Передача структуры в функцию
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

1. Можно передавать элемент структуры в качестве параметра в функцию. Тогда функция не знает, что это структура.

 

struct funds{

  char* bank;

  float fonds;

  char* name;

  float savef;

  }stan={"ПРБ", 1023.87, «Иванов И.И.», 123,45};

float sum (float, float);   

void main(void){

   printf ("У Иванова И.И.всего %.2f рубл.\n", sum(stan.fonds,stan.savef));

}

float sum(float x, float y){

return(x+y);

}

 

Функция sum() не знает, что ей передается элементы структуры, важно, что они имеют тип float.

 

2. Если нужно, чтобы она воздействовала на элемент структуры, то нужно передвать адрес элемента и далее работать через указатель определенного типа.

modify(&stan.savef);

 

3. Сообщение функции, что она имеет дело со структурой. Для этого нужно передать адрес структуры в качестве параметра.

 

struct funds {...} stan={...};

void main(void){

float sum (struct funds*);

printf ("У Иванова И.И. %.2f рублей\n", sum(&stan));

 }

 float sum (stuct funds* money){

return(money->fonds+money->savef);

 }

 

Указатель money ссылается на структуру funds. В отличие от массива имя структуры не является её адресом, поэтому указываем адрес &stan.

 

4. Имеется массив структур. В этом случае имя массива является его адресом.

 

struct funds {...}stans[2]={{...},{...}};

void main(void){

float sum (struct funds*);

printf ("Всего капитала %.2f рублей\n", sum(stans));

}

float sum(struct funds* money){

float summ;

int i;

for (i=0, summ=0;i<2; i++, money++)

     summ+=money->fonds+money->savef;

return (summ);

}

money <=> &stan[0]; увеличивается money++, ссылаемся на stan[1].

 

Пример 1. Определить номер дня в году.

struct date { int day; int month;

         int year; int yearday;}d={25,3,1999};

int date_tab[2][13]={{ 0,31,28,31,30,31,30,31,31,30,31,30,31},

                              { 0,31,29,31,30,31,30,31,31,30,31,30,31}};

int day_of_year(struct date *pd) {

int i, day, l=0;

day = pd->day;

if(pd->year%4==0&&pd->year%100!=0||pd->year%400==0)     //год высок.

       l=1;

for(i=0; i< pd->month; i++)

       day+=date_tab[l][i];

return(day);

}

void main(void) {

d.yearday=day_of_year(&d); - вызов функции.

printf(“%d“, d.yearday);

}

Объединения

 

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

Определяется также как и структура. Кючевое слово union . Есть шаблон определения и переменные этого типа.

 

union simbl {

int digit;

       double bigfl;

       char letter;

};

union simbl fit, save[10], *pu.

 

Компилятор выделяет память по наибольшему из элементов объединения bigfl (double 8 байт), для массива структур save[10] будет выделено (10 x 8) байт.

Как обращаться к элементу объеденения?

fit.digit=23; (использ. 2байта)

fit.bigfl=2.0 (23 стирается и записывается 2.0)

fit.letter='a' (2.0 стирается и записывается'a'в 1байт)

pu=&fit; x=pu->digit;

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

В С++ можно создавать «безымянные» объединения. В объявлении безымянного объединения отсутствует как тег объединения, так и список объектов этого типа:

 

union {

int digit;

       double bigfl;

       char letter;

};

 

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

digit=23;        

bigfl=2.0        

Безымянные объединения очень удобно использовать в качестве членов структур.

 

Синоним имени типа

 

Встречаются ситуации, когда удобно ввести синоним для имени некоторого типа.

Строится синоним имени с помощью ключевого слова typedef.

Примеры:

typedef int INT      //INT-синоним типа int

INT x, y;

 

typedef unsigned size_t;

size_t x, y;              //переменная типа unsigned

 

typedef char string[225];

string array;            //char array[225];

 

1. Функция typedef даёт имена типам данных.

2. Выполняется компилятором.

3. Более гибка, чем #define.

 

Испоьзование типа real вместо float:

typedef float real;

real x, y[5], *px;

если определение расположено внутри функции, то область действия локальна, вне функции глобальна.

typedef char* STRING     //STRING-идинтификатор указателя на тип char.

STRING name, sign;       //char*name,*sign;

 

Дата: 2018-12-21, просмотров: 354.