这个做业属于哪一个课程 | 2020年面向对象程序设计 (福州大学 - 数学与计算机科学学院) |
---|---|
这个做业要求在哪里 | 面向对象程序设计寒假做业1 |
这个做业的目标 | 1.安装C++开发环境(见附录) |
2.完成问答题、实践题及编程题 | |
3.发布博客 | |
做业正文 | 面向对象程序设计寒假做业1问答题 |
面向对象程序设计寒假做业1实践题 | |
面向对象程序设计寒假做业1编程题 | |
其余参考文献 | 均已在问答题、实践题中标出 |
#编程题 ###<font color=Blue>1.题目要求:</font><br/> <font face="黑体">经过汉字“整数”、“钱包”、“看看”、“增长”、“减小”实现白话文编程。注意钱包总额范围为零至九十九。</font><br/> ###<font color=Blue>2.分解需求:</font><br/> <font face="黑体">经过读题可知,本题包含三个方面: (1)定义整数变量“钱包”,并对其进行初始化; (2)输入“增长”、“减小”的指令,对钱包总额进行变化; (3)经过“看看 钱包”,输出钱包总额。</font><br/> ###<font color=Blue>3.思考过程及疑惑</font><br/> <font face="黑体">首先,我打算把其分为四块进行,由main函数、负责钱包总额初始化的函数、负责钱包总额增减的函数以及输出钱包总额的函数构成。 如下为钱包总额初始话的函数代码:</font><br/>html
int beginning(int wallet,char d[]){ if(strcmp(d,"零")==0) return 0; //这里使用strcmp函数时,当字符串相同时,返回值应为0,一开始 else if(strcmp(d,"一")==0) return 1; //觉得是1,故得不出结果,必定要注意!! else if(strcmp(d,"二")==0) return 2; else if(strcmp(d,"三")==0) return 3; else if(strcmp(d,"四")==0) return 4; else if(strcmp(d,"五")==0) return 5; else if(strcmp(d,"六")==0) return 6; else if(strcmp(d,"七")==0) return 7; else if(strcmp(d,"八")==0) return 8; else if(strcmp(d,"九")==0) return 9; else if(strcmp(d,"十")==0) return 10; else return -1; }
<font face="黑体">这里我采起枚举的方法,可是代码会显得很冗长,有没有其余更简便的方法呢? 对于负责钱包总额增减的函数的部分,我采用在main函数中判断,若字符串c为“增长”,则进行 </font><br/>编程
wallet+=calculate(wallet,d);
<font face="黑体">同理,若字符串c为“减小”,则进行 </font><br/>函数
wallet-=calculate(wallet,d);
<font face="黑体">原本一开始是打算将增长与减小分别写一个函数的,可是后来发现用if语句进行判断,更加简洁,下面为个人函数主体代码:</font><br/>学习
int calculate(int wallet,char d[]){ if(strcmp(d,"零")==0) return 0; else if(strcmp(d,"一")==0) return 1; else if(strcmp(d,"二")==0) return 2; else if(strcmp(d,"三")==0) return 3; else if(strcmp(d,"四")==0) return 4; else if(strcmp(d,"五")==0) return 5; else if(strcmp(d,"六")==0) return 6; else if(strcmp(d,"七")==0) return 7; else if(strcmp(d,"八")==0) return 8; else if(strcmp(d,"九")==0) return 9; else if(strcmp(d,"十")==0) return 10; else return -1; }
<font face="黑体">对于输出钱包总额的函数这个部分,一开始我打算在函数中分三种状况讨论,而后再在每一种状况中枚举出1-10种状况,然后发现这样作过于冗长,故此再写了一个函数负责1-10汉字输出,而在输出钱包总额函数中的三种状况调用此函数。以下:</font><br/>测试
void num(int i){ if(i==0) printf("零"); else if(i==1) printf("一"); else if(i==2) printf("二"); else if(i==3) printf("三"); else if(i==4) printf("四"); else if(i==5) printf("五"); else if(i==6) printf("六"); else if(i==7) printf("七"); else if(i==8) printf("八"); else if(i==9) printf("九"); else if(i==10) printf("十"); } void sum(int wallet){ int a,b; if(wallet<=10){num(wallet);} else if(wallet<20){ a=wallet%10; printf("十"); num(a); } else{ a=wallet/10; b=wallet%10; num(a); printf("十"); if(b!=0) num(b); /*这一步我认为比较重要,由于假如钱包总额 正好被十整除,按照咱们中文习惯,是不会 打出零的,好比20->二十而非二十零,故我 认为这步判断不可或缺。*/ } }
<font face="黑体">对于main函数部分,代码见下:</font><br/>设计
int main() { char a[100],b[100],c[100],d[100]; int wallet=0,i,flag=0; scanf("%s %s %s %s",a,b,c,d); if(strcmp(a,"整数")!=0||strcmp(c,"等于")!=0) flag=1; for(i=1;flag==0;i++){ if(i==1) wallet=beginning(wallet,d); else { scanf("%s",a); if(strcmp(a,b)!=0&&strcmp(a,"看看")!=0) break; scanf("%s",c); if(strcmp(a,"看看")==0){ sum(wallet); break;} scanf("%s",d); if(strcmp(c,"增长")==0) wallet+=calculate(wallet,d); if(strcmp(c,"减小")==0) wallet-=calculate(wallet,d); } } return 0; }
总代码以下:code
#include <stdio.h> #include <string.h> int beginning(int wallet,char d[]){ if(strcmp(d,"零")==0) return 0; else if(strcmp(d,"一")==0) return 1; else if(strcmp(d,"二")==0) return 2; else if(strcmp(d,"三")==0) return 3; else if(strcmp(d,"四")==0) return 4; else if(strcmp(d,"五")==0) return 5; else if(strcmp(d,"六")==0) return 6; else if(strcmp(d,"七")==0) return 7; else if(strcmp(d,"八")==0) return 8; else if(strcmp(d,"九")==0) return 9; else if(strcmp(d,"十")==0) return 10; else return -1; } int calculate(int wallet,char d[]){ if(strcmp(d,"零")==0) return 0; else if(strcmp(d,"一")==0) return 1; else if(strcmp(d,"二")==0) return 2; else if(strcmp(d,"三")==0) return 3; else if(strcmp(d,"四")==0) return 4; else if(strcmp(d,"五")==0) return 5; else if(strcmp(d,"六")==0) return 6; else if(strcmp(d,"七")==0) return 7; else if(strcmp(d,"八")==0) return 8; else if(strcmp(d,"九")==0) return 9; else if(strcmp(d,"十")==0) return 10; else return -1; } void num(int i){ if(i==0) printf("零"); else if(i==1) printf("一"); else if(i==2) printf("二"); else if(i==3) printf("三"); else if(i==4) printf("四"); else if(i==5) printf("五"); else if(i==6) printf("六"); else if(i==7) printf("七"); else if(i==8) printf("八"); else if(i==9) printf("九"); else if(i==10) printf("十"); } void sum(int wallet){ int a,b; if(wallet<=10){num(wallet);} else if(wallet<20){ a=wallet%10; printf("十"); num(a); } else{ a=wallet/10; b=wallet%10; num(a); printf("十"); if(b!=0) num(b); } } int main() { char a[100],b[100],c[100],d[100]; int wallet=0,i,flag=0; scanf("%s %s %s %s",a,b,c,d); if(strcmp(a,"整数")!=0||strcmp(c,"等于")!=0) flag=1; for(i=1;flag==0;i++){ if(i==1) wallet=beginning(wallet,d); else { scanf("%s",a); if(strcmp(a,b)!=0&&strcmp(a,"看看")!=0) break; scanf("%s",c); if(strcmp(a,"看看")==0){ sum(wallet); break;} scanf("%s",d); if(strcmp(c,"增长")==0) wallet+=calculate(wallet,d); if(strcmp(c,"减小")==0) wallet-=calculate(wallet,d); } } return 0; }
###<font color=Blue>4.测试用例</font><br/> <img src="https://img2018.cnblogs.com/blog/1925083/202001/1925083-20200125221658092-636310818.png" width="75%" height="75%"> <img src="https://img2018.cnblogs.com/blog/1925083/202001/1925083-20200125221714213-65593406.png" width="75%" height="75%"> <img src="https://img2018.cnblogs.com/blog/1925083/202001/1925083-20200125221724026-495661679.png" width="75%" height="75%"> <img src="https://img2018.cnblogs.com/blog/1925083/202001/1925083-20200125221732610-1934571047.png" width="75%" height="75%">htm
###<font color=Blue>5.疑惑及解决</font><br/> <font face="黑体">对象