практику

advertisement
9.
Структуры
9.1. Пример решения простой задачи
Задача:
Личная библиотека. Картотека домашней библиотеки содержит выходные данные книги
(авторы, название, издательство, год издания). Обеспечить поиск книг в картотеке по
заданному автору.
Решение:
Программа состоит из двух программных модулей (library, auxiliaries) и основной функции
(main.c). В модуле library описаны основные структуры данных и функция поиска книг
согласно поставленной задаче. Модуль auxiliaries содержит вспомогательные функции
загрузки информации о книгах из файла, печати результатов поиска и освобождения
памяти из-под созданных структур данных.
/* library.h */
#ifndef __LIBRARY_H__
#define __LIBRARY_H__
#include <string.h>
#include <stdlib.h>
// определение константы длины имени автора книги
#define AUTHOR_NAME_LEN 50
// определение константы длины названия книги
#define BOOK_NAME 255
// определение константы длины названия издательства
#define PUBLISHER_NAME 255
// определение структуры для представления одной книги
typedef struct
{
// имя автора
char Author[AUTHOR_NAME_LEN];
// название книги
char Name[BOOK_NAME];
// название издательства
char Publicher[PUBLISHER_NAME];
// год издания
int Year;
} Book;
/*
void findBooks(Book *books, int kBooks, char *author,
int **indeces, int *kIndeces);
Назначение:
1
Функция поиска книг заданного автора
Входные данные:
books - множество книг
kBooks - количество книг во входном множестве
author - автор, поиск книг которого выполняется
Выходные данные:
Массив индексов книг indeces заданного автора
*/
void findBooks(Book *books, int kBooks, char *author,
int **indeces, int *kIndeces);
#endif
/* library.c */
#include "library.h"
// реализация функции поиска книг заданного автора
void findBooks(Book *books, int kBooks, char *author,
int **indeces, int *kIndeces)
{
int i = 0, kAuthorBooks = 0;
// 1. определение количество книг заданного автора
// цикл по всем книгам
for (; i < kBooks; i++)
{
// если имя автора совпадает с заданным именем
// (проверяется вхождение строки author
// в strstr(books[i].Author)),
if (strstr(books[i].Author, author) != 0)
{
// то увеличивается количество книг автора на 1
kAuthorBooks++;
}
}
// 2. выделение памяти под результат
*kIndeces = kAuthorBooks;
*indeces = (int *)malloc(sizeof(int) * kAuthorBooks);
kAuthorBooks = 0;
// заполнение массива индексов книг
// цикл по всем книгам
for (i = 0; i < kBooks; i++)
{
// если имя автора совпадает с заданным именем
// (проверяется вхождение строки author
// в strstr(books[i].Author)),
if (strstr(books[i].Author, author) != 0)
{
// то запоминается индекс книги и текущий
// индекс сдвигается на 1
(*indeces)[kAuthorBooks++] = i;
2
}
}
}
/* auxiliaries.h */
#ifndef __AUXILIARIES_H__
#define __AUXILIARIES_H__
#include <stdio.h>
#include "library.h"
// определение константы максимальной длины строки файла
#define MAX_LINE_LEN 255
// определение функции чтения информации о книгах из файла
int readBooksInfo(char *fileName, Book **books, int *kBooks);
// определение функции печати информации о книгах, принадлежащих
одному автору
void printAuthorBooks(Book *books, int kBooks, int *indeces, int
kIndeces);
// определение функции освобождения памяти из-под массива,
// содержащего информацию о книгах
int freeBooksInfo(Book **books, int *kBooks);
#endif
/* auxiliaries.c */
#include "auxiliaries.h"
// реализация функции чтения информации о книгах из файла
int readBooksInfo(char *fileName, Book **books, int *kBooks)
{
int i = 0;
char line[MAX_LINE_LEN], *p = NULL;
// открытие файла на чтение
FILE *f = fopen(fileName, "r");
// если файл не открыт,
if (f == 0)
{
// то печатается соответствующее сообщение
printf("File \'%s\' was not opened.\n", fileName);
// выход из подпрограммы с кодом ошибки 1
return 1;
}
// чтение количества книг из файла (первая строка
// содержит данное значение)
fscanf(f, "%d\n", kBooks);
// выделение памяти для массива, содержащего информацию
// о всех книгах
*books = (Book *)malloc(sizeof(Book) * (*kBooks));
3
// цикл по всем строкам файла
for (; i < *kBooks; i++)
{
// чтение очередной строки файла
fgets(line, MAX_LINE_LEN, f);
// выделение лексемы из строки line до первого
// вхождения символа ;
// p - указатель на соответствующую лексему
p = strtok(line, ";");
// копирование строки, которая хранится
// по указателю p, - имя автора
memcpy((*books)[i].Author, p, strlen(p));
(*books)[i].Author[strlen(p)] = '\0'; // установка
признака конца строки
// выделение лексемы из исходной строки, начиная с
// позиции, которой заканчивается последняя
// найденная лексема
p = strtok(NULL, ";");
// копирование строки, которая хранится
// по указателю p, - название книги
memcpy((*books)[i].Name, p, strlen(p));
(*books)[i].Name[strlen(p)] = '\0'; // установка
признака конца строки
// выделение лексемы из исходной строки, начиная с
// позиции, которой заканчивается последняя
// найденная лексема
p = strtok(NULL, ";");
// преобразование строки, которая хранится по указателю
// p, в число - год издания книги
(*books)[i].Year = atoi(p);
// выделение лексемы из исходной строки, начиная с
// позиции, которой заканчивается последняя
// найденная лексема
p = strtok(NULL, ";");
// копирование строки, которая хранится
// по указателю p, - название издательства
memcpy((*books)[i].Publicher, p, strlen(p));
(*books)[i].Publicher[strlen(p)] = '\0'; // установка
признака конца строки
}
// закрытие файла
fclose(f);
// выход из подпрограммы
return 0;
}
// реализация функции печати информации о книгах,
// принадлежащих одному автору
void printAuthorBooks(Book *books, int kBooks, int *indeces,
int kIndeces)
{
int idx = 0;
// печать горизонтальной разделяющей линии,
4
// содержащей символ '-'
printf("-------------------------------------\n");
// вывод имени автора, чьи книги далее будут перечислены
printf("Перечень книг автора \"%s\":\n",
books[indeces[idx]].Author);
// проход по всем индексам книг заданного автора
for (; idx < kIndeces; idx++)
{
// печать номера и названия книги
printf("%d. %s\n", idx + 1, books[indeces[idx]].Name);
}
// печать горизонтальной разделяющей линии,
// содержащей символ '-'
printf("-------------------------------------\n");
}
// реализация функции освобождения памяти из-под массива,
// содержащего информацию о книгах
int freeBooksInfo(Book **books, int *kBooks)
{
// если область памяти была освобождена ранее,
if (*books == 0)
{
// то выход из подпрограммы с кодом ошибки 1
return 1;
}
// освобождение области памяти
free(*books);
// дополнительное обнуление числа книг
*kBooks = 0;
return 0;
}
/* main.c */
#include <stdio.h>
#include <locale.h>
#include "library.h"
#include "auxiliaries.h"
// объявление строковой константы, содержащей строку помощи
const char *helper =
"1_StuctureExample.exe <file> <author>\n\
\t<file>
- input file name\n\
\t<author> - author for searching\n\
";
// определение функции для обработки аргументов командной строки
int processArguments(int argc, char **argv, char **fileName,
Book **books, int *kBooks, char **author);
int main(int argc, char **argv)
{
5
char *fileName = 0, *author = 0;
int kBooks, *indeces = 0, kIndeces;
Book *books;
// установка локализации "Russian",
// связанной с категорией LC_CTYPE
setlocale(LC_CTYPE, "Russian");
// если обработка аргументов командной строки
// прошла неуспешно,
if (processArguments(argc, argv, &fileName, &books,
&kBooks, &author) != 0)
{
// то печать строки помощи
printf("%s\n", helper);
// выход из программы с кодом ошибки 1
return 1;
}
// вызов функции поиска книги заданного автора
findBooks(books, kBooks, author, &indeces, &kIndeces);
// вызов функции печати книг заданного автора
printAuthorBooks(books, kBooks, indeces, kIndeces);
// вызов функции освобождения памяти, занятой для хранения
// информации о всех книгах
freeBooksInfo(&books, &kBooks);
// освобождение памяти из-под массива индексов
// книг заданного автора
free(indeces);
// выход из основной функции
return 0;
}
// реализация функции для обработки аргументов командной строки
int processArguments(int argc, char **argv, char **fileName,
Book **books, int *kBooks, char **author)
{
// аргумент с индексом 0 - название исполняемого модуля
// аргумент с индексом 1 - имя файла с информацией о книгах
// аргумент с индексом 2 - имя автора для поиска книг
// если число аргументов командной строки меньше трех,
if (argc < 3)
{
// то выход из подпрограммы с кодом ошибки 1
return 1;
}
// получение аргумента с индексом 1 - имени файла
// с информацией о книгах
*fileName = argv[1];
// чтение из файла информации о книгах
// если чтение прошло неуспешно,
if (readBooksInfo(*fileName, books, kBooks) != 0)
{
// то выход из подпрограммы с кодом ошибки 1
return 1;
6
}
// выделение аргумента с индексом 2 - имени автора
// для поиска книг
*author = argv[2];
// выход из подпрограммы
return 0;
}
9.2. Пример решения задачи средней сложности
Задача:
Стадион. Информация о стадионах содержит название, список видов спорта, год
постройки, адрес (почтовый индекс, страна, область, район, город, улица, дом),
вместимость (количество зрителей), количество площадок (арен). Определить два самых
крупных (по вместимости) стадиона.
Решение:
Программа состоит из двух программных модулей (library, auxiliaries) и основной функции
(main.c). В модуле library описаны основные структуры данных и функция поиска
стадионов согласно поставленной задаче. Модуль auxiliaries содержит вспомогательные
функции загрузки информации о стадионах из файла, печати результатов поиска и
освобождения памяти из-под созданных структур данных.
/* library.h */
#ifndef __LIBRARY_H__
#define __LIBRARY_H__
#include <stdlib.h>
// определение константы максимального числа символов в индексе
#define MAX_LEN_POSTAL_CODE 7
// определение константы максимальной длины названия вида спорта
#define MAX_LEN_SPORT_NAME 30
// определение константы максимальной длины имени
#define MAX_LEN_NAME 100
// определение структуры для представления адреса стадиона
typedef struct
{
// почтовый индекс
char PostalCode[MAX_LEN_POSTAL_CODE];
// название страны
char Country[MAX_LEN_NAME];
// название области
char Restrict[MAX_LEN_NAME];
// название региона
char Region[MAX_LEN_NAME];
// название города
7
char Town[MAX_LEN_NAME];
// название улицы
char Street[MAX_LEN_NAME];
// название (номер) дома
char House[MAX_LEN_NAME];
} Address;
// определение структуры для представления информации
// об одном стадионе
typedef struct
{
// название стадиона
char Name[MAX_LEN_NAME];
// адрес стадиона
Address ActualAddress;
// перечень видов спорта
char **Sports;
// количество видов спорта
int SportsNumber;
// год постройки стадиона
int Year;
// вместимость стадиона
int Content;
// количество площадок
int GroundsNumber;
} Stadium;
/*
int findLargeStadiums(Stadium *stadiums, int kStadiums,
int *idx1, int *idx2);
Назначение:
Функция поиска двух самых крупных по вместимости стадионов
Входные данные:
stadiums - множество стадионов
kStadiums - количество стадионов
Выходные данные:
idx1 - индекс первого по вместимости стадиона
idx2 - индекс второго по вместимости стадиона
*/
int findLargeStadiums(Stadium *stadiums, int kStadiums,
int *idx1, int *idx2);
#endif
/* library.c */
#include "library.h"
// реализация функции поиска двух самых крупных
// по вместимости стадионов
int findLargeStadiums(Stadium *stadiums, int kStadiums,
8
int *idx1, int *idx2)
{
int i, maxContent1, maxContentIdx1, maxContent2,
maxContentIdx2;
*idx1 = -1;
*idx2 = -1;
// если указатель на массив данных о стадионах не нулевой,
if (stadiums == NULL)
{
// то выход из подпрограммы с кодом ошибки 1
return 1;
}
// если в массиве всего 1 стадион,
if (kStadiums == 1)
{
// то он первый самый крупный по вместимости стадион
// второго стадиона нет
*idx1 = 0;
// выход из подпрограммы с кодом ошибки 1
return 2;
}
// принимается, что первый стадион в массиве максимальный
// по вместимости
maxContentIdx1 = 0;
maxContent1 = stadiums[0].Content;
// цикл по оставшимся стадионам
for (i = 1; i < kStadiums; i++)
{
// если вместимость стадиона больше текущего максимума,
if (stadiums[i].Content > maxContent1)
{
// то сохраняется индекс стадиона
maxContentIdx1 = i;
// и изменяется текущий максимум
maxContent1 = stadiums[i].Content;
}
}
// установка индекса первого по вместимости стадиона
*idx1 = maxContentIdx1;
// принимается, что первый стадион в массиве второй
// самый крупный
// по вместимости
maxContentIdx2 = 0;
maxContent2 = stadiums[0].Content;
// если первый стадион уже является первым самым крупным
// по вместимости,
if (maxContentIdx2 == maxContentIdx1)
{
// то принимается, что следующий стадион является
// вторым по вместимости
maxContentIdx2 = 1;
maxContent2 = stadiums[1].Content;
}
9
// цикл по всем стадионам
for (i = 0; i < maxContentIdx1; i++)
{
// если вместимость стадиона больше текущего максимума
// и индекс стадиона отличен от индекса первого самого
// крупного стадиона,
if (stadiums[i].Content > maxContent2 &&
i != maxContentIdx1)
{
// то сохраняется индекс стадиона
maxContentIdx2 = i;
// и изменяется текущий максимум
maxContent2 = stadiums[i].Content;
}
}
// установка индекса второго по вместимости стадиона
*idx2 = maxContentIdx2;
// выход из подпрограммы
return 0;
}
/* auxiliaries.h */
#ifndef __AUXILIARIES_H__
#define __AUXILIARIES_H__
#include <stdio.h>
#include <string.h>
#include "library.h"
// определение константы максимальной длины строки
#define MAX_LINE_LEN 1000
// определение фукнции чтения информации о стадионах
int readStadiumsInfo(char *fileName, Stadium **stadiums,
int *kStadiums);
// определение функции печати информации о двух самых крупных
стадионов
void printLargestStadiums(Stadium *stadiums, int kStadiums,
int largeIdx1, int largeIdx2);
// определение функции освобождения области памяти,
// содержащей информацию о стадионах
void freeStadiumsInfo(Stadium **stadiums, int *kStadiums);
#endif
/* auxiliaries.c */
#include "auxiliaries.h"
// реализация фукнции чтения информации о стадионах
int readStadiumsInfo(char *fileName, Stadium **stadiums,
int *kStadiums)
{
10
int i = 0, j;
char line[MAX_LINE_LEN], *p = NULL;
// открытие файла на чтение
FILE *f = fopen(fileName, "r");
// если файл не открыт,
if (f == NULL)
{
// то печатается соответствующее сообщение
printf("File \'%s\' was not opened.\n", fileName);
// выход из подпрограммы с кодом ошибки 1
return 1;
}
// чтение количества стадионов из файла (первая строка
// содержит данное значение)
fscanf(f, "%d\n", kStadiums);
// выделение памяти для массива, содержащего информацию
// о всех стадионах
*stadiums = (Stadium *)malloc(sizeof(Stadium) *
(*kStadiums));
// цикл по всем строкам файла
for (; i < *kStadiums; i++)
{
// чтение очередной строки файла
fgets(line, MAX_LINE_LEN, f);
// выделение лексемы из строки line до первого
// вхождения символа ;
// p - указатель на соответствующую лексему
p = strtok(line, ";");
// копирование строки, которая хранится по указателю p,
// - название стадиона
memcpy((*stadiums)[i].Name, p, strlen(p));
(*stadiums)[i].Name[strlen(p)] = '\0'; // установка
признака конца строки
// выделение лексемы из исходной строки, начиная
// с позиции,
// которой заканчивается последняя найденная лексема
p = strtok(NULL, ";");
// копирование строки, которая хранится по указателю p,
// - почтовый индекс
memcpy((*stadiums)[i].ActualAddress.PostalCode, p,
strlen(p));
(*stadiums)[i].ActualAddress.PostalCode[strlen(p)]='\0';
// выделение лексемы из исходной строки, начиная с
// позиции, которой заканчивается последняя
// найденная лексема
p = strtok(NULL, ";");
// копирование строки, которая хранится по указателю p,
// - страна
memcpy((*stadiums)[i].ActualAddress.Country, p,
strlen(p));
(*stadiums)[i].ActualAddress.Country[strlen(p)] = '\0';
// выделение лексемы из исходной строки, начиная с
// позиции, которой заканчивается последняя
11
// найденная лексема
p = strtok(NULL, ";");
// копирование строки, которая хранится по указателю p,
// - область
memcpy((*stadiums)[i].ActualAddress.Restrict, p,
strlen(p));
(*stadiums)[i].ActualAddress.Restrict[strlen(p)] = '\0';
// выделение лексемы из исходной строки, начиная с
// позиции, которой заканчивается последняя
// найденная лексема
p = strtok(NULL, ";");
// копирование строки, которая хранится по указателю p,
// - регион
memcpy((*stadiums)[i].ActualAddress.Region, p,
strlen(p));
(*stadiums)[i].ActualAddress.Region[strlen(p)] = '\0';
// выделение лексемы из исходной строки, начиная с
// позиции, которой заканчивается последняя
// найденная лексема
p = strtok(NULL, ";");
// копирование строки, которая хранится по указателю p,
// - город
memcpy((*stadiums)[i].ActualAddress.Town, p, strlen(p));
(*stadiums)[i].ActualAddress.Town[strlen(p)] = '\0';
// выделение лексемы из исходной строки, начиная с
// позиции, которой заканчивается последняя
// найденная лексема
p = strtok(NULL, ";");
// копирование строки, которая хранится по указателю p,
// - улица
memcpy((*stadiums)[i].ActualAddress.Street, p,
strlen(p));
(*stadiums)[i].ActualAddress.Street[strlen(p)] = '\0';
// выделение лексемы из исходной строки, начиная с
// позиции, которой заканчивается последняя
// найденная лексема
p = strtok(NULL, ";");
// копирование строки, которая хранится по указателю p,
// - дом
memcpy((*stadiums)[i].ActualAddress.House, p,
strlen(p));
(*stadiums)[i].ActualAddress.House[strlen(p)] = '\0';
// выделение лексемы из исходной строки, начиная с
// позиции, которой заканчивается последняя
// найденная лексема
p = strtok(NULL, ";,");
// копирование строки, которая хранится по указателю p,
// - количество видов спорта
(*stadiums)[i].SportsNumber = atoi(p);
// выделение памяти для хранения видов спорта
(*stadiums)[i].Sports = (char **)malloc(sizeof(char *) *
(*stadiums)[i].SportsNumber);
// цикл по всем видам спорта на стадионе
12
for (j = 0; j < (*stadiums)[i].SportsNumber; j++)
{
// выделение памяти для хранения названия
// вида спорта
(*stadiums)[i].Sports[j] =
(char *)malloc(sizeof(char) *
MAX_LEN_SPORT_NAME);
// выделение лексемы из исходной строки, начиная с
// позиции, которой заканчивается последняя
// найденная лексема
p = strtok(NULL, ",;");
// копирование строки, которая хранится по указателю
// p, - название вида спорта
memcpy((*stadiums)[i].Sports[j], p, strlen(p));
(*stadiums)[i].Sports[j][strlen(p)] = '\0';
}
// выделение лексемы из исходной строки, начиная с
// позиции, которой заканчивается последняя
// найденная лексема
p = strtok(NULL, ";");
// преобразование строки, которая хранится по указателю
// p, в число - год строительства стадиона
(*stadiums)[i].Year = atoi(p);
// выделение лексемы из исходной строки, начиная с
// позиции, которой заканчивается последняя
// найденная лексема
p = strtok(NULL, ";");
// преобразование строки, которая хранится по указателю
// p, в число - вместимость стадиона
(*stadiums)[i].Content = atoi(p);
// выделение лексемы из исходной строки, начиная с
// позиции, которой заканчивается последняя
// найденная лексема
p = strtok(NULL, ";");
// преобразование строки, которая хранится по указателю
// p, в число - количество площадок
(*stadiums)[i].GroundsNumber = atoi(p);
}
// закрытие файла
fclose(f);
// выход из подпрограммы
return 0;
}
// реализация функции печати информации о двух самых
// крупных стадионов
void printLargestStadiums(Stadium *stadiums, int kStadiums,
int largeIdx1, int largeIdx2)
{
// если индекс первого стадиона >=0 и <kStadiums,
if (largeIdx1 >= 0 && largeIdx1 < kStadiums)
{
// то печать названия стадиона
13
printf("1. %s\n", stadiums[largeIdx1].Name);
}
// если индекс второго стадиона >=0 и <kStadiums,
if (largeIdx2 >= 0 && largeIdx2 < kStadiums)
{
// то печать названия стадиона
printf("2. %s\n", stadiums[largeIdx2].Name);
}
}
// реализация функции освобождения области памяти,
// содержащей информацию о стадионах
void freeStadiumsInfo(Stadium **stadiums, int *kStadiums)
{
int i = 0, j, kSports;
// цикл по всем стадионам
for (; i < *kStadiums; i++)
{
// определение количества поддерживаемых видов спорта
kSports = (*stadiums)[i].SportsNumber;
// цикл по всем вида спорта стадиона
for (j = 0; j < kSports; j++)
{
// освобождение памяти, занятой для хранения
// названия вида спорта
free((*stadiums)[i].Sports[j]);
}
// освобождение памяти, занятой для хранения массива
// указателей на названия видов спорта
free((*stadiums)[i].Sports);
}
// освобождение памяти, занятой для хранения массива
// указателей на информацию о стадионах
free(*stadiums);
// дополнительное обнуление числа стадионов
*kStadiums = 0;
}
/* main.c */
#include <stdio.h>
#include <locale.h>
#include "auxiliaries.h"
#include "library.h"
// объявление строковой константы, содержащей строку помощи
const char *helper =
"2_StructureExample.exe <file>\n\
\t<file> - input file name\n\
";
// определение функции для обработки аргументов командной строки
int ProcessArguments(int argc, char **argv,
14
Stadium **stadiums, int *kStadiums);
int main(int argc, char **argv)
{
Stadium *stadiums = NULL;
int kStadiums, largeIdx1, largeIdx2;
// установка локализации "Russian", связанной
// с категорией LC_CTYPE
setlocale(LC_CTYPE, "Russian");
// если обработка аргументов командной строки прошла
// неуспешно,
if (ProcessArguments(argc, argv, &stadiums, &kStadiums)
!= 0)
{
// то печать строки помощи
printf("%s\n", helper);
// выход из программы с кодом ошибки 1
return 1;
}
// вызов функции поиска двух самых крупных
// по вместимости стадионов
findLargeStadiums(stadiums, kStadiums,
&largeIdx1, &largeIdx2);
// вызов функции печати информации о двух самых
// крупных стадионах
printLargestStadiums(stadiums, kStadiums,
largeIdx1, largeIdx2);
// вызов функции освобождения памяти, занятой для хранения
// информации о всех стадионах
freeStadiumsInfo(&stadiums, &kStadiums);
// выход из основной функции
return 0;
}
// реализация функции для обработки аргументов командной строки
int ProcessArguments(int argc, char **argv,
Stadium **stadiums, int *kStadiums)
{
// аргумент с индексом 0 - название исполняемого модуля
// аргумент с индексом 1 - имя файла с информацией
//
о стадионах
char *fileName;
// если число аргументов командной строки меньше двух,
if (argc < 2)
{
// то выход из подпрограммы с кодом ошибки 1
return 1;
}
// получение аргумента с индексом 1 - имени файла
// с информацией о стадионах
fileName = argv[1];
// чтение из файла информации о стадионах
15
// если чтение прошло неуспешно,
if (readStadiumsInfo(fileName, stadiums, kStadiums) != 0)
{
// то выход из подпрограммы с кодом ошибки 1
return 1;
}
// выход из подпрограммы
return 0;
}
9.3. Простые задачи
Разработать структуры, реализовать необходимый набор операций с объектами
структурного типа. Обеспечить чтение данных из файла. Написать тестирующую
функцию main.
1. Определить структуру для представления трехмерного вектора. Обеспечить
выполнение операций сложения, вычитания, скалярного произведения векторов,
умножения вектора на скаляр, вычисления длины вектора и сравнения длин
векторов.
2. Определить структура для представления треугольника координатами вершин на
плоскости. Обеспечить выполнение операций вычисления площади, периметра
треугольника, вычисления высот, а также определения вида треугольника.
3. Биржа труда. База вакансий содержит следующую информацию: фирма,
должность, условия труда и оплаты, требования к специалисту. Обеспечить поиск
фирм, которым требуются люди на должность «менеджера».
4. Спортивная команда. Спортивная команда характеризуется названием, городом,
за который играет, количеством сыгранных игр, количеством очков, количеством
игроков. Среди множества спортивных команд определить команду, которая имеет
максимальное количество очков.
5. Автомобиль. Информация об автомобиле содержит марку, цвет, серийный номер,
регистрационный номер, количество дверей, год выпуска и цену. Среди списка
автомобилей определить самый старый.
6. Крылатые фразы. Имеется справочник пословиц, поговорок, афоризмов,
каламбуров, других словесных курьезов. Каждая крылатая фраза имеет автора и
характеризуется источником, из которого он взята, темой и набором ключевых
слов. Обеспечить поиск крылатых фраз по ключевым словам.
7. Справочник астронома. Для каждой из зарегистрированных звезд известны
название, созвездие, видимая звездная величина, расстояние, координаты на
небосклоне. Обеспечить поиск звезд заданного созвездия.
8. Справочник гидролога. Реки мира: протяженность (от истока до впадения), куда
впадает (в другую реку, море или озеро), годовой сток (в км3), площадь бассейна
(без крупных притоков). Обеспечить вычисление годового стока и площади
бассейна для заданной крупной реки вместе с ее притоками.
9. Фильм. Информация о фильме содержит название, фамилию и имя режиссера,
страну, год выпуска, бюджет, сборы. Выбрать фильмы конкретного режиссера.
10. Склад. База товаров, хранящихся на складе: наименование, единица измерения,
цена единицы, количество, дата последнего завоза. Определить наименования
товаров, отсутствующих на складе.
16
9.4. Задачи средней сложности
Разработать структуры, реализовать необходимый набор операций с объектами
структурного типа. Обеспечить чтение данных из файла. Написать тестирующую
функцию main.
1. Определить структуру для представления полинома произвольной степени
(полином представляется набором коэффициентов). Реализовать операции
сложения, умножения, вычитания полиномов, а также вычисления значения
полинома для заданного значения аргумента, дифференцирования полинома.
2. Биржа труда. База безработных содержит следующую информацию: анкетные
данные, профессия, образование, место и должность последней работы, причина
увольнения, семейное положение, контактная информация. Обеспечить поиск
безработных с высшим образованием и вычислить процент таковых от общего
числа безработных.
3. Человек. Информация о человеке содержит ФИО, пол, национальность, рост, вес,
дата рождения (год, месяц, число), номер телефона, домашний адрес (почтовый
индекс, страна, область, район, город, улица, дом, квартира). Обеспечить
сортировку списка людей по фамилии в алфавитном порядке.
4. Справочник банков. Справочник по каждому банку содержит наименование, статус
(форма собственности), условия хранения средств на лицевом счете (годовые
проценты на различных видах вкладов). Обеспечить выбор банка с наибольшим
процентом для заданного вида вклада.
5. Справочник туриста. Справочник содержит список турагентств и предлагаемых
ими услуг (страна, город или маршрут круиза, условия проживания и проезда,
экскурсионное обслуживание, сервис принимающей стороны, стоимость путевки).
Привести список турагентств, предлагающих туры в страны еврозоны.
6. Справочник любителя живописи. Справочник содержит список художников с
анкетными данными и стилями, список картин со ссылкой на художников, датой
создания, жанром. Оригинал картины находится в музее или в частной коллекции.
Определить процент картин определенного художника, находящихся в частной
коллекции.
7. Справочник астронома. Для каждой из зарегистрированных звезд известны
название, созвездие, видимая звездная величина, расстояние, координаты на
небосклоне. Обеспечить поиск звезд и созвездий в заданной точке земного шара в
заданное время.
8. Владелец автомобиля. Каждый владелец автомобиля регистрирует транспортное
средство в ГИБДД. База владельцев содержит ФИО, дату рождения владельца,
регистрационный номер автомобиля, номер технического паспорта, телефон,
отделение регистрации ГИБДД. Определить список владельцев, автомобили
которых зарегистрированы в определенном ГИБДД.
9. Касса автовокзала. Расписание автобусов: номер рейса, конечный и
промежуточные пункты, время отправления, количество свободных мест на
каждом рейсе. Выбрать ближайший рейс до заданного пункта (при наличии
свободных мест). Замечание: пункт может являться как конечным, так и
промежуточным пунктом автобуса.
10. Справочник покупателя. База торговых точек города: название, адрес и телефоны,
специализация, форма собственности, часы и дни работы. Обеспечить выбор
продуктовых магазинов города, работающих круглосуточно.
17
9.5. Задачи повышенной сложности
Разработать структуры, реализовать необходимый набор операций с объектами
структурного типа. Обеспечить чтение данных из файла. Написать тестирующую
функцию main.
1. Справочник меломана. Справочник представляет собой совокупность баз: база
групп и исполнителей, база песен, база дисков с перечнем песен в виде ссылок.
Обеспечить выбор песен заданной группы и всех дисков, где встречается данная
песня.
2. Терминология. База определений какой-либо науки содержит список терминов, их
толкований (определений), ссылки на используемые термины. Обеспечить
возможность просмотра всей цепочки от заданного термина до первичных
понятий.
3. Личная библиотека. Картотека домашней библиотеки содержит следующую
информацию о книгах: выходные данные книги (авторы, название, издательство),
раздел библиотеки (специальная литература, хобби, домашнее хозяйство,
беллетристика и т.д.), происхождение и наличие книги в данный момент,
субъективная оценка книги. Обеспечить вывод полного перечня книг по разделам,
а также выбор книги по разделу библиотеки.
4. Справочник абитуриента. База вузов: наименование, адрес, перечень
специальностей, конкурс прошлого года по каждой специальности (дневной,
вечерней, заочной форм), размер оплаты при договорном обучении. Обеспечить
выбор информации по разным критериям: все о данном вузе, все о данной
специальности, поиск минимального конкурса по данной специальности и вообще
по специальностям каждого вуза.
5. Школьник. По каждому школьнику имеется следующая информация: ФИО, класс,
пол, дата рождения (год, месяц, число), домашний адрес (почтовый индекс,
страна, область, район, город, улица, дом, квартира). По каждому классу
сформировать список учащихся, отсортированный в алфавитном порядке.
6. Справочник фаната. База спортсменов содержит анкетные данные (ФИО, пол,
дата рождения и т.д.), гражданство, происхождение, вид спорта, клуб или команда,
данные о личном рекорде или победах. Обеспечить поиск рекордсмена в заданном
виде спорта и в каждом из видов, присутствующих в справочнике.
7. Справочник географа. Города (географические координаты, численность
населения), регионы (области, провинции, штаты и т.п., принадлежность стране,
столица, численность населения), страны (площадь, численность населения,
форма правления, столица), материки. Обеспечить подсчет доли городского
населения в странах и регионах и определить населенность материков.
8. Справочник командира. Список подчиненных военнослужащих: анкетные данные,
адрес родителей, гражданская профессия, образование, звание и дата его
получения, должность, подразделение, форма службы (срочная, кадровая,
контрактная и т.д.), особенности характера и отношение к службе. Обеспечить
формирование списков военнослужащих заданного подразделения.
9. Отдел кадров. База о сотрудниках фирмы: паспортные данные (серия, номер, кем
выдан, когда выдан, дата рождения, место прописки), образование,
специальность, подразделение, должность, оклад, даты поступления в фирму и
последнего назначения. Выбрать из списка сотрудников лиц пенсионного возраста.
10. Государство. Государство характеризуется названием, названием столицы,
государственным языком, численностью населения, площадью территории,
18
денежными единицами, государственным строем, курсом валюты относительно
рубля (доллара). Выбрать из множества государств три с максимальной
численностью населения.
19
Download