Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Структура в качестве аргумента функцииСодержание книги
Поиск на нашем сайте Переменная структурного типа, указатель на структуру и ссылка на структуру могут быть формальными параметрами и возвращаемым значением функции. Вызов функции с передачей по значению копии структурной переменной (или ее отдельных полей) приводит к дополнительным потерям времени на запись копии структурной переменной в стек, зато манипуляции с копией не влияют на исходную переменную. По той же причине возврат функцией структурной переменной возможен (return имя_структурной_переменной), но требует затрат на размещение в стеке возвращаемого значения и последующего его копирования из стека в переменную lvalue того же типа, что и возвращаемое значение функции.
Проанализируйте примеры: void f3 (Book); // функция, получающая аргумент «структура типа Book» void f4 (Book*); // функция, получающая аргумент void f5 (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; просмотров: 94; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.196 (0.007 с.) |