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


    作业描述 详情
    这个作业属于哪个课程 2020面向对象程序设计
    这个作业要求在哪里 面向对象程序设计寒假作业2
    这个作业的目标 1.实践题:新建GitHub仓库,并将作业上传至该仓库
    2.编程题:优化代码、编译脚本、添加功能
    作业正文 面向对象程序设计寒假作业2
    其他参考文献 命名规则
    .gitignore
    bat语法

    一、实践题

    新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
    请使用.gitignore文件忽略不要上传的文件。用法自行百度。

    - 新建GitHub仓库

    - 同步到GitHub网页

    - 创建.gitignore

    查了资料了解到这个的一些规则,就仿造的做了一个简易版。参考网址

    • 第一行是忽略.a文件
    • 第二行是仅在当前目录下忽略TEST文件
    • 第三行是忽略test文件夹下的所有文件,但不包括test文件夹本身
    • 被过滤掉的文件不会出现在你的GitHub库中,但是本地的仓库还是有的,只是push的时候不会上传

    - 上传编程题代码到仓库(其他也已经上传)



    二、编程题(请使用C语言或者C++完成以下题目):

    • 继续完成作业一的编程题。
    • 优化架构,一般要求每个函数长度不超过15行。
    • 优化规范,尤其是命名规范。
    • 制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
    • 进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
    • 在作业一编程题的基础上添加以下功能:
      • 通过命令行读取一个文件,然后运行这个文件。如我的程序叫langlang 1.txt代表我要运行1.txt这个文本中的代码。
      • 假设我的1.txt内容如下:
    整数 钱包 等于 零
    钱包 增加 四
    钱包 减少 三
    看看 钱包
    

    输入lang 1.txt后,命令行输出


    - 编程题要求:

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


    - 解题

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

    • 分解需求:
      模块一:
      根据题意的输入格式
      模块二:
      将中文的“一二三……十”转换为数字“1,2,3……,10”
      模块三:
      将数字转换为中文
      模块四:
      将中文的“增加,减少,乘以,除以”转换为“+-*/”

    • 优化架构
      刚开始还想直接压缩原有的函数,尝试了很久,得出结论:要将我原先的每个函数压缩到不多于15行,实在是太南了!
      最后采用了拆分函数的方法压缩函数(我想不出别的办法压缩了o(╥﹏╥)o)

    进入正题

    • 本次优化
      • 压缩了函数行数
      • 添加了对于两位数的中文输入转换成数字
      • 添加了注释
      • 改善了命名规范(稍微规范了一些??)
    • 先讲一下命名规范
      看到这次作业的题目要求优化命名规范时,我才突然意识到原来命名是有规则的
      经过查询,得知命名规范有很多,常用的是帕斯卡命名法,骆驼命名法,下划线命名法参考网址
    - 帕斯卡命名法:第一个单词首字母大写
    - 骆驼命名法:第一个单词首字母小写,余下单词首字母大写
    - 下划线命名法:顾名思义,命名中加下划线

    • 本次有以下函数
    int changeToTen (char num_zt[100]);//0-10中文转化为数字 
    int changeAboutTen (char num_ten[100]);//十几与整十转化为数字 
    int changeOthers(char num_oth[100]);//其他两位数转化为数字 
    int Calculate(char ope[100],int num,int cha_num);//加减乘除的计算 
    char printToTen(int single_D);//0-10输出 
    char printTwoDigits(int two_D);//两位数中的十位输出 
    char printUnitsDigits (int units_D);//两位数中的个位输出 
    

    • 模块一:按题意的格式输入
      代码实现
    int main()
    {
    	int num,cha_num;
    	char str1[100],count[100],change_num[100],pre_num[100];
    	scanf("%s %s %s %s",str1,count,change_num,pre_num);
    	num=changeToTen(pre_num);//钱包中最初拥有的钱数 
    	for(;;){
    	    scanf("%s",str1);
    		if(strcmp(str1,"看看")==0){
    			scanf("%s",count);//如果出现看看,则进行最后一次输入后结束输入 
    			break;
    		 } 
    		else{
    			scanf("%s %s",count,change_num);//输入“增加,减少”,以及相应的钱数 
    			if(strlen(change_num)==2)cha_num=changeToTen(change_num);//如果是一个汉字,即0-10 
    		    if(strlen(change_num)==4)cha_num=changeAboutTen(change_num);//如果是两个汉字,即11-19,以及整十 
    		    if(strlen(change_num)==6)cha_num=changeOthers(change_num);//如果是三个汉字,即其他的两位数 
    		    num=Calculate(count,num,cha_num); //计算结果 
    		}
    	}
    	if(num<=10)printToTen(num);//输出0-10的转换 
    	else printTwoDigits(num);//输出大于10的转换 
    	return 0;
     } 
    

    • 模块二:将输入的中文数字转换成阿拉伯数字
      这次新增了对多于十的输入的处理

    处理0-10的输入###

    代码实现

    int changeToTen (char num_zt[100])//处理零到十的输入的转化 
     {
     	
     	if(strcmp(num_zt,"零")==0)return 0;
    	else if(strcmp(num_zt,"一")==0)return 1; 
    	else if(strcmp(num_zt,"二")==0)return 2;
    	else if(strcmp(num_zt,"三")==0)return 3;
    	else if(strcmp(num_zt,"四")==0)return 4;  
    	else if(strcmp(num_zt,"五")==0)return 5;
    	else if(strcmp(num_zt,"六")==0)return 6;
    	else if(strcmp(num_zt,"七")==0)return 7;
    	else if(strcmp(num_zt,"八")==0)return 8;
    	else if(strcmp(num_zt,"九")==0)return 9;
    	else if(strcmp(num_zt,"十")==0)return 10;
     }
    

    通过字符串的长度判断输入的是几位数

    处理十几和整十的输入###

    代码实现

    int changeAboutTen (char num_ten[100])//处理整十和十几的输入 
     {
     	char second_num[100];
     	int num;
    	strncpy(second_num,num_ten+2,2);//复制后两个字符,即第二个汉字 
    	num_ten[2]='';//保留第一个汉字,去除第二个汉字 
    	second_num[2]='';//切记要加! 
    	if(changeToTen(num_ten)==10)//判断第一个汉字是否是十 
    	num=10+changeToTen(second_num);//如果是十几 
    	else
    	num=10*changeToTen(num_ten);//如果是整十 
    	return num; 
     }
    

    为什么强调一定要加''呢?
    因为我看了两天都没看出来是因为没有''导致结果总是错误,直到我看的同学的注释里面强调,我才意识到。(感谢!)

    处理其他两位数的输入###

    代码实现

    int changeOthers (char num_oth[100])//处理其他两位数输入 
     {
     	char first_num[100],third_num[100];
     	int num;
     	strncpy(first_num,num_oth,2);//取第一个汉字,即十位数 
     	first_num[2]='';//切记要 !
     	strncpy(third_num,num_oth+4,2);//取第三个汉字,即个位数 
     	third_num[2]='';//切记要 !
    	num=changeToTen(first_num)*10+changeToTen(third_num);
    	return num; 
     }
    

    • 模块三:将数字转换为中文
      这次我把它分成了输出0-10,输出两位数两个部分函数。

    输出0-10###

    代码实现

     char printToTen(int single_D)//处理输出0-10 
     { 
     		if(single_D==0)printf("零");
    	else if(single_D==1)printf("一");
    	else if(single_D==2)printf("二");
    	else if(single_D==3)printf("三");
    	else if(single_D==4)printf("四");
    	else if(single_D==5)printf("五");
    	else if(single_D==6)printf("六");
    	else if(single_D==7)printf("七");
    	else if(single_D==8)printf("八");
    	else if(single_D==9)printf("九");
    	else if(single_D==10)printf("十");
    }
    

    输出两位数###

    • 输出整十
      代码实现
    char printTwoDigits(int two_D)//处理输出两位数 
    {
    		 int tens_digit,units_digit;
     		units_digit=two_D%10;//取出它的个位数 
     		two_D=two_D/10;
     		tens_digit=two_D;        //取出它的十位数 
     		 if(tens_digit==1)printf("一十");//对十位数处理 
    	else if(tens_digit==2)printf("二十");
    	else if(tens_digit==3)printf("三十");
    	else if(tens_digit==4)printf("四十");  
    	else if(tens_digit==5)printf("五十");
    	else if(tens_digit==6)printf("六十");
    	else if(tens_digit==7)printf("七十");
    	else if(tens_digit==8)printf("八十");
    	else if(tens_digit==9)printf("九十");
    	else if(tens_digit==10)printf("一百"); 
    	if(units_digit!=0)printf("%s",printUnitsDigits (units_digit));//如果不是整十,则另外输出个位数 
    
    	 }	
    
    • 输出个位数
      代码实现
    char printUnitsDigits (int units_D)//处理输出两位数中的个位数 
    {
    	if(units_D==1)printf("一");
    	else if(units_D==2)printf("二");
    	else if(units_D==3)printf("三");
    	else if(units_D==4)printf("四");  
    	else if(units_D==5)printf("五");
    	else if(units_D==6)printf("六");
    	else if(units_D==7)printf("七");
    	else if(units_D==8)printf("八");
    	else if(units_D==9)printf("九");
    }
    

    • 模块四:将中文的“增加,减少,乘以,除以”转换为“+-*/”
      代码实现
    int Calculate(char ope[100],int num,int cha_num)//处理加减乘除转化 
     {
     	if(strcmp(ope,"增加")==0)
        num=num+cha_num;
    	if(strcmp(ope,"减少")==0)
    	num=num-cha_num;
    	if(strcmp(ope,"乘以")==0)
    	num=num*cha_num;
    	if(strcmp(ope,"除以")==0)
    	num=num/cha_num;
    	return num;
     }
    

    • 完整代码
    #include<stdio.h>
    #include<string.h>
    int changeToTen (char num_zt[100]);//0-10中文转化为数字 
    int changeAboutTen (char num_ten[100]);//十几与整十转化为数字 
    int changeOthers(char num_oth[100]);//其他两位数转化为数字 
    int Calculate(char ope[100],int num,int cha_num);//加减乘除的计算 
    char printToTen(int single_D);//0-10输出 
    char printTwoDigits(int two_D);//两位数中的十位输出 
    char printUnitsDigits (int units_D);//两位数中的个位输出 
    int main()
    {
    	int num,cha_num;
    	char str1[100],count[100],change_num[100],pre_num[100];
    	scanf("%s %s %s %s",str1,count,change_num,pre_num);
    	num=changeToTen(pre_num);//钱包中最初拥有的钱数 
    	for(;;){
    	    scanf("%s",str1);
    		if(strcmp(str1,"看看")==0){
    			scanf("%s",count);//如果出现看看,则进行最后一次输入后结束输入 
    			break;
    		 } 
    		else{
    			scanf("%s %s",count,change_num);//输入“增加,减少”,以及相应的钱数 
    			if(strlen(change_num)==2)cha_num=changeToTen(change_num);//如果是一个汉字,即0-10 
    		    if(strlen(change_num)==4)cha_num=changeAboutTen(change_num);//如果是两个汉字,即11-19,以及整十 
    		    if(strlen(change_num)==6)cha_num=changeOthers(change_num);//如果是三个汉字,即其他的两位数 
    		    num=Calculate(count,num,cha_num); //计算结果 
    		}
    	}
    	if(num<=10)printToTen(num);//输出0-10的转换 
    	else printTwoDigits(num);//输出大于10的转换 
    	return 0;
     } 
     int changeToTen (char num_zt[100])//处理零到十的输入的转化 
     {
     	
     	if(strcmp(num_zt,"零")==0)return 0;
    	else if(strcmp(num_zt,"一")==0)return 1; 
    	else if(strcmp(num_zt,"二")==0)return 2;
    	else if(strcmp(num_zt,"三")==0)return 3;
    	else if(strcmp(num_zt,"四")==0)return 4;  
    	else if(strcmp(num_zt,"五")==0)return 5;
    	else if(strcmp(num_zt,"六")==0)return 6;
    	else if(strcmp(num_zt,"七")==0)return 7;
    	else if(strcmp(num_zt,"八")==0)return 8;
    	else if(strcmp(num_zt,"九")==0)return 9;
    	else if(strcmp(num_zt,"十")==0)return 10;
     }
     int changeAboutTen (char num_ten[100])//处理整十和十几的输入 
     {
     	char second_num[100];
     	int num;
    	strncpy(second_num,num_ten+2,2);//复制后两个字符,即第二个汉字  
    	num_ten[2]='';//保留第一个汉字,去除第二个汉字 
    	second_num[2]='';//切记要加! 
    	if(changeToTen(num_ten)==10)//判断第一个汉字是否是十 
    	num=10+changeToTen(second_num);//如果是十几 
    	else
    	num=10*changeToTen(num_ten);//如果是整十 
    	return num; 
     }
     int changeOthers (char num_oth[100])//处理其他两位数输入 
     {
     	char first_num[100],third_num[100];
     	int num;
     	strncpy(first_num,num_oth,2);//取第一个汉字,即十位数 
     	first_num[2]='';//切记要 !
     	strncpy(third_num,num_oth+4,2);//取第三个汉字,即个位数 
     	third_num[2]='';//切记要 !
    	num=changeToTen(first_num)*10+changeToTen(third_num);
    	return num; 
     }
     char printToTen(int single_D)//处理输出0-10 
     { 
     		if(single_D==0)printf("零");
    	else if(single_D==1)printf("一");
    	else if(single_D==2)printf("二");
    	else if(single_D==3)printf("三");
    	else if(single_D==4)printf("四");
    	else if(single_D==5)printf("五");
    	else if(single_D==6)printf("六");
    	else if(single_D==7)printf("七");
    	else if(single_D==8)printf("八");
    	else if(single_D==9)printf("九");
    	else if(single_D==10)printf("十");
    }
    char printTwoDigits(int two_D)//处理输出两位数 
    {
    		 int tens_digit,units_digit;
     		units_digit=two_D%10;//取出它的个位数 
     		two_D=two_D/10;
     		tens_digit=two_D;        //取出它的十位数 
     		 if(tens_digit==1)printf("一十");//对十位数处理 
    	else if(tens_digit==2)printf("二十");
    	else if(tens_digit==3)printf("三十");
    	else if(tens_digit==4)printf("四十");  
    	else if(tens_digit==5)printf("五十");
    	else if(tens_digit==6)printf("六十");
    	else if(tens_digit==7)printf("七十");
    	else if(tens_digit==8)printf("八十");
    	else if(tens_digit==9)printf("九十");
    	else if(tens_digit==10)printf("一百"); 
    	if(units_digit!=0)printf("%s",printUnitsDigits (units_digit));//如果不是整十,则另外输出个位数 
    
    	 }	
    char printUnitsDigits (int units_D)//处理输出两位数中的个位数 
    {
    	if(units_D==1)printf("一");
    	else if(units_D==2)printf("二");
    	else if(units_D==3)printf("三");
    	else if(units_D==4)printf("四");  
    	else if(units_D==5)printf("五");
    	else if(units_D==6)printf("六");
    	else if(units_D==7)printf("七");
    	else if(units_D==8)printf("八");
    	else if(units_D==9)printf("九");
    }
    	 
     int Calculate(char ope[100],int num,int cha_num)//处理加减乘除转化 
     {
     	if(strcmp(ope,"增加")==0)
        num=num+cha_num;
    	if(strcmp(ope,"减少")==0)
    	num=num-cha_num;
    	if(strcmp(ope,"乘以")==0)
    	num=num*cha_num;
    	if(strcmp(ope,"除以")==0)
    	num=num/cha_num;
    	return num;
     }
    
    • 测试结果:


    - 制作编译脚本,我选择了Windows批处理




    test.exe文件生成

    为了做这个题,我学了一些常用的Windows批处理的语法。参考网址

    • 遇到的问题:
      1.做了这道题,我才意识到我第一次作业查询gcc的版本的做法虽然也能查到,但并不标准,没有设置Path。
      这就直接导致了虽然我在几天前就查到了如何编译gcc的文章,但是在我的电脑上总是不能实现,总是显示各种错误提示。然后设置了path之后,就成功运行了!(个人认为是跟没设置Path有关系,因为这几天做了很多操作,不能很明确的知道是哪个操作让我终于实现编译)
      2.刚开始做的时候,根本看不明白网络上搜到的代码在讲什么,搜着搜着才意识到Windows批处理是有语法的,进行学习之后,看的顺利了很多

    - 单元测试

    测试脚本:

    0-10的转换测试:

    十几与整十输入转换测试:

    其他两位数处理

    处理0-10输出

    处理其他两位数输出

    计算函数

    最早我看到这个单元测试感觉很变态,迟迟不知从何下手,但是我看了看同学的作业,感觉就是新弄一个cpp文件,再用命令行运行就可以了??


    • 添加功能
      学习的同学说的freopen()函数,得知freopen()是在stdio.h里面的,在代码里面加了这个函数,实现了添加功能。
      格式:freopen("in.txt","r",stdin);in.txt处填文件路径

    • 遇到的问题:看到给的操作示例的时候,我十分懵逼,压根不知道是怎么有示例的效果的,然后搜索方法的时候毫无头绪,导致没有搜索到有效的方法,直到看到了同学的作业中提到了freopen(),经过查询才终于得到了解决方法

    学习整理bat
    学习整理.gitignore

    不得不说,这次的作业真是疯狂触及我的知识盲区,学习的过程感觉十分艰辛,不过这也算是痛并快乐着,冲冲冲!

  • 相关阅读:
    HDU
    HDU
    HDU
    Weights and Measures (贪心+dp)
    Weights and Measures (贪心+dp)
    HDU-1009-FatMouse' Trade(贪心)
    or2?Scum!(周期性求解)
    希希的多项式(推递推式)
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/2002ljy/p/12250514.html
Copyright © 2020-2023  润新知