Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практикум по программированию на языке СС++. Учебно-методическое пособие
.pdf
объединить эти разнотипные характеристики в единую переменную
структуру.
Структура это объединение разнотипных переменных. Общий вид описания
структуры:
struct ИмяСтруктуры {
тип Имя1;
тип Имя2;
...
};
ПеременныеИмя1, Имя2 и т.д., которые объединены структурой, называются
её полями. Поле может быть обычной переменной, массивом, указателем,
другой структурой. Опишем структуру для хранения данных о студенте
struct student {
charfio[30];
intkurs;
chargroup[7];
};
Объявление структуры является оператором, и поэтому после такого
объявления должна стоять точка с запятой. Объявление структуры не
приводит к выделению памяти под переменную. Это лишь описание каркаса
будущей переменной, её шаблон. С точки зрения компилятора объявление
структуры является описанием нового пользовательского типа данных. Для
того чтобы объявить переменные типа student, можно записать
student stud1, stud2; //Здесь объявлены две переменные stud1 и
stud2 типа student..
Под каждую из переменных типа структуры выделяется непрерывный
участок памяти.
Доступ к элементам структуры осуществляется с помощью операции
«точка», например, чтобы вывести на экран значение поля kurs переменной
stud2, можно использовать оператор
cout << stud2.kurs;
Структурный тип можно использовать для описания массива
структурированных записей.
#define stud struct student
stud
{
61

char fam[20];
char pol;
int mathematics;
int informatics;
int history;
};
int _tmain()
{/*описание массива 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 abstruct ab1
ab
{ char f[25],
char i[10],
char o[10];
long tel;
int voz;
};
int _tmain()
{ setlocale(0,”RUS”);
inti,k,j;
ab z[n]; /*описание массива z структур для исходного
списка*/
abY[n];/*описание массива Y структур для абонентов моложе
30 */
ab х; /*описание структурированной переменной xдля
сортировки */
62

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--)
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);
63

}
printf("-------------------------------------------------
-\n");
return 0;
}
Порядок выполнения работы.
1. Получить допуск к работе у преподавателя (показать домашние
заготовки).
2. Загрузить среду Visual Studio.
3. Ввести текст программы.
4. Провести отладку программы.
5. Выполнить программу, провести анализ результатов и убедившись в
правильности решения, предъявить их преподавателю для проверки.
6. Занести результаты расчета в отчет.
7. Выйти из среды.
Задание к лабораторной работе
По данным таблицы 6, содержащей информацию о работниках предприятия,
провести обработку данных согласно варианту задания. Вывести на печать
исходную таблицу и найденное значение.
Варианты заданий:
1. Найти информацию о сотруднике с минимальным значением рабочего
стажа.
2. Найти информацию о самом молодом сотруднике .
3. Посчитать средний возраст сотрудников.
4. Посчитать средний стаж сотрудников.
5. Найти в списке самого молодого мужчину.
6. Найти в списке самую молодую женщину.
7. Посчитать количество женщин в списке.
8. Посчитать количество сотрудников старше 30 лет.
9. Расположить сведения о сотрудниках в алфавитном порядке.
10. Определить, сотрудников какого пола больше в списке.
11. Посчитать, сколько в списке мужчин старше 50 лет.
12. Найти информацию о сотруднике с максимальным стажем работы.
13. Найти в списке самую старшую женщину.
14. Посчитать, сколько на предприятии сотрудником моложе 40 лет.
15. Выдать сведения о мужчинах с рабочим стажем больше 20 лет .
64

16. Выдать сведения о сотрудниках моложе 40 лет .
№
Фамилия И. О.
Пол
Год
рождения
Год поступления
на работу
1.
Анисимов Ю. П.
М
1970
1989
2.
Иванов И. Н.
М
1980
2002
3.
Махова О. И.
Ж
1960
1980
4.
Огарев К. М.
М
1991
2012
5.
Егорова П. К.
Ж
1993
2011
6.
Голикова О. И.
Ж
1972
1990
7.
Сотников Т. С.
М
1963
1990
8.
Комов В. И.
М
1979
2005
9.
Лебедев А. А.
М
1959
1981
10.
Димова В. В.
Ж
1991
2010
17. Упорядочить сведения о женщинах в порядке возрастания их рабочего
стажа.
18. Расположить сведения о женщинах в алфавитном порядке.
19. Расположить сведения о мужчинах старше 50 лет в алфавитном
порядке.
20. Расположить сведения о сотрудниках в возрасте от 30 до 50 лет в
алфавитном порядке.
Таблица 6
Содержание отчета
1. Номер и тема лабораторной работы.
2. Вариант задания.
3. Результаты подготовки:
- схема алгоритма обработки предложения,
- программа на заданном алгоритмическом языке.
4. Итоги работы программы:
- результаты расчета с текстовыми комментариями.
Показать отчет преподавателю.
Контрольные вопросы:
1. Описание структурного типа данных.
65

