寒假作业一

问答题

1.如果你不了解C++请回答以下问题:你认为C语言有什么缺陷(你觉得哪里用的不顺手)。

C语言是一门灵活的语言,你可以用你喜欢的方式、喜欢的思路写代码,想省略这个,想临时加入那个都是不在话下的。但是很多编译时正常,运行起来却是异常。以及觉得函数库比较少,有些很常用的比如筛素数什么的还是要自己再另编写程序来实现。

2.查阅相关资料,简述一下C语言/C++的编译过程。

预处理--->编译--->汇编--->链接
①预处理需要先展开所有的宏定义,处理掉所有的条件包括头文件预编译指令,将被包含的文件插入到该预编译指令的位置,删去注释,添加行号和文件标识便于调试时使用,最后一小步是保留编译器要使用的编译器指令。
②编译则将预处理后的文件进行一系列语法分析等优化生成的汇编代码。
③汇编则是由汇编器将汇编代码转变成机器可以执行的指令。
④链接是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接。
最终生成的目标文件是一个二进制的文件,由函数组成。

实践题

1.查看自己的C++编译器版本。

2.使用命令行编译一份C语言/C++代码。

编程题

中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。

编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包

样例
输入:

整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输出:


注意:

输入输出用例均为GBK编码,推荐使用vscode把文本切换为GBK编码。
数字只会出现以下 零一二三四五六七八九十 。

思考

第一眼看上去就像是一些数字之间的加减运算,不过换成了文字形式。对于我来说,首先想到的是将文字用数字的形式去代换。
编写代码的过程就是先编写代换文字为相应字符的数字,然后用编后的数字进行换算,最后输出想要的结果。

问题

