• 第一次个人编程作业


    这个作业属于哪个课程 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("
    ");
    }
    
    //汉字转换成数字
    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]='';
    		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]!='' ) 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("
    ");
    }
    
    //处理 如果 语句
    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]!='' ) 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
    ",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]!='';i++)
    			if(s[i]!=' ')
    			{
    				k=i;
    				while( s[i]!=' '&&s[i]!='' ) 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:

  • 相关阅读:
    2017年第一篇博客--关于集成友盟和微信支付等遇到的坑
    【转】ArcGIS Server10.1安装常见问题及解决方案
    【转】C# GDAL 配置
    【转】Silverlight无法添加服务引用
    arcgis for js/flex/sl 该选哪一个?
    webgis开发-开始向JS转向
    形象解释C#、Net、Asp.net
    怎么区分odd和even
    Linux入门
    html网页访问WebAPI中的方法遇到的问题
  • 原文地址:https://www.cnblogs.com/Viola-Violet/p/12285768.html
Copyright © 2020-2023  润新知