Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Здесь производится попытка прочитать 5 записей о рабочих в переменную buf из файла, связанного с переменной fw. Реально прочитанное число записей сохраняется в х. Функцию можно использовать и без оператора присваивания:
fread(&buf, sizeof(buf), 5, fw);
fwrite – записывает блок данных в поток.
Формат вызова функции:
fwrite (АдресБуфера, РазмерЗаписи, ЧислоЗаписей, ФайловаяПеременная);
Пример:
unsigned x;
worker buf;
x = fwrite(&buf, sizeof(buf), 5, fw);
Здесь производится попытка записать 5 записей о рабочих в переменную buf из файла, связанного с переменной fw. Реально записанное число записей сохраняется в х. Функцию можно использовать и без оператора присваивания:
fwrite(&buf, sizeof(buf), 5, fw);
fseek – изменяет указатель позиции файла на указанное место.
Чтение и запись в файл необязательно делать последовательно, можно это делать непосредственно доступом к нужному элементу файла посредством функции fseek(), которая устанавливает указатель позиции файла в нужное место. Прототип этой функции:
Формат вызова функции
fseek (Файловая_переменная, Смещение_в_байтах, точка_отсчета);
Точка отсчета задается одной из 3 констант:
начало файла SEEK_SET 0;
текущая позиция SEEK_CUR 1;
конец файла SEEK_END 2;
Смещение в байтах может быть положительным или отрицательным. При вычислении размера смещения все части выражения должны быть приведены к типу long int. Например, сместиться на 2 записи назад от текущей позиции:
fseek(fw, - long(2*sizeof(buf), SEEK_CUR);
fseek возвращает 0 если указатель успешно перемещен, и ненулевое значение при ошибке, поэтому функцию можно использовать в проверке условия или присваивании.
ftell – возвращает текущую позицию в файле (номер байта).
Использование:
long pos = ftell(fw);
feof – определяет, достигнут ли конец файла.
При считывании двоичного файла определить наличие конца файла не удается. Для определения конца файла служит функция feof() с прототипом:
int feof (FILE * tptr);
Следующая конструкция читает двоичный файл до конца файла (по байтам):
while (!feof (fptr)) { ch=getc(fptr); }
Следующий фрагмент считывает из файла все записи выводит на экран фамилии рабочих:
while (!feof (fw)) {
fread(&buf, sizeof(buf), 1, fw);
printf(”%s\n”,buf. name);
}
Общие принципы работы с файлами записей:
Сначала нужно создать файл с помощью программы. В ней должна быть предусмотрена функция добавления записи. Ввод записи с клавиатуры целиком невозможен, поэтому каждое поле (если оно не структурное), нужно вводить отдельно по запросу или заполняя экранную форму. Сформированная структура записывается в файл целиком.
При чтении информации из файла тоже лучше почитать запись целиком, проанализировать содержимое полей и выполнить какие-то действия.
При коррекции прочитанной записи необходимо сдвинуть указатель файла на одну запись назад, так как каждая операция чтения-записи смещает его автоматически. Затем можно записывать измененные данные.
Ниже приводится пример коррекции существующего файла о результатах Олимпиады. Запись содержит строковое поле для названия страны и массив из 3 чисел для медалей разного достоинства. Сначала определяется количество записей в файле с помощью оригинальной функции и выводятся результаты в виде таблицы. Затем пользователь может ввести название страны и откорректировать данные. Если такая страна в файле не будет найдена, она добавляется в конец файла. Если пользователь введет минус вместо названия страны, процесс коррекции заканчивается.
#include <stdio. h>
#include <conio. h>
#include <stdlib. h>
#include <string. h>
char* medal[]={"Gold","Silver","Bronse"};
typedef struct {
char name[16];
int res[3];
} sport;
long frecount(char* fn, int n) { // Определение числа записей
FILE *f;
long x;
if ((f=fopen(fn,"rb"))==NULL) {
puts("Не могу открыть файл!"); exit(1); }
fseek(f,0L,2);
x=ftell(f)/n;
fclose(f);
return x;
}
void main() {
clrscr();
sport s;
char mdf, country[16];
int p, x,k, mf;
FILE *f1;
long r, nr=frecount("ol. dat",sizeof(sport));
printf("Число записей в файле - %lu\n",nr);
// Вывод записей в виде таблицы
printf("Страна Золото Серебро Бронза\n");
printf("----\n");
if ((f1=fopen("ol. dat","rb"))==NULL) {
puts("Не могу открыть файл!"); exit(1); }
if (!feof(f1)) fread(&s, sizeof(s),1,f1);
while (!feof(f1)) {
printf("%-15s",s. name);
for (k=0; k<3; k++) {
printf("%10d",s. res[k]); }
printf("\n");
fread(&s, sizeof(s),1,f1);
}
printf("-----\n");
fclose(f1);
// Коррекция и добавление записей
if ((f1=fopen("ol. dat","r+b"))==NULL) {
puts("Не могу открыть файл!"); exit(1); }
do { // бесконечный цикл коррекции
p=0;
printf("Страна: ");
scanf("%15s",country);
if (country[0]=='-') break; // выход из цикла коррекции
rewind(f1);
if (!feof(f1)) fread(&s, sizeof(s),1,f1);
while (!feof(f1)) { // цикл поиска страны в файле
if (strcmp(s. name, country)==0) {
p=1;
printf("%-15s",s. name);
for (k=0; k<3; k++) {
printf("%10d",s. res[k]); }
printf("\n");
printf("Новые данные:\n");
for (k=0; k<3; k++) {
printf("%s: ",medal[k]);
scanf("%d",&x);
s. res[k]=x;
}
fflush(f1);
r=ftell(f1);
rewind(f1);
fseek(f1,r-long(sizeof(s)),1);
fwrite(&s, sizeof(s),1,f1);
break;
}
fread(&s, sizeof(s),1,f1);
} // while
if (!p) { // Новая страна - добавление
printf("Страна: ");
printf("%-15s",country);
strcpy(s. name, country);
printf("Медали:\n");
for (k=0; k<3; k++) {
printf("%s: ",medal[k]);
scanf("%d",&x);
s. res[k]=x;
}
fseek(f1,0L,2);
fwrite(&s, sizeof(s),1,f1);
}
} while (1); // конец бесконечного цикла
printf("-----\n");
fclose(f1);
getch();
}
Следующая программа организует запись блоком в файле строки (символьного массива), а также чтение и вывод на экран записанной информации.
#include <string. h>
#include <stdio. h>
void main (){
FILE*stream;
char msg [] =’this is a test’;
char buf [20];
if ((stream = fopen(‘DUMMY. FIL’, “w+”)) ==NULL) {
puts (“Ошибка открытия файла \n”);
return;
}
// запись строки в файл
fwrite (msg, strlen(msg)+1, 1, stream);
// установка указателя на начало файла
fseek (stream, 0, SEEK SET);
// чтение строки из файла
fread (buf, strlen (msg)+1, 1, stream);
printf (‘%s\n’, buf);
fclose (stream);
В этой программе поток открывается в режиме “w+” (создание для записи с последовательным чтением). Поэтому закрывать файл во время записи не потребовалось.
Задания для подготовки к работе
1. Изучите основную терминологию, связанную с файлами, потоками и структурами.
2. Изучите режимы открытия файлов, способы доступа к данным, возможности языка программирования по обработке файлов с прямым доступом.
3. Разработайте алгоритм и программу в соответствии с заданием.
Задания к работе
Создать программу для работы с файлом записей согласно варианта. Работа с файлом должна осуществляться через меню, в котором должны быть следующие пункты:
- Показать все записи; (в виде таблицы)
- Добавить запись;
- Удалить запись;
- Изменить запись;
- Поиск записи (по каким-то критериям);
- Сортировка записей (по какому-то одному полю).
Вывод найденных или отсортированных записей должен осуществляться в виде таблицы с заголовками. При большом количестве записей предусмотрите листание или паузу.
В программе можно использовать вспомогательный массив записей (как буфер) только в том случае, если количество записей в файле будет больше.
Для испытаний заполнить файл 15-20 записями.
Варианты заданий.
1. Создать файл, содержащий сведения о месячной заработной плате рабочих завода. Каждая запись содержит поля – фамилии рабочего, наименование цеха, размер заработной платы за месяц.
2. Создать файл, содержащий сведения о количестве изделий, собранных сборщиками цеха за неделю. Каждая запись содержит поля: фамилия сборщика, количество изделий, собранных им ежедневно в течение шестидневной недели, т. е. раздельно - в понедельник, вторник и т. д.
3. Создать файл, содержащий сведения о количестве изделий категорий А, В, С, собранных рабочим за месяц. Количество записей - произвольное.
4. Создать файл, содержащий сведения о телефонах абонентов. Каждая запись имеет поля: фамилия абонентов, год установки телефона, номер телефона.
5. Создать файл, содержащий сведения об ассортименте игрушек в магазине. Структура записи: название игрушки, цена, количество, возрастные границы, например 2-5, т. е. от 2 до 5 лет.
6. Создать файл, содержащий сведения о сдаче студентами 1 курса кафедры КиПР сессии. Структура записи: индекс группы, фамилия студента, оценки по пяти экзаменам, признак участия в общественной работе: «1»- активное участие, «0»- неучастие.
7. Создать файл, содержащий сведения о сдаче студентами сессии. Структура записи: индекс группы, фамилия студента, оценки по пяти экзаменам и пяти зачетам («з» означает зачет, «н» - незачет).
8. Создать файл, содержащий сведения о личной коллекции книголюба. Структура записи: шифр книги, автор, название, год издания, местоположение (номер стеллажа, шкафа и т. п.).
9. Создать файл, содержащий сведения о наличии билетов и рейсах Аэрофлота. Структура записи: номер рейса, пункт назначения, время вылета, время прибытия, количество свободных мест в салоне.
10. Создать файл, содержащий сведения об ассортименте обуви в магазине фирмы. Структура записи: артикул, наименование, количество, стоимость одной пары. Количество записей - произвольное. Артикул начинается с буквы Д для дамской обуви, М для мужской, П для детской.
11. Создать файл, содержащий сведения о десяти нападающих хоккейных команд «Динамо» и «ЦСКА» соответственно: имена нападающих, число заброшенных ими шайб, сделанных голевых передач, заработанное штрафное время.
12. Создать файл, содержащий сведения о том, какие из пяти предлагаемых дисциплин по выбору желает слушать студент. Структура записи: фамилия студента, индекс группы, 5 дисциплин, средний балл успеваемости. Выбираемая дисциплина отмечается символом 1, иначе – пробел.
13. Создать файл, содержащий сведения об отправлении поездов дальнего следования с Казанского вокзала. Структура записи: номер поезда, станция назначения, время отправления, время в пути, наличие билетов.
14. Создать файл, содержащий сведения о сотрудниках института. Структура записи: фамилия работающего, название отдела, год рождения, стаж работы, должность, оклад.
15. Создать файл, содержащий сведения о пациентах глазной клиники. Структура записи: фамилия пациента, пол, возраст, место проживания (город), диагноз.
Содержание отчета
Отчет должен содержать:
Тексты заданий (по вариантам);
Тексты программ с комментариями;
Протоколы работы программ;
Выводы по работе.
Контрольные вопросы.
1. Объяснить, что означают следующие термины: файл, запись, метод доступа, структура записи?
2. Каково назначение операторов открытия и закрытия файлов?
3. Допустимы ли различные типы данных для элементов одной записи?
4. Указать с помощью каких операторов выполняется запись данных в файл прямого доступа, чтение из файла?
5. Как распознать конец файла данных?
6. Как работать с файлом, который кроме записей имеет заголовок, описывающий структуру записи?
Литература
1. . С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2002. – 464с.
2. , . С/С++. Структурное программирование: практикум. – СПб.: Питер, 2002. – 240с.
3. Митницкий теории алгоритмов и язык программирования С. Учебное пособие. –М.: МФТИ, 2001. – 180с.
4. Могилев А. В. и др. Информатика. М.: Изд. центр “Академия”, 2000. – 816 с.
5. Подбельский С++: Учебное пособие. – М.: Финансы и статистика, 2002 – 560с.
6. , Фомин на языке Си. – М.: Финансы и статистика, 2002 – 600с.
Лабораторная работа № 10
Обработка текстовых файлов
Цели работы:
Научиться разрабатывать программы с использованием файловых структур данных;
Овладеть навыками обработки структурированных данных, расположенных во внешней памяти.
Краткие теоретические сведения
Файл в языке Си – это понятие, которое может быть приложено ко всему от файла на диске до устройства ввода-вывода. Стандарт ANSI языка Си связывает каждое из устройств с логическим устройством, называемым потоком. Так как потоки не зависят от физических устройств, одна и та же функция может записывать информацию на диск, магнитную ленту или выводить ее на экран, принтер.
В языке Си существует два типа потоков: текстовый (text) и двоичный (binary).
Текстовый поток – это последовательность символов. Для него нет взаимооднозначного соответствия между символами, которые передаются в потоке и выводятся на экран. Буква соответствует букве, но пара символов может соответствовать возврату каретки.
Двоичный поток - это последовательность байтов, которые взаимооднозначно соответствуют тому, что находится на внешнем устройстве.
Текстовый файл можно рассматривать и как текстовый, и как двоичный, а двоичный как текстовый – нельзя.
Под текстовым файлом здесь и далее будем понимать устройство, связанное с текстовым потоком (клавиатуру, экран, принтер) или файл, не содержащий вместе с текстом рисунков и других внедренных объектов. Такие файлы создаются в большинстве редакторов, работающих в среде MS DOS, или в редакторе Блокнот из стандартного набора программ Windows. В DOS и Windows отличается кодировка русских букв.
Текстовый файл является файлом последовательного доступа. Его можно рассматривать, как совокупность строк разной длины. Поэтому нельзя одной командой переместить указатель в файле на 5-ю строку или 326 слово. Можно сделать это, последовательно считывая информацию от начала файла до нужного места. Хотя в Си и можно переместить указатель на определенное количество байт функцией fseek, делать это рекомендуется только если файл открыт для чтения и нужно быть осторожным, так как некоторые символы могут занимать больше одного байта.
Текст в файле может иметь какую угодно структуру: обычный текст (несколько абзацев), текст программы (в том числе на языке Си), таблица записей. Фрагменты текстового файла могут иметь разную структуру.
Если есть четкие соглашения о формате файла (расположении данных), всегда можно написать программу для его чтения или коррекции.
Из текстового потока можно считывать любые числа, символы и строки. Записывать можно любые числа, символы, строки и логические значения (TRUE и FALSE, если они поддерживаются версией языка программирования).
Если текстовый файл, начиная с определенной строки, содержит однотипные записи, можно объявить в программе переменную типа struct, и считывать данные из файла в поля записи.
Запись – это структура данных, которая может содержать несколько полей. У каждого поля может быть свой тип данных (числовой, строка, массив, другая запись, ...). Каждое поле занимает фиксированный размер, а в памяти они хранятся последовательно друг за другом. Группа таких записей может храниться в двоичном файле или массиве. Зная общий размер записи, можно перемещаться по файлу к нужной записи.
Описание в программе указанной выше структуры о рабочем лучше выполнить следующим образом:
typedef struct {
char name[15]; // фамилия
unsigned int tab; // табельный номер
unsigned char q; // разряд
char prof[20]; // профессия
} worker;
Размер этой записи можно определить с помощью операции sizeof(worker).
Работа с файлом состоит из нескольких этапов:
- Открытие файла в определенном режиме (чтение, запись, чтение и запись, создание...) и связывание его с именем дискового файла или устройства;
- Операции чтения-записи;
- Закрытие файла. (при этом происходит сохранение изменений на диске).
Рассмотрим основные функции для работы с файлами.
fopen - открытие файла. Данная функция выполняет два действия:
1) Открывает поток и связывает файл на диске с этим потоком.
2) Возвращает указатель, ассоциируемый с этим файлом.
Прототип функции: FILE* fopen (char*filename, char*mode);
где
filename - это строка, содержащая имя открываемого файла;
mode - это строка, содержащая режим открываемого файла.
Возможные режимы открытия текстовых файлов:
“rt” – открыть текстовый файл только для чтения.
“wt” – создать новый текстовый файл для записи.
“at” - открыть текстовый файл для добавления в конец файла.
“r+t” – открыть текстовый файл для чтения и записи.
“w+t” – создать новый текстовый файл для чтения и записи.
“a+t” – открыть текстовый файл для добавления или создать для чтения и записи.
Если файл открыт для записи, то существующий файл уничтожается и создается новый. При открытии файла для чтения требуется чтобы он существовал. В случае открытия для чтения и записи существующий файл не уничтожается, однако создается, если он не
существует.
Чтобы объявить указатель на файл используется оператор FILE* ИмяПеременной.
Пример:
FILE* fw; // объявление файловой переменной
fw=fopen(”work. dat”, ”w”); // создание нового файла для записи
Наиболее часто используются режимы «rt», «wt», «at». Здесь все просто: файл открывается либо только для чтения, либо только для записи, либо только для добавления в конец файла.
В режиме "r+t" можно записывать данные поверх старых, но операции чтения лучше не производить
Вообще, если нужно преобразовать текстовый файл, следует использовать 2 файла: входной и выходной, а иногда и временный промежуточный.
fclose – закрытие файла.
Пример: fclose(fw);
fscanf – форматное чтение из текстового файла.
Формат вызова функции:
fscanf(Файловая_переменная, строка_формата, список_адресов_переменных);
Функция fscanf аналогична функции scanf за тем исключением, что в начале указывают имя файловой переменной.
fprintf – форматная запись в текстовый файл.
Формат вызова функции:
fprintf(Файловая_переменная, строка_формата, список_выражений);
Функция fprintf аналогична функции pirntf за тем исключением, что в начале указывают имя файловой переменной.
fgets – чтение строки текстового файла.
Формат вызова функции:
fgets(строковая_переменная, число_символов, Файловая_переменная);
Функция fgets считывает в строковую переменную строку из файла целиком, если второй параметр больше, чем длина строки в файле. В противном случае в переменную считываются только несколько первых символов из строки файла.
При чтении строки целиком символ перевода строки заносится в конец строковой переменной. Поэтому при ее выводе не нужно специально переводить строку.
fputs – запись строки в текстовый файл.
Формат вызова функции:
fgets(строковое_выражение, Файловая_переменная);
Функция fputs записывает строку в текстовый файл вместе с символом перевода строки.
Функция fputs аналогична функции puts за тем исключением, что 2-м параметром указывают имя файловой переменной.
feof – определяет, достигнут ли конец файла.
При посимвольном считывании текстового файла нужно сначала прочитать символ, а затем проверить, не достигнут ли конец файла с помощью функции feof().
Для определения конца строки нет специальной функции, но его можно обнаружить с помощью проверки символа. Символ «Конец строки» на диске состоит из 2 байтов с кодами 13 («Возврат каретки») и 10 («Перевод строки»), но при чтении из файла в символьной переменной сохраняется только последний байт.
Следующая программа читает текстовый файл 1.txt до конца файла (по символам) и выводит его на экран. После каждой строки выводится разделитель в виде линии. Затем производится чтение файла по строкам.
#include <stdio. h>
#include <conio. h>
main() {
clrscr();
FILE *f2;
char t, *str;
if ((f2=fopen("1.txt","rt"))==NULL) {
puts("Не могу открыть файл!"); exit(1); }
clrscr();
// чтение из файла по символам
for (;;) {
fscanf(f2,"%c",&t); // читать символ
printf("%c",t); // вывести его на экран
if (t==10) // Проверка на символ ”Перевод строки”
puts("----");
if feof(f2) break; // проверка конца файла
}
printf(”\n=====================================\n”);
rewind(f2); // вернуть указатель в начало файла
// чтение из файла по строкам
for (;;) {
fputs(str,100, f2); // читать строку
printf("%s",t); // вывести ее на экран
if feof(f2) break; // проверка конца файла
}
fclose(f2);
getch();
}
fseek – изменяет указатель позиции файла на указанное место.
Чтение и запись в текстовый файл желательно делать последовательно, однако можно переместить указатель к нужному байту файла посредством функции fseek. Делать это нужно очень осторожно, так как некоторые символы (например, переход на следующую строку), состоят из нескольких байт и указатель может сместиться неправильно. Кроме того, в некоторых режимах открытия текстового файла вызов функции fseek может игнорироваться.
Формат вызова функции
fseek (Файловая_переменная, Смещение_в_байтах, точка_отсчета);
Точка отсчета задается одной из 3 констант:
начало файла SEEK_SET 0;
текущая позиция SEEK_CUR 1;
конец файла SEEK_END 2;
Смещение в байтах может быть положительным или отрицательным. При вычислении размера смещения все части выражения должны быть приведены к типу long int. Например, сместиться на 2 записи назад от текущей позиции:
fseek(fw, - long(2*sizeof(buf), SEEK_CUR);
rewind – установить указатель на начало файла.
Формат вызова: rewind(Файловая_переменная);
Общие принципы работы с текстовыми файлами, имеющими вид таблиц:
- Для того, чтобы добраться до таблицы, может потребоваться чтение нескольких строк в начале файла, например, содержащих заголовок и прочую информацию.
- Если в таблице следует текстовое поле, следует визуально определить его длину, а в программе использовать чтение строки функцией fscanf с ограничением количества символов.
- Если в таблице следует числовое поле, в программе использовать чтение числа функцией fscanf с указанием формата числа.
- Когда все поля строки прочитаны, следует прочитать остаток строки (с символом конца строки) функцией fgets.
- Для чтения текстовых полей, содержащих пробелы, можно использовать спецификацию формата %[\x20-\xFF]s для функции fscanf или функцию fgets с указанием ширины поля.
Задания для подготовки к работе
1. Изучите основную терминологию, связанную с файлами, потоками и структурами.
2. Изучите режимы открытия файлов, способы доступа к данным, возможности языка программирования по обработке текстовых файлов.
3. Разработайте алгоритм и программу в соответствии с заданием.
Задания к работе
Создать программу для работы с текстовым файлом, содержащим таблицу записей согласно варианта. У таблицы должен быть заголовок. Работа с файлом должна осуществляться через меню, в котором должны быть следующие пункты:
- Показать все записи; (в виде таблицы)
- Добавить запись;
- Удалить запись;
- Изменить запись;
- Поиск записей (по каким-то критериям);
- Сортировка записей (по какому-то одному полю).
Вывод найденных или отсортированных записей должен осуществляться в виде таблицы с заголовками. При большом количестве записей предусмотрите листание или паузу.
Записи нужно сортировать в файле, а при выводе на экран.
Можно использовать временные файлы.
В программе можно использовать вспомогательный массив записей (как буфер) только в том случае, если количество записей в файле будет больше.
Для испытаний заполнить файл 15-20 записями.
Варианты заданий.
1. Создать файл, содержащий сведения о месячной заработной плате рабочих завода. Каждая запись содержит поля – фамилии рабочего, наименование цеха, размер заработной платы за месяц.
2. Создать файл, содержащий сведения о количестве изделий, собранных сборщиками цеха за неделю. Каждая запись содержит поля: фамилия сборщика, количество изделий, собранных им ежедневно в течение шестидневной недели, т. е. раздельно - в понедельник, вторник и т. д.
3. Создать файл, содержащий сведения о количестве изделий категорий А, В, С, собранных рабочим за месяц. Количество записей - произвольное.
4. Создать файл, содержащий сведения о телефонах абонентов. Каждая запись имеет поля: фамилия абонентов, год установки телефона, номер телефона.
5. Создать файл, содержащий сведения об ассортименте игрушек в магазине. Структура записи: название игрушки, цена, количество, возрастные границы, например 2-5, т. е. от 2 до 5 лет.
6. Создать файл, содержащий сведения о сдаче студентами 1 курса кафедры КиПР сессии. Структура записи: индекс группы, фамилия студента, оценки по пяти экзаменам, признак участия в общественной работе: «1»- активное участие, «0»- неучастие.
7. Создать файл, содержащий сведения о сдаче студентами сессии. Структура записи: индекс группы, фамилия студента, оценки по пяти экзаменам и пяти зачетам («з» означает зачет, «н» - незачет).
8. Создать файл, содержащий сведения о личной коллекции книголюба. Структура записи: шифр книги, автор, название, год издания, местоположение (номер стеллажа, шкафа и т. п.).
9. Создать файл, содержащий сведения о наличии билетов и рейсах Аэрофлота. Структура записи: номер рейса, пункт назначения, время вылета, время прибытия, количество свободных мест в салоне.
10. Создать файл, содержащий сведения об ассортименте обуви в магазине фирмы. Структура записи: артикул, наименование, количество, стоимость одной пары. Количество записей - произвольное. Артикул начинается с буквы Д для дамской обуви, М для мужской, П для детской.
11. Создать файл, содержащий сведения о десяти нападающих хоккейных команд «Динамо» и «ЦСКА» соответственно: имена нападающих, число заброшенных ими шайб, сделанных голевых передач, заработанное штрафное время.
12. Создать файл, содержащий сведения о том, какие из пяти предлагаемых дисциплин по выбору желает слушать студент. Структура записи: фамилия студента, индекс группы, 5 дисциплин, средний балл успеваемости. Выбираемая дисциплина отмечается символом 1, иначе – пробел.
13. Создать файл, содержащий сведения об отправлении поездов дальнего следования с Казанского вокзала. Структура записи: номер поезда, станция назначения, время отправления, время в пути, наличие билетов.
14. Создать файл, содержащий сведения о сотрудниках института. Структура записи: фамилия работающего, название отдела, год рождения, стаж работы, должность, оклад.
15. Создать файл, содержащий сведения о пациентах глазной клиники. Структура записи: фамилия пациента, пол, возраст, место проживания (город), диагноз.
Содержание отчета
Отчет должен содержать:
Тексты заданий (по вариантам);
Тексты программ с комментариями;
Протоколы работы программ;
Выводы по работе.
Контрольные вопросы.
7. В чем отличие текстовых файлов от двоичных?
8. Какие файлы удобнее для обработки записей?
9. Каково назначение операторов открытия и закрытия файлов?
10. Указать с помощью каких операторов выполняется запись данных в текстовый файл, чтение из файла?
11. Как распознать конец файла, конец строки?
12. Можно ли использовать прямой доступ к элементам текстового файла: строке, слову, записи?
Литература
39. . С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2002. – 464с.
40. , . С/С++. Структурное программирование: практикум. – СПб.: Питер, 2002. – 240с.
41. Митницкий теории алгоритмов и язык программирования С. Учебное пособие. –М.: МФТИ, 2001. – 180с.
42. и др. Информатика. М.: Изд. центр “Академия”, 2000. – 816 с.
43. Подбельский С++: Учебное пособие. – М.: Финансы и статистика, 2002 – 560с.
44. , Фомин на языке Си. – М.: Финансы и статистика, 2002 – 600с.
Лабораторная работа № 11
Динамические структуры данных
Цели работы:
Научиться управлять выделением и освобождением динамической памяти;
Научиться выполнять основные операции для списков: добавление, удаление и поиск элементов, вывод списка.
Краткие теоретические сведения
Методы организации и хранения линейных списков
Линейный список - это конечная последовательность однотипных элементов (узлов), возможно, с повторениями. Количество элементов в последовательности называется длиной списка, причем длина в процессе работы программы может изменяться.
Линейный список F, состоящий из элементов D1,D2,...,Dn, записывают в виде последовательности значений заключенной в угловые скобки F=<D1,D2,...,Dn>, или представляют графически (см. рис.1).
D1 | à | D2 | à | D3 | à | ... | à | Dn |
Рис. 1. Изображение линейного списка. |
Например, F1=<2,3,1>,F2=<7,7,7,2,1,12>, F3=<>. Длина списков F1, F2, F3 равна соответственно 3,6,0.
При работе со списками на практике чаще всего приходится выполнять следующие операции:
- найти элемент с заданным свойством;
- определить первый элемент в линейном списке;
- вставить дополнительный элемент до или после указанного узла;
- исключить определенный элемент из списка;
- упорядочить узлы линейного списка в определенном порядке.
В реальных языках программирования нет какой-либо структуры данных для представления линейного списка так, чтобы все указанные операции над ним выполнялись в одинаковой степени эффективно. Поэтому при работе с линейными списками важным является представление используемых в программе линейных списков таким образом, чтобы была обеспечена максимальная эффективность и по времени выполнения программы, и по объему требуемой памяти.
Методы хранения линейных списков разделяются на методы последовательного и связанного хранения. Рассмотрим простейшие варианты этих методов для списка с целыми значениями F=<7,10>.
При последовательном хранении элементы линейного списка размещаются в массиве d фиксированных размеров, например, 100, и длина списка указывается в переменной l, т. е. в программе необходимо иметь объявления вида
float d[100]; int l;
Размер массива 100 ограничивает максимальные размеры линейного списка. Список F в массиве d формируется так:
d[0]=7; d[1]=10; l=2;
Полученный список хранится в памяти согласно схеме на рис.13.
l: | 2 |
| |||||
d: | 7 | 10 | ... | ||||
[0] | [1] | [2] | [3] | [98] | [99] | ||
Рис.13. Последовательное хранение линейного списка. |
При связанном хранении в качестве элементов хранения используются структуры, связанные по одной из компонент в цепочку, на начало которой (первую структуру) указывает указатель dl. Структура образующая элемент хранения, должна кроме соответствующего элемента списка содержать и указатель на соседний элемент хранения.
Описание структуры и указателя в этом случае может имееть вид:
typedef struct snd /* структура элемента хранения */
{ float val; /* элемент списка */
struct snd *n ; /* указатель на элемент хранения */
} DL;
DL *p; /* указатель текущего элемента */
DL *dl; /* указатель на начало списка */
Для выделения памяти под элементы хранения необходимо пользоваться функцией malloc(sizeof(DL)) или calloc(l, sizeof(DL)). Формирование списка в связанном хранении может осуществляется операторами:
p=malloc(sizeof(DL));
p->val=10; p->n=NULL;
dl=malloc(sizeof(DL));
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 |


