Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сборник лабораторных работ.doc
Скачиваний:
6
Добавлен:
17.11.2019
Размер:
5.38 Mб
Скачать

18Краткая теоретическая справка

Работа со структурами подробно рассмотрена в конспекте лекций.

В языках С или C++ структура (структурный тип) создается при помощи ключевого слова struct, за которым следуют необязательное имя и список элементов структуры. Имя используется для создания других переменных данного структурного типа. Синтаксис описания структуры выглядит следующим образом:

struct имя_стуктурного_типа{

тип_элемента элемент1;

тип_элемента элемент2;

тип_элемента элемент3;

...

тип_элемента элементN;

};

Далее имя_стуктурного_типа может использоваться как и имя базового типа для создания переменных:

имя_стуктурного_типа список_имен_переменных;

Для обращения к отдельным элементам структур используются две операции: операция доступа к элементу структуры ('.'), также называемая операцией-точкой, и операция косвенного доступа к элементу структуры ('->'), также называемая операцией-стрелкой.

Пример. Определить структуру, описывающую понятие рациональное число. Написать и протестировать функции для сокращения, печати рационального числа, а также для деления двух рациональных чисел.

#include<stdio.h>

#include<math.h>

struct Racion{ //структурный тип "рациональная дробь"

int chis;

int znam;

};

void put(Racion A); //вывод структуры на экран

Racion SOKR(Racion A); //сокращение дроби

void DIV(Racion A, Racion B, Racion *C); //деление дробей

void main(){

Racion A, B, C;

puts("Введите числитель и знаменатель первой, "

"а затем - второй дроби : ");

scanf("%d%d%d%d", &A.chis, &A.znam, &B.chis, &B.znam);

DIV(A, B, &C);

printf("При делении "); put(A); printf (" на "); put(B);

printf("\n получилось "); put(C);

}

//вывод структуры A на экран:

void put(Racion A){

//если числитель и знаменатель имеют разные знаки:

if(A.chis * A.znam < 0) printf("-");

A.chis = abs(A.chis);

A.znam = abs(A.znam);

printf "%d/%d", A.chis, A.znam);

}

//сокращение дроби A:

Racion SOKR(Racion A){

int i, min;

if(abs(A.chis) > abs(A.znam)) min = abs(A.znam);

else min = abs(A.chis);

for(i = min; i >1; i--)

if(A.chis % i = 0 && A.znam % i = 0) break;

A.chis /= i;

A.znam /= i;

return A;

}

//деление дробей A и B, результат возвращается через адрес C:

void DIV(Racion A, Racion B, Racion *C){

A = SOKR(A);

B = SOKR(B);

C->chis = A.chis * B.znam;

C-<znam = A.znam * B.chis;

*C=SOKR(*C);

}

19Индивидуальные задания

Задача 1. Описать новый структурный тип. Описать требуемые в задаче функции для работы со структурами. Продемонстрировать выполнение функций. Для ввода-вывода переменной структурного типа описать функции inputStr() и printStr().

Формулировка задачи

1

Ввести перечислимые типы масть, достоинство. С их помощью описать как структуру переменную карта. Составить и протестировать функцию

  • БЬЕТ (К1, К2, КМ),

которая проверяет, бьет ли карта К1 карту К2, с учетом того, что масть Км является козырной.

2

Определить структуры, описывающие шар и точку в трехмерном пространстве. Составить и протестировать функцию, которая проверяет, находится ли точка внутри заданного шара.

3

Ввести структуру (с полями числитель и знаменатель) для описания понятия рациональное число. Составить и протестировать функции:

  • РАВНО(А, В), которая проверяет, равны ли друг другу рациональные числа А,В;

  • МАКС(Х,N), которая возвращает наибольшее из массива Х(N) рациональных чисел;

  • СЛОЖ(А, В, С), которая записывает в С результат сложения рациональных чисел А и В;

  • МИН(А, В), которая возвращает наименьшее из двух рациональных чисел А и В;

  • УМН(А, В, С), которая записывает в С результат перемножения рациональных чисел А и В.

4

Ввести структуру (с полями число, месяц, год) для описания понятия дата. Составить и протестировать функцию, которая:

  • вычисляет интервал (в днях), прошедший между двумя датами;

  • по порядковому номеру дня в году определяет число и месяц года, соответствующие этому дню;

  • по введенной дате распечатывает дату на N дней вперед.

5

Ввести структуру для описания комплексного числа. Составить и протестировать функции для:

  • получения сопряженного комплексного числа;

  • возведения комплексного числа в целую положительную степень;

  • умножения комплексных чисел в алгебраической форме;

  • деления комплексных чисел в алгебраической форме.

6

Ввести структуру для описания понятия алгебраический полином. Составить и протестировать функции для:

  • сложения полиномов;

  • умножения полиномов;

  • дифференцирования полинома;

  • интегрирования полинома.

7

Ввести структуру для описания треугольника. Составить и протестировать функции для:

  • вычисления площади треугольника;

  • вычисления периметра треугольника;

  • определения, попадает ли заданная точка внутрь треугольника.

Можно сначала описать структуру для описания точки. Тогда треугольник можно задать с помощью трех точек – вершин треугольника.

8

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

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

9

Определить структуры, описывающие точку в полярной и декартовой системах координат. Составить и протестировать функции для:

  • получения декартовых координат точки, если заданы ее полярные координаты;

  • вычисления расстояния между двумя точками, заданными в декартовой системе координат;

  • получения полярных координат точки, если заданы ее декартовы координаты;

  • вычисления расстояния между двумя точками, заданными в полярной системе координат.

10

Определить структуру – важнейшие исторические даты. Ее поля – год, событие.

Написать и протестировать функции:

  • подсчитывающую средний интервал между датами;

  • определяющую наиболее часто встречающуюся первую букву в названии события.

11

Определить структуру, описывающую прямоугольник со сторонами, параллельными осям координат (прямоугольник задается двумя точками – левой нижней и правой верхней).

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

12

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

  • определения, является ли прямоугольник квадратом;

  • вычисления площади прямоугольника;

  • вычисления периметра прямоугольника;

  • вычисления длины диагонали прямоугольника.

13

Определить структуру, описывающую окружность и точку. Составить и протестировать функции для:

  • проверки, попадает ли точка внутрь окружности;

  • вычисления расстояния от центра окружности до точки;

  • вычисления расстояния от точки до границы окружности.

14

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

  • проверки, попадает ли точка в кольцо;

  • вычисления расстояния от точки до границы кольца.

15

Определить структуру, описывающую квадрат, задающийся координатами центра и длиной стороны. Составить и протестировать функции для:

  • вычисления площади квадрата;

  • вычисления периметра квадрата;

  • увеличения стороны на заданное число;

  • определения количества точек с целыми координатами, находящихся внутри квадрата.

Задача 2. Задать массив структур согласно варианту (в соответствии с задачей 1). Описать функции для ввода-вывода значений массива. Последовательно выполнить сортировку массива по каждому из полей (функцию сортировки можно написать самостоятельно или использовать стандартную функцию qsort()). Поле, по которому производится сортировка, задается с помощью одного из параметров функции сортировки. После каждого вызова функции выводить массив на печать.

Тема: Работа с файлами

Цели: получение навыков взаимодействия с файлами.