Доступ к элементам структур через указатель



Указатель на структуру обеспечивает доступ к ее элементам двумя способами:

(*УказательНаСтруктуру).ИмяЭлемента

или

УказательНаСтруктуру->ИмяЭлемента

В первом случае круглые скобки необходимы, чтобы учесть приоритет операций.

Во втором случае используется операция "стрелка" ( -> ), которая называется операцией косвенного выбора элемента структурного объекта, адресуемого указателем.

Например:

(*pinega).mass эквивалентно pinega -> mass

(*pinega).coord[0] эквивалентно pinega -> coord[0]

 

Пример 6 .

#include "stdafx.h"

#include <stdio.h>

#include <string.h>

#include <iostream>

using namespace std;

struct student {

           char name[10];

           char surname[15];

           int age;

          } stud; 

  //переменная stud объявлена как структура типа student

int _tmain(int argc, _TCHAR* argv[]) {

struct student *s; // указатель на структуру student

s=&stud;       // инициализация указателя

strcpy(s->name,"Larry");

//обращение как к указателю на структуру

strcpy(s->surname,"Johnson");

(*s).age=34; //обращение как к переменной

printf("\n Имя: %s \n Фамилия: %s \n Возраст = %i",

      s->name,s->surname,s->age);

system("pause");

return 0;

}

Операции над указателями на структуры

Эти операции не отличаются от операций над другими указателями на данные. Исключение составляет операция "стрелка" ( -> ). Если присвоить указателю на структуру конкретного структурного типа значение адреса одного из элементов массива структур того же типа, то, изменяя значение указателя (например, с помощью операций ++ или -- ), можно равномерно "перемещаться" по массиву структур.

 

Пример 7 . Вычислить сумму заданного количества комплексных чисел, представленных в программе массивом структур.

#include "stdafx.h"

#include <iostream>

using namespace std;

#include <stdio.h>

struct complex {//Опредение структуры

           float x;

           float y;

          }array[]={1.0,2.0,3.0,-4.0,-5.0,-6.0,-7.0,-8.0};

struct complex summa = {0.0, 0.0};

struct complex *point = &array[0];

 

int _tmain(int argc, _TCHAR* argv[]) {

int i;

int k;

k=sizeof(array)/sizeof(array[0]);

for (i=0; i<k; i++){

summa.x+=point->x;  

summa.y+=point->y; }

printf("\n Сумма: real=%f, \t imag=%f", summa.x, summa.y);

system("pause");

return 0;

}

 

Пример 8 . Программа считывает системное время компьютера и переводит его во время по Гринвичу.

#include "stdafx.h"

#include <iostream>

using namespace std;

#include <time.h>

int _tmain(int argc, _TCHAR* argv[]) {

struct tm {

int tm_sec; //Секунды

int tm_min; //Минуты

int tm_hour; //Часы (0-23)

int tm_mday; //День месяца (1-31)

int tm_mon; //Месяц (0-11)

int tm_year; //Год (календарный год минус 1900)

int tm_wday; //День недели (0-6; Воскресенье = 0)

int tm_yday; //День года (0-365)

int tm_isdst;

//0, если переход на летнее время не используется

};

time_t t;

struct tm *gmt, *area;

t = time(NULL);

//Преобразует дату и время в структуру

area=localtime(&t);

printf("Секунды: %d\n", area->tm_sec);

printf("Минуты: %d\n", area->tm_min);

printf("Часы: %d\n", area->tm_hour);

printf("День: %d\n", area->tm_mday);

printf("Месяц: %d\n", area->tm_mon);

printf("Год: %d\n", area->tm_year);

printf("День недели: %d\n", area->tm_wday);

printf("День года: %d\n", area->tm_yday);

printf("Местное время: %s", asctime(area));

//Преобразуем структуру в строку

gmt=gmtime(&t);

//Преобразует дату и время во время по Гривинчу

printf("Время по Гринвичу: %s", asctime(gmt));

system("pause");

return 0;

}

 

Структуры и функции

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

Например:

//Определение структурного типа

struct person {

          char *name;

          int age;

         };

· Функция может возвращать структуру как результат:

· //Прототип функции

struct person f (int N);

· Функция может возвращать указатель на структуру:

· //Прототип функции

struct person *ff (void);

· Параметром функции может быть структура:

· //Прототип функции

void fff (struct person str);

· Параметром функции может быть указатель на объект структурного типа:

· //Прототип функции

void ffff (struct person *pst);

При вызове функции fff() выделяется память для формального параметра, т.е. для вспомогательного объекта типа struct person. В этот объект переносится значение фактического параметра, заменяющего формальный параметр – структуру str. Далее выполняются действия, предусмотренные операторами тела функции fff(). Эти действия не могут изменять структуру, использованную в качестве фактического параметра.

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

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

 

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

