Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные занятия_С++.doc
Скачиваний:
4
Добавлен:
23.04.2019
Размер:
462.85 Кб
Скачать

Задание 8. Структуры

Цель задания

Получить практические знания и навыки создания и использования структур в программах.

Основные понятия

Объявление структуры

Объявление структуры состоит из двух шагов:

- объявление типа структуры;

- объявление переменной данного типа.

Например, объявим тип структуры

struct Date {

char Fam[20];

long TelephoneNumber;

};

где struct ключевое слово; Dateназвание нового типа пользователя; Fam, TelephoneNamber поля структуры.

Date S1, S2; //Объявление переменных S1, S2 типа Date:

В оперативной памяти переменные S1, S2 будут занимать память по 24 байта каждая.

Переменной структурного типа можно присвоить значение другой переменной того же типа. Например, S1=S2; .

При объявлении переменных типа структуры можно проинициализировать их поля. Например, Date Str={"Иванов","Иван",2034878};

Доступ к полям структуры

Доступ к полям структуры осуществляется с помощью оператора "."(точка). При этом сначала записывается имя структурной переменной, а затем через "точку" имя поля структуры. Например,

cin>>S1.Fam;

cout<<S2.TelephoneNamber;

S1.TelephoneNamber=2012345;

Вложенные структуры

Полем структуры может быть переменная другого, ранее определенного структурного типа.

Например, struct date {

int day, month, year;

};

struct person {

char fam[20];

date birthday;

int height;

};

person P1;

cin>>P1.fam;

cin>>P1.birthday.day;

cin>>P1.birthday.month;

Таким образом, доступ к полям вложенной структуры осуществляется с помощью нескольких операций ".".

Статические массивы в структурах

Полем структуры может быть одномерный или двумерный массивы фиксированной размерности. Например,

struct Matr {

int a[2][3];

float b[3];

char fio[20];

};

Matr Str;

Str.a[0][0]=25;

cout<<Str.a[i][j];

cin>>Str.b[2];

Str.fio[0]='*';

Статический массив структур

Сначала необходимо определить структурный тип, а затем объявить массив переменных данного типа.

Например,

struct person {

char fam[20];

int height;

};

const n=100;

person P1[n];

Указатели в структуре

Полями структуры могут быть указатели. Например,

struct Str {

int *x;

char * c;} S;

Перед использованием структуры S ее поля-указатели необходимо проинициализировать, например, используя оператор new.

S.x=new int [k]; резервируем память для размещения динамического массива из k целых чисел и адрес первого элемента массива записываем в поле x структуры S.

S.c=new char[20]; резервируем память для размещения массива из 20 символов и адрес первого байта записываем в поле с структуры S.

После этого с массивами x и с структуры S можно работать.

Доступ к содержимому памяти, адрес которой находится в поле x структуры S выполняется с помощью операции разыменования.

Например,

for(int i=0; i<k; i++)

cin>>S.x[i];

Доступ к элементам массива с: S.c[i], S.c[0] и т.д.

Указатели на структуру

Можно определить указатель на структуру по обычным правилам. Например, Str * p;

Инициализацию указателя на структуру можно выполнить одним из следующих способов:

-адрес структуры определить с помощью new

Str *p=new Str;

-указателю на структуру присвоить адрес ранее объявленной структуры

Str str1; Str * p=&str1;

-использовать имя ранее объявленного статического массива структур

const n=5;

Str MasStr[n];

Str * p=MasStr;

Для доступа к полям структуры с помощью указателей имеются две возможности:

-вместо операции "." (точка) используется операция "->" (стрелка)

struct Date

{

char Fam[20];

long TelephoneNumber;

};

Date * uk=new Date;

uk-> TelephoneNumber=2034870;

cin>>uk->Fam;

-разыменование указателя и формирование уточненного имени по правилу: *(имя указателя).имя _поля.

Например, *(uk). TelephoneNumber=2034870;

Динамический массив структур

С помощью операции new можно выделить память для динамического массива структур. Для этого нужно выполнить следующие действия:

struct Point {

float x, y;

};

int n;

cin>>n;

Point * uk=new Point [n];

Переменной-указателю uk присваивается адрес начала массива структур. Доступ к полям i-й структуры осуществляется следующим образом:

