Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практикум по языкам программирования. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
31
Практическая работа № 3
Тема: «Динамическая память. Структуры в С++»
Цель работы: Изучение структур в языке С++ .
Структуры
Структуры являются развитием понятия массив. Массивы представляют собой объединения однотипных переменных. Однако зачастую логика программы требует объединения разнотипных переменных. Можно объединить
эти разнотипные характеристики в единую переменную структуру.
Структура это объединение разнотипных переменных. Общий вид
описания структуры:
struct ИмяСтруктуры {
тип Имя1;
тип Имя2;
... };
Переменные Имя1, Имя2 и т.д., которые объединены структурой, называются её полями. Поле может быть обычной переменной, массивом, указателем, другой структурой. Опишем структуру для хранения данных о студенте
struct student
{char fio[30];
int kurs; char group[7]; };
Объявление структуры является оператором, и поэтому после такого объявления должна стоять точка с запятой. Объявление структуры не приводит к выделению памяти под переменную. Это лишь описание каркаса будущей
переменной, её шаблон. С точки зрения компилятора объявление структуры
является описанием нового пользовательского типа данных. Для того чтобы
объявить переменные типа student, можно записать
student stud1, stud2; //Здесь объявлены две переменные stud1 и stud2 типа student.
Под каждую из переменных типа структуры выделяется непрерывный участок памяти.
32
Доступ к элементам структуры осуществляется с помощью операции
«точка», например, чтобы вывести на экран значение поля kurs переменной stud2, можно использовать оператор
cout << stud2.kurs;
Структурный тип можно использовать для описания массива структурированных записей.
#define stud struct student
stud { char fam[20]; char pol; int mathematics; int informatics; int history; };
{ /*описание массива Spis структурированных элементов с инициализацией*/ stud Spis[3]= { {“Иванов А.П.” , ‘m’ , 3 ,5 ,5}, {“Петрова А.П.” ‘j’ ,5, 5, 5}, {“Сидоров А.П.”, ‘m’ , 3, 4, 5} };
….
Пример задачи с использованием структурированных данных
Рассмотрим пример программы, в которой вводится информация об
абонентах сети: ФИО, телефон и возраст. В программе выбираются абоненты
моложе 25 лет, и их список выводится в алфавитном порядке.
#include <stdafx.h> #include <iostream> #include <stdlib.h> #define n 50 # define ab struct ab1
ab { char f[25], char i[10], char o[10];
33
long tel; int voz; };
int _tmain() { setlocale(0,”RUS”); int i,k,j; ab z[n]; /*описание массива z структур для исходного списка*/ ab Y[n]; /*описание массива Y структур для абонентов моложе 30 */ ab х; /*описание структурированной переменной x для
сортировки */
for (i=0; i<n; i++)/*ввод в цикле исходной информации о пятидесяти абонентах сети*/
{ printf("Введите ФИО абонента:"); scanf("%s%s%s",z[i].f, z[i].i, z[i].o);
printf("введите его телефон и возраст:"); scanf("%ld%d",&z[i].tel,&z[i].voz); }
printf("------------------------------------------\n"); printf("| Фамилия | Имя | Отчество| Телефон | Возраст |\n"); printf("------------------------------------------\n");
for (i=0;i<n;i++) /*вывод в цикле информации о пятидесяти абонентах*/
printf("|%20s|%8s|%9s|%7ld |\n", z[i].f,z[i].i,z[i].o, z[i].tel, z[i].voz); } printf("------------------------------------------\n");
for (i=0;i<n;i++) {if(z[i].voz<30) // поиск абонента моложе 30 лет Y[k++]=z[i]; //запись его в новый массив Y }
/*сортировка списка абонентов моложе 30 лет по алфавиту методом «пузырька»*/
for(i=1;i<k; i++) for(j=k-1;j>=i;j--)
34
if(Y[j].f[0] < Y[j-1].f[0]) {x=Y[j]; Y[j]=Y[j-1]; Y[j-1]=x;}
printf("список абонентов моложе 30 лет\n"); printf("-----------------------------------------\n"); printf("|Фамилия | Имя |Отчество| Телефон|Возраст|\n"); printf("------------------------------------------\n");
for (i=0;i<k;i++) // вывод отсортированного списка { printf("|%9s|%8s|%9s|%7ld | %5d |\n", Y[i].f,Y[i].i, Y[i].o, Y[i].tel,Y[i].voz); } printf("-------------------------------------------------
-\n"); return 0;
Задание. Написать программу на языке С++ решения задачи согласно своему варианту. В программе создать соответствующую заданию структуру, можно написать функции, реализующие операции со структурами. В
программе
можно использовать массив переменных созданного типа
структуры.
Варианты заданий
1. Создайте структуру, описывающую точку в двумерной системе
координат
(x,y). С помощью этой структуры задайте две точки. Будет ли прямая, проходящая через эти точки параллельна оси ординат? Оси абсцисс?
2. Создайте структуру Дата с элементами День, Месяц, Год. Для N
человек с заданной датой рождения вывести сообщение, в какой декаде
родился
человек, в каком сезоне и в каком веке.
3. Создайте структуру Прямоугольный_Параллелепипед с элементами –
a и b стороны прямоугольника-основания, h высота
параллелепипеда.
Найдите, у какого из N заданных параллелепипедов
объем наименьший?
4. Создайте структуру Время с элементами Часы, Минуты. Реализовать
следующую задачу: у прибора зафиксировано время начала работы и
время
завершения работы в текущий день. Определить общее время
работы
прибора за неделю.
35
5. Создайте структуру, описывающую точку в трехмерной системе
координат
(x, y, z). Найдите расстояние между двумя точками A(x1,y1,z1)
и B (x1,y1,z1).
6. Создайте структуру Треугольник с тремя элементами a, b, c – длины
3-х сторон. Найдите, у какого из трех заданных треугольников площадь наибольшая?
7. Создайте структуру Комплексное_Число с элементами x
действительная
и y – мнимая часть. Выполнить операцию с тремя
комплексными числами a,
b, c
Qabc c
2
(можно написать
функции, реализующие операции
вычитания и умножения
комплексных чисел).
8. Создайте структуру Конус с элементами: r – основание круга-
основания, h – высота конуса. Определить для N заданных конусов объем и площадь поверхности.
9. Создайте структуру Прямая с элементами x1, y1, x2, y2 – координаты
двух точек, через которые проходит прямая. Для К заданных прямых вывести уравнение прямых в виде y=ax+b.
10. Создайте структуру Комплексное Число с элементами x -
действительная и y - мнимая часть. Выполнить операцию с тремя комплексными числами a, b, c Q =a +b2+(b+a ) (можно написать
функции, реализующие операции сложения и умножения комплексных
чисел).
11. Создайте структуру Время с элементами Часы, Минуты. Известно
время
продолжительности каждого из N этапов процесса. Определить
общее
время процесса и минимальное время этапа.
12. Создайте структуру, описывающую точку в двумерной системе
координат
(x,y). С помощью этой структуры для N точек вывести
сообщение, в каком координатном углу расположена точка.
13. Создайте структуру Парабола с элементами a, b, c – коэффициенты
уравнения y=ax2+bx+c. Определить для M заданных парабол k – количество парабол, имеющих минимум, и, если такие есть, найти, у какой из них минимум функции наибольший, т. е. парабола расположена выше остальных.
14. Создайте структуру Комплексное Число с элементами x
действительная и y – мнимая часть. Выполнить операцию с тремя комплексными числами a,
b, c
Z a 2 bc cb
(можно написать
36
функции, реализующие операции
сложения, вычитания и умножения
комплексных чисел)
15. Создайте структуру Парабола с элементами a, b, c – коэффициенты
уравнения y=ax2+bx+c. Определить для N заданных парабол точки пересечения с осью X.
16. Создайте структуру Дробь с элементами a – числитель, b –
знаменатель. Даны две дроби. Реализуйте с этими дробями арифметические действия: умножение и деление (можно написать функции, реализующие эти действия).
17. Создайте структуру Вектор с элементами x, y, z – декартовые
координаты. Определить для M заданных векторов длину каждого вектора и найти номер самого длинного вектора.
18. Создайте структуру Окружность с элементами x0, y0 – координаты
центра, R – радиус. Для N окружностей вычислить длину каждой окружности и определить, пресекаются ли окружности с осями OX и OY.
19. Создайте структуру Прямая с элементами a, b – коэффициенты
уравнения
y=ax+b. Для M заданных прямых определить k1 – количество
прямых,
параллельных оси ОХ, и k2 – количество прямых, параллельных
оси ОY.
20. Создайте структуру Дробь с элементами a – числитель, b
знаменатель. Даны две дроби. Реализуйте с этими дробями арифметические действия: сложение и вычитание (можно написать функции, реализующие эти действия).
21. Создайте структуру Прямая с элементами a, b – коэффициенты
уравнения
y=ax+b и структуру Точка с элементами x, y координаты точки. Дана одна прямая и M точек, определить количество точек, лежащих на заданной прямой.
22. Создайте структуру Ромб с элементами d1, d2 – диагонали ромба.
Для К заданных ромбов определить k1 – количество квадратов и найти ромб с минимальной площадью.
23. Создайте структуру Треугольник с тремя элементами a, b, c – длины
3-х сторон. Для N заданных треугольников найти k1 – количество
равносторонних треугольников и k2 – количество прямоугольных треугольников.
37
24. Создайте структуру Комплексное Число с элементами x
действительная и y – мнимая часть. Для N заданных комплексных чисел найти числа, у которых модуль наибольший и наименьший.
25. Создайте структуру Параллелограмм с элементами a, b – стороны
параллелограмма и – угол между сторонами. Для К заданных фигур определить k1 количество квадратов и k2 количество прямоугольников.
26. Создайте структуру Дата с элементами День, Месяц, Год. Для N
человек с заданной датой рождения найти самого младшего и самого старшего человека.
Порядок выполнения работы
1. Получить допуск к работе у преподавателя (показать домашние
заготовки).
2. Загрузить среду Visual Studio.
3. Ввести текст программы.
4. Провести отладку программы. Выполнить программу, провести анализ
результатов и, убедившись в правильности решения, предъявить их преподавателю для проверки.
5. Занести результаты расчета в отчет.
6. Выйти из среды.
Содержание отчета
1. Номер и тема лабораторной работы.
2. Задание к лабораторной работе.
3. Схема алгоритма решения задачи.
4. Программа на языке Cи.
5. Результаты выполнения программы.
Показать отчет преподавателю.
Контрольные вопросы
1. Типы данных, применяемые в Си.
2. Тип данных структура в языке Си.
3. Особенности работы со структурированным типом данных.
38
Практическая работа № 4.
Тема: «Текстовые и двоичные (бинарные) файлы»
Цель работы: Работа с текстовыми и двоичными (бинарными) файлами.
Текстовые и бинарные файлы
С точки зрения программиста файл представляет собой потенциально
бесконечную ленту записей какого-либо размера. Однако видны не все записи
одновременно, а только их часть, как будто смотрим на ленту через воображаемое окно, называемое указателем (не путать с указателем FILE *). В
языке Си принято считать, что размер окна равен одному байту. При
считывании или записи указатель перемещается по ленте. В конце файла
находится так называемый признак конца файла, обозначаемый в языке Си константой EOF.
Числовые данные, которыми оперирует программа, хранятся в памяти
ЭВМ в том формате, который предусмотрен типом этих данных. Например, для
переменной целого типа int выделяются 4 байта. Данные хранятся в дополнительном коде. При выводе значения переменной на экран она переводится в текстовый, понятный человеку вид, то есть в последовательность
символов.
Точно так же и в файле, значение переменной может храниться либо в
двоичном виде (как в памяти ЭВМ), либо в текстовом, как последовательность
символов. В связи с этим файлы делятся на двоичные (бинарные) и текстовые. При работе с бинарными файлами операции чтения и записи не требуют никакого преобразования данных, а при работе с текстовыми файлами
требуется преобразовывать данные из текстового или в текстовый вид.
Для работы с файлами в программах на Cи используется заголовочный
файл stdio.h, в котором объявлен специальный тип данных – структура FILE,
предназначенная для хранения атрибутов (параметров) файлов (указатель текущей позиции файла, признак конца файла, флаги индикации ошибок,
сведения о буферизации и др.).
Поля структуры типа FILE доступны с помощью специальных C-функций. Для организации работы с файлом используется определенная последовательность действий.
Объявление переменной-указателя на структуру типа FILE, в которой
будут храниться атрибуты файла
FILE *fl;
где *fl – указатель на файл.
Открытие файла
fl=fopen("путь к файлу","режим работы файла");
39
Параметр "путь к файлу" указывает размещение файла на диске. Он
обязательно содержит имя файла и может содержать имя логического диска и
путь к нему по папкам.
Параметр "режим работы файла" показывает, как будет использоваться
файл:
"w" – для записи данных (вывод); "r" – для чтения данных (ввод); "a" – для добавления данных к существующим записям. Примеры открытия файлов:
FILE *fin,*out;
fin=fopen("My_file1","r"); out=fopen("My_file2","w");
Функция fopen() возвращает значение указателя на структуру типа файл. Если файл по каким-либо причинам не открывается, функция fopen() возвращает значение NULL.
Рассмотрим особенности режимов открытия файлов. Если файл
открывается в режиме записи данных "w", то указатель текущей позиции устанавливается на начало файла. Если указанный в функции fopen() файл не
существует, то он создается. Необходимо помнить, что открытие
существующего файла в режиме "w" приводит к уничтожению его старого содержания.
Открытие файла для чтения в режиме "r" возможно только для созданного
ранее файла, при этом указатель текущей позиции устанавливается на начало
файла. Если открываемый на чтение файл не существует, функция fopen() возвращает пустой указатель со значением NULL.
Если файл открывается в режиме добавления данных "a", то указатель
текущей позиции устанавливается на конец файла. Данные, ранее помещенные в файл, остаются без изменений. Если указывается несуществующий файл, то
он создается заново.
В Си файл можно открыть для чтения и/или записи в текстовом или бинарном (двоичном) режиме. Поэтому можно указать дополнительные условия режима открытия файла:
"b" – двоичный поток; "t" – текстовый поток; "+" – обновление файла. Пример: "r+" – чтение файла с обновлением, т. е. возможна перезапись данных с усечением; "w+" – запись в файл и одновременно чтение; "a+" – добавление данных и чтение.
Для поочередного выполнения чтения и записи в режиме "+" необходимо
ручное позиционирование курсора.
40
Обработка открытого файла
Каким образом можно прочитать уже открытый файл или записать в него
информацию? Для этого в языке Cи существуют специальные функции:
Чтение
(ввод)
Запись
(вывод)
getc()
putc()
fscanf()
fprintf()
fgets()
fputs()
fread()
fwrite()
При каждой операции ввода/вывода указатель текущей позиции файла
смещается на одну позицию в сторону конца файла.
Проверка признака конца файла
Так как при каждой операции ввода/вывода происходит перемещение
указателя текущей позиции в файле, в какой-то момент указатель достигает конца файла. Структура типа FILE имеет поле – индикатор конца файла. Функция feof() проверяет состояние индикатора конца файла и возвращает
значение 0, если конец файла не был достигнут, или значение, отличное от
нуля, если был достигнут конец файла. Функция имеет единственный аргумент – указатель на FILE. Вызов функции в команде if:
if (! feof(fin))…
проверяет, что конец файла еще не достигнут.
Закрытие файла После завершения обработки файла его следует закрыть с помощью
функции fclose(). При этом разрывается связь указателя на файл c внешним
набором данных. Освободившийся указатель можно использовать для другого
файла. Формат вызова функции:
fclose(fin);
При нормальном завершении программы в большинстве операционных
систем все открытые файлы закрываются автоматически, но рекомендуется
закрывать все файлы, дальнейшая обработка которых в программе не
предполагается, при помощи функции fclose().
Функции ввода/вывода
Простейший способ выполнить чтение из файла или запись в файл –
использовать функции getc() или putc().
Функция getc() выбирает из файла очередной символ; ей нужно только
знать указатель на файл, например,
char Symb=getc(fin);
здесь FILE *fin;
Если при обработке достигается конец файла, то функция getc()
возвращает значение EOF(endoffile).
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]