#include "stdafx.h"

#include <iostream>

using namespace std;

struct book {

char title[40];

char authors[30];

char publishing_house[25];

int year;

int pages;

};

void show_book(book b) {

cout << "Название: "<< b.title<<"\n";

cout << "Автор: "<< b.authors<<"\n";

cout << "издательство: "<< b. publishing_house<<"\n";

cout << "Год: "<< b.year<<"\n";

cout << "Количество страниц: " << b.pages<<"\n";

}

 

int _tmain(int argc, _TCHAR* argv[]) {

book a={"Программирование на языке Си", "Подбельский В.В.",

     "Финансы и статистика", 2004, 600};

show_book(a);

system("pause");

return 0;

}

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

 

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

#include "stdafx.h"

#include <iostream>

using namespace std;

struct book {

char title[40];

char authors[30];

char publishing_house[15];

int year;

int pages;

};

void input_book(book *b){ //структура передается по указателю

cout << "Название: ";

cin >> b->title;

cout << "Автор: ";

cin >> b->authors;

cout << "Издательство: ";

cin >> b->publishing_house;

cout << "Год: ";

cin >> b->year;

cout << "Количество страниц: ";

cin >> b->pages;

}

 

int _tmain(int argc, _TCHAR* argv[]) {

book a,*pa=&a;

input_book(pa);

system("pause");

return 0;

}

 

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

#include "stdafx.h"

#include <iostream>

using namespace std;

struct book {

char title[40];

char authors[30];

char publishing_house[15];

int year;

int pages;

};

void input_book(book &b) { //структура передается по ссылке

cout << "Название: ";

cin >> b.title;

cout << "Автор: ";

cin >> b.authors;

cout << "Издательство: ";

cin >> b.publishing_house;

cout << "Год: ";

cin >> b.year;

cout << "Количество страниц: ";

cin >> b.pages;

}

 

int _tmain(int argc, _TCHAR* argv[]) {

book a;

input_book(a);

system("pause");

return 0;

}

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

 

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

#include "stdafx.h"

#include <iostream>

using namespace std;

 

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;

}

 

int _tmain(int argc, _TCHAR* argv[]) {

ss x1,y1={1,2};

ss x2,y2={3,4};

ss x3,y3={5,6};

x1=g1(y1);

cout << "x1=" << x1.a << "; " << x1.b << "\n";

cout << "y1=" << y1.a << "; " << y1.b << "\n";

y1=g1(y1);

cout << "x1=" << x1.a << "; " << x1.b << "\n";

cout << "y1=" << y1.a << "; " << y1.b << "\n";

x2=g2(y2);

cout << "x2=" << x2.a << "; " << x2.b << "\n";

cout << "y2=" << y2.a << "; " << y2.b << "\n";

x3=g3(y3);

cout << "x3=" << x3.a << "; " << x3.b << "\n";

cout << "y3=" << y3.a << "; " << y3.b << "\n";

y3=g3(y3);

cout << "x3=" << x3.a << "; " << x3.b << "\n";

cout << "y3=" << y3.a << "; " << y3.b << "\n";

system("pause");

return 0;

}

Задания для выполнения

1. Описать переменную "студент", содержащую: имя, фамилию, отчество, название учебного заведения, номер группы. Создать список студентов ( N>10 ). Определить и распечатать фамилии студентов, учащихся заданной группы и заданного учебного заведения.

2. Описать переменную "круг", в которой содержатся все данные для построения круга на плоскости в декартовой системе координат. Определить площадь круга и длину окружности, ограничивающей круг.

3. Разработайте структуру, содержащую сведения о результатах ЕГЭ по предмету: Фамилия, Имя, Отчество, Число баллов по первому предмету, Число баллов по второму предмету, Число баллов по третьему предмету. Разработайте функцию, определяющую результат поступления абитуриента по заданному проходному баллу. Введите сведения об N абитуриентах и выведите результаты зачисления по образцу (данные, введенные пользователем, выделены жирным шрифтом):

Введите проходной балл на специальность: 255

Введите количество абитуриентов: 5

Сведения о 1 абитуриенте

Фамилия: Петров

Имя: Федор

Отчество: Степанович

Число баллов по первому предмету: 84

Число баллов по второму предмету: 76

Число баллов по третьему предмету: 95

Результат: зачислен

...

4. Разработайте структуру, описывающую комплексное число. Разработайте функции, выполняющие с комплексными числами четыре арифметические операции (+, -, *, /). Введите два комплексных числа и знак операции. Выведите результат.

