面向对象程序设计寒假作业2编程题

这个作业属于哪个课程 2020面向对象程序设计张栋班
这个作业要求在哪里 面向对象程序设计寒假作业2
这个作业的目标 1、继续完成作业一的编程题 2、优化架构,一般要求每个函数长度不超过15行。3、优化规范,尤其是命名规范。4、制作一个编译脚本,运行该脚本可以编译你的代码。5、进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。6、在作业一编程题的基础上添加以下功能: 通过命令行读取一个文件,然后运行这个文件。
作业正文 编程题
其他参考文献 C语言命名规则 Windows批处理(cmd/bat)常用命令教程 freopen()函数的使用 int main(int argc,char** argv) 详解

编程题的优化

对于编程题的优化有以下几个方面:
1、增加对关键词不止钱包的处理
2、尝试将能输入,输出的数的取值范围从零到十扩大到零到九十九。
3、运用函数分模块解决问题(设想有以下几种函数:将汉字转化为数字函 数,计算加法,减法函数,将数字转化为汉字函数)
4、解决多次输入“增加”的问题
5、优化程序使之能在输入错误时反应错误为何。
6、优化命名规范

对于问题一

不可以运用之前对于整句话输入的判断,即

if(strcmp(d,"整数 钱包 等于 零")==0)

而是要将第一句话分为四部分输入,即

scanf("%s",a);
     if(strcmp(a,"整数")!=0){
     printf("输入字符:%s 错误",a); 
     exit(0);
     }
    else{ 
     scanf("%s %s %s",b,c,d); 
     if(strcmp(c,"等于")!=0){
     printf("输入字符:%s 错误",c); 
     exit(0);}
        }
    sum=trans(d);
    while(scanf("%s",b)!=EOF){ 
    if(strcmp(b,"看看")!=0){
         scanf("%s %s",e,f);
         sum=sum+cal(e,f);
    }

输入:整数 氧气 等于 三十九
氧气 减少 十九
看看 氧气
输出:二十

对于问题二

因为输入的数字从零到九十九。
先可将数字分为三类。
第一类:包含三个汉字的数(六十六,五十七)
第二类:只包含一个汉字的数(零,九, 十)
第三类: 包含两个汉字的数(十八,八十)
第三类再分为以“十”开头的与以“十”结尾的
想法1:建立一个二维数组,存放0-99的数字。但是太麻烦
想法2:建立一个数组存放零-十的汉字
将每一个汉字单独进行转化,相关代码如下:

char array[11][3]={"零","一","二","三","四","五","六","七","八","九","十"};
int trans(char n[]){
    int i,a; char x[5],y[5];
    if(strlen(n)==2){
        for(i=0;i<=10;i++){
            if(strcmp(n,array[i])==0)
            return i;}}
    else if(strlen(n)==4){
        x[0]=n[0];  x[1]=n[1];  x[2]='\0';         
        y[0]=n[2];  y[1]=n[3];  y[2]='\0';
        if(strcmp(x,array[10])==0) {          
            for(i=0;i<10;i++){
            if(strcmp(y,array[i])==0)
            return i+10;} 
        }
        else{
        for(i=0;i<=10;i++){
        if(strcmp(x,array[i])==0)
        return i*10;}}
        }
        
    else{x[0]=n[0]; x[1]=n[1];  x[2]='\0';  
         y[0]=n[4]; y[1]=n[5];  y[2]='\0';
            for(i=0;i<10;i++){
            if(strcmp(x,array[i])==0)
            a=i;}
            for(i=0;i<=10;i++){
            if(strcmp(y,array[i])==0)
            return a*10+i;
            }
   }}

又由于该函数中有重复部分,故编写新函数

int search(char x[]){
    int i;
    for(i=0;i<10;i++){
        if(strcmp(x,array[i])==0)
        return i;       
 }
 if(i==10){ 
 printf("输入数字错误");
 exit(0);}
 }

对于问题三

运用如下几个函数(函数间还有相互调用)
函数1——将汉字数字相互转化的函数(见上方)
函数2——将转化后的数字经行加减运算

int cal(char n[],char m[]){
    int m1; 
    m1=trans(m); 
    if(strcmp(n,"增加")==0)
        return m1;
    else 
        return (-1)*m1;
}

函数3——将计算结果用汉字输出

void pri(int n){
    int i;
    if(n<=10)              printf("%s",array[n]);
    else if(n>10&&n<=19)   printf("十%s",array[n%10]);
    else if(n>=20&&n%10==0)printf("%s十",array[n/10]);
    else                   printf("%s十%s",array[n/10],array[n%10]); 
}

函数4——完成检索任务,辅助汉字数字相互转化函数(代码见上方)

对于问题四

运用以下语句:

while(scanf("%s",b)!=EOF)
    if(strcmp(b,"看看")!=0)  //当输入的字符不为“看看”时,之后即进行加减计算

对于问题五

目前能判断如下几处
1、在输入时进行一次判断

if(strcmp(a,"整数")!=0){
     printf("输入字符:%s 错误",a); 
     exit(0);                     //不一致就直接结束程序,并提示哪里出错
     }
if(strcmp(c,"等于")!=0){
     printf("输入字符:%s 错误",c); 
     exit(0);
     }

输入:帧数 氧气 等于 三十
输出:输入字符:帧数 错误

输入:整数 氧气 等 三十
输出:输入字符:等 错误

2、对输入的数字错误的判断

if(strcmp(z,"十")!=0){
            printf("输入数字:%s 错误",z);
           exit(0); }




3、对超出处理范围的数的提示

if(sum<100&&sum>=0)    pri(sum);
    else if(sum>=100) printf("数字太大算不来");
    else              printf("欠债");}



