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

这个作业属于哪个课程 2020面对对象程序设计
这个作业要求在哪里 面对对象程序设计寒假作业1
这个作业的目标 安装开发环境,了解C/C++优缺点,编译过程,了解命令行特点,学会用命令行编译代码,实现白话文编程,学会写博客
其他参考文献 链接
问答题
C语言的缺陷:
(1)	一个表现在数据的封装性上,使得c语言在数据的安全性上有较大的缺陷
(2)	语法限制不严格,对变量的类型约束不严格,影响程序的安全性,例如其对于数组下标越界不做检查。
(3)	缺少面对对象编程的功能,它只能使用面对过程的语言开发程序
(4)	运行时类型检查不可用,比如说在运行时发生数据类型的转化不会出现警告,由此可能造成精度丢失。
C语言的编译过程
(1)	预处理;该部分主要包括:宏 条件编译 文件包含 和一些其他指令四部分
(2)	编译:1、语法分析 2、词法分析 3、语义分析 4、符号汇总 5、文本语言转换成汇编语言
(3)	汇编:1.生成目标文件(Windows下生成.obj  Linux下生成.o)2、形成符号表3,汇编指令转换成二进制命令
(4)	链接:1、合并段表  2、符号表的合并与符号表重定位  3、Windows下生成可执行程序.exe文件。  Linux下生成 ./a.out文件

实践题
(1)查看自己的C++编译器版本:
先配置环境变量,此电脑->属性->高级系统设置->环境变量,找到path,在原有基础上在后面输入gcc所在文件夹的位置。按win+r打开cmd命令框,输入gcc-v即可查看编译器版本,但注意一定要找到正确的gcc程序位置,否则会提示你出现了错误。
(2)使用命令行编译一份C语言/C++代码:
如上文,在查看完c++编译器版本后,输入源文件名再输入a.exe即可编译并运行,即可运行出结果(我的程序是一个很简单的输出hello的程序)
结果如图:

编程题
首先看一下题目,题目如下:

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

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

样例
输入:

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

输出:


以上为该题目的题干,然后我描述一下我的思考过程并且分解题目需求:
(1)首先整个题目主要的运算只有普通的加减运算,但是输入的数据是以汉字表示的数字,所以我们需要将读入的汉字转化为数字;
(2)仔细分析给的案例,不难发现输出的数字结果也需要用汉字表示,所以我们需要一个将阿拉伯数字转化为汉字的过程;
(3)由于汉字表示数字有规定的语法需求,例如17表示为“十七”,而不是“一十七”,所以我们还需要一个函数来判断输入的汉字数字是否为符合汉语语法输入。

然后用代码来体现一下我的思考过程:
(1)由于数据是限制在0-99以内的数据,其中出现了4种不同的情况:
第一种:0-10用零-十表示,我用函数zhs表示,该函数正好可以将数组数组下标和汉字一一对应起来;
第二种:11-19用十表示;
第三种:20以上整十的倍数,用
十表示;
第四种:其余数字,用表示。
(第二,三,四种用zhs2表示)

int zhs(char *c){
	int i;
	if(strlen(c)==2)                                         /*该情况是0-9的情况*/
	{
		for(i=0;;i++){
			if(strcmp(han[i],c)==0)break;
		}
		return i;
	}
}
int zhs2(char *c){
	int re;
	char ch[2];
	if(strlen(c)==2)                                         /*若数字为个位数*/
	re=zhs(c);
	else if(strlen(c)==4)                                    /*10-19以及整十的倍数的情况*/ 
	{
		ch[0]=c[0];ch[1]=c[1];                               /*目的在于将两个汉字中的第一个分离出来*/
		if(strcmp(ch,"十")==0)re=10+zhs(c+2);
		else re=10*zhs(ch);	 
	} 
	else if(strlen(c)==6)                                    /*剩余数字的情况*/
	{
		ch[0]=c[0];ch[1]=c[1];
		re=10*zhs(ch)+zhs(c+4);
	}
	return re;
} 

(2)然后接下来这一步是用来判断读入的汉字数字语法是否正确的,如果其不对的话,将提示错误,并且让其再次有机会输入数据;
int right(char* c){
	int i;
	int fl=0;
	char ch[2];
	if(strlen(c)==4){
		ch[0]=c[0];ch[1]=c[1];
		if(strcmp(ch,han[10])==0){
			for(i=1;i<=9;i++){
				if(strcmp(han[i],c+2)==0){					
					return 0;
				}
			}
		}
		if(strcmp(c+2,han[10])==0){
			for(i=2;i<=9;i++){
				if(strcmp(han[i],ch)==0);
					return 0;
				}
			}
		}
	if(strlen(c)==6){
		ch[0]=c[2];ch[1]=c[3];
		if(strcmp(ch,han[10])!=0)return 1;		
		if(strcmp(ch,han[10])==0){
			ch[0]=c[0];ch[1]=c[1];
			for(i=2;i<=9;i++){
				if(strcmp(han[i],ch)==0){
					fl++;
					break;
				}
			}
			for(i=1;i<=9;i++){
				if(strcmp(han[i],c+4)==0){
					fl++;
					break;
				}
			}
			if(fl==2)return 0;
		}
	}
} 

