這個作業屬於哪個課程 | 2020面向對象程序設計 |
---|---|
這個作業要求在哪里 | 面向對象程序設計寒假作業1 |
這個作業的目標 | 1. 安裝C++開發環境 2. 完成問答題、實踐題及編程題 3. 發布博客 |
作業正文 | 作業鏈接 |
其他參考文獻 | C語言/C++的編譯過程、在Windows命令行中編譯運行C/C++程序 |
一、問答題
1.你認為C語言有什么缺陷。
C語言易讀性相對較低;C語言語法限制不太嚴格,對數組的越界不做檢查,對scanf有無&不進行檢查;C語言是面向過程不是面向對象;C語言字符串處理能力較弱。C語言運算符多。
2. C語言/C++的編譯過程。
1.預處理(Preprocessing),
預處理用於將所有的#include頭文件以及宏定義替換成其真正的內容,預處理之后得到的仍然是文本文件,但文件體積會大很多。
2.編譯(Compilation),
將經過預處理之后的程序轉換成特定匯編代碼(assembly code)的過程。
3.匯編(Assemble),
匯編過程將上一步的匯編代碼轉換成機器碼(machine code),這一步產生的文件叫做目標文件,是二進制格式。
4.鏈接(Linking)。
鏈接過程將多個目標文件以及所需的庫文件(.so等)鏈接成最終的可執行文件(executable file)。
二、實踐題
看群里的圖片,直接在cmd中寫“gcc -v”,發現會錯誤,在同學那知道要修改環境變量,找到gcc。過程:打開我的電腦-屬性-高級系統設置-環境變量 找到path,再把這個路徑復制過去 。
1. 看自己的C++編譯器版。
2. 使用命令行編譯一份C語言/C++代碼。在網上查看相關資料了解的。
這個代碼的功能是將0~9轉化成漢字零~九。
三、編程題
中國文化博大精深,從倉頡造字開始,漢字一直流傳到了今天。我們在感嘆漢字的源遠流長時,也不禁感慨,為什么沒有一門使用漢字編程的語言?
漢字真的不能編程嗎?最近文言文編程火了一把,吾有一數。曰三。名之曰「甲」。這朴實無華的變量定義無疑不是幾千年來中華文化的發展中一朵奇葩。
今天小王同學想,文言文能編程那白話文呢?他找到了你,讓你幫幫他。
編程要求
編寫一個程序,輸入滿足以下語法要求的一段文字,輸出運行后的結果。
變量定義:整數 錢包 等於 零
運算(加法):錢包 增加 四
運算(減法):錢包 減少 四
輸出:看看 錢包
看到題目,里面的變量是“整數”、“錢包”、符號還有數字,首先第一行需判斷類型是否是整數並且確定變量“錢包”的初始值,接下去對錢包進行加減運算,知道出現看看循環結束,輸出變量“錢包”的值。
要對漢字進行加減法,需要將漢字轉換成羅馬數字,就需寫一個change函數,對數字的讀入並進行運算。因為題目范圍給在0~9的范圍,所以只需要0~9的轉換。
int change(char a[]){//將漢子轉化成數字進行運算
int n;
if(!strcmp(a,"零")) n=0;
else if(!strcmp(a,"一")) n=1;
else if(!strcmp(a,"二")) n=2;
else if(!strcmp(a,"三")) n=3;
else if(!strcmp(a,"四")) n=4;
else if(!strcmp(a,"五")) n=5;
else if(!strcmp(a,"六")) n=6;
else if(!strcmp(a,"七")) n=7;
else if(!strcmp(a,"八")) n=8;
else if(!strcmp(a,"九")) n=9;
return n;
}
對於循環結束時的“看看 錢包”,我不是很理解,不知道是不是因為他的變量可能不止錢包單個,而是幾個變量一起在運算,最后看看其中一個。我是直接把它當做一個變量去算,最后通過“看看”來結束循環,而“錢包”來看看是否和之前變量一樣,不是就報錯。
而在循環結束時,需要將最終的數字轉換會漢字,由於范圍是在0~99內,當數字大於九時,要將數字拆成十位和個位,分別將十位和個位存入一個數組中,然后再輸出。而對於十到十九的數字,由於我們習慣前面沒加一需特殊考慮,並且對整十的數字,后面是沒加零的。在數字轉漢字的過程,我是通過調用change2函數,再調用change2函數實現的。
下面是我完整的代碼:
#include<stdio.h>
#include<string.h>
int change(char a[]){//將漢子轉化成數字進行運算
int n;
if(!strcmp(a,"零")) n=0;
else if(!strcmp(a,"一")) n=1;
else if(!strcmp(a,"二")) n=2;
else if(!strcmp(a,"三")) n=3;
else if(!strcmp(a,"四")) n=4;
else if(!strcmp(a,"五")) n=5;
else if(!strcmp(a,"六")) n=6;
else if(!strcmp(a,"七")) n=7;
else if(!strcmp(a,"八")) n=8;
else if(!strcmp(a,"九")) n=9;
return n;
}
int main(){
void change2(int n,char cnum[]);
int n;
char lei[20],name[20],name1[20],fu[20],num[20];
scanf("%s %s %s %s",lei,name,fu,num);
n=change(num);
if(!strcmp(lei,"整數")){//判斷類型是否為“整數”
while(1){
int flag=0;
scanf("%s",name1);
if(!strcmp(name1,"看看")) break;//循環結束標志
if(strcmp(name1,name)!=0) flag=1;//判斷運算對象是不是定義的變量,否則不進行處理繼續循環,這里進行標記
scanf("%s %s",fu,num);
if(flag==1) continue;
if(strcmp(fu,"增加")) n-=change(num);//判斷運算符號
else n+=change(num);
}
scanf("%s",name1);
if(strcmp(name1,name)){// 判斷最后詢問對象是否是該變量,否則報錯
printf("Error");
return 0;
}
if(n<0||n>99) printf("Error!");//數字不在0~99的范圍內
else{
char cnum[20];//將數字轉化成漢字
change2(n,cnum);
printf("%s",cnum);}
}
else printf("Error!");
return 0;
}
void change1(int n,char a[]){//將漢字轉化成數字
switch(n){
case 0:strcpy(a,"零");break;
case 1:strcpy(a,"一");break;
case 2:strcpy(a,"二");break;
case 3:strcpy(a,"三");break;
case 4:strcpy(a,"四");break;
case 5:strcpy(a,"五");break;
case 6:strcpy(a,"六");break;
case 7:strcpy(a,"七");break;
case 8:strcpy(a,"八");break;
case 9:strcpy(a,"九");break;
}
}
void change2(int n,char cnum[]){
char a[20];
if(n>=0&&n<=99){//判斷數字是否合法
if(n<10){
change1(n,a);
strcpy(cnum,a);
}
else{
int t;
t=n/10;
n=n%10;
if(t!=1){//考慮“十”和“一十”的差別
change1(t,a);
strcpy(cnum,a);
strcat(cnum,"十");
if(n!=0){//考慮末尾是零的情況
change1(n,a);
strcat(cnum,a);}
}
else{
strcpy(cnum,"十");
if(n!=0){
change1(n,a);
strcat(cnum,a); }
}
}
}
}
輸出樣例:
1. 題目例子
2. 10~19的特例
3. 整十的特例
4. 開頭不是“整數”
5. 變量不是“錢包”
6. 前后變量不一