Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 25.11.2008 | Доступ: свободный | Студентов: 9592 / 1296 | Оценка: 4.06 / 3.66 | Длительность: 21:16:00
Лекция 10:

Пользовательские типы данных

< Лекция 9 || Лекция 10: 123 || Лекция 11 >

9.1.2. Структуры – параметры функций

Если функция не изменяет структуру, то такую структуру можно передать по значению.

Пример 9.1. Отображение полей структуры на экране дисплея

#include <iostream.h>
#include <conio.h>
  struct book {
    char title[40];
    char authors[30];
    char publishing_house[15];
    int year;
    int pages;
    float price;
  };
void show_book(book b)
{ cout << "Title: "<< b.title << endl;
  cout << "Authors: "<< b.authors << endl;
  cout << "Publishing house: "<< b. publishing_house << endl;
  cout << "Year: "<< b.year << endl;
  cout << "Pages: " << b.pages << endl;
  cout << "Price: " << b.price << endl;
}
void main()
{ book a={"Programming Languages", "Jean E.Sammet",
		"Prentice-Hall", 1969,785,49.99};
  show_book(a);
  getch();
}
//=== Результат работы ===

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

Пример 9.2. Параметр функции – указатель на структуру.

#include <iostream.h>
#include <conio.h>
  struct book {
    char title[40];
    char authors[30];
    char publishing_house[15];
    int year;
    int pages;
    float price;
  };
void input_book(book *b)	//структура передается по указателю
{ cout << "Title: ";
  cin >> b->title;
  cout << "Authors: ";
  cin >> b->authors;
  cout << "Publishing house: ";
  cin >> b->publishing_house;
  cout << "Year: ";
  cin >> b->year;
  cout << "Pages: ";
  cin >> b->pages;
  cout << "Price: ";
  cin >> b->price;
}
void main()
{ book a,*pa=&a;
  input_book(pa);
  getch();
}

Пример 9.3. Параметр функции – ссылка на структуру

#include <iostream.h>
#include <conio.h>
  struct book {
    char title[40];
    char authors[30];
    char publishing_house[15];
    int year;
    int pages;
    float price;
  };
void input_book(book &b)	//структура передается по ссылке
{ cout << "Title: ";
  cin >> b.title;
  cout << "Authors: ";
  cin >> b.authors;
  cout << "Publishing house: ";
  cin >> b.publishing_house;
  cout << "Year: ";
  cin >> b.year;
  cout << "Pages: ";
  cin >> b.pages;
  cout << "Price: ";
  cin >> b.price;
}
void main()
{ book a;
  input_book(a);
  getch();
}

В некоторых таблицах используются многоэтажные шапки, когда определенное поле заголовка, в свою очередь, распадается на несколько полей. Такая же ситуация может встретиться и в структурах, когда в качестве очередного поля выступает другая структура. И уровень вложения таких полей ничем не ограничен.

Пример 9.4. Вложенные структуры

struct Point {int x; int y;};
struct Line {Point P1; Point P2;}
  Line ab;
  ab.P1.x=5;
  ab.P1.y=5;
  ab.P2.x=25;
  ab.P2.y=30;

Конечно, приведенная выше запись не являет образец компактности в программе, но она демонстрирует составные имена, обеспечивающие доступ к вложенным полям.

9.1.3.Функции, возвращающие структуры

Функции могут не только получать структуры в качестве своих параметров, но и возвращать результаты в виде структур. И это означает, что функция, возвращающая значение может иметь в качестве результата своей работы совокупность значений полей соответствующей структуры.

Пример 9.5. Функции g1, g2 и g3 возвращают структуру

#include <iostream.h>
#include <conio.h>
struct ss {int a; float b; };
ss g1(ss v)		//параметр - значение
{ v.a=7; v.b=8; return v; }
ss g2(ss &v)		//параметр - ссылка
{ v.a=v.b+7; v.b=v.a+8; return v; }
ss g3(const ss &v)	//параметр - константная ссылка
{ ss q;
  q.a=v.b+7; q.b=v.a+8; return q;
}
void main()
{ ss x1,y1={1,2};
  ss x2,y2={3,4};
  ss x3,y3={5,6};
  x1=g1(y1);
  cout << "x1=" << x1.a << '; ' << x1.b << endl;
  cout << "y1=" << y1.a << '; ' << y1.b << endl;
  y1=g1(y1);
  cout << "x1=" << x1.a << '; ' << x1.b << endl;
  cout << "y1=" << y1.a << '; ' << y1.b << endl;
  x2=g2(y2);
  cout << "x2=" << x2.a << '; ' << x2.b << endl;
  cout << "y2=" << y2.a << '; ' << y2.b << endl;
  x3=g3(y3);
  cout << "x3=" << x3.a << '; ' << x3.b << endl;
  cout << "y3=" << y3.a << '; ' << y3.b << endl;
  y3=g3(y3);
  cout << "x3=" << x3.a << '; ' << x3.b << endl;
  cout << "y3=" << y3.a << '; ' << y3.b << endl;
  getch();
}
//=== Результат работы ===
x1=7; 8         //x1 - изменился
y1=1; 2         //y1 - не изменился
x1=7; 8         //x1 - не изменился
y1=7; 8         //y1 - изменился
x2=11; 19       //x2 - изменился
y2=11; 19       //y2 - изменился
x3=13; 13       //x3 - изменился
y3=5; 6         //y3 - не изменился
x3=13; 13       //x3 - не изменился
y3=13; 13       //y3 - изменился

9.1.4. Структуры в языке C++

В языке C++ структуры послужили прообразом классов. Их основное отличие от структур языка C в том, что теперь структуры могут объединять разнородные данные с функциями – методами их обработки. Часть компонент структуры может быть доступна всем пользователям, другая часть может быть сокрыта, т.к. предназначена для выполнения внутренних задач. Однако со всеми этими особенностями структур мы будем знакомиться после изучения основ объектно-ориентированного программирования.

< Лекция 9 || Лекция 10: 123 || Лекция 11 >
Alexey Ku
Alexey Ku

Попробуйте часть кода до слова main заменить на 

#include "stdafx.h" //1

#include <iostream> //2
#include <conio.h>

using namespace std; //3

Александр Талеев
Александр Талеев

#include <iostream.h>
#include <conio.h>
int main(void)
{
int a,b,max;
cout << "a=5";
cin >> a;
cout <<"b=3";
cin >> b;
if(a>b) max=a;
else max=b;
cout <<" max="<<max;
getch();
return 0;
}

при запуске в visual express выдает ошибки 

Ошибка    1    error C1083: Не удается открыть файл включение: iostream.h: No such file or directory    c:\users\саня\documents\visual studio 2012\projects\проект3\проект3\исходный код.cpp    1    1    Проект3

    2    IntelliSense: не удается открыть источник файл "iostream.h"    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    1    1    Проект3

    3    IntelliSense: идентификатор "cout" не определен    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    6    1    Проект3

    4    IntelliSense: идентификатор "cin" не определен    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    7    1    Проект3

при создании файла я выбрал пустой проект. Может нужно было выбрать консольное приложение?