2. Обращения к полям, описанной структуры.
3. Методы сортировки массивов.
Лабораторная работа № 9.
СОЗДАНИЕ И ОБРАБОТКА БИНАРНЫХ ФАЙЛОВ
Цель работы: Приобрети навыков разработки алгоритмов обработки файлов.
Закрепление понятий базовых структур цикл, разветвление.
Подготовка к лабораторной работе:
1. Повторить следующие вопросы:
Понятие файла.
Способ описания файла.
Описание структурного типа.
Стандартные функции для работы с файлами.
С помощью какой функции осуществляется подготовка файла для
чтения?
С помощью, каких функций выполняется чтение данных из файла?
Как распознать конец файла данных?
2. В соответствии с индивидуальным заданием составить схему
алгоритма и программу на языке Си.
Текстовые и бинарные файлы.
С точки зрения программиста файл представляет собой потенциально
бесконечную ленту записей какого-либо размера. Однако видны не все записи
одновременно, а только их часть, как будто смотрим на ленту через
воображаемое окно, называемое указателем (не путать с указателем FILE *). В
языке Си принято считать, что размер окна равен одному байту. При
считывании или записи указатель перемещается по ленте. В конце файла
находится так называемый признак конца файла, обозначаемый в языке Си
константой EOF.
Числовые данные, которыми оперирует программа хранятся в памяти ЭВМ
с том формате, который предусмотрен типом этих данных. Например, для
переменной целого типа int выделяются 4 байта. Данные хранятся в
дополнительном коде. При выводе значения переменной на экран она
переводится в текстовый, понятный человеку вид, то есть в последовательность
66

символов. Точно также в файле значение переменной может храниться либо в
двоичном виде (как в памяти ЭВМ), либо в текстовом как последовательность
символов. В связи с этим файлы делятся на двоичные (бинарные) и текстовые.
При работе с бинарными файлами операции чтения и записи не требуют
никакого преобразования данных, а при работе с текстовыми файлами
требуется преобразовывать данные из текстового или в текстовый вид.
Для работы с файлами в программах на Cи используется заголовочный
файл stdio.h, в котором объявлен специальный тип данных – структура FILE,
предназначенная для хранения атрибутов (параметров) файлов (указатель
текущей позиции файла, признак конца файла, флаги индикации ошибок,
сведения о буферизации и др.).
Поля структуры типа FILE доступны с помощью специальных
C-функций. Для организации работы с файлом используется определенная
последовательность действий.
Объявление переменной-указателя на структуру типа FILE, в которой
будут храниться атрибуты файла
FILE *fl;
где *fl – указатель на файл.
Открытие файла
fl=fopen("путь к файлу","режим работы файла");
Параметр "путь к файлу" указывает размещение файла на диске. Он
обязательно содержит имя файла и может содержать имя логического диска и
путь к нему по папкам.
Параметр "режим работы файла"показывает, как будет использоваться файл:
"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.
67

