
- •Неоднородные типы данных. Записи (структуры)
- •В современных языках программирования логическое
- •Предположим, что нужно написать программу для деканата факультета. Эта программа должна обрабатывать информацию
- •В языке С можно так переписать приведенный выше фрагмент:
- •Объявление переменных для обработки данных одного студента, не используя новый тип
- •То, что поля структур сами могут быть структурами, позволяет целостным образом описывать достаточно
- •Техника Apple Нетбуки Доступные цены
- •Расписание авиарейсов
- •Описание структуры в программе состоит из двух этапов:
- •Примеры описания шаблона структуры:
- •Вложенные структуры
- •Пример описания вложенной структуры
- •Доступ к отдельным полям структурной переменной
- •Совмещение описания шаблона структуры и структурной переменной
- •Совмещение описания шаблона, описания структурных переменных и инициализации полей в
- •Определение объема памяти, выделяемой под структурную переменную
- •Копирование структур-переменных
- •Структурные переменные и указатели
- •Массивы структурных переменных
- •Примеры программ работы со структурами
- •Продолжение примера 1
- •Продолжение примера 1
- •Вид экрана после выполнения программы:
- •Пример 2. Поиск в массиве структур, вводимых с клавиатуры
- •Начало
- •/* Фамилии сотрудников, имеющих оклад выше среднего */
- •//Продолжение примера 2
- •//Продолжение примера 2 //Вывод списка сотрудников
- •//Продолжение примера 2
- •Какие изменения надо внести в алгоритм и программу последнего примера,
Примеры программ работы со структурами
|
|
|
Пример 1 |
|
#include <stdio.h> |
|
|
||
main() |
|
|
|
|
{ |
|
|
|
|
/* |
Описание шаблона структуры |
*/ |
||
struct Student |
|
|
|
|
|
{ char *fio; |
// Фамилия |
- указатель на char |
|
|
char |
Adress[40]; // Адрес |
- строка |
|
|
int |
Age; |
// Возраст |
- целое |
|
int |
oc[4]; |
// Оценки |
- целочис. Массив |
|
float |
sr; |
// Средний балл - вещественное |
|
|
} ; |
|
|
|
struct Student S; |
// Описание структурной переменной S |
|||
int i; |
|
|
|
|
float sr; |
|
|
|
|
Продолжение примера 1 |
|
S.fio="Петушков"; |
//Присваивание полю значения |
printf("Введите адрес студента %sa ",S.fio); |
|
gets(S.Adress); |
//Ввод значения поля |
S.Age=1987; |
//Присваивание полю значения |
S.oc[0]=3; |
|
S.oc[1]=5; |
|
S.oc[2]=4;
S.oc[3]= S.oc[2];
Продолжение примера 1
sr=0; |
//Вычисление |
for(i=0;i<=3;i++) |
//среднего |
sr=sr+S.oc[i]; |
|
sr=sr/4; |
//балла |
S.sr=sr; |
//Присваивание полю значения |
printf(" Средний балл студента %sа",S.fio);
printf(" %d года рождения,\n проживающего по адресу: %s,", S.Age,S.Adress);
printf(" равен %5.2f\n",S.sr); fflush(stdin); getchar(); return(0);
}

Вид экрана после выполнения программы:
Введите адрес студента Петушковa ул. Солнечная, д.1, кв. 4 Средний балл студента Петушкова 1987 года рождения, проживающего по адресу: ул. Солнечная, д.1, кв. 4, равен 4.00

Пример 2. Поиск в массиве структур, вводимых с клавиатуры
Условие задачи. Ввести данные об n сотрудниках некоторой фирмы: фамилия, год рождения, оклад. Вывести список сотрудников в форме таблицы и фамилии сотрудников, имеющих оклад выше среднего.
Используемые переменные: n - число сотрудников;
db – массив записей с данными о сотрудниках; s – сумма окладов сотрудников;
sr – средний оклад сотрудников; fio – имя поля "фамилия";
pay - – имя поля "оклад";
year - – имя поля "год рождения"; lfio - – длина поля "фамилия": lpay - – длина поля "оклад"; lyear - – длина поля "фамилия"; ldb - – размер массива db.

Начало
Ввод n, db
Вывод db
|
s=o |
|
|
|
|
i=o |
|
|
|
|
i<n |
Нет |
Вычисление |
|
|
|
|||
|
ДА |
|
среднего |
|
|
s=s+db[i].pay |
|
оклада |
|
|
i=i+1 |
|
|
|
|
sr=s/n |
|
|
|
|
i=o |
|
|
|
|
i<n |
Нет |
|
|
|
|
|
||
ДА |
ДА |
Нет |
Поиск |
|
db[i].pay>sr |
||||
сотрудников |
||||
|
|
|||
|
|
|
с окладом |
|
Вывод db[i].fio |
|
выше среднего |
||
|
и вывод |
|||
|
|
|
их |
|
|
i=i+1 |
|
фамилий |
|
|
|
|
||
|
Конец |
|
|
/* Фамилии сотрудников, имеющих оклад выше среднего */
#include <stdio.h> #include <string.h> main()
{
//длины полей фио, г.рожд., оклада
const int lfio=20, lyear =5, lpay =7, ldb=100; struct Man
{ char |
fio[lfio+1]; |
// фио |
int |
year; |
// год рожд. |
float |
pay; |
// оклад |
}; |
|
|
Man db[ldb]; |
// массив структур |
|
int i, n; |
|
|
float s,sr; |
|
|
//Продолжение примера 2
puts("Число записей?(1<n<=10)"); scanf("%d",&n);
for(i=0; i<n; i++)
{
puts("Фамилия? "); gets(db[i].fio); puts("Год рождения? "); scanf("&d",&db[i].year); puts("Оклад? "); scanf("&f",&db[i].pay);
}
//Продолжение примера 2 //Вывод списка сотрудников
puts(" Список сотрудников"); puts("┌──────────┬───┬────┐"); puts("│ Фамилия │ г.р. │ оклад│"); puts("├──────────┼───┼────┤"); for(i=0; i<n; i++)
printf("|%-20s|% 5d | % 7.2f |\n", db[i].fio, db[i].year, db[i].pay); puts("└──────────┴───┴────┘");

//Продолжение примера 2
//Вычисление среднего оклада s=0;
for(i=0; i<n; i++)
s+=db[i].pay; //s=s+ db[i].pay; s/=n; //s=s/n;
puts("Фамилии сотрудников, имеющих оклад выше среднего"); for(i=0;i<n;i++)
if(db[i].pay>s) printf("%-s\n",db[i].fio);
fflush(stdin);
getchar(); return 0;
}