Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы_по_проге_Берлин / Книги / учебное пособие ОАиП.pdf
Скачиваний:
49
Добавлен:
11.02.2015
Размер:
947 Кб
Скачать

(++him)->okl; или (him++)->okl;

Рассмотрим еще один пример объявления структуры: struct

{char * str; float f;

} *pr;

Как и выше, *pr->str есть содержимое объекта, на который ссылается str; *pr->str++ передвинет указатель pr->str после считывания объекта, на который он указывал; (*pr->str) ++ увеличит значение объекта, на который ссылается str; *pr ++->str передвинет указатель pr после получения значения, на которое указывает str.

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

В функцию можно наряду со стандартными типами данных передавать и

структуры.

 

struct men

// обьявление шаблона структуры Men

{ char *String;

 

int Number;

 

int Marks[10];

 

};

 

men sum(men);

// прототип 1

void sum (men*);

// прототип 2

Выше приведены

два прототипа функции. В первом описывается

функция, в которую передается копия переменной типа структура men и которая возвратит в основную программу значение того же типа.

Второй прототип описывает функцию в которую передается указатель на структуру. В функции выполнятся преобразования структуры расположенной в памяти по указателю, который в нее передан. Поэтому функция ничего не возвращает. Этот вариант функции лучше нежели первый, он будет работать быстрее и требует меньшего количества памяти.

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

Передача функции компонент структуры. В общем случае, элемент структуры является переменной (массивом) некоторого типа, и может быть передан как аргумент функции. Рассмотрим следующую несложную программу, выполняющую суммирование окладов нескольких профессий, и нахождение max из них:

#include <stdio.h>

float summa(float,float *);

struct str

 

{ char *prof[5];

// профессия

float okl[5],sm;

// оклад и сумма

} ok= {"проф1","проф2","3","4","", 1.5,2.06,31.4,3.0,0,0};

void main(void) { float max;

int i;

for(i=0;i<5;i++) max=summa(ok.okl[i],&ok.sm); printf("max значение =%5.2f\n сумма = %5.2f",max,ok.sm);

}

float summa(float i,float *j) { static float max=0;

*j+=i; //вычисление суммы max=(max>i)?max:i; //поиск max значения return max;

}

Рассматриваемая программа состоит из двух функций: main() и summa(). Функции summa() в качестве параметров передаются один из суммируемых окладов (ok.okl[i]) и адрес элемента структуры, куда помещается сумма (&ok.sm). Функция summa() также возвращает вычисленное максимальное значение оклада.

Передача всей структуры в функцию. В этом случае выполняется передача данных всей структуры в функцию (в стек) со всеми полями, которые в нее входят (массивы, другие структуры и т. д.).

При этом никакие изменения структуры внутри функции не влияют на структуру, используемую в качестве аргумента. При использовании структуры в качестве параметра, тип аргумента должен соответствовать типу параметров. Это можно сделать определив структуру глобально, а затем использовать ее для объявления необходимых структурных переменных и параметров.

#include <stdio.h> float sr_ball(struct str ); struct str

{char prof[15]; int oc[4];

};

void main(void)

{float bl;

struct str s= {"Иванов",5,4,3,5}; bl=sr_ball(s);

printf("средний балл =%5.2f",bl);

}

float sr_ball(struct str st)

{

return (st.oc[1]+st.oc[2]+st.oc[3]+st.oc[4])/4;

}

Передача структуры через указатель будет рассмотрена позже.

Примеры программ

Пример . Среди абитуриентов, сдавших вступительные экзамены в институт, определить количество абитуриентов, проживающих в городе Минске и сдавших экзамены со средним баллом не ниже 8, распечатать их фамилии в алфавитном порядке.

#include<stdio.h>

 

#include<conio.h>

 

#include<stdlib.h>

 

#include<string.h>

 

#define n 3

 

void main(void)

 

{ struct str

 

{ char *gr;

// город

char fm[15];

//фамилия

int oc[3];

 

} s[n];

 

int i,j,k=0;

 

char c;

 

clrscr();

printf("\nВведите информацию в массив структур"); for(i=0;i<n;i++) // цикл ввода структур в массив

{printf("\n введите город :"); fflush(stdin);

s[i].gr=(char *)malloc(10); //отводим память для ввода города

gets(s[i].gr);

//ввод города

if (!*s[i].gr) break;

// выход по пустой строке

printf("\n введите фамилию :");

gets(s[i].fm);

//ввод фамилии

printf("\n введите оценки (ф м л) :"); scanf("%d%d%d",s[i].oc,s[i].oc+1,s[i].oc+2);

}

i--; // последняя стр-ра s[i] - пустая или i==n for(c='А';c<='Я';c++)

for(j=0;j<=i;j++)

if(!strcmp(s[j].gr,"Минск") && s[j].fm[0]==c) if((s[j].oc[0]+s[j].oc[1]+s[j].oc[2])/3>=8)

{printf("\n%s",s[j].fm);

k++; // подсчет числа абитуриентов удовл. условию задачи

}

printf("\n Итого абитуриентов = %d",k);

}

Пример . вложенных структур

#include <stdio.h>

#define DL 30 // max число символов в строке char

struct name

 

{

char fm[DL];

// фамилия

 

char im;

// имя

};

char ot;

// отчество

 

 

struct inform

 

{

name nm;

// переменная типа на структура name

 

char prof[DL];

// профессия

 

int god;

// год рождения

 

float okl;

// оклад

};

void main(void)

{static inform mas[4]=

{"Иванов",'И','И',"конструктор",1989,15000.50, "Петров",'П','П',"оператор",1987,12350.50};

inform *him;

 

// указатель на структуру inform

printf("адрес mas[0]: %u

mas[1]: %u \n",&mas[0],&mas[1]);

him=mas;

 

// him содержит адрес mas[0]

printf("адрес mas[0]: %u

mas[1]: %u \n",him,him+1);

printf("him->okl = %.2f

 

(*him).okl = %.2f \n",him->okl,(*him).okl);

him++;

// him содержит адрес следующей стр-ры mas[1]

(++him)->okl++;

// him->okl==12351.5

printf("him->okl = %.2f

 

(*him).okl = %.2f \n",him->okl,(*him).okl);

him--;

printf("him->nm.fm = %.20s (*him).nm.fm = %.20s \n", (him)->nm.fm,(*--him).nm.fm);

//в этом случае выполняется переход к mas[0]-----------┘

//затем вывод -------------------------------┘

}

Пример . Нахождение площади прямоугольной фигуры по 2точкам с координатами (x1,y1) и (x2,y2).

#include <stdio.h> #include <conio.h>

struct rect analiz(struct rect); // здесь наличие слова struct обязательно void swap(int n,struct rect *);

struct point

 

{

int x;

// структура point описывает координаты

};

int y;

// (x и y) точки на плоскости

 

 

struct rect

 

{

point p1;

// структура rect описывает координаты

};

point p2;

// 2 угловых точек (прямоуг-ка, квадрата)