- •Федеральное агенство по образованию
- •Оглавление
- •Массивы указателей на строки Задание 1. Текстовый редактор Задание 1.1 Динамическая память. Модульное программирование
- •Задание 1.2 Реализация таблицы на основе динамического массива
- •Задание 1.3 Специальные функции работы со строками
- •Задание 1.3 Разработка приложенияWindowsForms
- •Структуры Задание 2 Реализация текстового редактора с использованием структур данных Задание 2.1 Представления набора строк в виде структур данных
- •Задание 2.2 Реализация операций выборки, преобразования и сортировки наборов строк с использованием словаря данных
- •Задание 3. Информационная система
- •Задание 3.1 Модульное программирование
- •Задание 3.2 Работа с и динамической памятью
- •Задание 3.3 Ввод и вывод
- •Пример реализации для консольного приложения
- •Пример реализации для приложения с оконным графическим интерфейсом
- •Задание 3.4 Сравнение структур
- •Задание 3.5 Консольное приложение
- •Задание 3.5 Приложение WindowsForms
- •3.6 Пример пошаговой разработки приложение WindowsForms
- •Классы. Задание 4. Объектно-ориентированная реализация текстового редактора
- •Задание 4. 1 Разработка класса классаMyString.
- •Задание 4. 2 Разработка класса таблица.
- •Задание 5. Объектно-ориентированная реализация информационной системы Задание 5.1 Представление структуры данных записи (Record), в виде класса с конструкторами и деструкторами
- •Задание 5. 2 Разработка класса таблица для хранения объектов классаRecord.
- •Задание 5.3 Представление базовых понятий предметной области в виде классов. Разработка интерфейса и реализации. Определение конструкторов классов.
- •1. Разработать класс MyDate (дата-время)
- •3. Дополнить класс MyString (строка)
- •4. Разработать класс Title (название)
- •5 . Разработать класс Name (имя)
- •6. Разработать класс Address (Адрес)
- •7. Разработать класс Telephone ( номер телефона)
- •8. Разработать класс e_Mail (Адрес электронной почты)
- •Задание 5.2 Использование объектов классов в качестве элементов классов
- •Задание 5.3 Использование указателей на объекты классов и объекты классов в качестве элементов классов
- •Задание 5.4 Система управления данными.
- •Задание 5.5 Иерархия классов
- •Задание 5.6 Шаблоны классов
- •Приложение 1
- •Приложение 2
- •Приложение 3
- •В среде разработки Visual Studio .Net (массивы строк, структуры, классы)
Задание 3.3 Ввод и вывод
Ввод и вывод лучше организовать в виде собственного набора функций, интерфейс которого приведен ниже . Это позволит сделать код программы независмым от используемых в реализации функции библиотечных средств ввода вывода. Например, можно использовать стандартную библиотеку языка Си или потоки языка С++
Для функций ввода используем имя input, для функций ввода –output, например
int input(File fp,Record* r) ;
int input(Record* r) ;
void output(File f,Record* r);
voidoutput(Record*r);
Тип Fileопределяется с помощью средстваtypedef
Например
typedefFILE*File;
Функции возвращают 1 при успешном вводе и 0 в случае ошибки или конца файла. Достижение конца файла можно определит при помощи функции
inteof(FILE*fp){returnfeof(fp);}
Для повторного ввода файла необходимо вызвать функцию
void clear(FILE* fp){rewind(fp);}
Для записи и чтения структуры Record из файла проще всего использовать функции блокового ввода вывода стандартной библиотеки языка Си.
Например
int finput(FILE* f, Record* r)
{return fread(r,sizeof(Record),1,f); }
Такой подход имеет существенное преимущество. Поскольку каждая запись будет иметь одинаковый размер, то можно организовать произвольный доступ к любой записи по ее номеру.
Однако для строковых полей это может привести к не экономному расходованию памяти на диске, так как строки реально могут быть значительно меньше, чем объем зарезервированной под них памяти. Кроме того, при использования указателей в качестве полей структур, применение функций блокового ввода вывода теряет смысл. В этом случае наиболее удобны функции форматного ввода вывода.
intfinput(Filef,Record*r)
{
char buf[256];
int state= fscanf(f,"%s%s%d%d%d%d%d\n",
r->autor,buf,&r->number,&r->price,&r->day,&r->month,&r->year);
r->title=new char[strlen (buf)+1] ;
strcpy(r->title, buf);
if(state==7)return 1;
return0;
}
Приведенный способ достаточно прост, но обладает рядом существенных недостатков.
Во-первых, невозможно прекратить ввод пока не будут введены все поля.
Во-вторых, функции ввода стандартной библиотеки языка Си являются функциями низкого уровня, неконтролирующими правильность ввода данных. При несоответствии вводимых данных заданному формату произойдет аварийное завершение программы. Для правильной организации ввода необходимо выдать сообщение об ошибке ввода конкретного элемента и предоставить пользователю возможность повторить ввод.
Сообщения об ошибках выводятся на экран с использованием различных средств для консольного приложения и приложения с оконным графическим интерфейсом. Поэтому набор функций с сообшениями о различных ошибках в исключительных ситуациях необходимо организовать в виде модуля исключений, интерфейс которго будет одним и тем же, а реализация различна для различных типов приложений.
Пример минимального набора функций из интерфейса модуля исключений приводится ниже
exeptions.h
void ExeptionLetters(char* str);
void ExeptionInt(char* str);
void ExeptionFloat(char* str);
void ExeptionRange(double d,double min,double max);
voidExeptionFopen(char*str);
Пример реализации для консольного приложения
#include "exeptions.h"
void ExeptionInt(char* str)
{printf("\nString %s\t must include letters of digits\n",str);}
void ExeptionRange(double d,double min,double max)
{printf("\n Value %f\t must be latter then %f and must be greater then%f\n",d,min,max);}