当然还有一些细小的问题,例如说“看看”后面的变量是否是前面定义过的变量,如果不是,又需要提出提醒等等
现在展示出完整代码:

#include<stdio.h>
#include<string.h>
int zhs(char* c);                                /*通过该函数将0-9的汉字转化成数字*/
int zhs2(char* c);                               /*通过该函数将输入的汉字转化为数字*/
int right(char* c);                              /*该函数用于判断读入的汉字数字是否为正确读法*/
char han[11][4]={"零","一","二","三","四","五","六","七","八","九","十"}; 
int main(){
	int a,i; 
	char bian[20];
	char cc[10];
	char number[10];
	scanf("%s",cc);
	if(strcmp(cc,"整数")==0){
		int num;
		scanf("%s",bian);
		for(i=0;i<2;i++)scanf("%s",cc);
		while(right(cc)==1){
			printf("输入有误,请重新输入:");
			scanf("%s",cc);
		}
		num=zhs2(cc);
		scanf("%s",cc);
		while(strcmp(cc,"看看")!=0){
			if(strcmp(cc,bian)==0){
				scanf("%s %s",cc,number);
			while(right(number)==1){
				printf("输入有误,请重新输入:");
				scanf("%s",number);
			}
			if(strcmp(cc,"增加")==0)num+=zhs2(number);
			if(strcmp(cc,"减少")==0)num-=zhs2(number);
			scanf("%s",cc);
			continue; 
			}
			if(strcmp(cc,bian)!=0){
				scanf("%s %s",cc,number);                    /*照样需要输入两次的字符串*/
				scanf("%s",cc);
			}	 
		}  
		scanf("%s",cc);
		while(strcmp(cc,bian)!=0){
			printf("未定义该物品");
			for(i=0;i<2;i++)scanf("%s",cc);
		}
		if(strcmp(cc,bian)==0)                               /*判断查看的是否是同一变量,如果是才进行输出*/{
			if(num<=10)printf("%s",han[num]);
			else if(num<=19)printf("十%s",han[num%10]);
			else if(num%10==0)printf("%s十",han[num/10]);
			else printf("%s十%s",han[num/10],han[num%10]);
		}                                                    /*同样是将最后的结果按照4种不同的情况进行分类输出*/
	} 
	return 0;
} 
int zhs(char *c){
	int i;
	if(strlen(c)==2)                                         /*该情况是0-9的情况*/
	{
		for(i=0;;i++){
			if(strcmp(han[i],c)==0)break;
		}
		return i;
	}
}
int zhs2(char *c){
	int re;
	char ch[2];
	if(strlen(c)==2)                                         /*若数字为个位数*/
	re=zhs(c);
	else if(strlen(c)==4)                                    /*10-19以及整十的倍数的情况*/ 
	{
		ch[0]=c[0];ch[1]=c[1];                               /*目的在于将两个汉字中的第一个分离出来*/
		if(strcmp(ch,"十")==0)re=10+zhs(c+2);
		else re=10*zhs(ch);	 
	} 
	else if(strlen(c)==6)                                    /*剩余数字的情况*/
	{
		ch[0]=c[0];ch[1]=c[1];
		re=10*zhs(ch)+zhs(c+4);
	}
	return re;
}  
int right(char* c){
	int i;
	int fl=0;
	char ch[2];
	if(strlen(c)==4){
		ch[0]=c[0];ch[1]=c[1];
		if(strcmp(ch,han[10])==0){
			for(i=1;i<=9;i++){
				if(strcmp(han[i],c+2)==0){					
					return 0;
				}
			}
		}
		if(strcmp(c+2,han[10])==0){
			for(i=2;i<=9;i++){
				if(strcmp(han[i],ch)==0);
					return 0;
				}
			}
		}
	if(strlen(c)==6){
		ch[0]=c[2];ch[1]=c[3];
		if(strcmp(ch,han[10])!=0)return 1;		
		if(strcmp(ch,han[10])==0){
			ch[0]=c[0];ch[1]=c[1];
			for(i=2;i<=9;i++){
				if(strcmp(han[i],ch)==0){
					fl++;
					break;
				}
			}
			for(i=1;i<=9;i++){
				if(strcmp(han[i],c+4)==0){
					fl++;
					break;
				}
			}
			if(fl==2)return 0;
		}
	}
} 

然后让我们来看一下运行的结果:

(很少写博客,可能有写的不好的地方,下次会继续改进)

posted @ 2020-01-27 17:45  隔壁的老哥  阅读(15)  评论(0)    收藏  举报