2020面向对象程序设计寒假作业1

这个作业属于哪个课程 [2020面向对象程序设计张栋班][1]
这个作业要求在哪里 [面向对象程序设计寒假作业1][2]
这个作业的目标 1.C语言有什么缺陷 2.简述一下C语言/C++的编译过程 3.查看自己的C++编译器版本 4.使用命令行编译一份C语言/C++代码 5.编写一个程序,实现白话文编程
作业正文 [2020面向对象程序设计寒假作业1][3]
其他参考文献 [c/c++编译过程][4]
[1]:https://edu.cnblogs.com/campus/fzu/2020OOP "2020面向对象程序设计张栋班"
[2]:https://edu.cnblogs.com/campus/fzu/2020OOP/homework/10224 "面向对象程序设计寒假作业1"
[3]:https://www.cnblogs.com/bamboo233/p/12232893.html "2020面向对象程序设计寒假作业1"
[4]:https://www.jianshu.com/p/5eccc5fde471 "c/c++编译过程"

问答题

1.C语言有何缺陷

  • 语法限制不太严格,对数组下标是否越界不做检查,经常出错。
  • 运算符和优先级过多,记忆复杂,有些许难度。
  • 命名时在一个范围内是不可以使用相同变量的。

2.C/C++的编译过程

  • 预处理:预处理用于将所有的#include头文件以及宏定义替换成其真正的内容。
  • 编译:编译就是将预处理的文件进行一系列的词法分析,语法分析,语义分析,以及优化后产生相应的汇编代码文件。
  • 汇编:把汇编语言代码翻译成目标机器指令的过程,即生成目标文件。
  • 链接:链接就是把每个源代码独立编译后的结果,然后按照它们的要求将它们组装起来。

实践题

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

  • 打开vs-工具-命令行-开发者命令提示-输入cl.exe

  • 我的电脑-属性-高级系统设置-环境变量-系统变量-path-添加gcc路径-cmd查看

2.使用命令行编译代码

编程题

题目

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

编程要求

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

样例

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

输出:

思路

  • 首先考虑将“零”到“九”一一对应转化为数字,百度后知道一个汉字占两个字节,所以采用字符数组来储存,用if和strcmp函数来转化成数字。
int change1(char a[]){
	if(strcmp(a,"零")==0) n=0;
	else if (strcmp(a,"一")==0) n=1;
	else if (strcmp(a,"二")==0) n=2;
	else if (strcmp(a,"三")==0) n=3;
	else if (strcmp(a,"四")==0) n=4;
	else if (strcmp(a,"五")==0) n=5;
	else if (strcmp(a,"六")==0) n=6;
	else if (strcmp(a,"七")==0) n=7;
	else if (strcmp(a,"八")==0) n=8;
	else if (strcmp(a,"九")==0) n=9;
	else n=10;
	return n;
}
  • 变量的输入,变量可能不一定是“钱包”,也可能不一定是“整数”,(我也不确定,而且就算不一定,我能力也不太行)若前后变量不一致且不能够进行加减运算时,应该输出“error”。前面的运算过程应该用循环来实现,直到读到“看看”时结束。到后面我发现前两个变量固定的话,那么整个输入可以当成一个数组,就可以不要每个变量都定义一个数组?但是就是不确定变量是否是“钱包”和“整数”,导致有点混乱。后面觉得还是应该定义多个数组来存储不同变量。然后依次判断变量是否符合输入要求,若不符合,则“error”处理。
int main(){
	int n;
	char lei[10],rongqi[10],fuhao[10],shuzi[10],r2[10];
	scanf("%s %s %s %s",lei,rongqi,fuhao,shuzi);
	n=change1(shuzi);
	if(strcmp(lei,"整数")==0) {
		if(strcmp(rongqi,"钱包")==0){
			while(1){
				scanf("%s",r2);
				if(strcmp(r2,"钱包")==0) {
					scanf("%s %s",fuhao,shuzi);
					if(strcmp(fuhao,"增加")==0) n+=change1(shuzi);
					else n-=change1(shuzi);
				} 
				if(strcmp(r2,"看看")==0) break;
			}
		}
		else flag=0; //标记变量不为“钱包” 
	}
	else flag=0;//标记变量不为“整数” 
	if(flag==0) printf("error");
	else change2(n);
	return 0;
} 
  • 得到的结果用好几个change函数将数字转化成相应白话文输出。

  • 当数字<9时,用change3函数

