
4.Тест-требования
Настройка
сценарий
При запуске программы проверить, что сначала появляется меню, описанное в пункте 2.1.1. При выборе пользователем одного из типов работы (выбор типа работы в меню описано в пункте 2.1.1) проверить,что появляются сообщения на экране, описанные в пункте 2.3, отвечая на которые пользователь вводит необходимую для данного типа работы информацию. Так проверить, что при выборе:
"1" – 1) появляется сообщение 2.3.1 для ввода числа с клавиатуры.
2) пользователь вводит число для обработки, описанное в пункте 2.1.2.
3) осуществляется проверка числа на правильность; в случаях ошибок появляется сообщение 2.3.5.
результат выводится на экран в виде заданного числа и через тире его
буквенное представление.
"2" – 1) появляется сообщение 2.3.1 для ввода числа с клавиатуры.
2) пользователь вводит число для обработки, описанное в пункте 2.1.2.
3) осуществляется проверка числа на правильность; в случаях ошибок появляется сообщение 2.3.5.
4) выводится сообщение 2.3.3 для введения имя файла, в котором необходимо сохранить результат.
если файл не существует, то он создается под заданным именем и в него
записывается результат.
"3" – 1) появляется сообщение 2.3.2 для введения файла, из которого необходимо считывать числа для обработки
2) при введении несуществующего файла появляется сообщение 2.3.4, в котором предлагается закончить или продолжить работу. При этом оканчание работы означает выход из данного цикла, а в случае продолжния работы на экран выводится сообщение 2.3.4 для повторного задания файла.
3) числа в файле проверяются на соответствие с входными данными, описанными в пункте 2.1.2.
4) в случае существования числа в файле, не соответствующего пункту 2.1.2, выводится сообщение 2.3.7, после которого начинается новый цикл работы и появляется меню, описанное в пункте 2.1.1.
если числа в файле соответствуют пункту 2.1.2, то результат выводится
на экран в виде числа из файла и через тире его буквенное представление.
"4" - 1) появляется сообщение 2.3.2 для введения файла, из которого необходимо считывать числа для обработки
2) при введении несуществующего файла появляется сообщение 2.3.4, в котором предлагается закончить или продолжить работу. При этом оканчание (нажатие n+Enter) работы означает выход из данного цикла, а в случае продолжния (нажатие y+Enter) работы на экран выводится сообщение 2.3.4 для повторного задания файла.
3) числа в файле проверяются на соответствие с входными данными, описанными в пункте 2.1.2.
4) в случае существования числа в файле, не соответствующего пункту 2.1.2, выводится сообщение 2.3.7, после которого начинается новый цикл работы и появляется меню, описанное в пункте 2.1.1.
5) если числа в файле соответствуют пункту 2.1.2, выводится сообщение 2.3.3 для введения имя файла, в котором необходимо сохранить результат.
если файл не существует, то он создается под заданным именем и в него
записывается результат.
"5" – 1) выводится сообщение 2.3.6, в котором предлагается закончить или продолжить работу в данном цикле. При этом оканчание (нажатие n +Enter) работы означает выход из программы, а в случае продолжения работы на экран выводится меню, описанное в пункте 2.1.1.
функция обработки числа
Проверить,что соблюдается следующий формат вывода в файл и на экран: заданное число, в цифровом представлении, пробел, тире, пробел, буквенное представление числа. Каждое число записано с новой строки, причем число в цифровой записи выравнивается по левой стороне экрана и может занимать максимум 4 позиции. Следующие за этими 3 позиции предназначены для вывода пробела, тире, пробела. Буквенное представление числа начинает записываться с 8-й позиции от верхнего левого края экрана.Проверить, что выходные данные могут быть выведены на экран или в файл.
5 Реализация
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <ctype.h>
#include <ios.h>
struct Units{ //1 2...9
char num[2];
char writenNum[10];
};
struct Ten{ //20 30...90
char num[2];
char writenNum[10];
};
struct spec{ //11 12 ...19
char num[2];
char writenNum[11];
};
char str [64];
Units arUnits[9];
Ten arTen[8];
spec arSpecUnits[9];
void fillArUnits()
{
strcpy(arUnits[0].num,"1");
strcpy(arUnits[0].writenNum,"one");
strcpy(arUnits[1].num,"2");
strcpy(arUnits[1].writenNum,"two");
strcpy(arUnits[2].num,"3");
strcpy(arUnits[2].writenNum,"three");
strcpy(arUnits[3].num,"4");
strcpy(arUnits[3].writenNum,"four");
strcpy(arUnits[4].num,"5");
strcpy(arUnits[4].writenNum,"five");
strcpy(arUnits[5].num,"6");
strcpy(arUnits[5].writenNum,"six");
strcpy(arUnits[6].num,"7");
strcpy(arUnits[6].writenNum,"seven");
strcpy(arUnits[7].num,"8");
strcpy(arUnits[7].writenNum,"eight");
strcpy(arUnits[8].num,"9");
strcpy(arUnits[8].writenNum,"nine");
}
void fillArSpecUnits()
{
strcpy(arSpecUnits[0].num,"1");
strcpy(arSpecUnits[0].writenNum," eleven");
strcpy(arSpecUnits[1].num,"2");
strcpy(arSpecUnits[1].writenNum," twelve");
strcpy(arSpecUnits[2].num,"3");
strcpy(arSpecUnits[2].writenNum," thrirteen");
strcpy(arSpecUnits[3].num,"4");
strcpy(arSpecUnits[3].writenNum," fourteen");
strcpy(arSpecUnits[4].num,"5");
strcpy(arSpecUnits[4].writenNum," fifteen");
strcpy(arSpecUnits[5].num,"6");
strcpy(arSpecUnits[5].writenNum," sixteen");
strcpy(arSpecUnits[6].num,"7");
strcpy(arSpecUnits[6].writenNum," seventeen");
strcpy(arSpecUnits[7].num,"8");
strcpy(arSpecUnits[7].writenNum," eighteen");
strcpy(arSpecUnits[8].num,"9");
strcpy(arSpecUnits[8].writenNum," nineteen");
}
void fillArTen()
{
strcpy(arTen[0].num,"2");
strcpy(arTen[0].writenNum,"twenty ");
strcpy(arTen[1].num,"3");
strcpy(arTen[1].writenNum,"thirty ");
strcpy(arTen[2].num,"4");
strcpy(arTen[2].writenNum,"fourty ");
strcpy(arTen[3].num,"5");
strcpy(arTen[3].writenNum,"fifty ");
strcpy(arTen[4].num,"6");
strcpy(arTen[4].writenNum,"sixty ");
strcpy(arTen[5].num,"7");
strcpy(arTen[5].writenNum,"seventy ");
strcpy(arTen[6].num,"8");
strcpy(arTen[6].writenNum,"eighty ");
strcpy(arTen[7].num,"9");
strcpy(arTen[7].writenNum,"ninety ");
}
bool allDigits(char *ptr)
{
int i=0;
while (*(ptr+i) && isdigit(*(ptr+i)))
i++;
return !(*(ptr+i));
}
bool enterInt()
{
int counter;
bool rightNum=true;
cin>>str;
if (allDigits(str))
{
counter=strlen(str);
if (counter<=3)
{
char prom[64]="";
if (counter==2)
strcat(prom,"0");
else
if (counter==1)
strcat(prom,"00");
strcat(prom,str);
strcpy(str,prom);
rightNum=true;
}
else
{
cout<<"Error.Numbers only with 3 digits are avaible"
<<endl;
rightNum=false;
}
}
else
{
cout<<"Error.Enter integer value"<<endl;
rightNum=false;
}
return rightNum;
}
bool checkNumInFile()
{
int counter;
bool rightNum=true;
if (allDigits(str))
{
counter=strlen(str);
if (counter<=3)
{
char prom[64]="";
if (counter==2)
strcat(prom,"0");
else
if (counter==1)
strcat(prom,"00");
strcat(prom,str);
strcpy(str,prom);
rightNum=true;
}
else
rightNum=false;
}
else
rightNum=false;
return rightNum;
}
void putNumberInFile(ofstream outNumberFile,char *result)
{
outNumberFile<<result;
}
void proccessNum(char result[80])
{
bool firstZero=false;
int i=0;
int k=0;
char *zero="0";
char *number=str;
if ((!strncmp(number,zero,1) && !strncmp(number+1,zero,1)
&& !strncmp(number+2,zero,1)))
strcat(result,"zero");
else
{
if (!strncmp(number,zero,1)) //k=0 '0**'
{
k++;
firstZero=true;
}
else
{
while ((i<9) && //k=0 'd**'
(strncmp(arUnits[i].num,number,1)))
{
i++;
};
strcat(result,arUnits[i].writenNum);
strcat(result," hundred");
k++;
}
i=0;
number+=k;
if (!strncmp(number,zero,1)) //k=1 '*0*'
{
number++; //k=2 '*0d'
while ((i<9) &&
(strncmp(arUnits[i].num,number,1)))
{
i++;
}
if (i!=9) //k=2 '*0!0'
{
if (!firstZero)
strcat(result," and ");
strcat(result,arUnits[i].writenNum);
//'*0d'
}
}
else
if (!strncmp(number,"1",1)) //k=1 '*1*'
{
number+=k; //k=2 '*1d'
while ((i<9)&&
(strncmp(arSpecUnits[i].num,number,1)))
{
i++;
}
if (i!=9) //k=2 '*1!0'
{
if (!firstZero)
strcat(result," and ");
strcat(result,arSpecUnits[i].writenNum);
}
else
strcat(result,"ten");
}
else //k=1 '*d*'
{
while ((i<8) &&
(strncmp(arTen[i].num,number,1)))
{
i++;
}
if (!firstZero)
strcat(result," and ");
strcat(result,arTen[i].writenNum);
i=0;
number+=k; //k=2 '***'
while ((i<9) &&
(strcmp(arUnits[i].num,number)))
{
i++;
}
if (i!=9) //k=2 '**!0'
strcat(result,arUnits[i].writenNum);
}
}
}
void main()
{
char ch,unvalidFileOpen;
char request[80];
char *recPointer;
char req;
char fileName[80];
ofstream outNumberFile,outSolutionFile;
ifstream inNumberFile;
fillArUnits();
fillArTen();
fillArSpecUnits();
do{
do{
cout<<"Menu"<<endl
<<"1 - input from keyboard / output on screen"<<endl
<<"2 - input from keyboard / output in file"<<endl
<<"3 - input from file / output on screen"<<endl
<<"4 - input from file / output in file"<<endl
<<"5 - exit"<<endl;
cin>>request;
if (allDigits(request) && (strlen(request)==1))
{
req=request[0];
}
else
req='5';
char result [80];
char tire[]=" - ";
switch(req){
case '1':{
char answer;
do
{
bool errorInNumber=false;
cout<<"Input integer number"<<endl;
if (enterInt())
{
strcpy(result,str);
strcat(result,tire);
proccessNum(result);
cout<<result<<endl;
cout<<"Go on(y/n)?"<<endl;
cin>>answer;
}
}
while(answer!='n');
}
break;
case '2':
{
cout<<"Enter the file name to place the result in"
<<endl;
cin>>fileName;
outNumberFile.open(fileName,ios::out);
if (!outNumberFile)
cerr<<"Can't open file"<<endl;
else
{
char answer;
do
{
cout<<"Input integer number"<<endl;
if (enterInt())
{
strcpy(result,str);
strcat(result,tire);
proccessNum(result);
putNumberInFile(outNumberFile,result);
outNumberFile<<endl;
cout<<"Go on(y/n)?"<<endl;
cin>>answer;
}
}
while(answer!='n');
outNumberFile.close();
}
}
break;
case '3':{
cout<<"Enter the file name to read from"
<<endl;
cin>>fileName;
inNumberFile.open(fileName,ios::nocreate);
if (inNumberFile.fail())
{
cerr<<"File can't be open"<<endl;
cout<<"Continue the work(y/n)?"<<endl;
cin>>unvalidFileOpen;
if (unvalidFileOpen=='y')
{
inNumberFile.clear(0);
continue;
}
else
exit(1);
}
else
{
bool errorInFile=true;
while (inNumberFile>>str)
{ if (!checkNumInFile())
errorInFile=checkNumInFile();
if (checkNumInFile())
{
strcpy(result,str);
strcat(result,tire);
proccessNum(result);
cout<<result<<endl;
}
else
cout<<str<<" - "<<endl;
}
if (!errorInFile)
cout<<"Error.File contains not proccessed values"
<<endl;
}
inNumberFile.close();
}
break;
case '4':{
cout<<"Enter the file name to read from"
<<endl;
cin>>fileName;
inNumberFile.open(fileName,ios::nocreate);
if (inNumberFile.fail())
{
cerr<<"File can't be open"<<endl;
cout<<"Continue the work(y/n)?"<<endl;
cin>>unvalidFileOpen;
if (unvalidFileOpen=='y')
{
inNumberFile.clear(0);
continue;
}
else
exit(1);
}
else
{
cout<<"Enter the file to place the result in"
<<endl;
cin>>fileName;
outNumberFile.open(fileName,ios::out);
if (!outNumberFile)
cerr<<"Can't open file"<<endl;
else
{
bool errorInFile=true;
while(inNumberFile>>str)
{
if (!checkNumInFile())
errorInFile=checkNumInFile();
if (checkNumInFile())
{
strcpy(result,str);
strcat(result,tire);
proccessNum(result);
putNumberInFile(outNumberFile,result);
outNumberFile<<endl;
}
else
{
putNumberInFile(outNumberFile,str);
putNumberInFile(outNumberFile,tire);
outNumberFile<<endl;
}
}
outNumberFile.close();
inNumberFile.close();
if (!errorInFile)
cout<<"Error.File contains not proccessed values"
<<endl;
}
}
}
break;
}
}
while (req!='5');
cout<<"Continue the work (y/n)?"<<endl;
cin>>ch;
}
while (ch!='n');
}