Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 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; просмотров: 40; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.14.15.94 (0.013 с.) |