Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР14-С++-24-мая-2012.doc
Скачиваний:
34
Добавлен:
23.09.2019
Размер:
2.26 Mб
Скачать

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 – количество элементов массива. Доступ к элементу массива – через операцию → (стрелка).