Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Краткие теоретические сведения

Поиск

Структура объединяет логически связанные данные разных типов. Структурный тип данных определяется описанием шаблона:

                   struct ID_структуры {

                                                        описание полей;

                                                        };

между символами «}» и «;» иногда помещают список декларируемых структурных переменных, при этом «ID_структуры» можно опустить.

Описание полей производится обычным способом. Типом элемента поля не может быть только тип FILE, других ограничений нет.

Пример определения структурного типа:

struct person

    {

char Fio[72];

      int Nom_Gr;

};

Интерпретация объекта типа struct person:

Fio Nom_Gr
72 2

длина в байтах 

Структурный тип "struct ID_структуры" можно использовать для декларации структур­ных переменных, массивов, функций и т.д.

struct person Teacher;           // структурная переменная

struct person Student[100];        // массив структур

struct person *Sved;                   // указатель на структуру

Предыдущий пример можно записать кратко:

struct person {

                 char Fio[72];

                 int Nom_Gr;

                       } Teacher, Student[100], *Sved;

Структурный тип данных удобно применять для группового управления манипулиро­ва­нием логически связанных объектов. Параметрами таких операций являются адрес и размер структуры.

Примеры групповых операций:

- захват и освобождение памяти для объекта, представленного совокупностью необязательно одно­типных  данных;

- запись и чтение данных, хранящихся на внешних носителях как физические и/или логические записи с известной структурой.

Обращение к элементам структур производится посредством:

а) операции принадлежности (.) в виде:

ID_структуры. ID_элемента

или

 (*указатель_структуры). ID_элемента

б) операции косвенной адресации (->) в виде:

указатель_структуры -> ID_элемента

Примеры обращения к полям описанной выше структуры:

к полю Fio:                                к полю Nom_Gr:  

Teacher.Fio                               Teacher.Nom_GR

  Student[15].Fio                         Student[15]. Nom_GR

  Sved->Fio                                 Sved-> Nom_GR

 

Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки и пересылке как единое целое.

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

В языке Си это выполняет функция fopen. Она связывает физический файл на носителе с логическим именем в программе. Логическое имя – это указатель на файл, т.е. на область памяти, где хранится информация о файле. Указатели на файлы необходимо объявлять. Формат объявления такого указателя следующий:

                       FILE  *указатель на файл;

Формат объявления функции

fopen (“строка_1”, “строка_2”);

в строке_1 (заключенной в кавычки) указывается место, в которое вы собираетесь поместить файл, например “a:mas_dat.dat” – файл с именем mas_dat.dat будет находиться на дискете (а:), “d:\\work\\sved.txt” – файл с именем sved.txt будет находиться на d:, в каталоге work.

В строке_2 указываются коды режимов доступа к открываемым файлам:

w - файл открывается только для записи; если файла с заданным именем нет, то он будет создан, если же такой файл существует, то перед открытием прежняя информация уничтожается;

r - файл открывается только для чтения; если такого файла нет, то возникает ошибка;

a - файл открывается для добавления в конец новой информации;

r+ - файл открывается для редактирования данных; возможны и запись, и чтение информации;

w+ - то же, что и для r+;

a+ - то же, что и для a, только запись можно выполнять в любое место файла; доступно и чтение файла;

t   - файл открывается в текстовом режиме; указывается поле r, w, a, r+, w+, a+;

b - файл открывается в двоичном режиме; указывается поле r, w, a, r+, w+, a+.

Текстовый режим отличается от двоичного тем, что при открытии файла как текстового пара символов «перевод строки», «возврат каретки» заменяется на один символ: «перевод строки» для всех функций записи данных в файл, а для всех функций вывода символ «перевод строки» теперь заменяется на два символа: «перевод строки», «возврат каретки».

По умолчанию файл открывается в текстовом режиме.

Пример:        

FILE  *f;

f= fopen ("d:\\work\\Dat_sp.cpp", "w");

или

    FILE  *f= fopen ("d:\\work\\Dat_sp.cpp", "w");

- открывается для записи текстовый файл Dat_sp.cpp с указателем f, который будет находиться на диске d, в каталоге work.

Если при открытии файла произошла ошибка, функция fopen возвращает значение NULL. Приведем пример стандартной последовательности операторов, необходимых для корректной работы с файлом:

#include <stdio.h>

   ...

    FILE *f_my;

              If(!(f_my = fopen(“rez.txt”, “r+t”)))

              {

                       puts(“\n Ошибка при открытии файла!”);

                       getch(); return;

              }

   ...                  //  Работа с файлом

    fclose(f_my);

   ...

 

После работы доступ к файлу необходимо закрыть с помощью функции fclose (указа­тель_на_файл). Например, из предыдущего примера файл закрывается так: fclose (f);

Для закрытия нескольких файлов введена функция, объявленная следующим образом:   void fcloseall (void);

Для работы с текстовыми файлами удобнее всего пользоваться функциями fprintf, fscanf. Формат параметров и выполняемые функции аналогичны известным операторам форматного ввода-вывода, только добавлен параметр – указатель на файл, к которому применяется данная функция. Рассмотрим простой пример:

#include<stdio.h>

    void main()

    {

    int a=2,b=3;

    FILE *f1;

    if(!(f1=fopen(“d:\\work\\f_rez.txt”,”w+t”)))

              {

puts(“\n Файл не создан!”);

              getch(); return;

              }

    fprintf(f1,” Файл результатов \n”);

    fprintf(f1,” %d плюс %d = %d\n”,a,b,a+b);

    fclose(f1);

    }

Просмотрев содержимое файла, можно убедиться, что данные в нем располагаются так же, как на экране при использовании функции printf.

Функция int fgets (char *S,int m,FILE *fp) – выполняет чтение строки S из файла fp до тех пор, пока не встретит символ '\n' или пока не будет считано m байт.

Функция int fputs (char *S, FILE *fp) - записывает строку S в файл fp до тех пор, пока не встретится '\0', который в файл не переносится и на символ '\n' не заменя­ется.

Функции работы с текстовыми файлами удобны при создании результирующих файлов для отчетов по лабораторным и курсовым работам. Для создания баз данных удобнее пользоваться функциями работы с бинарными файлами. В основном прототипы этих функций описаны в библиотеках stdio.h и io.h. Рассмотрим некоторые из них:

1) int fread (void * ptv, int size, int n, FILE *fp) - считывает n блоков по size байт каждый из файла fp в область памяти, на которую указывает ptv (необходимо заранее отвести память под считываемый блок);

2) int fwrite (void * ptv, int size, int n, FILE *fp) - записывает n блоков по size байт каждый из области памяти, на которую указывает ptv в файл fp;

3) int fileno (указатель_файла) – возвращает дескриптор файла (число, определяющее номер файла);

4) long filelength (int дескриптор_файла) – возвращает длину файла в байтах;

5) int chsize (int дескриптор_файла, long позиция) – выполняет изменение размера файла, признак конца файла устанавливается после байта с номером «позиция»;         

6) int fseek (указатель_файла, long количество_байт, int код) – выполняет смещение текущей позиции в файле на количество_байт в направлении признака код:

    0 - от начала файла;

    1 - от текущей позиции указателя;

    2 - от конца файла;

7) long ftell (указатель_файла)   - возвращает значение указателя на текущую позицию файла (-1 – ошибка);

8) int feof (указатель_файла) – возвращает ненулевое значение при правильной записи признака конца файла;

9) int fgetpos (указатель_файла,long*текущая_позиция) – определяет значение текущей позиции файла; возвращает 0 при успешном завершении.

Пример программы работы с файлом структур

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

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

struct Sved {

              char Fam[20];

              int mark[3];

              float S_Bal;

              } zap;

char Spis[]="d:\\work\\Sp.dat";

FILE *F_zap;

void main ()

{ int i,kodR,size=sizeof(Sved);

float s;

while(1) {

    puts(" Создание - 1");

    puts(" Просмотр - 2");

    puts(" Добавление - 3");

    puts(" Выход        - 0");

    scanf(“%d”, &kodR);

switch(kodR) {

case 1:

case 3: if(kodR==1) F_zap=fopen(Spis,"w+b");

                       else F_zap=fopen(Spis,"a+b");

    while(2) {

    puts(" Фамилия (Завершение ввода - 0)");

scanf(“%s”, zap.Fam);

              if((zap.Fam[0])=='0') break;                    

    puts(" Marks (3) ");

    for(s=0,i=0;i<3;i++)

                       {

             scanf(“%d”, &zap.mark[i]);

             s+=zap.mark[i];

                       }

        zap.S_Bal=s/3.;

    fwrite(&zap, size, 1, F_zap);

              }

    fclose(F_zap);

break;

case 2: F_zap=fopen(Spis,"r+b");

while(2)

{

 if(!fread(&zap, size, 1, F_zap)) break;     

     printf(" %20s %2d %2d %2d %5.2f\n",  

zap.Fam,zap.mark[0],zap.mark[1],zap.mark[2],zap.S_Bal);

         }

fclose(F_zap);

break;

case 0: return;                 

} //  Конец Switch  

}       //  Конец While(1)

}            //  Конец программы

Варианты заданий

Написать программу обработки файла типа запись, содержащую следующие пункты меню:

Создание,

Просмотр,

Коррекция – добавление новых данных или исправление старых.

 

Список товаров, имеющихся на складе, включает:

наименование товара;

количество единиц товара;

цену единицы товара;

дату поступления товара на склад.

Вывести в алфавитном порядке список товаров, хранящихся более месяца, стоимость которых превышает 1000 рублей.

Для получения места в общежитии формируется список студентов, который включает:

Ф.И.О. студента;

номер группы (буква и четыре цифры);

средний балл;

доход на одного члена семьи.

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

Вывести список очередности предоставления места в общежитии.

В справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны:

номер рейса;

тип автобуса;

пункт назначения;

время отправления;

время прибытия на конечный пункт.

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

На междугородной АТС информация о разговорах содержит:

дату разговора;

код и название города;

время разговора;

тариф;

номер телефона в этом городе;

номер телефона абонента.

Вывести по интересующему вас городу общее время разговора с ним и сумму.

Информация о сотрудниках фирмы включает:

Ф.И.О. сотрудников;

табельный номер;

количество проработанных часов за месяц;

почасовой тариф.

Рабочее время свыше 144 ч считается сверхурочным и оплачивается в двойном размере. Вывести размер заработной платы каждого сотрудника фирмы за вычетом подоходного налога, который составляет 12% от суммы заработной платы.

Информация об участниках соревнований содержит:

Ф.И.О. игрока;

игровой номер;

возраст;

рост;

вес.

Вывести информацию о самой молодом, рослом и легком участнике соревнований.

Для книг, хранящихся в библиотеке, задаются:

регистрационный номер книги;

автор;

название;

год издания;

издательство;

количество страниц.

Вывести список книг с фамилиями авторов в алфавитном порядке, изданных после заданного года.

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

наименование;

количество;

номер цеха.

Для заданного цеха необходимо вывести количество выпущенных изделий по каждому наименованию в порядке убывания количества.

Информация о сотрудниках предприятия содержит:

Ф.И.О.;

номер отдела;

должность;

дату начала работы.

Вывести список сотрудников по отделам в порядке убывания стажа работы.

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

Вычислить общую сумму выплат за месяц по отделу А, а также среднемесячный заработок сотрудникам этого отдела.

Напечатать для бухгалтерии ведомость для сотрудников этого отдела, у которых зарплата ниже введенной с клавиатуры.

Создать файл, содержащий сведения о количестве изделий категории А, В, С, собранных рабочими за месяц. Структура записи имеет поля: фамилия сборщика, наименование цеха, количество изделий по категории, собранных рабочими за месяц.

Считая данными (вводятся с клавиатуры) значения расценок Sa, Sв, Sc за выполненную работу по сборке единицы изделия категорий А, В, С, выдать на печать следующую информацию:

- общее количество изделий категории А, В, С, собранных рабочими цеха X;

- ведомость заработной платы рабочих цеха X;

- средний размер заработной платы работников этого цеха.

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

по вводимой с клавиатуры фамилии абонента выдается номер телефона;

определяется количество установленных телефонов с XXXX года (год вводится с клавиатуры).

Создать файл, содержащий сведения об ассортименте игрушек в магазине. Структура записи: название игрушки, цена, количество, возрастные границы, например, от 2 до 5 лет. Вывести на печать:

название игрушек, которые подходят детям от 1 до 3 лет;

стоимость самой дорогой игрушки и ее наименование;

название игрушки, которая по стоимости не превышает «х» р. Значение «х» вводится с клавиатуры.

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

фамилии неуспевающих студентов с указанием номера группы и количества задолженностей;

средний балл, полученный каждым студентом группы Х (вводится с клавиатуры), и всей группой в целом.

Создать файл, содержащий сведения об ассортименте обуви в магазине. Структура записи: артикул, наименование, количество, стоимость одной пары. Артикул начинается с буквы Д для женской обуви, М -для мужской, П - для детской. На печать вывести информацию:

- о наличии и стоимости обуви артикула Х (вводится с клавиатуры);

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

 

Контрольные вопросы

1. Как описываются структуры в языке Си?

2. Что такое структурная переменная?

3. Как обратиться к полю структурной переменной?

4. Укажите правила открытия, закрытия файла в языке Си.

5. Какие режимы доступа к файлам вы знаете?

 

Список рекомендуемой литературы

 

1. Березин Б.И., Березин С.Б. Начальный курс С и С++. – М.: Диалог-МРТИ,1999. - 288 с.

2. Больски М.Н. Язык программирования СИ. Справочник. - М.: Радио и связь, 1988.

3. Демидович Е.М. Основы алгоритмизации и программирования. Язык СИ. - Мн.: Бест­принт, 2001. – 440 c.

4. Касаткин А.И., Вольвачев А.Н. Профессиональное программирование на языке Си: Oт Turbo–C к Borland C++: Справочное пособие – Мн.: Вышэйшая школа,1992. - 240 с.

5. Касаткин А.Н. Профессиональное программирование на языке СИ. Управление ресурсами. Справочное пособие. Мн.: Высш. школа.1992

6. Керниган Б., Ритчи Д. Язык программирования Си. - М.: Финансы и статистика,1992. - 271 с.

7. Климова Л.И. С++. Практическое программирование. - М.: Кудиц-Образ, 2001. – 587 c.

8. Котлинская Г.П., Галиновский О.И. Программирование на языке СИ. - Мн.: Выш.шк., 1991. – 155 c.

9. Подбельский В.В., Фомин С.С. Программирование на языке Си. М.: Финансы и статистика. 2001.

10. Романовская Л.М., Русс Т.В., Свитковский С.Г. Программирование в среде СИ для ПЭВМ ЕС. - М.: Финансы и статистика, 1992.

11. Страуструп Б. Язык программирования С++. 2-е изд.: В 2 т. Киев: ДиаСофт,1993.

12. Тимофеев В.В. Программирование в среде С++ Builder 5. - М.: БИНОМ, 2000.

13. Шилд Г. Программирование на Borland С++. - Мн.: ПОПУРРИ, 1999. – 800 c.

14. Юлин В.А., Булатова И.Р. Приглашение к СИ. - Мн.: Высш.шк., 1990.

15. Программирование. Основы программирования на алгоритмическом языке С. Лабораторный практикум под общей редакцией Бусько В.Л. Мн. БГУИР, 2003


Приложение 1



Поделиться:


Последнее изменение этой страницы: 2020-11-28; просмотров: 156; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.170.38 (0.008 с.)