void change3(int n){
	if(n==0) printf("零"); 
	else if(n==1) printf("一"); 
	else if(n==2) printf("二"); 
	else if(n==3) printf("三"); 
	else if(n==4) printf("四"); 
	else if(n==5) printf("五"); 
	else if(n==6) printf("六"); 
	else if(n==7) printf("七"); 
	else if(n==8) printf("八"); 
	else if(n==9) printf("九"); 
	if(n==10) printf("十"); 
}
  • 当数字>9时,应将其十位与个位拆开,分别输出。
  • 在输出时,还要考虑平时的语言习惯。比如说,11-19转化成白话文前面是么有“一”的,用change4函数。
void change4(int n){
	if(n==0) printf("十"); 
	else if(n==1) printf("十一"); 
	else if(n==2) printf("十二"); 
	else if(n==3) printf("十三"); 
	else if(n==4) printf("十四"); 
	else if(n==5) printf("十五"); 
	else if(n==6) printf("十六"); 
	else if(n==7) printf("十七"); 
	else if(n==8) printf("十八"); 
	else if(n==9) printf("十九"); 

}
void change2(int n){
	if(n<=9){
		change3(n);
	}
	else{
		int shiwei,gewei;
		shiwei=n/10;
		gewei=n%10;
		if(shiwei==1)//11-19
		{
			change4(gewei);
		}
		else{
			if(gewei==0)//整十 
			{
				change3(shiwei);
				printf("十"); 
			}
			else//十位不为1,个位不为0 
			{
				change3(shiwei);
				printf("十");
				change3(gewei);
			}
		} 
	}
}
  • 整十数有使用前面的函数,所以就不单独例举。

  • 完整代码

#include<stdio.h>
#include<string.h>
int flag=1;
int n;
int change1(char a[]){
	int n;
	if(strcmp(a,"零")==0) n=0;
	else if (strcmp(a,"一")==0) n=1;
	else if (strcmp(a,"二")==0) n=2;
	else if (strcmp(a,"三")==0) n=3;
	else if (strcmp(a,"四")==0) n=4;
	else if (strcmp(a,"五")==0) n=5;
	else if (strcmp(a,"六")==0) n=6;
	else if (strcmp(a,"七")==0) n=7;
	else if (strcmp(a,"八")==0) n=8;
	else if (strcmp(a,"九")==0) n=9;
	else n=10;
	return n;
}
void change3(int n){
	if(n==0) printf("零"); 
	else if(n==1) printf("一"); 
	else if(n==2) printf("二"); 
	else if(n==3) printf("三"); 
	else if(n==4) printf("四"); 
	else if(n==5) printf("五"); 
	else if(n==6) printf("六"); 
	else if(n==7) printf("七"); 
	else if(n==8) printf("八"); 
	else if(n==9) printf("九"); 
	if(n==10) printf("十"); 
}
void change4(int n){
	if(n==0) printf("十"); 
	else if(n==1) printf("十一"); 
	else if(n==2) printf("十二"); 
	else if(n==3) printf("十三"); 
	else if(n==4) printf("十四"); 
	else if(n==5) printf("十五"); 
	else if(n==6) printf("十六"); 
	else if(n==7) printf("十七"); 
	else if(n==8) printf("十八"); 
	else if(n==9) printf("十九"); 

}
void change2(int n){
	if(n<=9){
		change3(n);
	}
	else{
		int shiwei,gewei;
		shiwei=n/10;
		gewei=n%10;
		if(shiwei==1)//11-19
		{
			change4(gewei);
		}
		else{
			if(gewei==0)//整十 
			{
				change3(shiwei);
				printf("十"); 
			}
			else//十位不为1,个位不为0 
			{
				change3(shiwei);
				printf("十");
				change3(gewei);
			}
		} 
	}
}
int main(){
	int n;
	char lei[10],rongqi[10],fuhao[10],shuzi[10],r2[10];
	scanf("%s %s %s %s",lei,rongqi,fuhao,shuzi);
	n=change1(shuzi);
	if(strcmp(lei,"整数")==0) {
		if(strcmp(rongqi,"钱包")==0){
			while(1){
				scanf("%s",r2);
				if(strcmp(r2,"钱包")==0) {
					scanf("%s %s",fuhao,shuzi);
					if(strcmp(fuhao,"增加")==0) n+=change1(shuzi);
					else n-=change1(shuzi);
				} 
				if(strcmp(r2,"看看")==0) break;
			}
		}
		else flag=0; //标记变量不为“钱包” 
	}
	else flag=0;//标记变量不为“整数” 
	if(flag==0) printf("error");
	else change2(n);
	return 0;
} 
  • 题目示例

  • 整十例子

  • 十几例子

遇到的问题

  • 因为循环停止的条件是“看看”,所以不管“看看”后面是不是“钱包”都不会报错,而且在第一个变量不是“钱包”的时候似乎也有问题

  • 当增加的数超过十时,输出是有问题的

posted @ 2020-01-27 01:23  根号233  阅读(152)  评论(0编辑  收藏  举报