第一次个人编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/SE
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzzcxy/SE/homework/10283
这个作业的目标 发布一篇随笔,使用markdown语法进行编辑。
在随笔前附上github仓库地址。
作业正文 见下面
其他参考文献 https://blog.csdn.net/weixin_42029738/article/details/81255389

github仓库地址:https://github.com/Viola-Violet/code

1、记录自己的代码行数,需求分析时间,编码时间:

(1)代码行数:大约200行;
(2)需求分析时间:>2h;
(3)编码时间:4天;

2、分解需求的思路,分解成多个模块,并阐述为什么这么分,优势在哪,可以附上代码片段:

定义结构体数组,用来存放变量名以及其对应的值,值用int类型存放,方便运算;
inter二维数组的一维大小与其存放的数字大小一一对应,便于快速寻找;
自定义两个函数(ntc与ctn)分别实现汉字与数字之间的转换,但仅限于三位数的,无法实现更高位的;
自定义disp函数处理 看看 语句的两种不同情况(输出指定字符串 or 输出指定变量的值);
自定义fun函数对 如果 语句进行详细判断;
主函数则控制输入以及对其进行初步判断,while(strcmp(s,"0"))循环语句可输入多条输入语句,遇0则结束。

3、记录不会的知识的学习过程以及修改优化的过程;可以附上资料网站:

学习过程:
程序中可能会有遇到中文乱码无法进行判断的现象:由于输入的格式,可以先用空格进行分割,再利用strcmp函数与指定的中文进行比较,也可利用strstr函数截取所需要的中文内容(特别是用于 如果 的输入语句)
GitHub新建仓库和提交代码:GitHub新建仓库和提交代码
优化过程:
一个变量和简单加减(10以内):一个变量和简单加减.c
多个变量和简单加减(10以内):多个变量和简单加减.c
数字转汉字(三位数):数字转汉字(三位数).c
汉字转数字(三位数):汉字转数字(三位数).c
最后,将以上代码进行整合、测试并修改。

4、代码的进一步完善:

数值可能会有小数的情况,特别是在进行除法运算后,int类型的数据会让结果出现误差;
变量的数值大小受限,一方面因为汉字与数字之间的相互转换,输入与输出的数值最多只能是三位数的;另一方面,由于int类型,在运算时遇到大数会溢出;
变量的个数受结构体数组的限制;
在对输入语句用空格进行分割时,由于分割的字符串长短不一,对存储空间会造成一定程度的浪费等等。

5、具体代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
//定义结构体数组 name存放变量名 n则记录变量的大小
struct people
{
	char name[10];
	int n;
}peop[10];

//全局变量,其中x用来记录变量名的个数
char inter[11][5]={"零","一","二","三","四","五","六","七","八","九","十"};
int i,j,k,x=0;
char s[1001];


//一个数字汉字转为数字类型
int number(char *num)
{
	for(i=0;i<11;i++)
		if ( strcmp(inter[i],num)==0 )
			return i;
	if ( strcmp(num,"两")==0 )
		return 2;
}

//数字转换成汉字
void ntc( int n1 )
{
	if(n1<0)
	{
		printf("负");
		n1=abs(n1);
	}
	while(n1)
	{
		if(n1<=10)
		{
			puts(inter[n1]);
			return ;
		}
		else if(n1<100)
		{
			printf("%s",inter[n1/10]);
			printf("十");
			n1%=10;
		}
		else if(n1>=100)
		{
			printf("%s",inter[n1/100]);
			printf("百");
			if( n1%100 < 10 && n1%100 != 0)
				printf("零");
			n1%=100;
		}	
	}
	printf("\n");
}

//汉字转换成数字
int ctn( char *a )
{
	char num[5];
	int i,sum=0,m=0;
	for(i=0;a[i];i+=2)
	{
		strncpy(num,a+i,2);
		num[2]='\0';
		if ( strcmp(num,"十")==0 )
			if(sum==0) sum=10;
			else sum*=10;
		else if ( strcmp(num,"百")==0 )
		{
			m=sum*100;
			sum=0;
		}
		else
			sum+=number(num);
	}
	return sum+m;
}

//根据变量名查找对应位置
int look(char *na)
{
	for(i=0;i<5;i++)
		if( strcmp(peop[i].name,na)==0 ) return i;
}

//打印 看看 后要求的内容
void disp(char *p)
{
	char str1[2][50]={0};
	p=strstr(p,"看看");
	for(i=0,j=0;j<2;i++)
		if(p[i]!=' ')
		{
			k=i;
			while( p[i]!=' '&&p[i]!='\0' ) i++;
			strncpy(str1[j++],p+k,i-k);
		}
	if(str1[1][0]!='"')
	{
		k=look(str1[1]);
		ntc(peop[k].n);
		return ;
	}
	for(i=1;str1[1][i]!='"';i++)
		printf("%c",str1[1][i]);
	printf("\n");
}