5. Индивидуальное задание.  

Поля структуры Задача
1. Фамилия Имя Отчество Пол Должность Дата рождения Вывести данные об инженерах, пенсионного возраста (мужчинам больше 65-ти лет, женщинам 60).
2. № поезда Пункт и время прибытия Пункт и время отбытия Вывести все сведения о поездах, время пребывания в пути которых превышает 7 часов 20 минут.
3. Фамилия Имя Отчество Должность Зарплата Дата рождения Вывести сведения о сотрудниках, у которых зарплата выше средней и возраст менее 30-ти лет.
4. Марка автомобиля Производитель Тип Год выпуска Дата регистрации Вывести сведения о машинах марки “Toyota” и зарегистрированных до 2007-го года.
5. Фамилия Имя Отчество Должность Зарплата Дата рождения Вывести сведения о сотрудниках, которые родились в мае.
6. № поезда Время прибытия Время отбытия Направление Расстояние Вывести среднюю скорость каждого поезда.
7. Фамилия Имя Отчество Должность Пол Дата приема на работу Определить средний стаж работы и вывести все сведения о сотрудниках, стаж которых выше среднего.
8. Фамилия Имя Отчество Должность Зарплата Дата рождения Вывести данные о самом молодом сотруднике.
9. Марка автомобиля Производитель Тип Год выпуска Дата регистрации Вывести сведения о машинах марки “Ford” и зарегистрированных до 2000-го года.
10. Название фильма Дата и время сеанса Продолжительность сеанса Жанр Бюджет Вывести данные о фильмах, начинающихся после 18:00 и продолжительностью сеанса более 1 часа 40 минут.
11. Наименование Дата производства Срок годности Цена № серии Вывести наименование товара и конечную дату применения (годен до:).
12. Фамилия Дата и место рождения Амплуа Количество игр Количество желтых карточек Вывести сведения о футболистах, старших 20- лет и получающих не более 1 карточки за 10 игр.
13. Марка автомобиля Производитель Грузоподъемность Год выпуска Дата регистрации Вывести сведения о машинах, зарегистрированных более года назад и имеющих грузоподъемность более 3-х тонн.
14. Фамилия работника Должность Дата подписания контракта Срок действия контракта Оклад Вывести сведения о работниках, срок действия контракта, которых истекает в течении 5-ти дней.
15. № поезда Направление Время прибытия Время отбытия Расстояние Вывести данные о поездах, пребывающих в пути более суток.
16. № Авиарейса Время вылета Время прилета Направление Марка самолета Расстояние Вывести данные об авиарейсе с максимальной скоростью.
17. Наименование Дата производства Срок годности Цена № серии Вывести товары, срок годности которых заканчивается в течении 5-ти суток.
18. Наименование Цена Дата производства Срок годности Количество Производитель Вывести сведения о товарах, срок годности которых менее 20-ти дней. Определить количество просроченных товаров.
19. Фамилия Дата рождения Клуб Амплуа Количество игр Место рождения Вывести сведения о защитниках, младше 20- лет и сыгравших за свой клуб более 40-ка матчей.
20. № Авиарейса Время вылета Время прилета Направление Марка самолета Расстояние Вывести данные об авиарейсе с максимальной длительностью полета.
21. Фамилия Имя Отчество Должность Пол Дата приема на работу Вывести все сведения о сотрудниках, стаж которых превышает 10 лет.
22. Марка автомобиля Производитель Тип Год выпуска Дата регистрации Вывести сведения о машинах, произведенных до 2005-го года и зарегистрированных в этом году.
23. Фамилия работника Должность Дата подписания контракта Срок действия контракта Оклад Вывести сведения о работниках, подписавших контракт менее года назад.
24. Название фильма Дата и время сеанса Продолжительность сеанса Жанр Бюджет Вывести данные о фильмах, начинающихся до 18:00 и продолжительностью сеанса менее 1 часа 30 минут.
25. Фамилия Дата рождения Амплуа Количество игр Количество забитых мячей Место рождения Вывести сведения о футболистах, старших 20-ти лет и забивающих за игру не менее 0,4 мяча.
26. Фамилия Имя Отчество Должность Зарплата Дата рождения Вывести сведения о сотрудниках, которые родились в сентябре и зарплата которых больше 20000.
27. Название фильма Дата и время сеанса Продолжительность сеанса Жанр Бюджет Вывести данные о фильмах, начинающихся после 19:00 и жанр «комедия».

 


Дата добавления: 2021-07-19; просмотров: 856; Мы поможем в написании вашей работы!

Поделиться с друзьями:






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