Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание С++ 07_10_08_.doc
Скачиваний:
25
Добавлен:
11.03.2016
Размер:
1.15 Mб
Скачать

Пример реализации для приложения с оконным графическим интерфейсом

#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);}