Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Archive / Метод_указ.doc
Скачиваний:
84
Добавлен:
30.03.2015
Размер:
700.42 Кб
Скачать

Лабораторная работа 8 программирование с использованием функций

В структуре С-программ основной структурной единицей является функция. С-программа содержит главную функцию main, а также может включать одну или несколько подпрограмм-функций.

Различают описание и представление функций. Описание делает возможным доступ ку функции (помещает ее в область видимости), информирует компилятор о типе возвращаемого значения, о типе передаваемых ей значений . Описание часто называют прототипом функции. Использование прототипа обязательно, если функция описана после того, как она вызывается , например, после main-функции, причем прототип предваряется служебным словом extern.

Представление функции включает:

- тип значения, возвращаемого функцией;

- число и тип формальных параметров;

- код (тело) функции, который должен выполняться при вызове функции;

- локальные переменные.

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

Если не указывается тип значения, возвращаемого функцией, то по умолчанию принимается тип int. Функция не может возвращать массив, но может возвращать указатель на него. В теле любой функции рекомендуется использовать оператор return, который может дополняться либо выражением, либо именем переменной, значение которой возвращается, либо каким-либо значением. Все программные С-системы должны содержать функцию main, в противном случае загрузчик не сможет собрать программу. Все параметры функции за исключением указателей и массивов передаются по значению, при этом в функции создаются локальные копии этих параметров, что увеличивает объем используемой программой памяти. При вызове функции для локальных параметров в стеке выделяется память, при завершении выполнения функций эта память освобождается.

Пример.

Определить максимальный и минимальный элементы массива с использованием подпрограммы-функции.

# include <stdio.h>

# include <stdlib.h>

# define m 8 // макропеременная m

typedef float mas[m] // пользовательский тип данных

float a[m], amax, amin; // глобальные переменные

float ma() // процедура-функция

{int i, amax=a[0];

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

if (a[i]>amax) amax=a[i];

return amax;} // возврат значения

void main() // главная функция программы

{

extern float mi(float d[], int i); // заголовок функции

int i; float c[m];

randomize(); // генератор случайных чисел

printf(“Array c \n”);

for (i=0;i<m;i++) // заполнение массива

{c[i]=0.1*random(20); printf(“%5.2f”,c[i]);}

printf(“\n max=%f min=%f\n”,ma(c,m),mi(c,m)); // вызов функций

}

float mi(mass d, int i) // тело подпрограммы-функции

{ int i; float dmin=d[0];

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

if (d[i]<dmin) dmin=d[i];

return dmin;}

Лабораторная работа 9 структуры и объединения

Помимо массивов к структурированным или агрегатным типам относятся структуры и объединения, которые заключают в себе данные разного типа. Структура описывается следующим образом:

struct <имя структуры>

{

тип <имя_поля1>;

тип <имя_поля2>;

тип <имя_поляN>;

};

Определение структуры является оператором, поэтому заканчивается точкой с запятой. Переменные, которые объединяются структурой, называются членами, элементами или полями структуры.

Пример. Определения структуры STUDENT (сведений о студенте)

struct STUDENT {

сhar Name[30];

char Groupe[5];

int Age;

};

Такая запись не задает никакой переменной и выделения памяти не происходит. Под именем STUDENT задается частный вид структуры или шаблон струк­туры, т.е. определен новый тип struсt STUDENT. Для объяв­ления конкретных переменных этого типа можно написать:

struct <имя структуры> <список переменных>;

Пример. struct STUDENT stud1, stud2;

Переменные также могут задаваться одновременно с шаблоном

struct STUDENT {

сhar Name[30];

char Groupe[5];

int Age;

} stud1, stud2;

Теперь объявлены две переменные и компилятор автоматически выделит под них память (под каждую переменную непрерывный участок).

Внешние статические структуры можно инициировать, помещая следом за определением список начальных значений элементов:

struct stud1="Иванов И.","А-319", 21;

Как и для других типов, структурам можно давать имена с помощью оператора typedef, т.е.

typedef struct <имя структуры>

{

тип <имя_поля1>;

тип <имя_поля2>;

тип <имя_поляN>;

} <имя типа>;

Обращение к элементу структуры осуществляется через селектор, т.е. сначала пишется имя переменной структурного типа, а затем через точку – имя элемента.

<имя_переменной_стр>.<имя_поля>

Структура операции доступа к полю по указателю:

переменная_указатель -> имя_поля;

Операция "стрелка" употребляется, когда необходимо использовать значение элемента структуры с применением переменной-указателя.

Пример. (*uk).a или uk->a; // получение значения поля а переменной uk

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

#include <stdio.h>

#include <string.h>

#include <conio.h>

typedef struct address // создание пользовательского типа adress

{char city[30];

char street_house_flat[60];};

typedef struct data // создание пользовательского типа

//информация о студентах

{char fio[60];

int year_birthday;

char group[10];

address st_adress; };

void main()

{data st_group[25]; char st_fio[30], num_group[10], st_city[20], st_adr[60];

clrscr();

cout<< “Input data”<<endl;

for (int i=0; i<25; i++) // заполнение сведений о студентах

{ cout<< “Input FIO”; gets(st_fio); strcpy(st_group.fio,st_fio);

cout << “Input year_birthday”; cin>> st_group.year_birthday;

cout<<”Input group”; gets(num_group); strcpy(st_group.group,num_group);

cout<<”Iput city”; gets(st_city); strcpy(st_group.st_adress.city,st_city);

cout<<”Iput adress”; gets(st_adr);

strcpy(st_group.st_adress.street_hous_flat,st_adr);

}

cout << “FIO year group address”<<endl;

for (int i=0; i<25; i++) // вывод сведений о студентах,

// проживающих в Омске

if (st_group.st_adress.city==”Omsk”)

{ cout<< st_group.fio<< st_group.year_birthday<<st_group.group<<

st_group.st_adress.street_hous_flat<<endl;

}

getch();

}