- 若是你不瞭解C++請回答如下問題:你認爲C語言有什麼缺陷(你以爲哪裏用的不順手)。 若是你已經瞭解C++請回答如下問題:你以爲C++和C語言比有什麼優勢。 我不瞭解c++,所以我是想說說C語言。 C語言的有代碼量小、運行速度快、功能強大三個優勢,它也有許多缺陷。 (1) 危險性高 C語言的語法限制不太嚴格,程序設計自由度大。這個特色使得程序設計更主動、靈活,但也埋藏了許多危險。例如:C語言中能夠將一個浮點型數據賦給一個整型數據,會丟失精度但不影響程序運行;C語言對數組下標越界不檢查,容易形成數據在內存中的混亂等。 對於這些細小的問題,不只要求使用者對程序設計更熟練,並且製造了許多小漏洞,容易被利用,引發程序的安全問題。 (2) 運算符多樣,易混淆 C語言具備多種運算符,若是運用熟練,能充分體現C語言表達靈活和效率高等特色,但這也增長了使用難度,多樣的運算符和優先級可能會混浠形成錯誤。 (3) 許多運算符具備不一樣意義 例如C語言中static在函數內部,表達該變量的值在各個調用間一直保持延續性,相似於全局變量;在函數外部,表達該函數或者變量只對本文件可見。多重意義的還有extern,void,*,&等。這對於初學者程序設計時形成了許多麻煩和困擾。 我是個初學者,常常飽受C語言語法限制不嚴格的惡意,正如C語言浮點型能夠賦給整型,且不會提示錯誤,這在我前期的程序設計和做業考試中帶給我很多的麻煩。多樣的運算符也帶給我很多的困擾,最深入的仍是學習scanf函數時,常常忘記加&以至於錯誤。
- 查閱相關資料,簡述一下C語言/C++的編譯過程。 C語言編譯過程:源文件->預編譯->編譯->連接 第一步:編輯源文件 第二步:預處理 (1) 將全部的#define刪除,而且展開全部的宏定義 (2) 處理全部的條件編譯指令(帶#的指令) (3) 處理#include,將#include指向的文件插入到該行處 (4) 刪除全部註釋 (5) 添加行號和文件標示,這樣在調試和編譯出錯的時候才知道是哪一個文件的哪一行 (6) 保留#pragma編譯器指令 第三步:編譯 從高級語言->彙編語言->機器語言 (1) 詞法分析 (2) 語法分析 (3) 語義分析 (4) 優化後生成相應的彙編代碼 (5) 彙編代碼轉換爲機器碼 編譯的過程就是把源文件翻譯成二進制文件 第四步:連接 將源文件中用到的庫函數與彙編生成的目標文件合併生成可執行文件 這個過程,就是將源文件從.c變成.exe的過程。
實踐題:html
- 查看本身的C++編譯器版本 首先vs的c++編譯器文件名爲cl.exe,所以在vs裏打開命令行,輸入cl.exe便可查看編譯器版本。
![](http://static.javashuo.com/static/loading.gif)
若是是Devc++的gcc編譯器的話,能夠經過在命令行中打入gcc –v查看版本 如圖:
c++
可是這兩個都須要設置環境變量,方法以下:在個人電腦->屬性->高級系統設置->環境變量->系統變量的Path中輸入編譯器地址。例如Devc++的gcc編譯器,本人的地址是D:\辦公\Dev-Cpp\MinGW64\bin,所以Path中也需如此輸入。 如圖:
編程
- 使用命令行編譯一份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 如圖操做:
![](http://static.javashuo.com/static/loading.gif)
(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學習