2020面向對象程序設計寒假作業1 題解


作業描述 詳情
這個作業屬於哪個課程 2020福大數計面向對象程序設計
這個作業要求在哪里 面向對象程序設計寒假作業1
1. 安裝C++開發環境。
這個作業的目標 2. 完成問答題、實踐題及編程題
3. 發布博客
作業正文 2020面向對象程序設計寒假作業1 題解
C語言的不足之處
c語言的優缺點
C語言的優點和缺點
其他參考文獻 C語言 符號的不同意義
C語言編譯過程
c語言編譯過程詳解,預處理,編譯,匯編,鏈接(干貨滿滿)
gcc的使用簡介與命令行參數說明

問答題:

  1. 如果你不了解C++請回答以下問題:你認為C語言有什么缺陷(你覺得哪里用的不順手)。
    如果你已經了解C++請回答以下問題:你覺得C++和C語言比有什么優點。
    我不了解c++,因此我是想說說C語言。
    C語言的有代碼量小、運行速度快、功能強大三個優點,它也有許多缺陷。
    (1) 危險性高
    C語言的語法限制不太嚴格,程序設計自由度大。這個特點使得程序設計更主動、靈活,但也埋藏了許多危險。例如:C語言中可以將一個浮點型數據賦給一個整型數據,會丟失精度但不影響程序運行;C語言對數組下標越界不檢查,容易造成數據在內存中的混亂等。
    對於這些細小的問題,不僅要求使用者對程序設計更熟練,而且制造了許多小漏洞,容易被利用,引起程序的安全問題。
    (2) 運算符多樣,易混淆
    C語言具有多種運算符,如果運用熟練,能充分體現C語言表達靈活和效率高等特點,但這也增加了使用難度,多樣的運算符和優先級可能會混浠造成錯誤。
    (3) 許多運算符具有不同意義
    例如C語言中static在函數內部,表達該變量的值在各個調用間一直保持延續性,類似於全局變量;在函數外部,表達該函數或者變量只對本文件可見。多重意義的還有extern,void,*,&等。這對於初學者程序設計時造成了許多麻煩和困擾。
    我是個初學者,經常飽受C語言語法限制不嚴格的惡意,正如C語言浮點型可以賦給整型,且不會提示錯誤,這在我前期的程序設計和作業考試中帶給我不少的麻煩。多樣的運算符也帶給我不少的困擾,最深刻的還是學習scanf函數時,經常忘記加&以致於錯誤。
  2. 查閱相關資料,簡述一下C語言/C++的編譯過程。
    C語言編譯過程:源文件->預編譯->編譯->鏈接
    第一步:編輯源文件
    第二步:預處理
    (1) 將所有的#define刪除,並且展開所有的宏定義
    (2) 處理所有的條件編譯指令(帶#的指令)
    (3) 處理#include,將#include指向的文件插入到該行處
    (4) 刪除所有注釋
    (5) 添加行號和文件標示,這樣在調試和編譯出錯的時候才知道是哪個文件的哪一行
    (6) 保留#pragma編譯器指令
    第三步:編譯 從高級語言->匯編語言->機器語言
    (1) 詞法分析
    (2) 語法分析
    (3) 語義分析
    (4) 優化后生成相應的匯編代碼
    (5) 匯編代碼轉換為機器碼
    編譯的過程就是把源文件翻譯成二進制文件
    第四步:鏈接
    將源文件中用到的庫函數與匯編生成的目標文件合並生成可執行文件
    這個過程,就是將源文件從.c變成.exe的過程。

實踐題:

  1. 查看自己的C++編譯器版本
    首先vs的c++編譯器文件名為cl.exe,因此在vs里打開命令行,輸入cl.exe即可查看編譯器版本。

如果是Devc++的gcc編譯器的話,可以通過在命令行中打入gcc –v查看版本
如圖:

但是這兩個都需要設置環境變量,方法如下:在我的電腦->屬性->高級系統設置->環境變量->系統變量的Path中輸入編譯器地址。例如Devc++的gcc編譯器,本人的地址是D:\辦公\Dev-Cpp\MinGW64\bin,因此Path中也需如此輸入。
如圖:

  1. 使用命令行編譯一份C語言/C++代碼。
    編寫一個程序,輸入滿足以下語法要求的一段文字,輸出運行后的結果。
    變量定義:整數 錢包 等於 零
    運算(加法):錢包 增加 四
    運算(減法):錢包 減少 四
    輸出:看看 錢包
    注:數值只會出現零一二三四五六七八九十
    (1)提取題目要去:由題可得,我需要輸入一段文字,得到文字描述的答案
    首先我需要進行一次變量定義,隨后是n次的代數運算,最后是輸出運算后的結果。
    特別注意的是單次數值只會在0到10 中出現。
    (2)模塊化:我將問題分為一個主模塊和三個副模塊
    主模塊main中,我首先將變量定義設置了四個數組啊a,b,c,d,分別輸入數據類型、變量名、符號、數值。其中變量名並不是很重要,就像錢包只是個皮囊包裝,無關緊要,重要的還是里面的money(數值),因此我在隨后的運算中使用同個變量名coin。之后,在運算部分,我設置一個一個以“看看”字符串結尾的while循環,循環中反復輸入變量名、符號、數值。
    第一副模塊num負責返回d數組即數值數組中數值字符對應的數字,但只能是零到十,其他字符將會返回-1,在接下來的判斷中提示錯誤。
    int num(char d[])
    {
    if(!strcmp(d,"零")) return 0;
    else if(!strcmp(d,"一")) return 1;
    else if(!strcmp(d,"二")) return 2;
    else if(!strcmp(d,"三")) return 3;
    else if(!strcmp(d,"四")) return 4;
    else if(!strcmp(d,"五")) return 5;
    else if(!strcmp(d,"六")) return 6;
    else if(!strcmp(d,"七")) return 7;
    else if(!strcmp(d,"八")) return 8;
    else if(!strcmp(d,"九")) return 9;
    else if(!strcmp(d,"十")) return 10;
    else return -1;
    }
    第二副模塊judge,塊如其名,是用來判斷c符號數組對應的運算符號並與num模塊順便運算,返回運算值。judge模塊主要出沒於主模塊的while循環中。如果出現加減乘除之外的字符,這個模塊會毫不客氣的指出你的錯誤(我愚蠢的阿豆豆喲!)
    int judge(int n ,char c[],char d[])
    {
    if(!strcmp(c,"增加")) return n+num(d);
    else if(!strcmp(c,"減少")) return n-num(d);
    else if(!strcmp(c,"乘以")) return n*num(d);
    else if(!strcmp(c,"除以")) return n/num(d);
    else printf("輸入錯誤");
    }
    第三副模塊sum,最終模塊,負責對n次運算結束后的最終數值進行數字轉中文字符的轉化。考慮錢包有可能有十元、百元、千元等情況,綜合我的錢包情況,得出結論:錢包是沒有百元以上的。再考慮兩位數的稱呼問題,我統一兩位數為x十x,如二十四。
    此模塊中,我首先制定了零到九的十位字符數組,再將得到的最終數值分解成十位和個位,一一對應在中間加字符“十”輸出,即得結果。
    void sum(int n)
    {
    char nums[10][4]={"零","一","二","三","四","五","六","七","八","九"};
    if(n<10) printf("%s",nums[n]);
    else
    {
    int m=n%10;
    n=n/10;
    printf("%s十%s",nums[n],nums[m]);
    }
    }
    (3)全體分析
    我的代碼中,將輸入的字符串分解成幾個部分是因為由題輸入中每個詞語都是用空格間隔的,在多個數組輸入時,因為有空格會將每個詞語分割到對應的數組中。
    接着,代碼中大量運用strcmp函數對比兩個字符串,是因為中文字符占了兩個以上的字符位,我想到的遍歷方法是不能輸出單個中文字符的,因此用strcmp對比判斷。
    (4)命令行編譯
    最讓我頭疼的部分來了!我經常使用的是Devc++,vs還是昨天下載的。在查看vs編譯器版本並親自用命令行和cl.exe編譯了一個helloworld后,我膨脹了,然后喜聞樂見的事情,C語言很多函數我在vs上提示錯=錯誤……然后我改用DevC++。
    代碼敲完之后,使用命令行編譯,
    首先我在記事本中寫入代碼,另存為gcc所在目錄下並保存為text.c格式,然后需要在命令行中找到gcc編譯器,並按照gcc text.c –o text.exe的格式,將源文件變為可執行文件,這個格式我找了很久……關於gcc可以參考網址
    https://www.cnblogs.com/fengliu-/p/10219850.html
    如圖操作:

(5)完整代碼

include<stdio.h>

include<string.h>

int num(char d[])
{
if(!strcmp(d,"零")) return 0;
else if(!strcmp(d,"一")) return 1;
else if(!strcmp(d,"二")) return 2;
else if(!strcmp(d,"三")) return 3;
else if(!strcmp(d,"四")) return 4;
else if(!strcmp(d,"五")) return 5;
else if(!strcmp(d,"六")) return 6;
else if(!strcmp(d,"七")) return 7;
else if(!strcmp(d,"八")) return 8;
else if(!strcmp(d,"九")) return 9;
else if(!strcmp(d,"十")) return 10;
else return -1;
}

int judge(int n ,char c[],char d[])
{
if(!strcmp(c,"增加")) return n+num(d);
else if(!strcmp(c,"減少")) return n-num(d);
else if(!strcmp(c,"乘以")) return n*num(d);
else if(!strcmp(c,"除以")) return n/num(d);
else printf("輸入錯誤");
}

void sum(int n)
{
char nums[10][4]={"零","一","二","三","四","五","六","七","八","九"};
if(n<10) printf("%s",nums[n]);
else
{
int m=n%10;
n=n/10;
printf("%s十%s",nums[n],nums[m]);
}
}

int main()
{
char a[10], b[10], c[10], d[10];
int coin;
scanf("%s%s%s%s",a,b,c,d);
getchar();
if(!strcmp(a,"整數"))
{
if(num(d)==-1) printf("輸入錯誤\n");
else coin += num(d);
}
while(2)
{
scanf("%s",b);
if(!strcmp(b,"看看"))
{
if(coin>99) printf("我真的沒那么多錢");
else sum(coin);
break;
}
scanf("%s%s",c,d);
coin = judge(coin,c,d);
}
}
(6) 樣例展示

本萌新能力有限,博客不太會弄,排版不行,如對我的題解有問題,歡迎各位向我指出,一起學習!QAQ


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM