Тема: Внешний интерфейс
(Обработка данных в файле, пакетный режим)
1. Цель работы:
· Получение представления внешнего интерфейса;
· Освоение работы с пакетным режимом;
· Закрепление навыков работы с файлом.
Обеспечение
· Инструментальная система, поддерживающая TurboPascal.
· Инструментальная система, поддерживающая C или C++.
3. Продолжительность выполнения работы:
Продолжительность выполнения работы определяется объемом задачи:
1. Если задание выполняется на базе предыдущей работы (тема «Несвязанные динамические структуры»), то продолжительность работы составляет 2 академических часа.
2. Если выдается новое задание, то продолжительность работы составляет 4 академических часа.
4. Задание:
Разработать программу с использованием внешнего интерфейса. Работу выполнить на базе практической работы «Несвязанные динамические структуры», в соответствии с индивидуальным заданием.
Требование к заданию
5.1. Входные данные должны вводиться из файла.
5.2. Выходные данные должны выводиться в файл.
5.3. Входной и выходной файлы - текстовые.
5.4. С клавиатуры вводится только имена файлов.
5.4. Обеспечить в программе многовариантную обработку данных, т.е. во входном файле должны находиться не один вариант данных, а любое количество вариантов данных..
5.5. В выходном файле должны находиться все варианты данных в соответствии с входным файлом.
5.6. Выходной файл должен быть оформлен в виде протокола, т.е. в нем должны быть представлены:
- наименование программы;
- дата и время запуска программы;
- входные данные;
- промежуточные данные (в случае необходимости);
- выходные данные в формализованном виде;
- время работы программы (в крайнем случае, время окончании работы программы);
- каждый вариант данных должен быть разделен от другого варианта разделителем.
5.7. Имена файлов задаются из вне: в командной строке.*
5.8. Если в командной строке не указаны имена входного и/или выходного файла, то имена файлов устанавливаются по умолчанию.*
*-
Порядок выполнения работ
1) Анализ задания;
2) Разработать тесты;
3) Разработать алгоритм программы;
4) Разработать программу на исходном языке программирования;
5) Отладить программу;
6) Проверить работу программы по тестам;
7) Оформить отчет;
8) Защитить работу.
7. Содержание отчета:
1) Тема работы;
2) Цель работы;
3) Обеспечение;
4) Задание этой работы и индивидуальное задание;
5) Требования к программе;
6) Тесты;
7) Блок-схема программы;
8) Текст программы;
9) Содержимое входного файла с указанием имени файла.
10) Содержимое выходного файла с указанием имени файла.
8. Теоретическая часть
8.1. Стандартная поддержка определения даты и времени:
В модуле time.h содержат определение типа time_t:
Typedef long time_t
и структуры tm, которая объявлена следующим образом:
struct tm
{
int tm_sec; //секунды
int tm_min; //минуты
int tm_hour; //часы (0-23)
int tm_mday; //дата (1-31)
int tm_mon; //месяц (0-11)
int tm_year; //год (тек.год -1900)
int tm_wday; // день недели (0-6; воскр =0)
int tm_yday; // день в году ()
int tm_isdst; //
};
Функции работы с датой и временем:
Asctime | Преобразует время и дату из формата структуры типа tm в символьную строку |
Ctime | Преобразует время и дату из формата time_t в символьную строку |
difftime | Вычисляет интервал между двумя заданными временными параметрами |
localtime | Преобразует дату и время из формата time_t в формат структуры tm |
Mktime | Преобразует дату и время в календарный формат |
Примеры:
А)
struct tm *ptr;
time_t lt;
lt=time(NULL);
ptr=localtime(<);
printf(asctime(ptr));
Б)
#include <io.h>
int main(void)
{
time_t tt;
tm *pMyTime;
tt = time(Null);
pMyTime = localtime(&tt);
cout << “Текущее время: ”;
cout << asctime(pMyTime);
pMyTime;
return;
}
8.2. Стандартная поддержка реализации ввода данных в командной строке (Пакетный режим).
Иногда бывает полезно, а то и просто необходимо передать данные в программу через командную строку, для этого в языках программирования имеется инструментальная поддержка:
Pascal | Cи | |
int main(int argc, char *argv[],char **env[]) | ||
Количество параметров командной строки содержится | ParamCount (стандартная переменная, ее не надо описывать) | Argc (аргумент функции main) |
Параметры командной строки. | ParamStr() (стандартная переменная, ее не надо описывать) | argv[] (аргумент функции main) |
Задание параметров не выходя из интегрированной среды | RUN/Arguments. | RUN/Arguments. |
Примеры чтения данных с командной строки:
А) на языке программирования С:
#include <stdio.h>
int main(int argc, char *argv[],char **env[])
{
int i;
printf("\nколичество аргументов в командной строке = %d",argc);
printf("\nаргументы командной строки:");
for(i=0; i<argc; i++) printf("\n%d. %s",i,argv[i]);
return(i);
}
Б) на языке программирования Pascal:
Var
I: Word;
begin
Writeln('Количество параметров командной строки =', ParamCount);
Writeln('Параметры командной строки:');
for I:= 0 to ParamCount do
Writeln(I,'. ',ParamStr(I));
Setbuf();
end.
Работа с файлами
Обобщенный алгоритм работы файлом:
1. Открытие файла
2. Обработка в соответствии с задачей,
3. Закрытие файла
Таблица стандартных функций работы с файлами в Pascal и C/С++.
Pascal | C | С++ | |||||
Описание файловой переменной | F: text; F: file of data; F: file; | FILE *fp; | |||||
Открытие файла: | Assign(F,’FILE1.DAT’) Reset (var F [size: word]) (чтение) Rewrite (var F [size: word]) (запись) Append (var F: Text) (добавление) | fp = fopen (filname,””). FILE *fp; режим обработки и вид файла(t b), параметры режимы: r- w-a- | |||||
Закрытие файла. | Close(f) | fclose (fp) | |||||
Функции последовательного доступа: чтение из файла, запись в файл. | |||||||
А) поэлементная обработка | Read([var F: Text;] [v1,v2,…,Vn]) Write([var F:Text;] [V1,V2,…Vn]) | Getc(FILE *fp) Puts(int ch, FILE *fp) Возвращает int fgets () fputs() и т.д. | |||||
Б) поблочная обработка | BlockRead (file,Buf,N,Result) BlockWrite(file,Buf,N,Result) file - файловая переем. buf – Памяти обмена информации, n - число компонентов, result - число обработанных компонентов | fread(buf,c,bytes,fp) fwrite(buf,c,bytes,fp) buf - указатель на область памяти, откуда будет проис-ходить обмен информацией c - сколько единиц записи bytes - Длина каждой единицы записи в байтах fp - указатель файла | |||||
В) Форматный ввод/вывод | См. А | fscanf(FILE *fp,const char * string) fprintf (FILE *fp,const char * string) | |||||
Функции произвольного доступа | |||||||
Переустановка файлового указателя. | seek () Точка отсчета, всегда начало файла. | fseek (FILE *fp, long, int to) кол/ байт от точки отчета, где to – точка отсчета: SEEK_SET; SEEK_END; SEEK_CUR | |||||
Определения отступа указателя от начала файла | Ftell(FILE *fp) | ||||||
Размер файла. | Filesize(f) | fseek (FILE *fp, long, int to) | |||||
Определение конца файла | Eof(f) | feof(fp) EOF | |||||
Отсекание информация от файлового указателя до конца файла | Truncate(f) | ||||||
Примеры
9.1 Пример программы на языке программирования С
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include <time.h>
void main()
{
int ch;
time_t t;
char filename[100];
int *a,i,n;
float sr,disp;
FILE *file;
randomize();
clrscr();
//Открытие файла
printf("Imya faila: "); scanf("%s", &filename);
file = fopen(filename, "rt");
if (file==NULL) {
printf("Fail ne nayden");
exit(1);
}
//Выделение памяти
fscanf(file,"%d",&n);
a=(int*)malloc(n*sizeof(int));
if (!a) {
printf("Nedostatochno Pamyati!!");
getch();
exit(1);
}
//Считывание данных из файла
for (i=0;i<n;i++) fscanf (file,"%d",(a+i));
fclose(file);
//Вычисления
sr=0;
for (i=0;i<n;i++) sr+=*(a+i);
sr=sr/n;
disp=0;
for (i=0;i<n;i++) disp=disp+(*(a+i)-sr);
//Вывод результата на экран
for (i=0;i<n;i++) printf ("X[%d]=%d\n",i+1,*(a+i));
printf ("\n");
printf ("X srednee=%f\n",sr);
printf ("D=%f\n",disp);
//Запись результата в файл
printf("Vvedite imya faila dlya zapisi resultata: ");
scanf("%s", &filename);
file = fopen(filename, "wt");
if (file==NULL)
{
printf("ne poluchilos sozdat fail\n");
exit(1);
}
fprintf (file,"Programma dla rascheta Xsr i dispersii dx,zadannogo massiva\n");
for (i=0;i<n;i++) fprintf (file,"X[%d]=%d\n",i+1,*(a+i));
fprintf (file,"X srednee=%f\n",sr);
fprintf (file,"Dispersia=%f\n",disp);
t=time(NULL);
fprintf (file,"%s",ctime(&t));
fclose(file);
free (a);
}
Типовые ошибки
1) Ввод данных осуществляют с клавиатуры, затем записывают в файл. Что не соответствует требованиям к заданию.
2).Реализуется один вариант данных в файле. Что не соответствует требованиям к заданию.
11. Контрольные вопросы
1) Представить доказательства выполнения каждого требования к заданию.
2) Расскажите как реализовать пакетный режим (ввод данных в программу с командной строки) в языках программирования.
3) Сравните реализацию пакетного режима в Си и Pascal.
4) Стандартные подпрограммы обработки файлов в C и Pascal.
5) Сравнить обработку файлов в C и Pascal.
6) Стандартные подпрограммы, поддерживающие определение времени и даты.
7) Что такое внешний интерфейс?
8) В каком случае рекомендуется хранить данные в файле?
9) В каком случае рекомендуется задавать данные только с клавиатуры?
10) Когда следует хранить данные в текстовом файле, а когда -в бинарном?
11) Стандартные подпрограммы обработка времени и даты.
Литература
1. Г.С.Иванова «Основы программирования»(издание второе) издательство «МГТУ имени Н.Э.Баумана» 2002
2. Минакова Н.И. И др. “Методы программирования” Москва Изд-во “Вузовская книга”, 1999, Стр 280