Если файл открывается в режиме добавления данных "a", то указатель текущей
Чтение
(ввод)
Запись
(вывод)
getc()
putc()
fscanf()
fprintf()
fgets()
fputs()
fread()
fwrite()
позиции устанавливается на конец файла. Данные, ранее помещенные в файл,
остаются без изменений. Если указывается несуществующий файл, то он
создается заново.
В Си файл можно открыть для чтения и/или записи в текстовом или бинарном
(двоичном) режиме. Поэтому можно указать дополнительные условия режима
открытия файла:
"b" – двоичный поток;
"t" – текстовый поток;
"+" – обновление файла.
Пример:
"r+" – чтение файла с обновлением, т. е. возможна перезапись данных с
усечением;
"w+" – запись в файл и одновременно чтение;
"a+" – добавление данных и чтение.
Для поочередного выполнения чтения и записи в режиме "+" необходимо
ручное позиционирование курсора.
Обработка открытого файла
Каким образом можно прочитать уже открытый файл или записать в него
информацию? Для этого в языке Cи существуют специальные функции:
При каждой операции ввода/вывода указатель текущей позиции файла
смещается на одну позицию в сторону конца файла.
Проверка признака конца файла
Так как при каждой операции ввода/вывода происходит перемещение указателя
текущей позиции в файле, в какой-то момент указатель достигает конца файла.
Структура типа FILE имеет поле – индикатор конца файла. Функция feof()
проверяет состояние индикатора конца файла и возвращает значение 0, если
конец файла не был достигнут, или значение, отличное от нуля, если был
достигнут конец файла. Функция имеет единственный аргумент – указатель на
FILE. Вызов функции в команде if:
if (! feof(fin))…
проверяет, что конец файла еще не достигнут.
Закрытие файла.
После завершения обработки файла его следует закрыть с помощью
функции fclose(). При этом разрывается связь указателя на файл c внешним
68

набором данных. Освободившийся указатель можно использовать для другого
файла. Формат вызова функции:
fclose(fin);
При нормальном завершении программы в большинстве операционных систем
все открытые файлы закрываются автоматически, но рекомендуется закрывать
все файлы, дальнейшая обработка которых в программе не предполагается, при
помощи функции fclose().
Функции ввода/вывода
Простейший способ выполнить чтение из файла или запись в файл –
использовать функции getc() или putc().
Функция getc() выбирает из файла очередной символ; ей нужно только знать
указатель на файл, например,
charSymb=getc(fin);
Если при обработке достигается конец файла, то функция getc() возвращает
значение EOF(endoffile).
Функция putc() заносит значение символа Symb в файл, на который указывает
out. Формат вызова функции:
putc(Symb,out);
Пример 1. Текст из файла my_char.txtвыводится на экран. Если файл не найден,
на экран выводится сообщение "Filenotfound!":
#include <stdio.h>
int main(void)
{
FILE *ptr; //описание указателя на файл
unsigned char ch;
if
((ptr=fopen("my_char.txt","r"))!=NULL)/*открытиефайладлячтения
*/
{
while (!feof(ptr)) //циклдоконцафайла
{
ch=getc(ptr);//чтениесимволизфайла
printf("%c",ch);//вывод на монитор символа, взятого из файла
}
fclose(ptr);//закрытиефайла
}
else printf("\nFile not found!");
return 0;
}
В этом примере для чтения файла используется указатель ptr. При открытии
файла производится проверка. Если переменной ptr присвоено значение NULL,
69

то файл не найден; на экран выводится соответствующее сообщение, и
программа завершается. Если ptr получил ненулевое значение, то файл открыт.
Далее выполняется чтение символов из файла до тех пор, пока не будет
достигнут конец файла (!feof(ptr)). Прочитанный символ помещается в
переменную ch, а затем выводится на экран.
Пример 2. Записать в файл буквы, вводимые с клавиатуры. Ввод продолжается
до нажатия клавиши F6 или CTRL/z (ввод символа EOF – конца файла):
#include <stdio.h>
int main(void)
{
charc;
FILE *out;// описание указателя на файл
out=fopen("Liter.txt","w");//открытие файла для записи
c=getchar( ); // ввод первого символа
while ( (c!=EOF) /*пока не будет введенсимвол конца
{
fputc(c,out);// запись введенного символа в файл
c=getchar( );
}
fclose(out);//закрытиефайла
return 0;
}
Функции fscanf() и fprintf() выполняют форматированный ввод/вывод.
Чтение из файла выполняет функция fscanf():
fscanf(fin,[строка формата],[список адресов переменных]);
Функция возвращает количество введенных из файла значений или EOF.
Запись в файл осуществляет функция fprintf():
fprintf(out,[строка формата],[список переменных, констант]);
Возвращает количество выведенных в файл байт (символов) или EOF.
Строка формата функций fscanf() и fprintf() формируется так же, как было
описано ранее в главе, посвященной консольному вводу/выводу и функциям
printf() и scanf().
Следует заметить, что вызов функции
fscanf(stdin,[строка формата],[список адресов переменных]);
эквивалентен вызову
scanf([строка формата],[список адресов переменных]);
Аналогично,
fprintf(stdout, [строка формата],[список переменных, констант]);
эквивалентно
printf([строка формата],[список переменных, констант]);
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