for(int i=0; i<n; i++) {

cin>>uk->x >>uk->y; // cin>>uk[i].x >>uk[i].y;

uk++;

}

Ссылка на структуру

Для структур, как и для простых переменных, можно использовать ссылочный тип. Например,

Point pp;

Point & Spp=pp;

Структуры и функции

Формальным параметром функции может быть структура. Как и для простых переменных, возможна передача структур в функцию одним из следующих способов:

-по значению void Func( Point str)

-по ссылке void Func( Point & str)

-с помощью указателя void Func( Point * str).

Примеры выполнения задания

//Пример 8.1. Сформировать статический массив структур,

//каждый элемент которого содержит информацию о студенте:

//фамилия; -курс; -группа.

//Вывести список студентов курса, номер которого вводится.

//Оформить в виде функций ввод и обработку массива структур.

#include<iostream.h>

#include<stdio.h>

#include <stdlib.h>

#include <conio.h>

struct Student { //Описание структурного типа Student

char name[10];

int kurs, gruppa;

};

void Input(Student * mas, int ); //Функция ввода информации

void Show(Student * mas, int, int);//Функция вывода информации

int main() {

const n=5; //Количество студентов

Student str[n]; //Статический массив структур

Input (str, n); //Заполнение массива структур

while(1) {

cout<<"Введи номер курса(0-конец ввода)\n";

int nomer;

cin>>nomer;

if(!nomer) exit(0);

Show (str, n, nomer); //Вызов функции Show

}

getch();

return 0;

}

void Input(Student *mas, int size1) {

for(int i=0; i<size1; i++) {

cout<<"Фамилия: ";

cin>>mas[i].name;

cout<<"Курс: ";

cin>>mas[i].kurs;

cout<<"Группа: ";

cin>>mas[i].gruppa;

}

}

void Show (Student * mas, int size1, int nomer) {

cout<<"Список студентов "<<nomer<<" курса"<<endl;

for (int i=0; i<size1; i++)

if(mas[i].kurs==nomer) cout<<mas[i].name<<endl;

}

//Пример 8.2. Сформировать динамический массив структур.

//Каждый элемент массива содержит информацию о точке на плоскости.

//Найти точку, максимально удаленную от начала координат.

#include <math.h>

#include <stdio.h>

#include <iostream.h>

#include <conio.h>

// Описание структурного типа Point

struct Point {

float x,y;

float r;

};

void Input(Point *mas, int n); //Функция ввода информации

int MyMax(Point *mas, int n);//Функция выч. максим. расст.

void Show (Point * mas, int n); //Функция вывода информации

int main() {

int n;

cout<<"Задайте количество точек ";

cin>>n;

Point *p=new Point[n];//Динам. массив структур

Input (p, n);

int nomer=MyMax(p,n);

cout<<"Maксимально удаленная точка x="

<<p[nomer].x<<" y="<<p[nomer].y<<endl;

Show (p, n);

getch();

return 0;

}

void Input(Point *mas, int n)

{

for(int i=0; i<n; i++) {

cout<<"x= ";

cin>>mas[i].x;

cout<<"y= ";

cin>>mas[i].y;

}

}

void Show (Point * mas, int n) {

cout<<"Точки:"<<endl;

for (int i=0; i<n; i++)

cout<<mas[i].x<<" "<<mas[i].y<<" "<<mas[i].r<< endl;

}

int MyMax(Point *mas, int n) {

int imax=0;

for ( int i=0; i<n; i++) {

mas[i].r=sqrt(mas[i].x*mas[i].x+mas[i].y*mas[i].y);

if (mas[i].r>mas[imax].r) imax=i;

}

return imax;

}

Постановка задания

Разработать алгоритм решения задачи. Написать программу, которая реализует данный алгоритм. Создать динамический массив структур. Оформить ввод, вывод массива структур и его обработку в виде функций. Организовать выполнение функций с помощью меню.

Варианты контрольных заданий

  1. Определить структуру, описывающую рациональное число с полями числитель и знаменатель. Составить функции:

а) сложения рациональных чисел;

б) умножения рациональных чисел;

в) нахождения наибольшего числа из массива рациональных чисел;