对于问题六:
通过查询资料,最后采用“驼峰命名法”

完整代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int CalculateNumber(char n[],char m[]);
int Transform(char n[]);  
int Search(char x[]);
void PrintCharacter(int n);
char array[11][3]={"零","一","二","三","四","五","六","七","八","九","十"};
int main(){
     int sum;
     char a[50],b[50],c[50],d[50],e[50],f[50],g[50]; 
     scanf("%s",a);
     if(strcmp(a,"整数")!=0){
     printf("输入字符:%s 错误",a); 
     exit(0);
     }
    else{ 
     scanf("%s %s %s",b,c,d); 
     if(strcmp(c,"等于")!=0){
     printf("输入字符:%s 错误",c); 
     exit(0);
     }}
     sum=Transform(d);
    while(scanf("%s",b)!=EOF){ 
    if(strcmp(b,"看看")!=0){
         scanf("%s %s",e,f);
         sum=sum+CalculateNumber(e,f);
     // printf("%d",sum);
    }
    else{
    scanf("%s",g);
    if(sum<100&&sum>=0)    PrintCharacter(sum);
    else if(sum>=100) printf("数字太大算不来");
    else              printf("欠债");}
    }
return 0;        
} 
void PrintCharacter(int n){
    int i;
    if(n<=10)                printf("%s",array[n]);
    else if(n>10&&n<=19)     printf("十%s",array[n%10]);
    else if(n>=20&&n%10==0)  printf("%s十",array[n/10]);
    else                     printf("%s十%s",array[n/10],array[n%10]); 
}
int CalculateNumber(char n[],char m[]){
    int m1; 
    m1=Transform(m); 
    if(strcmp(n,"增加")==0)
        return m1;
    else 
        return (-1)*m1;
}
int Transform(char n[]){
    int i,a; char x[5],y[5],z[5]; 
         x[0]=n[0]; x[1]=n[1];  x[2]='\0';  
         y[0]=n[4]; y[1]=n[5];  y[2]='\0';
         z[0]=n[2]; z[1]=n[3];  z[2]='\0';
    if(strlen(n)==2)                          return Search(n);
    else if(strlen(n)==4){
        if(strcmp(x,array[10])==0)            return Search(z)+10;
        else if(strcmp(z,array[10])==0)       return Search(x)*10;
        else    {
        printf("输入数字:%s 错误",n);
        exit(0);
        }}
    else if(strlen(n)==6){ 
        if(strcmp(z,"十")!=0||strcmp(x,"十")==0||strcmp(y,"十")==0){
        printf("输入数字:%s 错误",n);
        exit(0);}
        return Search(x)*10+Search(y);}
   else {
   printf("输入数字:%s 错误",n);
   exit(0);
   }}
 int Search(char x[]){
    int i;
    for(i=0;i<=10;i++){
        if(strcmp(x,array[i])==0)
        return i;       
 }
 if(i==11){ 
 printf("输入数字错误");
 exit(0);}
 }