这样想就有出大问题,就是不能进行大于九的整数的运算,而且还有列举出二十几个数字这种较为小学生的方法。想过用字符串转换去算(并没有什么结果所以否定掉了这个思路。目前为止就只写成了这样。
在调试的过程中还是可以看到,我用的这种方法在输入的过程中很多情况还是没有考虑到。

过程

过程
①编写出把输入的汉字转换成数字 字符
②把计算出的数字再转换成文字
③主函数中的输入、计算以及输出

分解

1.写出转换需要的两个函数
①开始时的输入汉字转换为可以运算的数字

int change1(char a[])
{using namespace std;
	if(strcmp(a,"零")==0)return 0;
	if(strcmp(a,"一")==0)return 1;
	if(strcmp(a,"二")==0)return 2;
	if(strcmp(a,"三")==0)return 3;
	if(strcmp(a,"四")==0)return 4;
	if(strcmp(a,"五")==0)return 5;
	if(strcmp(a,"六")==0)return 6;
	if(strcmp(a,"七")==0)return 7;
	if(strcmp(a,"八")==0)return 8;
	if(strcmp(a,"九")==0)return 9;
}

②算出结果的数字后转换成汉字进行输出的函数。

void change2(int shu)
{using namespace std;
if(shu==0)cout<<"零";  
if(shu==1)cout<<"一";  
if(shu==2)cout<<"二";   
if(shu==3)cout<<"三";   
if(shu==4)cout<<"四";    
if(shu==5)cout<<"五";   
if(shu==6)cout<<"六";
if(shu==7)cout<<"七";
if(shu==8)cout<<"八";
if(shu==9)cout<<"九";
if(shu==10)cout<<"十";  
if(shu==11)cout<<"十一";  
if(shu==12)cout<<"十二";   
if(shu==13)cout<<"十三";   
if(shu==14)cout<<"十四";    
if(shu==15)cout<<"十五";   
if(shu==16)cout<<"十六";
if(shu==17)cout<<"十七";
if(shu==18)cout<<"十八";
if(shu==19)cout<<"十九";
if(shu==20)cout<<"二十";  
if(shu==21)cout<<"二十一";  
if(shu==22)cout<<"二十二";   
if(shu==23)cout<<"二十三";  
if(shu==24)cout<<"二十四";    
if(shu==25)cout<<"二十五";   
if(shu==26)cout<<"二十六";
if(shu==27)cout<<"二十七";
}

由于技术有限,只能通过列举,列举出有限的结果来进行运算。

②编写主函数。(包括一些必要的输入输出及基本的运算)

int main(){using namespace std;
	char str1[10],str2[10],str3[10],str4[10],str5[10],str6[10],str7[10],str8[10];
	int shu;
	cin>>str1>>str2>>str3>>str4;
	if(strcmp(str1,"整数")!=0||strcmp(str2,"钱包")!=0||strcmp(str3,"等于")!=0)
	cout << "错误" << endl;
	shu=change1(str4);
    while(1){
    cin>>str5;
    if(strcmp(str5,"看看")==0)break;
    if(strcmp(str5,"看看")!=0&&strcmp(str5,"钱包")!=0)cout<<"错误"<<endl; 
	cin>>str6>>str7;
    if(strcmp(str5,"钱包")!=0||(strcmp(str6,"增加")!=0&&strcmp(str6,"减少")!=0))
	cout<<"错误"<<endl;
    if(strcmp(str5,"钱包")==0&&strcmp(str6,"增加")==0)
	shu=shu+change1(str7);
	if(strcmp(str5,"钱包")==0&&strcmp(str6,"减少")==0)
	shu=shu-change1(str7);
	}
	change2(shu);
	return 0;
}

按照我这种思路确实是不太可行。首先方法要分的清楚,在我调试的过程中可以发现有很多bug,我的情况分的并不清楚。

最后是汇总的

#include<cstdio>
#include<iostream>
#include<string.h>
int change1(char a[])
{using namespace std;
	if(strcmp(a,"零")==0)return 0;
	if(strcmp(a,"一")==0)return 1;
	if(strcmp(a,"二")==0)return 2;
	if(strcmp(a,"三")==0)return 3;
	if(strcmp(a,"四")==0)return 4;
	if(strcmp(a,"五")==0)return 5;
	if(strcmp(a,"六")==0)return 6;
	if(strcmp(a,"七")==0)return 7;
	if(strcmp(a,"八")==0)return 8;
	if(strcmp(a,"九")==0)return 9;
}

void change2(int shu)
{using namespace std;
if(shu==0)cout<<"零";  
if(shu==1)cout<<"一";  
if(shu==2)cout<<"二";   
if(shu==3)cout<<"三";   
if(shu==4)cout<<"四";    
if(shu==5)cout<<"五";   
if(shu==6)cout<<"六";
if(shu==7)cout<<"七";
if(shu==8)cout<<"八";
if(shu==9)cout<<"九";
if(shu==10)cout<<"十";  
if(shu==11)cout<<"十一";  
if(shu==12)cout<<"十二";   
if(shu==13)cout<<"十三";   
if(shu==14)cout<<"十四";    
if(shu==15)cout<<"十五";   
if(shu==16)cout<<"十六";
if(shu==17)cout<<"十七";
if(shu==18)cout<<"十八";
if(shu==19)cout<<"十九";
if(shu==20)cout<<"二十";  
if(shu==21)cout<<"二十一";  
if(shu==22)cout<<"二十二";   
if(shu==23)cout<<"二十三";  
if(shu==24)cout<<"二十四";    
if(shu==25)cout<<"二十五";   
if(shu==26)cout<<"二十六";
if(shu==27)cout<<"二十七";
}

int main(){using namespace std;
	char str1[10],str2[10],str3[10],str4[10],str5[10],str6[10],str7[10],str8[10];
	int shu;
	cin>>str1>>str2>>str3>>str4;
	if(strcmp(str1,"整数")!=0||strcmp(str2,"钱包")!=0||strcmp(str3,"等于")!=0)
	cout << "错误" << endl;
	shu=change1(str4);
    while(1){
    cin>>str5;
    if(strcmp(str5,"看看")==0)break;
    if(strcmp(str5,"看看")!=0&&strcmp(str5,"钱包")!=0)cout<<"错误"<<endl; 
	cin>>str6>>str7;
    if(strcmp(str5,"钱包")!=0||(strcmp(str6,"增加")!=0&&strcmp(str6,"减少")!=0))
	cout<<"错误"<<endl;
    if(strcmp(str5,"钱包")==0&&strcmp(str6,"增加")==0)
	shu=shu+change1(str7);
	if(strcmp(str5,"钱包")==0&&strcmp(str6,"减少")==0)
	shu=shu-change1(str7);
	}
	change2(shu);
	return 0;
}

出现没有直接结束的情况

posted @ 2020-01-27 14:28  AirBirdDD  阅读(118)  评论(0)    收藏  举报