- •Предисловие
- •Задание 1. Задачи целочисленной арифметики
- •If (Условие) Оператор1;
- •Варианты контрольных заданий
- •Задание 2. Использование функций
- •Задание 3. Обработка одномерных массивов
- •Задание 4. Обработка двумерных массивов
- •Задание 5.Обработка символов и строк
- •Задание 6. Одномерный массив–параметр функции
- •Задание 7. Двумерный массив–параметр функции
- •Задание 8. Структуры
Задание 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;
}
Постановка задания
Разработать алгоритм решения задачи. Написать программу, которая реализует данный алгоритм. Создать динамический массив структур. Оформить ввод, вывод массива структур и его обработку в виде функций. Организовать выполнение функций с помощью меню.
Варианты контрольных заданий
Определить структуру, описывающую рациональное число с полями числитель и знаменатель. Составить функции:
а) сложения рациональных чисел;
б) умножения рациональных чисел;
в) нахождения наибольшего числа из массива рациональных чисел;
г) нахождения наименьшего числа из массива рациональных чисел;
д) проверки, есть ли одинаковые числа в массиве рациональных чисел;
е) сортировки по возрастанию элементов массива рациональных чисел;
ж) сортировки по убыванию элементов массива рациональных чисел.
Определить структуру, описывающую точку в полярной и декартовой системе координат. Составить функции:
а) нахождения среди множества точек, заданных в декартовой системе координат, точек, расположенных ближе всех (дальше всех) от начала координат;
б) получения декартовых координат точки, если заданы ее полярные координаты;
в) вычисления расстояния между двумя точками, заданными в декартовой системе координат;
г) получения полярных координат точки, если заданы ее декартовы координаты;
д) вычисления расстояния между двумя точками, заданными в полярной системе координат.
Определить структуру, описывающую дату с полями число, месяц, год. Составить функции с учетом високосных годов:
а) вычисления интервала (в днях) между двумя датами;
б) определения по порядковому номеру дня в году числа, месяца и года, соответствующих этому дню;
в) определения по введенной дате даты на n дней вперед (назад);
г) сложения даты и заданного количества дней;
д) вычитания из даты заданного количества дней;
е) нахождения в массиве дат максимальной и минимальной даты;
ж) сортировки массива дат по возрастанию, убыванию в зависимости от признака.
Определить структуру, описывающую время с полями часы, минуты, секунды. Составить функции:
а) сложения времени и заданного количества секунд;
б) вычитания из времени заданного количества секунд;
в) сложения двух моментов времени;
г) вычитания из одного момента времени другого;
д) подсчета числа секунд между двумя моментами времени, лежащими в пределах одних суток; разных суток;
е) нахождения в массиве времен максимального и минимального времени;
ж) сортировки массива времен по возрастанию, убыванию в зависимости от признака;
Определить структуру для описания комплексного числа. Составить функции:
а) сложения (вычитания) чисел; б) произведения двух чисел;
в) деления чисел; г) возведения в целочисленную степень;
д) извлечения квадратного корня.
Определить структуру для описания полинома. Составить функции:
а) ввода (вывода) полинома; б) нормализации полинома;
в) сложения полиномов; г) вычитания полиномов;
д) умножения полиномов; е) деления полиномов;
ж) дифференцирования полиномов;
з) интегрирования полиномов.
Определить структуру для регистрации автомобиля с полями: дата регистрации, марка машины, год выпуска, цвет, номер. Составить функции:
а) регистрации новой машины;
б) удаления машины из регистрационного списка;
в) поиска машины по любой комбинации признаков;
г) вывода списка автомашин не старше заданного года;
д) вывода списка автомашин заданной марки, упорядочив его по году выпуска.
Определить структуру, содержащую информацию о студенте факультета с полями ФИО студента, курс, группа, оценки в сессию. Составить функции:
а) вывода для каждого курса списков студентов, сдавших сессию на ” отлично ”, на ” хорошо ” и ” отлично ”, получивших удовлетворительные оценки, получивших неудовлетворительные оценки;
б) вывода для каждого курса списков групп, расположив их в порядке убывания среднего балла группы;
в) вывода для заданного курса списков групп, расположив в каждой группе список студентов в порядке убывания их среднего балла;
г) нахождения количества студентов, получивших неудовлетворительные оценки, для каждой группы и каждого курса;
д) вывода сводной таблицы для каждого курса, содержащей фамилии студентов в порядке убывания их среднего балла;
е) вывода таблицы, содержащей информацию о сдаче каждого предмета в заданной группе (название предмета, число студентов, получивших «2», «3», «4», «5»).
СОДЕРЖАНИЕ
ПРЕДИСЛОВИЕ 3
Задание 1. задачи целочисленной арифметики 3
Задание 2. Использование функций 8
Задание 3. Обработка одномерных массивов 14
Задание 4. обработка двумерных массивов 18
Задание 5.ОБРАБОТКА СИМВОЛОВ И СТРОК 22
Задание 6. Одномерный массив–параметр функции 26
задание 7. двумерный массив–параметр функции 31
задание 8. СТРУКТУРЫ 35