制作编译脚本

配置好环境变量(环境变量在控制面板>系统和安全>系统>高级系统设置>环境变量)
在桌面新建文本文档,粘贴代码:

@echo off
echo 请输入文件所在磁盘
set /p a=
echo 正在转移到该磁盘
cd "%a%"
echo 请输入文件所在路径
set /p b=
echo 转移到文件路径
cd "%b%"
echo 请输入文件名
set /p c=
echo 编译开始
gcc "%c%" -o 作业二改版.exe
if exist "作业二改版.exe" echo 编译成功
if not exist "作业二改版.exe" echo 编译失败
Pause

将文本文档后缀改为.bat或.cmd
打开文件
依次输入:
C:
C:\Users\luckykk\Desktop
作业二改版.cpp
即可编译成功。

遇见的问题
1、出现中文乱码,如图

查询资料发现保存文本文档时要修改编码为UTF-8。但是我一开始就是保存为UTF-8!
于是我尝试反向操作把编码改为ANSI,居然就可以了!
2、报错:no such file or directory

开始以为不可以把文件存在d盘,经过多次尝试后发现是查找只能在同一个盘中进行(应该)
所以文件可以存在d盘如图:

3、执行完操作后,窗口直接关闭,手速不够,根本来不及截图啊!
解决方法:在代码最后加入“pause”

制作测试脚本

在文本文档中输入代码:

@echo off
cd c:
echo 开始测试
作业二测试.exe
echo 测试结束
Pause

本次测试在函数中比较重要的将正确的汉字转化为数字的函数。
代码如下:

#include<stdio.h>
 #include<string.h>
 int search(char x[]);
char array[11][3]={"零","一","二","三","四","五","六","七","八","九","十"};
int main(){
    char n[50]; int i,a;
    for(a=0;a<10;a++){
    scanf("%s",n);
    char x[5],y[5],z[5]; 
         x[0]=n[0]; x[1]=n[1];  x[2]='\0';  
         y[0]=n[4]; y[1]=n[5];  y[2]='\0';
         z[0]=n[2]; z[1]=n[3];  z[2]='\0';
    if(strlen(n)==2)                            printf("%d 通过\n",search(n)); 
    else if(strlen(n)==4){
        if(strcmp(x,array[10])==0)             printf("%d 通过\n",search(z)+10); 
        else if(strcmp(z,array[10])==0)        printf("%d 通过\n",search(x)*10);  
        else    {
        printf("输入数字:%s 错误\n",n);
        continue; 
        }}
    else if(strlen(n)==6){ 
        if(strcmp(z,"十")!=0||strcmp(x,"十")==0||strcmp(y,"十")==0){
        printf("输入数字:%s 错误\n",n);
    continue; 
    }
        printf("%d 通过\n",search(x)*10+search(y));} 
   else {
   printf("输入数字:%s 错误\n",n);
   continue; }
       }}
 int search(char x[]){
    int i;
    for(i=0;i<=10;i++){
        if(strcmp(x,array[i])==0)
        return i;       
 }
 if(i==11)
 printf("输入数字错误\n");
 }

测试输入:

十六
六十
六十六
六十十
十六六
十十六
一百

零七
测试输出:
6 通过
16 通过
60 通过
66 通过
输入数字:六十十 错误
输入数字:十六六 错误
输入数字:十十六 错误
输入数字:一百 错误
0 通过
输入数字:零七 错误

运用命令行读取运行文件

一开始毫无头绪,问了同学才知道需要用到freopen
然后我就在main函数中加了一句freopen(gets(h),"r",stdin);
喜滋滋开始运行,得到结果如下:

后来发现好像有点不对,我输入的是“作业二改版.exe”和“test.txt”,而依题意应该输入“作业二改版 test.txt”,但是这样输入又没有输出。
于是,我就翻开了大佬们的作业
发现了int main( int argc , char *argv[] , char *envp[] )
这样的东西,于是我又跑去百度。查过的资料见上方参考资料。
但是自己还是能力有限,看的不是很懂,也没有写出来,哭。

猜你喜欢

转载自www.cnblogs.com/lkdj/p/12264222.html