zoukankan      html  css  js  c++  java
  • 面向对象程序设计寒假作业3

    这个作业属于哪个课程 2020年面向对象程序设计
    这个作业要求在哪里 面向对象程序设计寒假作业3
    这个作业的目标 1.继续完成编程题2.发布博客
    作业正文 如下
    其他参考文献 如何优化c语言代码

    编程题(请使用C语言或者C++完成以下题目):
    继续完成作业二的编程题。
    优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择,循环语句怎么办。
    思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。

    编程题要求:
    读题,提取出题目的要求。
    分解需求,把需求分解为几个你觉得不太相关的模块。
    思考每个模块怎么写,可以从简单的模块开始写。
    对于不会的问题进行查阅资料。
    对于每一个模块设计测试用例。
    详细记录下以上每一步,并写在博客中。
    不要求完全做出来,但要求记录详细。
    建议博客长度不少于1000字(不包含代码)。

    解释
    单元测试:对每一个函数进行测试,这代表了你需要把代码分到不同的文件,使用不同的主函数切换测试/运行。
    编译脚本:运行该脚本后无需任何输入就能自动编译全部代码,并输出编译结束的代码。
    测试脚本:运行该脚本后可以自动的编译并运行所有测试样例,并输出测试结果。

    上次作业test2中对测试脚本的理解不够准确,在这次作业中补充如下
    测试代码

    #include <stdio.h>
    #include <string.h> 
    char change[5];
    void output_1(int sum)
    {
    	if(sum>=0)
    	{
    		if(sum==0) strcpy(change,"零");
    		else if(sum==1) strcpy(change,"一");
    		else if(sum==2) strcpy(change,"二");
    		else if(sum==3) strcpy(change,"三");
    		else if(sum==4) strcpy(change,"四");
    		else if(sum==5) strcpy(change,"五");
    		else if(sum==6) strcpy(change,"六");
    		else if(sum==7) strcpy(change,"七");
    		else if(sum==8) strcpy(change,"八");
    		else if(sum==9) strcpy(change,"九");
    		else if(sum==10) strcpy(change,"十");
    	}
        else if(sum<0)
    		strcpy(change,"over-expenditure!");
    }
    int main()
    {
        output_1(0);
    	if(!strcmp(change,"零"))
    	  printf("pass
    ");
    	else
    	  printf("error
    ");  
    	output_1(1);
    	if(!strcmp(change,"一"))
    	  printf("pass
    ");
    	else
    	  printf("error
    ");   
    	output_1(5);
    	if(!strcmp(change,"五"))
    	  printf("pass
    ");
    	else
    	  printf("error
    ");  
    	output_1(-4);
    	if(!strcmp(change,"over-expenditure!"))
    	  printf("pass
    ");
    	else
    	  printf("error
    ");    
    	 output_1(0);
    	if(!strcmp(change,"一"))
    	  printf("pass
    ");
    	else
    	  printf("error
    "); 
    	 output_1(1);
    	if(!strcmp(change,"六"))
    	  printf("pass
    ");
    	else
    	  printf("error
    ");     
    	 return 0;
    }
    

    测试脚本

    @echo off
    gcc test.cpp -o test.exe
    echo 开始测试
    test.exe
    echo 测试完毕
    pause
    

    运行结果


    通过查找资料了解优化代码可以从以下方面入手

    • 选择合适的算法和数据结构
      将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。
    • 使用尽量小的数据类型
      能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。
    • 使用自加、自减指令
    • 减少运算的强度
      1.求余运算。a=a%8;可以改为:a=a&7; 2.平方运算a=pow(a,2.0);可以改为:a=aa; 3.用移位实现乘除法运算a=a4;b=b/4;可以改为:a=a<<2;b=b>>2;
    • 查表
      在程序中一般不进行非常复杂的运算,如浮点数的乘除及开方等,以及一些复杂的数学模型的插补运算,对这些即消耗时间又消费资源的运算,应尽量使用查表的方式,并且将数据表置于程序存储区。如果直接生成所需的表比较困难,也尽量在启了,减少了程序执行过程中重复计算的工作量。

    这次代码完善中主要扩大了数字范围,实现了负数的输出。
    添加了输入函数input_2,代码如下

    int input_2(char num[])   
    {   
    	    int sum=0;
    		if(strlen(num)==2)                                         //如果只有一个汉字,则可直接按照个位数转化
    		   sum=input_1(num);
    		else{
    			char copy1[5],copy2[2];
    			strcpy(copy1,num);
    		   	copy1[2]='';                                      //获取第一个汉字
    		   	if(strlen(num)==4)
    		   	{
    		   	    copy2[0]=num[2];copy2[1]=num[3];                //获取第二个汉字即最后一个汉字
    			   	if(input_1(copy1)==10)                      //对形如"十五"的输入进行转化
    		   		   sum=input_1(copy2)+10;
    		   		else                                        //对形如"二十"的输入进行转化
    				   sum=input_1(copy1)*10;   
    		    }
    		    else                                                    //对形如"二十三"的输入进行转化
    		    {
    		    	copy2[0]=num[4];copy2[1]=num[5];                    //获取第三个汉字即最后一个汉字
    				sum=input_1(copy1)*10+input_1(copy2);;
    			}
    		}   
    		return sum;	 
    }
    

    运行结果

    添加输出函数output_3,如下

    void output_3(int sum)
    {
    	printf("负");
    	if(sum>=-10) 
    	   output_1((-1)*sum);
    	else
    	   output_2((-1)*sum);   
    }
    

    运行结果


    完整代码

    #include <stdio.h>
    #include <string.h>
    int input_1(char a[])
    {
    	if(!strcmp(a,"零")) return 0;
    	else if(!strcmp(a,"一")) return 1;
    	else if(!strcmp(a,"二")) return 2;
    	else if(!strcmp(a,"三")) return 3;
    	else if(!strcmp(a,"四")) return 4;
    	else if(!strcmp(a,"五")) return 5;
    	else if(!strcmp(a,"六")) return 6;  
        else if(!strcmp(a,"七")) return 7; 
    	else if(!strcmp(a,"八")) return 8; 
    	else if(!strcmp(a,"九")) return 9; 
    	else if(!strcmp(a,"十")) return 10;
    }
    int input_2(char num[])   
    {   
    	    int sum=0;
    		if(strlen(num)==2)
    		   sum=input_1(num);
    		else{
    			char copy1[5],copy2[2];
    			strcpy(copy1,num);
    		   	copy1[2]='';
    		   	if(strlen(num)==4)
    		   	{
    		   	    copy2[0]=num[2];copy2[1]=num[3];
    			   	if(input_1(copy1)==10)
    		   		   sum=input_1(copy2)+10;
    		   		else
    				   sum=input_1(copy1)*10;   
    		    }
    		    else
    		    {
    		    	copy2[0]=num[4];copy2[1]=num[5];
    				sum=input_1(copy1)*10+input_1(copy2);;
    			}
    		}   
    		return sum;	 
    }
    void output_1(int sum)
    {
    	if(sum>=0)
    	{
    		if(sum==0) printf("零");
    		else if(sum==1) printf("一");
    		else if(sum==2) printf("二");
    		else if(sum==3) printf("三");
    		else if(sum==4) printf("四");
    		else if(sum==5) printf("五");
    		else if(sum==6) printf("六");
    		else if(sum==7) printf("七");
    		else if(sum==8) printf("八");
    		else if(sum==9) printf("九");
    		else if(sum==10) printf("十");        
    	}
    	else if(sum<0)
    		printf("over-expenditure!"); 
    }
    void output_2(int sum)
    {
        if(sum<=99)
    	{
    		int a,b;
    		a=sum%10;
    		b=sum/10;
    		if(b!=1)
    		  output_1(b);
    	    printf("十");
    		if(a!=0)
    		  output_1(a);	  
    	}
    	else
    	printf("You are a rich man!");
    }
    void output_3(int sum)
    {
    	printf("负");
    	if(sum>=-10) 
    	   output_1((-1)*sum);
    	else
    	   output_2((-1)*sum);   
    }
    int main()
    {
    	char zs[5],qb[100],dy[100],num[10],q[5];
    	int sum;
    	scanf("%s %s %s %s",zs,qb,dy,num);
    	if(strcmp(zs,"整数")==0&&strcmp(qb,"钱包")==0&&strcmp(dy,"等于")==0)
    	{
    	    sum=input_2(num);
    		while(1)
    		{
    			scanf("%s",qb);
    			if(strcmp(qb,"钱包"))
    			 break;
    			scanf("%s %s",dy,num);
    			if(!strcmp(dy,"增加"))
    		    	sum+=input_2(num);
    			else if(!strcmp(dy,"减少"))
    				sum-=input_2(num);
    			else
    				printf("error!");
    		} 
    		scanf("%s",q);
    		if(strcmp(qb,"看看")==0&&strcmp(q,"钱包")==0)
    		{
    			if(sum<=10&&sum>=0)
    			 output_1(sum);
    			if(sum>10&&sum<=99)
    			 output_2(sum);
    			if(sum<0) 
    			  output_3(sum);
    		} 
    		else
    		 printf("error!");
    	} 
    	else
    	printf("error!");
    	return 0;
    } 
    
  • 相关阅读:
    python 安装 reportlab 报错 “ImportError: No module named reportlab.lib”
    人声和乐器的频谱范围
    C语言中指针中的值赋值给数组
    快速熟悉Matlab
    Ubuntu 16.04 下octave的使用入门
    IP达人启示录
    python常用的十进制、16进制之间的转换
    GNU 下命令objcopy 用法
    python zeros用法实例
    Debian/Ubuntu清理硬盘空间的8个技巧
  • 原文地址:https://www.cnblogs.com/2636r/p/12311894.html
Copyright © 2011-2022 走看看