- •1. Краткие теоретические сведения
- •1.1. Понятие структуры
- •1.2. Определение (описание) шаблона структуры
- •1.3. Описатель типа
- •1.4. Объявление переменных структурного типа
- •1.5. Инициализация переменной структурного типа
- •1.6. Операции со структурами
- •1.7. Доступ к значениям полей структурного типа
- •1.8. Вложенные структурные типы
- •1.9. Массивы структурного типа
- •1.10. Структурные переменные и указатели
- •1.11. Структуры и функции
- •1.11. Использование синонима типа
- •1.12. Доступ к отдельному биту
- •1.13.Типичные ошибки при разработке структур
- •1.14. Примеры программирования задач на структуры
- •2. Задание
- •2.4. Задания для выполнения на занятиях
- •2.4.1. Задание 1. Вычисление с использованием структур
- •2.4.1.1. Условие задания
- •2.4.1.2. Пример для варианта 30
- •2.4.1.3. Программа
- •2.4.1.4. Тестирование
- •2.4.2. Задание 2. Массив структур
- •2.4.2.1. Условие задания
- •2.4.2.2. Пример выполнения работы
- •2.4.2.3. Программа
- •2.4.2.4. Тестирование
- •2.4.3. Задание 3. Структуры данных
- •2.4.3.1. Условие задания
- •2.4.3.2. Пример для варианта 30
- •2.4.3.3. Программа
- •2.4.3.4. Тестирование
- •2.4.4. Задание 4. Структуры данных
- •2.4.4.1. Условие задания
- •2.4.4.2. Пример для варианта 31
- •2.4.4.3. Программа
- •2.4.4.4. Тестирование
- •2.4.5. Задание 5. Создание и обработка структур
- •2.4.5.1. Условие задания
- •2.4.6.2. Пример для варианта 30
- •2.4.7.2. Пример для варианта 30
- •2.4.7.3. Программа
- •2.4.7.4. Тестирование
- •3. Выводы
- •4. Требование к отчету
- •4. Краткие теоретические сведения.
- •5. Вопросы для самоконтроля
- •Литература
- •1. Краткие теоретические сведения 2
- •1.1. Понятие структуры 2
1.11. Использование синонима типа
Ключевое слово typedef позволяет в программе создать синоним типа, который может использоваться для объявления переменных, параметров функций. Синоним можно создать для любого существующего типа (int, float и т. д.), в том числе для пользовательского типа – структуры или массива.
Пример 14.67
Создание синонима структуры:
typedef struct point
{
int x,y;
} POINT;
Идентификатор POINT представляет собой синоним типа point. С помощью синонима POINT можно объявить переменную:
POINT pt1;
или передать переменную в функцию:
void ShowRect(POINT pt1,POINT pt2);
Пример 2. Создание синонима массива:
typedef float mas[4][5];
Идентификатор mas обозначает тип – двумерный массив, состоящий из четырех строк и пяти столбцов. Этот идентификатор можно использовать для объявления переменной – массива A: mas A;
или для передачи массива в функцию:
void FormMas(mas A,int m,int n);
1.12. Доступ к отдельному биту
Если некоторые поля структуры принимают только два значения т.е. используются как флаги, то очень удобно пользоваться полями битов. Поля битов это специальный тип членов структуры, в котором определено, из скольких бит состоит каждый элемент.
Основная форма объявления структуры с битовыми полями:
struct имя_структуры
{
тип имя1: длина_в_битах;
тип имя2: длина_в_битах;
...
тип имяN: длина_в_битах;
}
Здесь тип может быть int, unsigned или signed.
Длина такой структуры всегда кратна восьми. Если определить
struct student
{
unsigned status: 1;
} stud;
то для переменной stud будет выделено 8 бит, а использоваться будет только один первый бит.
1.13.Типичные ошибки при разработке структур
Наиболее часто встречающейся ошибкой является включение в структуру взаимозависимых данных. То есть таких членов, значения которых могут быть вычислены на основании других членов структуры.
Например, неправильной структурой будет:
struct Line
{
vec3 pt1,pt2;
double length;
};
В данном случае член length может быть вычислен на основании pt1 и pt2. Хранение значение length в структуре нарушает вторую рекомендацию по использованию структур. Кроме расхода памяти для хранения избыточной информации программист получает намного более сложную проблему: необходимость синхронизации данных. При каждом изменении любого из членов структуры придётся пересчитывать значение length.
Более утончённые примеры ошибок:
// Прямоугольник на плоскости
struct Box2
{
vec2 pt1, pt2, pt3, pt4;
};
// Окружность в трехмерном пространстве
struct CircleIn3D
{
Plane plane; // Плоскость, в которой лежит окружность
vec3 center;
double radius;
};
1.14. Примеры программирования задач на структуры
Пример 14.10
Сформировать структуру, содержащую сведения о студентах. Структурный тип содержит поля: ФИО студента, адрес, возраст, оценки сессии, средний балл в сессию. Написать программу, которая вводит и выводит информацию о студенте.
#include <stdio.h>
main()
{
/* Описание шаблона структуры */
struct Student
{ char *fio; // Фамилия - указатель на char
char Adress[40]; // Адрес - строка
int Age; // Возраст - целое
int oc[4]; // Оценки - целочис. массив
float sr; // Средний балл - вещественное
} ;
struct Student S; // Описание структурной переменной S
int i;
float sr;
S.fio="Петушков"; //Присваивание полю значения
printf("Введите адрес студента %sa ",S.fio);
gets(S.Adress); //Ввод значения поля
S.Age=1987; //Присваивание полю значения
S.oc[0]=3; S.oc[1]=5; S.oc[2]=4; S.oc[3]= S.oc[2];
sr=0; //Вычисление среднего балла
for(i=0;i<=3;i++)
sr=sr+S.oc[i];
sr=sr/4;
S.sr=sr; //Присваивание полю вычисленного значения
/* Вывод полей записи S */
printf(" Средний балл студента %sа", S.fio);
printf(" %d года рождения,\n проживающего по адресу: %s,",
S.Age,S.Adress);
printf(" равен %5.2f\n", S.sr);
fflush(stdin); getchar();
return(0);
}
Из примера видно, что имя поля структуры и имя переменной могут совпадать, поскольку у них разные области видимости. Более того, поля разных структур могут совпадать. Но делать так не рекомендуется поскольку себя запутать легче, чем компилятор.
Вид экрана после выполнения приведенной программы:
Введите адрес студента Петушковa ул. Солнечная, д.1, кв. 4
Средний балл студента Петушкова 1987 года рождения,
проживающего по адресу: ул. Солнечная, д.1, кв. 4, равен 4.00
Здесь красным цветом выделен текст, который пользователь набрал на клавиатуре.
Пример 14.5
Составить инвентарный перечень книг, в котором для каждой книги необходимо указывать ее наименование, автора и год издания. Причем количество книг может быть разным, но будем полгать, что не более 100.
В этом случае программу ввода и хранения информации по книгам можно записать в виде:
#include
struct book
{
char title[100]; //наименование книги
char author[100]; //автор
int year; //год издания
};
int main()
{
int cnt_book = 0, ch;
struct book lib[100]; // массив структур типа book
do
{
printf(“Введите наименование книги: “);
scanf(“%s”,lib[cnt_book].title);
printf(“Введите автора книги: “);
scanf(“%s”,lib[cnt_book].author);
printf(“Введите год издания книги: “);
scanf(“%d”,&lib.year);
printf(“Нажмите q для завершения ввода: ”);
cnt_book++;
}
while(scanf(“%d”,ch) == 1 && cnt_book < 100);
return 0;
}
Данный пример показывает удобство хранения информации по книгам. Тот же алгоритм в общем случае можно реализовать и без структуры, но тогда пришлось бы использовать два двумерных массива символов и один одномерный массив для хранения года издания. Несмотря на то, что формально такая запись была бы корректной с точки зрения языка С++, но менее удобна в обращении.
Пример 14.20
Поиск в массиве структур, вводимых с клавиатуры. Сформировать структуру, имеющую поля ФИО, год рождения, оклад. Вывести фамилии сотрудников, имеющих оклад выше среднего
Текст программы
/* Фамилии сотрудников, имеющих оклад выше среднего */
#include <stdio.h>
#include <string.h>
#include <iostream.h>
void main()
{
const int lfio=20, lpay=5, lo=7, //длины полей фио, г.рожд., оклада
ldb=10;
struct Man
{ char fio[lfio+1]; // фио
int year; // год рожд.
float pay; // оклад
};
Man db[ldb]; // массив структур
int i, n;
float s; // Средний оклад
puts("Число записей?(1<n<=10)"); cin>>n;
/*Ввод массива записей */
for(i=0; i<n; i++)
{
puts("Фамилия? "); cin>>db[i].fio;
puts("Год рождения? "); cin>>db[i].year;
puts("Оклад? "); cin>>db[i].pay;
}
/* Вывод массива записей в форме таблицы*/
puts(" Список сотрудников");
puts("┌──────────┬───┬────┐");
puts("│ ФИО │ г.р.│Оклад │");
puts("├──────────┼───┼────┤");
for(i=0; i<n; i++)
printf("|%-20s|% 5d | % 7.2f |\n", db[i].fio, db[i].year, db[i].pay);
puts("└──────────┴───┴────┘");
puts("Фамилии сотрудников, имеющих оклад выше среднего");
//Вычисление среднего оклада
s=0;
for(i=0; i<n; i++)
s+=db[i].pay; // s=s+db[i].pay;
s/=n; //s=s/n;
// Определение и вывод фамилий
for(i=0; i<n; i++)
if(db[i].pay>s) printf("%-s\n", db[i].fio);
fflush(stdin); getchar();
}
Пример 14.10
Сформировать структуру, содержащую сведения о студентах. Структурный тип содержит поля: ФИО студента, курс, возраст. Написать программу, которая вводит и выводит информацию о студенте.
Пример программы.
#include <stdio.h>
// определение структуры
struct student
{
char name[30];
int kurs;
int age;
};
void main()
{
// объявление переменных stud1 и stud2 типа struct student
struct student stud1, stud2;
printf("Введите имя:");
// ввод имени
gets(stud1.name);
printf("Введите возраст:");
// ввод возраста
scanf("%d",
&stud1.age);
printf("Введите номер курса:");
// ввод номера курса
scanf("%d", &stud1.kurs);
// присваивание stud2=stud1 возможно, так как один и тот же шаблон
stud2=stud1;
// Вывод
printf("Студент %sn",
stud2.name);
printf("Курс %dn", stud2.kurs);
printf("Возраст
%dn", stud2.age);
}
Заметьте, что когда мы делаем вызов scanf("%d", &stud1.age); и scanf("%d", &stud1.kurs); мы ставим знак & перед именем структуры, а не перед именем поля (элемента структуры).
Пример 14.11
Модифицировать программу примера 14.10 так, чтобы она обеспечивала ввод, вывод и хранение информации о всех студентах группы.
Будем считать, что количество студентов в группе не превышает 30 человек.
Текст программы
#include <stdio.h>
// определение структуры
struct student
{
char name[30];
int kurs;
int age;
};
void main()
{
// объявление массива на 30 структур
struct student stud[30];
int i, n;
printf("Количество студентов:");
// ввод n (число студентов)
scanf("%d", &n);
for(i=0;i<n;i++)
{
printf("Введите имя:");
// ввод имени
scanf("%s", stud[i].name);
printf("Введите возраст:");
// ввод возраста
scanf("%d", &stud[i].age);
printf("Введите номер курса:");
// ввод номера курса
scanf("%d", &stud[i].kurs);
}
// Вывод
for(i=0;i<n;i++) {
printf("Студент %sn", stud[i].name);
printf("Курс %dn", stud[i].kurs);
printf("Возраст %dn", stud[i].age);
}
}
Пример 14.11
Сформировать структуру, содержащую сведения о вкладах. Структурный тип содержит поля: ФИО вкладчика, номер счета, тип вклада (срочный, депозит, обычный), сумма вклада, дата последнего обращения к вкладу. Написать программу, которая выводит информацию о всех вкладчиках банка в алфавитном порядке имен и о вкладчиках банка, имеющих наибольший размер вклада.
Текст программы:
#include <string.h>
#include <stdio.h>
# include <iomanip.h>
struct Banc
{
char name[20]; // фамилия вкладчика
int sch; // номер счета
char tip[10]; // тип вклада
float sum; // сумма вклада
char data[10]; // дата последнего обращения
};
void main(void)
{
Banc b[10],b_new[10];
int kol;
cout<<"Введите количество вкладчиков >";
cin>>kol;
for(int i=0; i<kol; i++)
{
cout<<"Имя вкладчика :";
cin>>setw(15)>>b[i].name;
cout<<"Номер счета :";
cin>>b[i].sch;
cout<<"Тип вклада :";
cin>>b[i].tip;
cout<<"Сумма вклада :";
cin>>setw(10)>>b[i].sum;
cout<<"Дата последнего обращения к вкладу :";
cin>>setw(10)>>b[i].data;
cout<<endl;
}
/* Вывод содержимого массива вкладчиков в алфавитном порядке*/
for(int i=0; i<kol; i++)
{
Banc min=b[i];
int num=i;
for(int j=i; j<kol; j++)
if(strcmp(banc[j].name,min.name)<0)
{
min=b[j];
num=j;
}
b[num]=b[i];
b[i]=min;
}
cout<<"Имя вкладчика”<<”Номер счета”<<”Тип вклада”;
cout<<”Сумма вклада”<<”Дата последнего обращения к вкладу”<<endl;
for(int i=0; i<kol; i++)
{
cout<<setw(15)<<b[i].name<<setw(13)<<b[i].sch<<setw(11)<<b[i].tip;
cout<<setw(13)<<b[i].sum<<setw(16)<<b[i].data<<endl;
}
// Формирование массива вкладчиков, имеющих наибольший размер вклада
float max=0.0;
int kol_new=0;
for(int i=0; i<kol; i++) // Определение значения наибольшего вклада
if(b[i].sum>max) max=b[i].sum;
cout<<”Наибольшая сумма вклада”<<max<<endl;
// Массив вкладчиков с наибольшей суммой вклада
for(int i=0; i<kol; i++)
if(b[i].sum==max) b_new[kol_new++]=b[i];
cout<<”Имя вкладчика”<<”Номер счета”<<”Тип вклада”;
cout<<”Сумма вклада”<<”Дата последнего обращения к вкладу”<<endl;
for( i=0; i<kol_new; i++)
{ cout<<setw(15)<<b_new[i].name<<setw(13)<<b_new[i].sch<<
setw(11)<< b_new[i].tip;
cout<<setw(13)<<b_new[i].sum<<setw(16)<<b_new[i].data<<endl;
}
}
Пример 14.12
Сформировать структуру FLAT, содержащую сведения о квартире. Структурный тип содержит поля: адрес, количество комнат, общая площадь, стоимость квадратного метра. Написать программу, которая осуществляет поиск квартиры в пределах заданной суммы.
Текст программы на языке С++:
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
struct flat
{
char adres[30];
int kolvo;
long int stoimost;
double ploshad;
};
int main()
{
const n=3;
int i,j;
flat s[n],t;
cout.setf(ios::left);
clrscr();
for(i=0;i<=n-1;i++)
{
cout<<" Vvedite adress\n";
cin>>s[i].adres;
cout<<" Vvedite kolichestvo komnat\n";
cin>>s[i].kolvo;
cout<<" Vvedite ploshad\n";
cin>>s[i].ploshad;
cout<<" Vvedite stoimost\n";
cin>>s[i].stoimost;
cout<<"\n";
}
cout<<"\n Adress Kolichestvo_komnat Ploshad Stoimost\n\n";
for(i=0;i<=n-1;i++)
{
cout.width(20);cout<<s[i].adres;
cout.width(20);cout<<s[i].kolvo;
cout.width(15);cout<<s[i].ploshad;
cout.width(15);cout<<s[i].stoimost<<"\n";
}
int stoimost;
cout<<"\n\n Vvedute stoimost kvartirbl za kv metr\n";
cout<<"\n";
cin>>stoimost;
for(i=0;i<=n-1;i++)
if(s[i].stoimost<=stoimost)
{
cout.width(20);cout<<s[i].adres;
cout.width(20);cout<<s[i].kolvo;
cout.width(20);cout<<s[i].ploshad;
cout.width(20);cout<<s[i].stoimost<<"\n";
}
getch();
clrscr();
}
Результат тестирования программы:
Пример 14.13
Сформировать структуру FLAT, содержащую сведения о квартире. Структурный тип содержит поля: адрес, количество комнат, общая площадь, стоимость квадратного метра. Написать программу, которая осуществляет поиск двухкомнатной квартиры в пределах заданной суммы.
Текст программы на языке С++:
#include <iostream.h>
#include <string.h>
#include <conio.h>
const int L=31;
struct flat
{
char adr [L];
int kk;
int plo;
int skm;
};
struct gruppa
{
char adr [L];
int kk;
int plo;
int skm;
};
void input(flat x[ ],int n);
void output(flat x[ ],int n);
void outputgr(gruppa y[ ],int n);
void input(flat x[ ],int n)
{int i;
for (i=0;i<n;i++)
{
cout<<"adress";
cin>>x[i].adr;
cout<<"kol komnat";
cin>>x[i].kk;
cout<<"obch plochad";
cin>>x[i].plo;
cout<<"stoim kv metra";
cin>>x[i].skm;
cout<<endl;
}
}
void output(flat x[ ],int n)
{
int i;
for (i=0;i<n;i++)
cout << i + 1 <<" "<< x[i].adr <<" "<< x[i].kk <<" "<< x[i].plo <<" "<< x[i].skm << endl;
}
void outputgr(gruppa y[ ],int n)
{
int i;
for (i=0;i<n;i++)
cout << i + 1 <<" "<< y[i].adr <<" "<< y[i].kk <<" "<< y[i].plo <<" "<< y[i].skm << endl;
}
void main()
{
clrscr();
const int N=100;
flat a[N];
gruppa b[N];
for (int i = 0; i < N; i++)
{
a[i].adr[0] = NULL;
a[i].kk = 0;
a[i].plo = 0;
a[i].skm = 0;
b[i].adr[0] = NULL;
b[i].kk = 0;
b[i].plo = 0;
b[i].skm = 0;
}
int i, k, s, m, v;
cout<<"kol kvartir";
cin>>m;
input(a,m);
cout<<"ishodn massiv";
output(a,m);
cout<<"vvedite stoim";
cin>>s;
k=0;
for(i=0;i<m;i++)
{
v=a[i].plo*a[i].skm;
if((a[i].kk == 2) && (v<=s))
{
strcpy (b[k].adr,a[i].adr);
k++;
}
}
cout<<"perechen";
outputgr(b,k);
getch();
}
Пример 14.14
Дан массив записи, содержащие сведения о веществах: указывается название вещества, его удельный вес и проводимость. Найти название и удельные веса веществ заданной проводимости и напечатать их в порядке убывания удельного веса.
Текст программы на языке С++:
#include<stdlib.h>
#include<string.h>
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
struct materials{
char caption[20];
int mass;
int res;
}p[50],result[50],tmp;
int n,res_n,resist;
void search(int resistance,int count){
res_n=-1;
for (int j=0;j<count;j++)
if (p[j].res==resistance)
{ res_n++;
result[res_n]=p[j];
}
}
void sort(){
for (int i = 0; i <= res_n-1; i++)
{
int min = i;
for (int j = i+1; j <= res_n; j++)
if (result[j].mass <= result[min].mass) min = j;
tmp=result[i];
result[i]=result[min];
result[min]=tmp;
}
}
void showresults()
{
for (int i=0;i<=res_n;i++)
cout<<result[i].caption<<" "<<result[i].res<<" "<<result[i].mass<<endl;
getch();
}
void main(){
clrscr();
int n;
printf("Enter n:");
cin>>n;
for (int i=0;i<n;i++)
{
cout<<"enrter name, resistance and mass of "<<i+1<<" element: \n";
cin>>p[i].caption>>p[i].res>>p[i].mass;
}
printf("Enter resistance:");
scanf("%i",&resist);
search(resist,n);
sort();
showresults();
}
Тестирование программы
Пример 14.15
Задано n комплексных чисел, найти число наибольшего модуля.
Текст программы
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
struct complex
{
float x; //действительная часть
float y; //мнимая часть
};
//Объявление массива комплексных чисел
complex p[100];
int i,n,nmax;
float max;
cout<<"n=";
cin>>n;
for(i=0;i<n;i++)
{
cout<<"Vvedite complex chislo\n";
//ввод действительной части i-го комплексного числа
cin>>p[i].x;
//ввод мнимой част i-го комплексного числа
cin>>p[i].y;
cout<<p[i].x<<"+"<<p[i].y<<"i"<<endl;
}
max=pow(p[0].x*p[0].x+p[0].y*p[0].y,0.5);nmax=0;
for(i=1;i<n;i++)
if (pow(p[i].x*p[i].x+p[i].y*p[i].y,0.5)>max)
{
max=pow(p[i].x*p[i].x+p[i].y*p[i].y,0.5);nmax=i;
}
cout<<"Nomer maxsimalnogo modulya "<<nmax<<
"\nEgo velichina "<<max<<endl;
return 0;}
Результаты
n=5
Vvedite complex chislo
1 3
1+3i
Vvedite complex chislo
5 0.2
5+0.2i
Vvedite complex chislo
-0.2 3
-0.2+3i
Vvedite complex chislo
4.2 0.01
4.2+0.01i
Vvedite complex chislo
-6.2 0.45
-6.2+0.45i
Nomer maxsimalnogo modulya 4
Ego velichina 6.21631
Press any key to continue
Пример 14.16
Динамические структуры
Решим предыдущую задачу с использованием динамических структур.
Текст 1
#include <iostream>
#include <math.h>
#include <malloc.h>
using namespace std;
int main()
{
struct complex
{
float x;
float y;
};
complex *p;
int i,n,nmax;
float max;
cout<<"n=";
cin>>n;
//выделяется память под массив p
p=(complex *)calloc(n,sizeof(complex));
for(i=0;i<n;i++)
{
cout<<"Vvedite complex chislo\n";
cin>>p[i].x;
cin>>p[i].y;
cout<<p[i].x<<"+"<<p[i].y<<"i"<<endl;
}
max=pow(p[0].x*p[0].x+p[0].y*p[0].y,0.5);nmax=0;
for(i=1;i<n;i++)
if (pow(p[i].x*p[i].x+p[i].y*p[i].y,0.5)>max)
{
max=pow(p[i].x*p[i].x+p[i].y*p[i].y,0.5);nmax=i;
}
cout<<"Nomer maxsimalnogo modulya "<<nmax<<"\nEgo velichina
"<<max<<endl;
free(p);
return 0;
}
Текст 2
#include <iostream>
#include <math.h>
#include <malloc.h>
using namespace std;
int main()
{
struct complex
{
float x;
float y;
};
complex *p;
int i,n,nmax;
float max;
cout<<"n=";
cin>>n;
p=new complex [n];
for(i=0;i<n;i++)
{
cout<<"Vvedite complex chislo\n";
//запись (p+i)->x аналогична записи p[i].x
cin>>(p+i)->x;
cin>>(p+i)->y;
cout<<(p+i)->x<<"+"<<(p+i)->y<<"i"<<endl;
}
max=pow(p->x*p->x+p->y*p->y,0.5);
nmax=0;
for(i=1;i<n;i++)
if (pow((p+i)->x*(p+i)->x+(p+i)->y*(p+i)->y,0.5)>max)
{
max=pow((p+i)->x*(p+i)->x+(p+i)->y*(p+i)->y,0.5);nmax=i;
}
cout<<"Nomer maxsimalnogo modulya "<<nmax<<
"\nEgo velichina "<<max<<endl;
delete [] p;
return 0;
}
Пример 14.44
Программа, реализующая ввод списка студентов и вывод информации о студенте по его номеру в списке. Ввод информации о студенте реализован в виде отдельной функции.
#include<stdio.h>
const int n=3;
typedef struct
{
int num;
char fam[20];
char name[15];
}student;
student mas[n];
student *ptr=&mas[0];
void vvod(student *p)
{
scanf("%d",&p->num);
scanf("%s",p->fam);
scanf("%s",p->name);
}
void main ()
{
int i,d;
for(i=0;i<n;i++) vvod(ptr+i);
рrint("Введите номер студента в списке\п");
scanf("%d",&d);
for(i=0;i<n;i++)
if (mas[i].num==d) printf(" Студент %s %s\n",mas[i].fam,mas[i].name);
}
Процедуре vvod передается значение указателя на элемент массива mas, который является структурой. В приведенной программе использованы оба способа обращения к элементу структуры (с использованием указателя и без него).
Пример 14.56
Программа, реализующая ввод списка студентов и вывод информации о студенте по его номеру в списке. Ввод информации о студенте реализован в виде отдельной функции.
#include<stdio.h>
const int n=3;
typedef struct
{
int num;
char fam[20];
char name[15];
}student;
student mas[n];
student *ptr=&mas[0];
void vvod(student *p)
{
scanf("%d",&p->num);
scanf("%s",p->fam);
scanf("%s",p->name);
}
void main ()
{
int i,d;
for(i=0;i<n;i++) vvod(ptr+i);
рrint("Введите номер студента в списке\п");
scanf("%d",&d);
for(i=0;i<n;i++)
if (mas[i].num==d) printf(" Студент %s %s\n",mas[i].fam,mas[i].name);
}
Процедуре vvod передается значение указателя на элемент массива mas, который является структурой. В приведенной программе использованы оба способа обращения к элементу структуры (с использованием указателя и без него).
Пример 14.57
Структуры, как и обычные типы данных, можно передавать функции в качестве аргумента. Следующий пример демонстрирует работу функции отображения полей структуры на экран.
Передача структур через аргументы функции.
#include
struct tag_people {
char name[100];
char job[100];
int old;
};
void show_struct(struct tag_people man);
int main()
{
struct tag_people person = {“Иванов”,”Электрик”,30};
show_struct(person);
return 0;
}
void show_struct(struct tag_people man)
{
printf(“Имя: %s\n”,man.name);
printf(“Профессия: %s\n”,man.job);
printf(“Возраст: %d\n”,man.old);
}
В приведенном примере используется функция с именем show_struct, которая имеет тип аргумента struct tag_people и переменную-структуру man. При передаче структуры функции создается ее копия, которая доступная в теле функции show_struct под именем man. Следовательно, любые изменения полей структуры с именем man никак не повлияют на содержание структуры с именем person.
Пример 14.58
Иногда необходимо выполнять изменение полей структуры функции и возвращать измененные данные вызывающей программе. Для этого можно задать функцию, которая будет возвращать структуру, как показано в листинге следующей программы.
//Функции, принимающие и возвращающие структуру.
#include
struct tag_people {
char name[100];
char job[100];
int old;
};
void show_struct(struct tag_people man);
struct tag_people get_struct();
int main()
{
struct tag_people person;
person = get_struct();
show_struct(person);
return 0;
}
void show_struct(struct tag_people man)
{
printf(“Имя: %s\n”,man.name);
printf(“Профессия: %s\n”,man.job);
printf(“Возраст: %d\n”,man.old);
}
struct tag_people get_struct()
{
struct tag_people man;
scanf(“%s”,man.name);
scanf(“%s”,man.job);
scanf(“%d”,man.old);
return man;
}
В данном примере используется функция get_struct(), которая инициализирует структуру с именем man, запрашивает у пользователя ввод значений ее полей и возвращает введенную информацию главной программе. В результате выполнения оператора присваивания структуры man структуре person, происходит копирование информации соответствующих полей и автоматическое удаление структуры man.
Пример 14.59
Функциям в качестве аргумента можно также передавать массивы структур. Для этого используется следующее определение:
void show_struct(struct people mans[], int size);
Здесь size – число элементов массива, которое необходимо для корректного считывания информации массива mans. Следующий пример показывает принцип работы с массивами структур.
//Передача массива структур функции
#include
#define N 2
struct tag_people {
char name[100];
char job[100];
int old;
};
void show_struct(struct people mans[], int size);
int main()
{
struct people persons[N] = {
{ “Иванов”, «Электрик», 35 },
{ “Петров”, «Преподаватель», 50 },
};
show_struct(persons, N);
}
void show_struct(struct people mans[], int size)
{
for(int i = 0;i < size;i++)
{
printf(“Имя: %s\n”,mans[i].name);
printf(“Профессия: %s\n”,mans[i].job);
printf(“Возраст: %d\n”,mans[i].old);
}
}
При передаче аргумента persons выполняется копирование информации в массив mans и указывается дополнительный параметр size, для определения числа элементов массива mans. Затем в функции show_struct() реализуется цикл, в котором выполняется отображение информации массива структуры на экран монитора.
Пример 14.80
Работа со структурой magazin
Привести ?????
// объявления и инициализация
magazin *pm, m = ("Nature", 2000, 4};
// доступ к элементам
cout « m.tittle « " " « m.number « endl;
// одна структура в свободной памяти
*pm = new magazin;
*pm = m;
pm->tittle = "Nature";
delete pm;
// массив структур в свободной памяти
pm = new magazin[10];
pm[0].tittle = "Природа";
delete[] pm;
Пример 14.81
Программа, в которой массив точек формируется и выводится на экран с помощью функций.
#include <stdio.h>
#define N 5
struct point
{
int x,y;
};
void form_mas(struct point* mas, int n)
{
printf("Enter koordinates!\n");
for(int i=0;i<n;i++)
{
printf("x→");
scanf("%d",&mas[i].x);
printf("y→");
scanf("%d",&mas[i].y);
}
}
void print_mas(struct point* mas, int n)
{
printf(" x y\n");
for(int i=0; i<n; i++)
printf("%4d %6d\n",(mas+i)→x,(mas+i)→y);
}
int main()
{
struct point Points[N];
form_mas(Points,N);
print_mas(Points,N);
return 0;
}
Функция form_mas() заполняет массив точек, который передан в функцию через указатель mas. Параметр функции n определяет количество элементов массива. Доступ к элементу массива – через операцию . (точка). Выражение &mas[i].x вычисляет адрес элемента структуры mas[i].x, так как операция & имеет более низкий приоритет, чем операции [] и · (точка).
Функция print_mas() выводит массив на экран. Передача массива в функцию происходит также через указатель mas. Параметр n – количество элементов массива. Доступ к элементу массива – через операцию → (стрелка).