Структура в качестве аргумента функции 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Структура в качестве аргумента функции



Переменная структурного типа, указатель на структуру и ссылка на структуру могут быть формальными параметрами и возвращаемым значением функции.  

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

 

Проанализируйте примеры:

void f3 (Book);    // функция, получающая аргумент «структура типа Book»

void f4 (Book*); // функция, получающая аргумент
                                   //«указатель на структуру типа Book»

void f5 (Book&); // функция, получающая аргумент
                                     //«ссылка на структуру типа Book»

Book f(); // функция возвращает структуру типа Book

Book* f1(); // функция возвращает указатель на структуру типа Book

Book& f2(); // функция возвращает ссылку на структуру типа Book

 

Примеры работы со структурами

1. Определение структурного типа complex, представляющего комплексные числа, заданные в алгебраической форме, и определение структурных переменных x, y этого типа:

struct complex { float re;    //действительная часть числа

            float im;    //мнимая часть числа

} x, y;                 

 

При этом x.re – доступ к полю действительной части комплексного числа x,

              y.im – доступ к полю мнимой части комплексного числа y,

 

Тогда функции для ввода, вывода, сложения комплексных чисел могут выглядеть так:

struct complex { float re, im;}; //определение структурного типа

 

complex read ();              //прототип функции ввода комплексного числа

void print (complex);        //прототип функции вывода комплексного числа на экран

void add (complex, complex, complex*); //прототип функции сложения комплексных чисел

void add1 (const complex&, const complex&, complex&);

int main()

{

complex c1, c2, c3,c4;        //определение комплексных чисел

c1 = read();                  //вызов функции ввода числа

c2 = read();

 

add (c1, c2, &c3);    

print(c1); cout << "\t + \t" << endl;

print (c2); cout << " = " << endl;

print (c3);

cout << endl;

 

add1 (c1, c3, c4);

print(c1); cout << "\t + \t" << endl;

print (c3); cout << " = " << endl;

print (c4);

 

_getch();

return 0;

}

 

complex read()

{

complex c;

cout << "re, im:"<< endl;

cin >> c.re >> c.im;

return c;

}

 

void print (complex c)

{

 cout << c.re << " + i*" << c.im << endl;

return;

}

 

void add (complex c1, complex c2, complex *c3)

{

c3->re = c1.re +c2.re;  //или (*c3).re = c1.re + c2.re;      

c3->im= c1.im +c2.im;

return;

}

void add1 (const complex &c1, const complex &c2, complex &c3)

{

c3.re = c1.re +c2.re;      

c3.im= c1.im +c2.im;

return;

}

   

2. Определение структурного типа racion, представляющего понятие «рациональное число» и набор функций для сокращения, печати, деления рациональных чисел:

struct racion {int chis, znam;}; //определение структуры

 

void put (racion);            //прототипы функций

racion sokr (racion A);

void div (racion A, racion B, racion *C);

 

int main()

{

racion A, B, C;

puts ("racion1, racion2:?");

scanf ("%d%d%d%d", &A.chis, &A.znam, &B.chis, &B.znam); //ввод чисел

div(A, B, &C);                     //вызов функции деления чисел

printf (":"); put(A);

printf ("\tna\t"); put(B);

printf ("\n="); put(C); //вывод результата

_getch();

return 0;

}

 

 void put (racion A)   //функция выводит на экран «рациональное число»

{if (A.chis * A.znam <0) printf ("-");

A.chis = abs(A.chis);

A.znam = abs(A.znam);

printf("%d / %d", A.chis, A.znam);

}

 

void div (racion A, racion B, racion *C) //функция делит 2 рациональных числа

{

A=sokr(A);

B= sokr (B);

C->chis = A.chis*B.znam;

C->znam = A.znam*B.chis;

*C= sokr (*C);

}

 

racion sokr (racion A)  //функция выполняет сокращение «рационального числа»

{

int i, min;

if (abs(A.chis) > abs(A.znam)) min= abs(A.znam);

else min = abs(A.chis);

for (i=min; i>1; i--)

if(A.chis % i ==0 && A.znam % i ==0) break;

A.chis /=i;

A.znam /=i;

return A;

}

 

3. Рассмотрим программу, позволяющую по паре чисел (год, порядковый номер дня) получить название и число месяца:

struct date {

       int d, m, y; //день, месяц, год

        char *mname; //название месяца

} md;

     

//двумерный массив с количеством дней в месяце для високосного и невисокосного года

static int dofm[2][12]={{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},

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

 

//массив строк с названием месяцев

static char *name[ ]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

 

void monthd(date*, int); //прототип функции пересчета

//значение года передается функции в поле «год» структурной переменной,

//пересчитанные значения дня и месяца возвращаются в этой же переменной,

//поэтому значение структурной переменной передается по указателю

 

int main()

{int yd;                   //порядковый номер дня года

 cout << "god, den?";

 cin >> md.y >> yd;     //ввод значений года  и порядкового номера дня

 monthd (&md, yd);    //вызов функции пересчета

 md.mname = name[md.m];  //присваивание названия месяцу

 cout << md.d <<" " << md.mname<< endl;

 _getch();

return 0;

}

 

void monthd(date *md, int yd)

{int i, v;

 v = (!(md->y%4) && (md->y%100) ||!(md->y%400)); //проверка на високосность

 if (yd > 365+v)

   {cout << "wrong number"; _getch(); exit(1);} //проверка значения дня года

 md->d = yd;             //подготовка начального значения для поля md->d

 

 for (i=0; md->d > dofm[v][i]; i++) //пересчет порядкового значения дня года

             md->d -= dofm[v][i]; //в день месяца

 md->m=i;                          //присваивание значения месяцу

}

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 40; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.14.15.94 (0.013 с.)