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

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

一、原题[编程题](https://edu.cnblogs.com/campus/fzu/2020OOP/homework/10224)

1.首先是主函数部分

int main()
{
	char a[1000], b[1000], c[1000], d[1000],be[1000],ce[1000],f[1000];
	scanf("%s %s %s %s", a, b, c, d);
        int m, money;
	if (strcmp(a, "整数")!=0) m = 1;
	for (int i = 1;m==0; i++)
	{
		if (i == 1) money = exchange(d);
        else
        {
            scanf("%s",be);
            if ( (strcmp(be, "看看")==0)) break;
            if((strcmp(be, b) != 0) && (strcmp(be, "看看") != 0)) continue; 
            scanf("%s %s", ce, f);
            if (strcmp(ce, "增加") == 0) 
			{
				money += exchange(f);
				//printf("%d\n",money);sum(money);printf("\n");
			}
            if (strcmp(ce, "减少") == 0) 
			{
				money -= exchange(f);
				//printf("%d\n",money);sum(money);printf("\n");
			}	
        }
	}
	//printf("%d\n",money);
    sum(money);
    return 0;
}

说明:

(1)以题给示例为例

字符串a,b,c,d分别表示首行的整数,钱包,等于,零
字符串be表示非首行的第一个词组如钱包,看看
字符串ce表示增加或减少
字符串f表示非首行的四,三等等

(2)break和continue的运用
        if ( (strcmp(be, "看看")==0)) break;
        if((strcmp(be, b) != 0) && (strcmp(be, "看看") != 0)) continue; 

在for循环的条件中我设置了进入循环的条件,即当输入的a是整数时进入循环。但我没有设置退出循环的条件,而是在for循环中设置了break和continue,break语句是用来提前终止循环的,即当当输入的be是看看时结束循环;continue语句是用来提前终止本次循环的,即当输入的be不是看看也不是“钱包”时,不参加运算。

(3)辅助输出

由于一开始运行的时候出现了一些小问题,所以我设置了几个辅助输出帮助我判断是哪个部分的问题

//printf("%d\n",money);sum(money);printf("\n");
//printf("%d\n",money);
(4)strcmp函数————字符串比较函数

在运用时出现了些错误,所以我查了一下资料
其一般形式为: strcmp(字符串1,字符串2)
如果字符串1与字符串2相同,则函数值为0

2.exchange函数

int exchange(char d[])
{
	char ds[1000],dg[1000];
	if(strlen(d)==2) return number(d);//处理0-10
	else if(strlen(d)==4) 
	{
		dg[0]=d[2];dg[1]=d[3];//dg里存的是两位数里的个位 
		if(number(dg)!=10) return 10+number(dg);//处理11-19 
		else//处理10的倍数20,30,40,50,60,70,80,90 
		{
			ds[0]=d[0];ds[1]=d[1];//ds里存的是两位数中的十位
			return 10*number(ds);
		}
	}
	else if(strlen(d)==6)
	{
		ds[0]=d[0];ds[1]=d[1];//ds里存的是两位数中的十位
		dg[0]=d[4];dg[1]=d[5];//dg里存的是两位数里的个位 
		return 10*number(ds)+number(dg);
	}
}

思路

依然是将0-99的数分成0-10;11-19,10的倍数(不包括10);其余几十几的数
但要区分这四种类型的数首先要根据中文长度分为(例子)一;十一,二十;二十一;
这三种类型的数依据strlen来区分
经资料查询:一个英文字母在计算机中占一个字节,一个汉字在计算机中占两个字节
同时也有实践证明:



所以可以得出
一:strlen(d)2
十一,二十:strlen(d)
4
二十一:strlen(d)==6
但是我无法得到汉字占的具体是哪两位,这里我只能研究了一下其他同学的作业猜出的
如果是0-10,直接转换汉字
如果是11-19或10的倍数,再根据第二个字是否为十来处理
如果是其余的数,则拆成个位和十位处理

3.sum函数

sum函数是对主函数中的money进行转换,转换成汉字

void sum(int mon)
{
    int ge, shi;
    if (mon <= 10) Chinese(mon);
    else if (mon < 20)
    {
        ge = mon % 10;
        printf("十");
        Chinese(ge);
    }
    else
    {
        shi = mon / 10;
        ge = mon % 10;
        if (ge == 0)
        {
        	Chinese(shi);
            printf("十");
        }
        else
        {
            Chinese(shi);
            printf("十");
            Chinese(ge);
        }
    }
}

思路

如果mon在0-10之间,直接转换。
如果mon在11-19之间,只要分离出个位转换,前面输出“十”。
如果mon在20-99之间,先将十位和个位分离出来,如果个位是0,则只要转换十位,末尾输出“十”,否则两个都要转换,再在中间输出“十”。

4.完整代码如下:

#include<stdio.h>
#include<string.h>
int number(char d[])
{
    if (strcmp(d, "零") == 0) return 0;
    else if (strcmp(d, "一") == 0) return 1;
    else if (strcmp(d, "二") == 0) return 2;
    else if (strcmp(d, "三") == 0) return 3;
    else if (strcmp(d, "四") == 0) return 4;
    else if (strcmp(d, "五") == 0) return 5;
    else if (strcmp(d, "六") == 0) return 6;
    else if (strcmp(d, "七") == 0) return 7;
    else if (strcmp(d, "八") == 0) return 8;
    else if (strcmp(d, "九") == 0) return 9;
    else if (strcmp(d, "十") == 0) return 10;
}
int exchange(char d[])
{
	char ds[1000],dg[1000];
	if(strlen(d)==2) return number(d);//处理0-10
	else if(strlen(d)==4) 
	{
		dg[0]=d[2];dg[1]=d[3];//dg里存的是两位数里的个位 
		if(number(dg)!=10) return 10+number(dg);//处理11-19 
		else//处理10的倍数20,30,40,50,60,70,80,90 
		{
			ds[0]=d[0];ds[1]=d[1];//ds里存的是两位数中的十位
			return 10*number(ds);
		}
	}
	else if(strlen(d)==6)
	{
		ds[0]=d[0];ds[1]=d[1];//ds里存的是两位数中的十位
		dg[0]=d[4];dg[1]=d[5];//dg里存的是两位数里的个位 
		return 10*number(ds)+number(dg);
	}
}
void Chinese(int mo)
{
    switch (mo)
    {
    case 0:printf("零"); break;
    case 1:printf("一"); break;
    case 2:printf("二"); break;
    case 3:printf("三"); break;
    case 4:printf("四"); break;
    case 5:printf("五"); break;
    case 6:printf("六"); break;
    case 7:printf("七"); break;
    case 8:printf("八"); break;
    case 9:printf("九"); break;
    case 10:printf("十"); break;
    }
}
void sum(int mon)
{
    int ge, shi;
    if (mon <= 10) Chinese(mon);
    else if (mon < 20)
    {
        ge = mon % 10;
        printf("十");
        Chinese(ge);
    }
    else
    {
        shi = mon / 10;
        ge = mon % 10;
        if (ge == 0)
        {
        	Chinese(shi);
            printf("十");
        }
        else
        {
            Chinese(shi);
            printf("十");
            Chinese(ge);
        }
    }
}
int main()
{
	char a[1000], b[1000], c[1000], d[1000],be[1000],ce[1000],f[1000];
	scanf("%s %s %s %s", a, b, c, d);
    int m, money;
	if (strcmp(a, "整数")!=0) m = 1;
	for (int i = 1;m==0; i++)
	{
		if (i == 1) money = exchange(d);
        else
        {
            scanf("%s",be);
            if ( (strcmp(be, "看看")==0)) break;
            if((strcmp(be, b) != 0) && (strcmp(be, "看看") != 0)) continue; 
            scanf("%s %s", ce, f);
            if (strcmp(ce, "增加") == 0) 
			{
				money += exchange(f);
				//printf("%d\n",money);sum(money);printf("\n");
			}
            if (strcmp(ce, "减少") == 0) 
			{
				money -= exchange(f);
				//printf("%d\n",money);sum(money);printf("\n");
			}	
        }
	}
	//printf("%d\n",money);
    sum(money);
    return 0;
}


当计算过程中超过99时,计算会出现错误,但如果超过的情况是中间数时,由于money是数的运算,故不影响最终结果。

二、编译脚本

1.制作编译脚本

(这部分对我来说特别困难,我参考了很多教程和同学的作业才有个大致的概念)
这是我参考的资料

http://tieba.baidu.com/p/3528806494?pn=1&qq-pf-to=pcqq.group
https://www.cnblogs.com/xpwi/p/9626959.html
先用记事本模仿着写出了代码
用windows批处理语句在记事本中写出代码,然后以.bat格式保存,再双击运行


一开始一直是编译失败,后来发现是变量的问题才改过来的


(不知道这样对不对)

2.单元测试

有了制作编译脚本的经验,测试脚本就轻松多了

(1)number函数测试

(2)exchange函数测试

#include<stdio.h>
#include<string.h>
int number(char d[])
{
    if (strcmp(d, "零") == 0) return 0;
    else if (strcmp(d, "一") == 0) return 1;
    else if (strcmp(d, "二") == 0) return 2;
    else if (strcmp(d, "三") == 0) return 3;
    else if (strcmp(d, "四") == 0) return 4;
    else if (strcmp(d, "五") == 0) return 5;
    else if (strcmp(d, "六") == 0) return 6;
    else if (strcmp(d, "七") == 0) return 7;
    else if (strcmp(d, "八") == 0) return 8;
    else if (strcmp(d, "九") == 0) return 9;
    else if (strcmp(d, "十") == 0) return 10;
}
int exchange(char d[])
{
	char ds[1000],dg[1000];
	if(strlen(d)==2) return number(d);//处理0-10
	else if(strlen(d)==4) 
	{
		dg[0]=d[2];dg[1]=d[3];dg[2]='\0';//dg里存的是两位数里的个位 
		if(number(dg)!=10) return 10+number(dg);//处理11-19 
		else//处理10的倍数20,30,40,50,60,70,80,90 
		{
			ds[0]=d[0];ds[1]=d[1];ds[2]='\0';//ds里存的是两位数中的十位
			return 10*number(ds);
		}
	}
	else if(strlen(d)==6)
	{
		ds[0]=d[0];ds[1]=d[1];ds[2]='\0';//ds里存的是两位数中的十位
		dg[0]=d[4];dg[1]=d[5];dg[2]='\0';//dg里存的是两位数里的个位 
		return 10*number(ds)+number(dg);
	}
}
int main()
{
	char d[1000];
	scanf("%s",d);
	int m=exchange(d);
	printf("%d",m);
	return 0;	
}

一开始我输入三十三结果是-7,后来才发现是ds,dg字符串里没有填上'\0'


(3)Chinese函数测试

(4)sum函数测试

#include<stdio.h>
#include<string.h>
void Chinese(int mo)
{
    switch (mo)
    {
    case 0:printf("零"); break;
    case 1:printf("一"); break;
    case 2:printf("二"); break;
    case 3:printf("三"); break;
    case 4:printf("四"); break;
    case 5:printf("五"); break;
    case 6:printf("六"); break;
    case 7:printf("七"); break;
    case 8:printf("八"); break;
    case 9:printf("九"); break;
    case 10:printf("十"); break;
    }
}
void sum(int mon)
{
    int ge, shi;
    if (mon <= 10) Chinese(mon);
    else if (mon < 20)
    {
        ge = mon % 10;
        printf("十");
        Chinese(ge);
    }
    else
    {
        shi = mon / 10;
        ge = mon % 10;
        if (ge == 0)
        {
        	Chinese(shi);
            printf("十");
        }
        else
        {
            Chinese(shi);
            printf("十");
            Chinese(ge);
        }
    }
}
int main()
{
	int money;
	scanf("%d",&money);
	sum(money);
	return 0; 
}

(5)main函数测试

三、添加新功能

通过学习freopen函数得到

freopen(“文件地址”,"r",stdin);

把它放入源代码main函数中

int main()
{
	freopen("0.txt","r",stdin);
	char a[1000], b[1000], c[1000], d[1000],be[1000],ce[1000],f[1000];
	scanf("%s %s %s %s", a, b, c, d);
    int m, money;
	if (strcmp(a, "整数")!=0) m = 1;
	for (int i = 1;m==0; i++)
	{
		if (i == 1) money = exchange(d);
        else
        {
            scanf("%s",be);
            if ( (strcmp(be, "看看")==0)) break;
            if((strcmp(be, b) != 0) && (strcmp(be, "看看") != 0)) continue; 
            scanf("%s %s", ce, f);
            if (strcmp(ce, "增加") == 0) 
			{
				money += exchange(f);
				//printf("%d\n",money);sum(money);printf("\n");
			}
            if (strcmp(ce, "减少") == 0) 
			{
				money -= exchange(f);
				//printf("%d\n",money);sum(money);printf("\n");
			}	
        }
	}
	//printf("%d\n",money);
    sum(money);
    return 0;
}

用记事本编辑


再用windows+r打开cmd,输入

后面就不太会了

反思

通过这次作业,我深感自己知识十分浅薄,在这个专业还有很多知识没有掌握,希望能好好研究

posted @ 2020-02-05 15:54  jasf  阅读(171)  评论(0)    收藏  举报