//处理 如果 语句
void fun(char *p)
{
	char str1[10][50]={0};
	for(i=0,j=0;p[i];i++)
		if(p[i]!=' ')
		{
			k=i;
			while( p[i]!=' '&&p[i]!='\0' ) i++;
			strncpy(str1[j++],p+k,i-k);
		}
	if ( strcmp(str1[1],"无")==0 )
		return ;
	else if ( strcmp(str1[1],"整数")==0 )
		{
			strcpy(peop[x].name, str1[2]);
			peop[x].n=ctn(str1[4]);
			x++;
		}
	else if ( strcmp(str1[1],"看看")==0 )
		disp(p);
	else if ( strcmp(str1[2],"等于")==0 )
	{
		k=look(str1[1]);
		peop[k].n=ctn(str1[3]);
	}
	else if ( strcmp(str1[2],"增加")==0 )
	{
		k=look(str1[1]);
		peop[k].n=peop[k].n+ctn(str1[3]);
	}
    else if ( strcmp(str1[2],"减少")==0 )
	{
		k=look(str1[1]);
		peop[k].n=peop[k].n-ctn(str1[3]);
	}
	else if ( strcmp(str1[2],"乘")==0 || strcmp(str1[2],"乘以")==0 )
	{
		k=look(str1[1]);
		peop[k].n=peop[k].n * ctn(str1[3]);
		printf("%d\n",peop[k].n);
	}
	else if ( strcmp(str1[2],"除")==0 )
	{
		k=look(str1[1]);
		peop[k].n=ctn(str1[3])/peop[k].n;
	}
	else if ( strcmp(str1[2],"除以")==0 )
	{
		k=look(str1[1]);
		peop[k].n=peop[k].n/ctn(str1[3]);
	}
	else
		printf("您输入的格式有问题!");
}

//程序入口
int main()
{
	int t=5;
	gets(s);
	while(strcmp(s,"0"))//输入0终止程序
	{
		char str[15][50]={0};
		//gets(s);
		for(i=0,j=0;s[i]!='\0';i++)
			if(s[i]!=' ')
			{
				k=i;
				while( s[i]!=' '&&s[i]!='\0' ) i++;
			    strncpy(str[j++],s+k,i-k);
			}
		if ( strcmp(str[0],"整数")==0 )  //两个字符串相等时,strcmp返回0
		{
			strcpy(peop[x].name, str[1]);
			peop[x].n=ctn(str[3]);
			x++;
		}
	    else if ( strcmp(str[0],"看看")==0 )
			disp(s);
		else if ( strcmp(str[1],"等于")==0 )  
		{
			k=look(str[0]);
			peop[k].n=ctn(str[2]);
		}
	    else if ( strcmp(str[1],"增加")==0 )
		{
			k=look(str[0]);
		    peop[k].n=peop[k].n+ctn(str[2]);
		}
		else if ( strcmp(str[1],"减少")==0 )
		{
			k=look(str[0]);
		    peop[k].n=peop[k].n-ctn(str[2]);
		}
		else if ( strcmp(str[1],"乘")==0 || strcmp(str[1],"乘以")==0 )
		{
			k=look(str[0]);
		    peop[k].n=peop[k].n*ctn(str[2]);
		}
        else if ( strcmp(str[1],"除以")==0 )
		{
			k=look(str[0]);
		    peop[k].n=peop[k].n/ctn(str[2]);
		}
		else if ( strcmp(str[1],"除")==0 )
		{
			k=look(str[0]);
		    peop[k].n=ctn(str[2])/peop[k].n;
		}
		else if ( strcmp(str[0],"如果")==0 )
		{
			k=look(str[1]);
			if( (strcmp(str[2],"大于")==0 && peop[k].n>ctn(str[3])) || 
				(strcmp(str[2],"小于")==0 && peop[k].n<ctn(str[3])) || 
				(strcmp(str[2],"大于等于")==0 && peop[k].n>=ctn(str[3])) || 
				(strcmp(str[2],"小于等于")==0 && peop[k].n<=ctn(str[3])) || 
				(strcmp(str[2],"等于")==0 && peop[k].n==ctn(str[3])) )
				fun(strstr(s,"则"));
			else
			    fun(strstr(s,"否则"));
		}
		else
			printf("您输入的格式有问题,请重新输入");
		gets(s);
	}
}

6、样例运行截图:

样例1:

样例2:

样例3:

posted @ 2020-02-08 23:49  Viola-Violet  阅读(322)  评论(0编辑  收藏  举报