Файл: Информация и формы ее представления Информационные процессы и технологии.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 07.11.2023
Просмотров: 275
Скачиваний: 1
СОДЕРЖАНИЕ
1.3. ЭВМ как средство обработки информации
1.1 Информация и формы ее представления
1.2 Информационные процессы и технологии
1.3 ЭВМ как средство обработки информации
Структура и принципы функционирования ЭВМ
Основные характеристики вычислительной техники
Перспективы развития вычислительных средств
2.4 Операционная система MS-DOS
Файловая структура логического диска
Раздел 3 Основные принципы программирования
3.1. Этапы подготовки и решения задач на ЭВМ
3.2. Алгоритмы и способы их описания
3.3. Компиляция и интерпретация программ
3.1 Этапы подготовки и решения задач на ЭВМ
3.2 Алгоритмы и способы их описания
3.3. Компиляция и интерпретация программ
Раздел 9 Объектно-ориентированное программирование
};
Тогда при описании переменных можно использовать этот тип:
struct student X;
Здесь X - переменная типа структура; struct student - тип; fam, mathematics, informatics, history - поля структуры.
Отметим, что определение типа структуры может быть задано в программе на внешнем уровне, при этом имя пользовательского типа имеет глобальную видимость (при этом память не выделяется). Определение типа структуры также может быть сделано внутри функции, тогда имя типа структуры имеет локальную видимость.
Чтобы упростить обращение к структурному типу, можно воспользоваться директивой #define.
Например, для предыдущей структуры:
#define stud struct student
stud
{
char fam[20];
int mathematics, informatics, history;
};
Теперь идентификатор stud заменит в любом месте программы громоздкий тип struct student.
Теперь описании переменной типа структура будет выглядеть так:
stud X;
В более поздних версиях языка С ключевое слово typedef позволяет в программе создать синоним типа, который удобно использовать для объявления переменных структурного типа. Например:
typedef struct student
{
char fam[20];
int mathematics, informatics, history;
} STUD;
Идентификатор STUD представляет собой синоним типа struct student. С помощью синонима STUD можно объявить переменную:
STUD X;
Для обращения к отдельным полям переменной типа структура используется составное имя:
<имя переменной>.<имя поля>
Например, для переменной X обращения к полям записываются следующим образом:
X.fam, X. mathematics, X. informatics, X. history.
При размещении в памяти структурной переменной можно выполнить ее инициализацию. Неявная инициализация производится для глобальных переменных, переменных класса static. Структурную переменную можно инициализировать явно при объявлении, формируя список инициализации в виде константных выражений.
Формат: struct Имя переменная ={значение1, … значениеN};
Внутри фигурных скобок указываются значения полей структуры, например:
struct student X={"Андреева С.В.", 4, 5, 5};
при этом первое значение записывается в первое поле, второе значение – во второе поле и т. д., а сами значения должны иметь тип, совместимый с типом поля.
6.2 Обработка структур
Над структурами возможны следующие операции:
-
присваивание значений структурной переменной; -
получение адреса переменной с помощью операции &; -
ввод и вывод значений переменных структурного типа; -
сравнение полей переменных структурного типа.
Операция присваивания применима, как к отдельным полям переменной структурного типа, так и к переменным в целом.
При присваивании полям структуры значений, необходимо учитывать типы полей. Например:
#include "stdafx.h"
#include
typedef struct student // описание структуры
{
char fam[20];
int mathematics, informatics, history;
} STUD;
main()
{ STUD X; //описание переменной структурного типа
strcpy(X.fam, "Андреева С.В. "); /*копирование фамилии в поле fam переменной Х */
X. mathematics=4;
X. informatics=5;
X. history=5;
printf("\n %s %d %d %d", X.fam, X.mathematics, X.informatics,X.history);/*вывод информации из полей переменной Х
. . .
}
Для структурного типа возможно присваивание значений одной структурной переменной другой структурной переменной, при этом обе переменные должны иметь один и тот же тип.
Присваивание значения одной переменной другой выполняется путем копирования значений соответствующих полей, например:
. . .
main()
{ STUD X, Y;
strcpy(X.fam, "Андреева С.В. ");
X. mathematics=4;
X. informatics=5;
X. history=5;
Y=X; // копирование информации из Х в Y
printf("\n %s %d %d %d",
Y.fam, Y.mathematics, Y.informatics, Y.history);
. . .
}
В результате выполнения этого копирования в Y.fam будет записано значение "Андреева С.В.", а в Y. mathematics – оценка 4, в. Y.informatics – 5 и в Y.history – тоже 5.
Работа со структурной переменной обычно сводится к работе с отдельными полями структуры. Такие операции, как ввод с клавиатуры, сравнение полей и вывод на экран применимы только к отдельным полям. Например, в выше приведенном примере вывод информации о студенте осуществляется выводом значений отдельных полей с помощью функции printf().
С помощью структурного типа можно формировать массивы записей. Так, например информацию о 20 студентах можно хранить в массиве из 20 элементов структурного типа:
typedef struct student
{
char fam[20];
int mathematics, informatics, history;
} STUD;
main()
{ STUD Spis[20];
. . .
}
Пример задачи с использованием структурированных данных
Рассмотрим пример программы, в которой вводится информация об абонентах сети: ФИО, телефон и возраст. В программе выбираются абоненты моложе 25 лет и их список выводится в алфавитном порядке.
#include "stdafx.h"
#include
#include
typedef struct abon //описание структуры
{ char f[10],i[10],o[10];
long tel;
int voz;
}ABON;
const int n=5;
int i,k,j;
int main()
{ ABON z[n],y[n]; //описание массивов структур
ABON х;
for (i=0; 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
printf("|%9s|%8s|%9s|%7ld | %5d |\n", z[i].f,z[i].i,z[i].o, z[i].tel,z[i].voz);
}
printf("---------------------------------------------------\n");
for (i=0;i
{if(z[i].voz<25) // поиск абонента моложе 25 лет
y[k++]=z[i];
}
for(i=1;i
for(j=k-1;j>=i;j--)
if(y[j].f[0]
{x=y[j];
y[j]=y[j-1];
y[j-1]=x;}
printf("mologe 25\n");
printf("---------------------------------------------------\n");
printf("| Фамилия | Имя | Отчество| Телефон | Возраст |\n");
printf("---------------------------------------------------\n");
for (i=0;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;
}
Полем структурной переменной может быть переменная любого типа, в том числе другая структурная переменная. Поле, представляющее собой структуру, называется вложенной структурой.
Контрольные вопросы
-
Формат описаний комбинированного типа данных на языке СИ. -
Ввод-вывод значений структурного типа. -
Какие операции допустимы для переменных структурного типа. -
Правила сравнения значений полей структуры. -
Какие алгоритмы сортировки последовательностей вы знаете?
Раздел 7 Файлы данных
7.1 Понятие файла
7.2 Работа с файлами в стиле С
7.3 Работа с потоками в С++
7.1 Понятие файла
В большинстве своем файлы представляют собой именованные области внешней (дисковой) памяти, с которыми программы могут обмениваться информацией. Необходимость в таких обменах, во-первых, возникает, когда объем оперативной памяти недостаточен для хранения нужной информации. Во-вторых, программа может воспользоваться данными, полученными ранее другой программой и предусмотрительно записанными на диск. Наконец, в программах, требующих во время своей работы ввод исходных данных достаточно большого объема, целесообразно считывать эти данные из файла – данные в файле можно подготовить заблаговременно и тщательно выверить.
Файл – это информация, размещенная на каком-либо носителе (диске) или в буфере ввода/вывода устройства (клавиатура). Файлы предназначены только для хранения информации, а обработка этой информации осуществляется программами.
Работа с файлами в С++ реализуется либо с помощью функций, унаследованных от библиотеки С, либо с помощью потоков С++. Каждый способ имеет свои преимущества. Преимущество использования потоков в том, что они легче в использовании в простых случаях ввода/вывода, не требующих форматирования, и потоковые операции можно переопределить для собственных классов. Ввод/вывод в стиле С удобнее использовать при форматированном выводе в программах, не использующих объектно-ориентированную технику.
7.2 Работа с файлами в стиле С
Для обмена данными файл должен быть открыт, по завершении этого процесса – закрыт.
Поток – это логический канал, предназначенный для выполнения операций ввода/вывода. Каждому файлу при его открытии ставится в соответствие поток.
В языке C существуют стандартные потоки:
stdin – стандартный консольный ввод (клавиатура по умолчанию);
stdout – стандартный консольный вывод (монитор по умолчанию);
Стандартные потоки открываются при каждом запуске программы.
Для работы с файлами в программах, написанных в стиле С, используется специальный тип данных – структура 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.
Если файл открывается в режиме добавления данных "a", то указатель текущей позиции устанавливается на конец файла. Данные, ранее помещенные в файл, остаются без изменений. Если указывается несуществующий файл, то он создается заново.
В языке С файл можно открыть для чтения и/или записи в текстовом или бинарном (двоичном) режиме. Поэтому можно указать дополнительные условия режима открытия файла:
"b" – двоичный поток;
"t" – текстовый поток;
"+" – обновление файла.
"r+" – чтение файла с обновлением, т. е. возможна перезапись данных с усечением;
"w+" – запись в файл и одновременно чтение;
"a+" – добавление данных и чтение.
Для поочередного выполнения чтения и записи в режиме "+" необходимо ручное позиционирование курсора.
Закрытие файла
После завершения обработки файла его следует закрыть с помощью функции fclose(). При этом разрывается связь указателя на файл c внешним набором данных. Освободившийся указатель можно использовать для другого файла. Формат вызова функции:
fclose(fin);
При нормальном завершении программы в большинстве операционных систем все открытые файлы закрываются автоматически, но рекомендуется закрывать все файлы, дальнейшая обработка которых в программе не предполагается, при помощи функции fclose().
Ниже приведен фрагмент программного кода, поясняющего принцип работы с файлом.
int main()
{
FILE *in; //описание укателя на файл
in=fopen("num_arr.txt","r");//открытие файла
// Обработка открытого файла
. . .
fclose(in); //закрыть файл
return 0;
}
Обработка открытого файла
Каким образом можно прочитать уже открытый файл или записать в него информацию? Для этого в языке C существуют специальные функции:
Чтение (ввод) | Запись (вывод) |
fgetc() | fputc() |
fscanf() | fprintf() |
fgets() | fputs() |
fread() | fwrite() |
При каждой операции ввода/вывода указатель текущей позиции файла смещается на одну позицию в сторону конца файла.
Проверка признака конца файла
Так как при каждой операции ввода/вывода происходит перемещение указателя текущей позиции в файле, в какой-то момент указатель достигает конца файла. Структура типа FILE имеет поле – индикатор конца файла. Функция feof() проверяет состояние индикатора конца файла и возвращает значение 0, если конец файла не был достигнут, или значение, отличное от нуля, если был достигнут конец файла. Функция имеет единственный аргумент – указатель на FILE. Вызов функции в команде if:
if (! feof(fin))…
проверяет, что конец файла еще не достигнут.
Функции ввода/вывода
Простейший способ выполнить чтение из файла или запись в файл – использовать функции fgetc() или fputc().
Функция fgetc() выбирает из файла очередной символ; ей нужно только знать указатель на файл, например: