- •Федеральное агенство по образованию
- •Оглавление
- •Массивы указателей на строки Задание 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 (массивы строк, структуры, классы)
Пример реализации для приложения с оконным графическим интерфейсом
#include "exeptions.h"
void ExeptionInt(char* str)
{String* s=new String(str);
s=String::Concate(S"\nString",s,S"\t must include letters of digits\n");
MessageBos::Show(S"ExeptionInt ",s);}
void ExeptionRange(double d,double min,double max)
{String* s1=d.ToString();
String* s2=min.ToString();
String* s3=max.ToString();
s1=String::Concate(S"\n Value",s1,S"\t must be latter then ",s2,S"and must be greater then",s3);
MessageBos::Show(S"ExeptionRange",s1);}
В связи с тем, что необходимо контролировать ввод каждого конкретного элемента целесообразно производить ввод с использованием промежуточного текстового буфера. После проверки правильности вводимых данных производить преобразование формата и копировать значение в переменные, а в противном случае выдавать сообщение об ошибке.
Даные операции можно реализовать в виде отдельных модулей функций
Модуль функций преобразования:
Заголовочный файл MyConvert.h
int copyto(char** ss,char buf[] );
int copyto(int* i,char buf[]);
int copyto(double* d,char buf[]);
Файл реализации MyConvert.cpp
int copyto(char** ss,char buf[] )
{ delete [](*ss); //Предполагается , что указатель *ss должен быть правильно //инициализирован, т.е. его значение равно 0, или он был получен с помощью оператора new
*ss =new char[strlen (buf)+1] ;
strcpy(*ss, buf);
return 1;}
int copyto(int* i,char buf[])
{if(IsInt(buf))
*i=atoi(buf);
else return 0;
return 1;}
int copyto(double* i,char buf[]);
Модуль функций для проверки правильности вводимых (validator.h)данных может иметь следующий вид
#pragma once
int IsLetters(char* s);
int IsInt(char* s);
int IsFloat(char* s);
int InRange(double d,double min,double max);
Пример реализации
#include "validator.h"
#include "exeptions.h"
int IsInt(char* s)
{if(s==0)return 0;
for(;*s!='\0' && *s>='0' && *s<='9' ;s++)
;
if (*s!='\0') {ExeptionInt(s); return 0;}
return 1;}
Кроме того, поскольку ввод осуществляется с помощью различных действий, например, для указателей и массивов и в качестве полей могут использоваться другие структуры, то целесообразно разработать отдельные функции ввода - вывода для каждого типа данных и представить их в виде модуля.
Пример минимального набора функций из интерфейса пользовательского модуля ввода - вывода io.h стандартных встроенных типов приводится ниже
#pragma once
typedef FILE* File;
int eof( File fp);
int eof();
void clear(File fp);
void clear();
int input(File fp,char* s);
int input(File fp,char** s);
int input(File fp,int* i);
int input(File fp,double* i);
int input(char* s);
int input(char** s);
int input(int* i);
int input(double* d);
int output(char* s);
int output(File fp,char* s);
Пример реализации
#include "stdafx.h"
#include "io.h"
#include "chars.h"
#define MAX 256
char buf[MAX];
usingnamespacestd;
//Достижение конца файла можно определит при помощи функции
int eof(FILE* fp){return feof(fp);}
//Для повторного ввода файла необходимо вызвать функцию
void clear(FILE* fp){rewind(fp);}
int eof(){return feof(stdin); }
void clear(){rewind(stdin); }
int input(File fp,char* s)
{int state=fscanf(fp,"%s",s);
return state && state!=EOF; }
int input(FILE* fp,char** s)
{ return input(fp,buf) && copyto(s,buf);}
int input(FILE* fp,int* i)
{ return input(fp,buf) && copyto(i,buf);}
int output(FILE* fp,char* s)
{return fprintf(fp,"%s\n",s);}
int input (char* s) {return input (stdin,s);}
int output(char* s) {return output(stdout,s);}
Используя разработанный вспомогательный набор модулей можно реализовать функцию проверки корректности данных и функции ввода – вывода структуры Record следующим образом
int validate(Record* t)// проверяет корректность данных
{ int a,b,c,d;
a=IsLetters(t->autor);
b= IsLetters(t->title);
c= InRange( t->day,1,31);
d= InRange( t->month,1,12);
return a && b && c&& d;}
int input(File fp,Record* rr)
{int state=1;
if(rr){
state&=input(fp, rr->autor); if(eof( fp)) return 0;
state&=input(fp,&rr->title); if(eof( fp)) return 0;
state&=input(fp,&rr->number); if(eof( fp)) return 0;
state&=input(fp,&rr->price); if(eof(fp)) return 0;
state&=input(fp,&rr->day); if(eof(fp)) return 0;
state&=input(fp,&rr->month); if(eof( fp)) return 0;
state&=input(fp,&rr->year); if(eof(fp)) return 0;
state&=validate(rr);
}
return state;}
int input(Record* rr)
{int state=1;
if(rr){
output("autor");
state&=input( rr->autor); if(eof( )) return 0;
output( "title");
state&=input(&rr->title); if(eof( )) return 0;
output( "number");
state&=input(&rr->number); if(eof( )) return 0;
output( "price");
state&=input(&rr->price); if(eof( )) return 0;
output( "day");
state&=input(&rr->day); if(eof( )) return 0;
output("month");
state&=input(&rr->month); if(eof( )) return 0;
output("year");
state&=input(&rr->year); if(eof( )) return 0;
state&=validate(rr);
}
return state;}
int output(File f,Record* r)
{return fprintf(f,"%s\t%s\t%d\t%d\t%d\t%d\t%d\n",
r->autor,r->title,r->number,r->price,r->day,r->month,r->year);
}
void output(Record* r)
{output(stdout, r);}