這個作業屬於哪個課程 | 2020年面向對象程序設計 (福州大學 - 數學與計算機科學學院) |
---|---|
這個作業要求在哪里 | 面向對象程序設計寒假作業1 |
這個作業的目標 | 1.安裝C++開發環境(見附錄) |
2.完成問答題、實踐題及編程題 | |
3.發布博客 | |
作業正文 | 面向對象程序設計寒假作業1問答題 |
面向對象程序設計寒假作業1實踐題 | |
面向對象程序設計寒假作業1編程題 | |
其他參考文獻 | 均已在問答題、實踐題中標出 |
編程題
1.題目要求:
通過漢字“整數”、“錢包”、“看看”、“增加”、“減少”實現白話文編程。注意錢包總額范圍為零至九十九。
2.分解需求:
通過讀題可知,本題包含三個方面:
(1)定義整數變量“錢包”,並對其進行初始化;
(2)輸入“增加”、“減少”的指令,對錢包總額進行變化;
(3)通過“看看 錢包”,輸出錢包總額。
3.思考過程及疑惑
首先,我打算把其分為四塊進行,由main函數、負責錢包總額初始化的函數、負責錢包總額增減的函數以及輸出錢包總額的函數構成。
以下為錢包總額初始話的函數代碼:
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;
}
這里我采取枚舉的方法,但是代碼會顯得很冗長,有沒有其他更簡便的方法呢?
對於負責錢包總額增減的函數的部分,我采用在main函數中判斷,若字符串c為“增加”,則進行
wallet+=calculate(wallet,d);
同理,若字符串c為“減少”,則進行
wallet-=calculate(wallet,d);
本來一開始是打算將增加與減少分別寫一個函數的,但是后來發現用if語句進行判斷,更加簡潔,下面為我的函數主體代碼:
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;
}
對於輸出錢包總額的函數這個部分,一開始我打算在函數中分三種情況討論,然后再在每一種情況中枚舉出1-10種情況,而后發現這樣做過於冗長,故此再寫了一個函數負責1-10漢字輸出,而在輸出錢包總額函數中的三種情況調用此函數。如下:
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->二十而非二十零,故我
認為這步判斷不可或缺。*/
}
}
對於main函數部分,代碼見下:
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;
}
總代碼如下:
#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;
}
4.測試用例



