Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Передача структур в качестве аргументов функций↑ ⇐ ПредыдущаяСтр 3 из 3 Содержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
Переменные-структуры можно передавать в качестве аргументов функций. Следующий фрагмент кода демонстрирует определение функции printWorker(), которая принимает структуру Worker в качестве аргумента и выводит ее на экран:
void printWorker(Worker worker) { printf("%s\n", worker.name); printf("%d\n", worker.age); printf("%g\n", worker.salary); }
Вызвать эту функцию можно, передав в нее структуру типа Worker, например, элемент массива workers:
printWorker(workers[1]);
Возврат структуры в качестве значения функции Переменные-структуры можно возвращать в качестве значения функции. Следующая функция принимает две структуры типа Worker и возвращает сотрудника с большей зарплатой:
Worker getWellPaid(Worker w1, Worker w2) { return w1.salary > w2.salary? w1: w2; }
Обратите внимание на то, что здесь используется сокращенная запись оператора if-else, эквивалентная такой конструкции:
Worker getWellPaid(Worker w1, Worker w2) { if (w1.salary > w2.salary) { return w1; } else { return w2; } }
При вызове функции getWellPaid() совместно с функцией printWorker()
Worker director = {"Андрей", 30, 5000}; Worker manager = {"Сергей", 35, 3000}; printf("Сотрудник\n\n"); printWorker(getWellPaid(director, manager)); printf("\nЗарабатывает больше\n");
получается следующий результат:
Передача структуры в качестве аргумента функции Рассмотрим следующую задачу. Объявить структуру Point (Точка) с вещественными полями x, y и z, которые задают координаты этой точки в трехмерном пространстве. Написать функцию, которая принимает два аргумента типа Point и возвращает расстояние между ними.
#include "stdafx.h" #include <iostream> using namespace std;
struct Point { float x; float y; float z; };
float sqr(float number) { return number*number; }
float getDistance(Point p, Point q) { return sqrt(sqr(p.x-q.x) + sqr(p.y-q.y) + sqr(p.z-q.z)); }
int main() { Point p = {1,2,3}; Point q = {2,3,4}; cout << getDistance(p,q)) << endl; } Возврат структур в качестве значения функции Создадим функцию, которая принимает две точки и возвращают ту из них, которая отстоит дальше от начала координат. #include <iostream> using namespace std;
struct Point { float x; float y; float z; };
float sqr(float number) { return number*number; }
float getDistance(Point p, Point q) { return sqrt(sqr(p.x-q.x) + sqr(p.y-q.y) + sqr(p.z-q.z)); }
Point farPoint(Point p1, Point p2) { Point zero = {0,0,0}; float d1 = getDistance(zero, p1); float d2 = getDistance(zero, p2); return d1>d2? p1: p2; }
int main() { Point p = {1,2,3}; Point q = {2,3,4}; Point far = farPoint(p,q); cout << far.x << " " << far.y << endl; } Примеры решения задач Задача 1. Объявите структуру Vector (Вектор) с вещественными полями x, y и z, которые задают координаты этого вектора в трёхмерном пространстве. Создайте функцию, которая принимает два аргумента типа Vector и возвращает их скалярное произведение.
#include <iostream> using namespace std; struct Vector { float x; float y; float z; }; float getScalarProduct(Vector v1, Vector v2) { return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z; } int main() { Vector vect1 = {12.3, 45.3, 2.3}; Vector vect2 = {11.2, 35.2, 17.8}; cout << getScalarProduct(vect1, vect2) << endl; return 0; }
Задача 2. Объявите структуру Point (Точка) с вещественными полями x и y, которые задают её координаты на плоскости. Объявить также структуру Circle (Окружность) с полем center типа Point, которое задает координаты центра этой окружности, и вещественным полем radius, определяющим её радиус. Создайте функцию, которая принимает в качестве аргументов окружность и точку, а возвращает true, если точка находится внутри окружности, и false – иначе.
#include <iostream> using namespace std; struct Point { float x; float y; }; struct Circle { Point center; float radius; }; float getDistance(Point p1, Point p2) { return sqrt((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y)); } bool isInside(Point p, Circle c) { float dist = getDistance(p, c.center); return dist < c.radius; } int main() { Circle circle; circle.center.x = 12.3; circle.center.y = 10.1; circle.radius = 7.8; Point point; point.x = 15; point.y = 11; IsInside(point, circle)? cout << "Внутри\n": cout << "Снаружи\n"; return 0; } Задача 3. Объявите структуру «Книга», имеющую 5 полей: название, автор, тираж, количество страниц и цена. Задайте в коде программы массив из структур и выведите их в виде таблицы.
#include <iostream> using namespace std; struct Book { char name[100]; char author[100]; int nCopies; int nPages; float price; }; Book books[] = { {"Пиковая дама", "Пушкин", 10000, 70, 300}, {"Идиот", "Достоевский", 20000, 490, 600}, {"Мастер и Маргарита", "Булгаков", 40000,340,500}, {"Совершенный код", "Макконнел", 4000,800, 900}, {"Криптография", "Смарт", 3000, 400, 550} }; int main() { setlocale(LC_ALL, "Russian"); printf("%-20s %-12s %-7s %-5s %-5s\n", "Название", "Автор", "Тираж", "Стр.", "Цена"); printf("------------------------------------\n"); for (int i=0; i<5; i++) { printf("%-20s %-12s %-7d %-5d %-5.2f\n", books[i].name, books[i].author, books[i].nCopies, books[i].nPages, books[i].price); } printf("------------------------------------\n"); return 0; }
Задача 4. На основе предыдущей программы реализовать меню из следующих пунктов: 1 – Вывод массива в виде таблицы, 2 – Сортировка массива по второму полю, 3 – Сортировка массива по третьему полю, 4 – Запись содержимого массива в файл, 0 – Выход. Каждый пункт меню реализовать в виде отдельной функции.
#include <iostream> using namespace std; struct Book { char name[100]; char author[100]; int nCopies; int nPages; float price; }; const int n=5; Book books[n] = { {"Пиковая дама", "Пушкин", 10000, 70, 300}, {"Идиот", "Достоевский", 20000, 490, 600}, {"Мастер и Маргарита", "Булгаков", 40000, 340, 500}, {"Совершенный код", "Макконнел", 4000, 800, 900}, {"Криптография", "Смарт", 3000, 400, 550} }; void printBooks() { printf("%-25s %-15s %-7s %-10s %-10s\n", "Название", "Автор", "Тираж", "Страниц", "Цена"); for (int i=0; i<5; i++) { printf("%-25s %-15s %-7d %-10d %-10.2f\n", books[i].name, books[i].author, books[i].nCopies, books[i].nPages, books[i].price); } } #define NAME 1 #define AUTHOR 2 #define N_COPIES 3 #define N_PAGES 4 #define PRICE 5 bool isGreater(Book b1, Book b2, int field) { switch(field) { case NAME: return strcmp(b1.name, b2.name) > 0; case AUTHOR: return strcmp(b1.author, b2.author) > 0; case N_COPIES: return b1.nCopies > b2.nCopies; case N_PAGES: return b1.nPages > b2.nPages; case PRICE: return b1.price > b2.price; default: return true; } } void sortBooks(int field) { for (int i=0; i<n-1; i++) { int max = i; for (int j=i+1; j<n; j++) { if (isGreater(books[max], books[j], field)) { max = j; } } Book temp = books[max]; books[max] = books[i]; books[i] = temp; } } void intoFile() { FILE* dataFile = fopen("books.txt", "w"); for (int i=0; i<5; i++) { fprintf(dataFile, "%s\n%s\n%d\n%d\n%f\n", books[i].name, books[i].author, books[i].nCopies, books[i].nPages, books[i].price); } fclose(dataFile); } int main() { setlocale(LC_ALL, "Russian"); while (true) { system("cls"); printf("1 - Вывод всех книг\n"); printf("2 - Сортировка по названию\n"); printf("3 - Сортировка по автору\n"); printf("4 - Сортировка по тиражу\n"); printf("5 - Сортировка по числу страниц\n"); printf("6 - Сортировка по цене\n"); printf("7 - Запись в файл\n"); printf("0 - Выход\n"); int choice; cin >> choice; switch (choice) { case 1: printBooks();break; case 2: sortBooks(NAME);break; case 3: sortBooks(AUTHOR);break; case 4: sortBooks(N_COPIES);break; case 5: sortBooks(N_PAGES);break; case 6: sortBooks(PRICE);break; case 7: intoFile();break; case 0: exit(EXIT_SUCCESS);break; default: printf("Ошибка\n"); } system("pause"); } return 0; }
КОНТРОЛЬНЫЕ ВОПРОСЫ
|
||||
Последнее изменение этой страницы: 2016-04-23; просмотров: 483; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.61.199 (0.007 с.) |