г) нахождения наименьшего числа из массива рациональных чисел;

д) проверки, есть ли одинаковые числа в массиве рациональных чисел;

е) сортировки по возрастанию элементов массива рациональных чисел;

ж) сортировки по убыванию элементов массива рациональных чисел.

  1. Определить структуру, описывающую точку в полярной и декартовой системе координат. Составить функции:

а) нахождения среди множества точек, заданных в декартовой системе координат, точек, расположенных ближе всех (дальше всех) от начала координат;

б) получения декартовых координат точки, если заданы ее полярные координаты;

в) вычисления расстояния между двумя точками, заданными в декартовой системе координат;

г) получения полярных координат точки, если заданы ее декартовы координаты;

д) вычисления расстояния между двумя точками, заданными в полярной системе координат.

  1. Определить структуру, описывающую дату с полями число, месяц, год. Составить функции с учетом високосных годов:

а) вычисления интервала (в днях) между двумя датами;

б) определения по порядковому номеру дня в году числа, месяца и года, соответствующих этому дню;

в) определения по введенной дате даты на n дней вперед (назад);

г) сложения даты и заданного количества дней;

д) вычитания из даты заданного количества дней;

е) нахождения в массиве дат максимальной и минимальной даты;

ж) сортировки массива дат по возрастанию, убыванию в зависимости от признака.

  1. Определить структуру, описывающую время с полями часы, минуты, секунды. Составить функции:

а) сложения времени и заданного количества секунд;

б) вычитания из времени заданного количества секунд;

в) сложения двух моментов времени;

г) вычитания из одного момента времени другого;

д) подсчета числа секунд между двумя моментами времени, лежащими в пределах одних суток; разных суток;

е) нахождения в массиве времен максимального и минимального времени;

ж) сортировки массива времен по возрастанию, убыванию в зависимости от признака;

  1. Определить структуру для описания комплексного числа. Составить функции:

а) сложения (вычитания) чисел; б) произведения двух чисел;

в) деления чисел; г) возведения в целочисленную степень;

д) извлечения квадратного корня.

  1. Определить структуру для описания полинома. Составить функции:

а) ввода (вывода) полинома; б) нормализации полинома;

в) сложения полиномов; г) вычитания полиномов;

д) умножения полиномов; е) деления полиномов;

ж) дифференцирования полиномов;

з) интегрирования полиномов.

  1. Определить структуру для регистрации автомобиля с полями: дата регистрации, марка машины, год выпуска, цвет, номер. Составить функции:

а) регистрации новой машины;

б) удаления машины из регистрационного списка;

в) поиска машины по любой комбинации признаков;

г) вывода списка автомашин не старше заданного года;

д) вывода списка автомашин заданной марки, упорядочив его по году выпуска.

  1. Определить структуру, содержащую информацию о студенте факультета с полями ФИО студента, курс, группа, оценки в сессию. Составить функции:

а) вывода для каждого курса списков студентов, сдавших сессию на ” отлично ”, на ” хорошо ” и ” отлично ”, получивших удовлетворительные оценки, получивших неудовлетворительные оценки;

б) вывода для каждого курса списков групп, расположив их в порядке убывания среднего балла группы;

в) вывода для заданного курса списков групп, расположив в каждой группе список студентов в порядке убывания их среднего балла;

г) нахождения количества студентов, получивших неудовлетворительные оценки, для каждой группы и каждого курса;

д) вывода сводной таблицы для каждого курса, содержащей фамилии студентов в порядке убывания их среднего балла;

е) вывода таблицы, содержащей информацию о сдаче каждого предмета в заданной группе (название предмета, число студентов, получивших «2», «3», «4», «5»).

СОДЕРЖАНИЕ

ПРЕДИСЛОВИЕ 3

Задание 1. задачи целочисленной арифметики 3

Задание 2. Использование функций 8

Задание 3. Обработка одномерных массивов 14

Задание 4. обработка двумерных массивов 18

Задание 5.ОБРАБОТКА СИМВОЛОВ И СТРОК 22

Задание 6. Одномерный массив–параметр функции 26

задание 7. двумерный массив–параметр функции 31

задание 8. СТРУКТУРЫ 35

46