目錄
-
1. C語言的起源 2. C語言的特點 3. C語言的應用領域 4. C語言的重要性 5. 小試牛刀
-
1. cup、內存、硬盤、顯卡、顯示器、主板之間的關係 2. HelloWord是如何運轉起來的 3. 什麼是數據類型 4. 什麼是變量 5. 變量爲什麼必須初始化(垃圾數據的講解) 6. 什麼是進制 7. 常量是以什麼樣的二進制存儲在計算機中的
-
1. 字節 2. Ascll編碼 3. char的講解 4. 字符的存儲
-
1. printf("") 2. printf("控制輸出符",變量) 3. printf("非控制輸出符",變量) 4. printf("控制輸出符控制出符",變量,變量)
-
1. 爲什麼要使用輸出控制符 2. 一定要注意的就是無論scanf函數從鍵盤輸入幾個數據. scanf函數中的非輸出控制符一定要一字不漏的寫出來。哪怕是一個逗號都不能夠少。
-
1. 爲什麼要使用輸出控制符 2. 常見的輸出控制符包含如下 3. 非進制輸出控制符 4. 進制的輸出控制符
-
1. 首先我們來看看什麼是非法輸入 2. 控制非法輸入
-
1. 算術運算符 + - * / %(取餘)(需要重點注意 / 運算和%運算) 2. 邏輯運算符 && || !(與或非) (注意可能前面一個決定了後面的不執行的情況) 3. 比較運算符 > < >= <= != == 4. 賦值運算符 =、 += 、-= 、*=、 /=、
-
1. 什麼是流程控制 2. 流程控制的分類 3. 選擇if 或者switch 1. if最簡單的應用 2. C語言中對真假的表示 3. if 範圍 4. if…else 5. if …else if…else if…else 6. 例子1:成績評判系統 7. 例子2:三個數大小排序 8. if中空語句的問題 (空語句就是不寫任何東西直接寫一個分號; 程序也能夠通過,並不會報錯) 9. if中常見的問題的解析 4. 循環
C 語言概述
-
C語言的起源
C語言的起源在這裏就不細講了
-
C語言的特點
優點:
代碼量小,運行速度快,功能強大
缺點:
安全性不高。開發週期長(因爲是面向過程的語言,開發大型的應用不太方便)。可移植性差(不能夠任何機器上都可以跑,有點類似與彙編,每個不同的機器都有不同的彙編指令)
-
C語言的應用領域
C語言的應用領域比較廣吧。一般是系統的開發(我們所熟知的三大操作系統都是基於C語言來寫的(windoms,linux,unix三大常用的操作系統))。部分應用的開發,如遊戲等等。
最主要的還是應用於系統軟件。編寫應用軟件不是C語言的強項
-
C語言的重要性
C語言基本上算是現在流行語言的祖宗吧,是學習《數據結構》,《操作系統》,《java》的基礎。特別是《數據結構》。
C語言還是連接電腦硬件的最有力的語言。重要性不言而喻。學計算機的如果C語言學不好那基本上不會走的很遠,即使現在找到了工作,也是走不長遠的。
-
C語言小例子練習來感受一下C語言的魅力
這是一個解一元二次方程的例子。直接輸入方程的係數就可以進行求解。
# include<stdio.h> # include<math.h> int main(void) { int a ; int b ; int c ; //定義方程係數的三個變量 double middle; double ra,rb; printf("請輸入方程係數...\n"); scanf("%d%d%d",&a,&b,&c); middle = b*b-4*a*c; if(middle>0) { //有兩個解 ra=(-b+sqrt(middle))/(2*a); rb=(-b-sqrt(middle))/(2*a); printf("x1=%f,x2=%f\n", ra,rb); } else if(middle==0) { //有且只有一個解 ra=(-b)/(2*a); rb=ra; printf("x1=%f\n", ra); } else { //方程沒有解 printf("方程沒有解!\n"); } return 0; }
C語言編程預備知識
-
cup、內存、硬盤、顯卡、顯示器、主板之間的關係
這裏我們用一個電影的例子來進行講解
最開始的時候電影是在硬盤的上存放的>>>>>然後我們用鼠標進行點擊給 cpu 發送指令>>>> cup給內存說我要看電影>>>>內存將電影從硬盤中調取出來>>>並給cup傳送指令>>>>cup進行解析
是聲音就通過聲卡進行輸出,是圖片就通過顯卡進行輸出>>>>最後輸出到顯示器上或者通過喇叭進行傳給用戶直觀的感受。
主板就是起一個連接的作用。相當於各個城市之間的道路一樣。
-
HelloWord是如何運轉起來的
我們在vc++6.0中運行C語言的時候都是需要先進性編譯在進行連接最後再點擊執行就可以在終端中看到我們程序的結果
實際上編譯和鏈接是vc++6.0這個軟件進行的,將通過編譯後的文件生成一個可以執行的 .exe 後綴的文件。然後再通過操作系統去申請我們的cup去執行。然後纔是我們的結果。
所以說不是單單只是軟件的功能
-
什麼是數據類型
我們在這裏只是簡單的先介紹一下有一個概念。具體的類型會在後面進行講解的
在數學中我們可以將現實生活中的數字分爲: 整數,實數,複數等等。我們在C語言中也是這樣差不多的進行分類。在C語言中我們大致的分一下類:
-
基礎數據類型:
整型:
在整型中我們由分爲長整型,短整型,和整型。 這樣分的目的就是爲了節省內存資源。我們有時候一個數比如 3 只需要一個字節就能夠進行存儲。但是如果用一個 long int 來進行存儲的話當然是可以的,但是long int 它是佔有8個字節的長整型。存儲一個一字節的數實在是浪費空間。
整型的分類
長整型: long int (8字節) 整型: int (4字節) 短整型: hort int (2字節)
浮點型的分類
單精度浮點型:float (4字節) 雙精度浮點型:double (8字節)
字符
字符 char 只能用於存儲一個字符,而不能存儲字符串。在java、python、等等的語言中都是可以的,但是在C語言中是不行的。存儲字符串的我們後面在講解
-
複合數據類型
所謂的複合數據類型就是將一些基本的數據類型進行拼接然後成爲複合數據類型
結構體
枚舉
共同體
我們後面將會重點講解枚舉
-
-
什麼是變量
變量是內存中的一段存儲的空間。這裏我們簡單的通過一個程序進行講解一下
# include<stdio.h> int main(void) { int i=3; printf("%d\n", i); return 0; }
我們定義了一個變量 i 併爲它賦值爲 3 。這個變量是存儲在內存中的,我們定義一個變量的時候就是在內存中尋找空餘的位置分配給它,然後記住它的地址。所以說變量就是內存中的一段空閒的空間
-
變量爲什麼必須初始化
這裏說的初始化就是對變量進行賦值。我們先看看沒有進行初始化的變量會輸出什麼。
# include<stdio.h> int main(void) { int i; printf("%d\n", i); return i; }
我們來看看程序的輸出結果
-858993460 Press any key to continue
我們看到程序輸出了很大的一串數字。重複執行幾次程序結果都是一樣的。這又是爲什麼呢?
前面我們講解到,變量是內存中一段空閒的空間,我們在使用這段空閒的空間之前很有可能之前也有別的程序也使用過了,留下來了一些殘留的垃圾數據。 但是如果是這樣的話,這些數據應該是隨 機的而不應該每次執行都是一樣的結果啊!原來 vc++6.0 這個軟件很早就發現了這個問題,於是在我們沒有對變量進行初始化的時候提前的給變量所在的內存空間進行賦初值了,賦了一個 -8 開頭的很大的數據,讓我們看到後就知道是變量沒有初始化。
這裏我們大致講解一下軟件運行與內存的關係 (垃圾數據)
1. 軟件在運行之前會向操作系統申請存儲空間。在內存空間足夠的情況下,操作系統將會分配一段空閒的內存空間,並將外存中的軟件拷貝一份放入內存空間中,並啓動該程序的運行 2. 在軟件運行期間,該軟件所佔有的內存空間不再分配給其餘的軟件,而是自己一個人佔有直至任務結束 3. 當軟件運行完畢後,操作系統將回收該內存空間(注意: 操作系統並不會清空該內存空間中遺留下來的數據),以便給別的軟件分配空間。(這些遺留下來的數據我們叫做垃圾數據)
-
什麼是進制
進制在我們生活中很常見。像我們說的 89, 90 等等是十進制數。我們生活中使用的都是十進制數,逢十進一。我們說的幾進制就是逢幾進一,例如我們熟知的還有二進制,八進制,十六進制等等。這裏就不詳細的進行講解了。後面會專門進行講解的
-
常量是以什麼樣的二進制存儲在計算機中的
整數是以補碼的形式轉換成爲二進制代碼存儲在計算機中的
實數是以IEEE754標準轉換成爲二進制代碼存儲在計算機中的
字符存儲的方式和整數差不多。在Ascll表中有對應字符的數字,然後再將數字的補碼形式轉換成爲二進制代碼存儲在計算機中。例如:A 在ascll表中的值是65.然後再將65的補碼轉換成爲二進制代碼存儲在計算機中。
這些標準講解起來都比較麻煩。在後面我們會作爲專題進行講解。
什麼叫字節
-
字節是存儲數據的單位。也是硬件所能夠進行訪問的最小的單位。前面我們說cup是從內存進行調用程序然後執行。在內存中程序的存儲是一位一位的進行存儲的。但是cpu不能夠精確的訪問到每一位(byte)。
而是隻能夠訪問字節(bit)以上的單位。這裏的 1字節(bit)=8位(btye)。現在我們說的32位64位也是這個意思。
我們下面來講講關於計算機計量單位的進位
1bit=8byte 1K=1024bit(字節) 1M=1024K 1G=1024M 1T=1024G
Ascll碼
- Ascll就是一種編碼規則。只是說我們的C語言滿足這個編碼規則。這個編碼規則將一些常見的字符轉化成爲數字然後再轉化爲二進制文件放在計算機中
Char的講解
-
我們來看一個代碼
# include<stdio.h> int main(void) { //char 字符是用來進行單個字符的而不是字符串的定義 char a='a'; //這是可以的,因爲只是單個字符 char b="ABch"; //這是錯誤的。char定義的只是一個字符而不是字符串,將字符串賦值給char這是錯誤的 char c='ab'; //這是錯誤的。單引號只能夠將單個字符括起來,而不能夠將字符串括起來。 char d="A"; //這也是錯誤的。每個字符串默認會帶上一個"\0"的終止符(後面我們會講解終止符)。所以這個是一個字符串。 printf("%c\n",c); return 0; }
這裏我們要注意的就是字符串後面會自動的加上一個 \0 的終止符。原本是3個字符的會變爲4個。
""雙引號用於將字符串括起來。’'用於將字符括起來。char只能夠用於存儲單個的字符而不是字符串。
字符的存儲
- 字符的存儲實質上就是和整數的存儲時差不多的。通過Ascll表將字符轉化成爲一個整數,然後再將整數按照整數的方式進行存儲。所以說字符的存儲實際上和整數的存儲時差不多的。
printf函數的常見的用法
-
pritnf(""); 直接輸出在屏幕上
# include<stdio.h> int main(void) { printf("你好世界!\n"); return 0; } /* 用於直接輸出信息 */
-
printf(“輸出控制符”,變量); 輸出單個變量
# include<stdio.h> int main(void) { int i=10; printf("%d\n",i); //這裏的%d是輸出控制符,表示的是以十進制進行輸出。 return 0; }
-
printf(“輸出控制符輸出控制符”, 變量,變量) 輸出兩個變量
# include<stdio.h> int main(void) { int i=10, j=20; printf("%d %d\n",i,j); //printf("%d%d",i,j); return 0; } /* 兩個輸出控制符之間沒有添加空格 ------------輸出結果------------------- 1020 --------------------------------------- 兩個輸出控制符之間添加了空格 ------------輸出結果------------------- 10 20 --------------------------------------- 總結: 我們可以看到在兩個輸出控制符之間如果沒有添加空格的話,兩個輸出的數據是會連接在一起的。這樣不方便與人交互。 */
-
printf(“非輸出控制符,輸出控制符”,變量) 帶有描述信息得輸出
/* -------------2020/3/13 21:13------------- 目的:探究printf的用法 */ # include<stdio.h> int main(void) { int i=10, j=20; printf("i=%d,j=%d\n",i,j); return 0; } /* ------------在vc++6.0中運行的結果------- i=10,j=20 ---------------------------------------- */
scanf函數的講解
-
爲什麼要使用輸出控制符
在回答這個問題之前我們先來看看另外的一個東西。我們知道用鍵盤從終端上輸入的都是字符或者是字符串,哪怕輸入123它也是字符串而不是我們說的數字。所以我們就需要使用控制符轉換成爲我們需要的數據類型。所以我們需要使用輸出控制符。
-
scanf(“輸出控制符”,&變量) &是一個取地址的符號
# include<stdio.h> int main(void) { int i; printf("請輸入...\n"); scanf("%d",&i); printf("i = %d\n",i); return 0; /* -----------vc++6.0中輸出的結果------------------ 請輸入... 12mmmmmmm i = 12 請輸入... 12 i = 12 請輸入... mmm344343434 i = -858993460 心得: 爲什麼會出現這樣得結果呢?原來C語言在執行輸入得時候不滿足輸出控制符得數據都不會錄入。所以第二個後面得mmmm就直接省略了。 而如果mmmm在前面得話,系統就會認爲你的數據都是錯得,就不會把值賦給變量。 ------------------------------------------------ */ }
-
scanf(“非輸出控制符,輸出控制符”,&變量)
# include<stdio.h> int main(void) { int i; printf("請輸入...\n"); scanf(",%d",&i); printf("i = %d\n",i); return 0; /* -----------vc++6.0中輸出的結果------------------ 請輸入... 12 i = -858993460 請輸入... ,2 i = 2 請輸入... 【】3 i = -858993460 心得: 爲什麼會出現這樣得結果呢? scanf函數中非輸出控制符都要原封不動得輸入,否則就會報錯。 ------------------------------------------------ */ }
-
在鍵盤上輸入多個變量 scanf(“輸出控制符輸出控制符” ,&變量,&變量)
# include<stdio.h> int main(void) { int i,j; printf("請輸入...\n"); scanf("%d,%d",&i,&j); printf("i = %d,j=%d\n",i,j); return 0; /* -----------vc++6.0中輸出的結果------------------ 請輸入... 1,2 i = 1,j=2 請輸入... 12 i = 12,j=-858993460 請輸入... 1;2 i = 1,j=-858993460 心得: 這個和前面講解的是一樣的。任何的非輸出控制符都要在輸入的時候輸入,不然很可能就會進行報錯。 第二個輸入就是沒有在12之間輸入非輸出控制符導致系統將12認爲是一個數賦值給了變量i, 而變量j沒有賦值出現垃圾數據 所以說在使用scanf函數的時候不要輕易的添加非輸出控制符,或者在前面給用戶提示怎麼輸入數據。 ------------------------------------------------ */ }
輸出控制符
-
爲什麼要使用輸出控制符:
-
我們知道在計算機中數據是以二進制的形式存儲在計算機中的,但是01組成的代碼既可以表示數據也可以表示指令。如果不用輸出控制符變成我們想要的樣子的話,很容易的造成誤解。
-
如果01組成的代碼表示的是數據的話,那麼同樣的 01 代碼組合不同的輸出格式就會有不同的輸出結果。所以需要使用輸出控制符
-
-
常見的輸出控制符包含如下:
%d --------------- int %ld --------------- long int %c --------------- char %f --------------- float %lf --------------- double %x(或者%x 後者%#X) ------------整型(長短都可以)(用是十六進制輸出) %o ------------整型(長短都可以)(八進制輸出) %s ------------字符串
-
非進制輸出控制符
-
代碼演示
/* ----------------2020/3/13 21:45--------------- 目的: 探究非進制控制輸出符 */ # include<stdio.h> int main(void) { int i=10; char a='a'; float b=2.123459789; double c=3.123456789; //%d 一般多用於int類型。表示用十進制進行輸出 printf("%d\n",i); //%ld 表示long int 類型 printf("%d\n",i); //%c 用於輸出字符串 printf("%c\n",a); //%f 用於輸出單精度浮點數 printf("%f\n" ,b); //%lf用於輸出雙精度浮點數 printf("%lf\n" ,c); return 0; } /* --------------------vc++6.0上運行的結果------------------ 10 10 a 2.123460 3.123457 --------------------------------------------------------- 心得: 我們可以看到浮點數最多輸出得是小數點後面六位,不論單精度還是雙精度都是一樣得。 超過了六位的浮點數從第七位四捨五入,無論第八位有多大,第七位後面的數已經與這個數無關了。只看第七位是否四捨五入 不足六位數的浮點數在後面補0 */
-
-
進制的輸出控制符
- 代碼演示
/* -----------------2020/3/13 22:35---------------- 目的: 探究進制輸出符的控制 */ # include<stdio.h> int main(void) { int i=30; //用八進制輸出 printf("%o\n",i); //輸入的是小寫的o printf("%O\n",i); //輸入的大寫的O printf("%0\n",i); //輸入的數字零 printf("%#o\n",i); //輸入的是井號加小寫字母o printf("%#O\n",i); printf("----------------\n"); //十六進制輸出 printf("%x\n",i); //輸入的是小寫x printf("%X\n",i); //輸入的是大寫的X printf("%#x\n",i); //輸入的是井號加小寫字母o printf("%#X\n",i); //輸入的是井號加小寫字母o return 0; } /* ---------vc++6.0中運行的結果-------------- 36 O 036 O ---------------- 1e 1E 0x1e 0X1E ------------------------------------------ 心得: 在八進制中小寫得o輸出不帶符號得八進制數。大寫得O和數字零看起來差不多,但是輸入大寫得O出來得是一個零。而數字0出來的是空行 所以在八進制中只有小寫得o能夠輸出數據,#o能夠輸出帶符號得八進制數 在十六進制中大小寫得x都可以輸出數據。X輸出得超過10得大寫得字符。小寫得就是小寫的字符。#x帶有符號的十六進制數。 在十六進制中大小寫都可以輸出而八進制只有小寫可以輸出的原因可能是因爲十六進制中超過的10的部分是字母表示的。可以用大小寫。而八進制都是數字無法用法大小寫區分 */ }
關於C語言得非法輸入
-
首先我們來看看什麼是非法輸入
# include<stdio.h> int main(void) { int i,j,k; char ch; printf("請進行第一次輸入...\n"); scanf("%d",&i); printf("i=%d\n",i); printf("----------------\n"); printf("請進行第二次輸入....\n"); scanf("%d",&j); printf("j=%d\n",j); printf("----------------\n"); printf("請進行第三次輸入....\n"); scanf("%d",&k); printf("k=%d\n",k); return 0; /* ----------------vc++6.0中輸出得結果----------------------- 請進行第一次輸入... 123 i=123 ---------------- 請進行第二次輸入.... 456 j=456 ---------------- 請進行第三次輸入.... 789 k=789 ------------------------------------------------------------- 請進行第一次輸入... 123.。。。。 i=123 ---------------- 請進行第二次輸入.... j=-858993460 ---------------- 請進行第三次輸入.... k=-858993460 ------------------------------------------------------------- 請進行第一次輸入... mmmmm i=-858993460 ---------------- 請進行第二次輸入.... j=-858993460 ---------------- 請進行第三次輸入.... k=-858993460 ----------------------------------------------------------- 心得: 我們看到只有第一次的輸入是正確的。我們先來說說爲什麼要使用輸出控制符。 我們從終端中輸入的都是字符或者字符串,例如我們輸入123,在我們看來是數字,但是在計算機看來就是字符,我們在python中也是的,使用的時候需要將字符轉換成爲相應的數據類型。 所以我們就是需要使用輸出控制符將字符轉化成爲我們需要的數據類型進行輸入。搞懂了爲什麼要使用輸出控制符,我們再來回答上面的問題。 scanf函數在進行輸入的時候,先對字符串進行讀取,例如"123mmmm",讀取的123符合%d的輸入形式,所以就賦值給了i。但是後面的mmmm不符合%d的輸入形式,繼續的留在輸入的字符串中,等待 下一次的讀取。結果在下面使用scanf函數的時候,率先從上面沒有讀完的地方繼續進行讀寫,mmmm顯然不符合%d所以初始化變量j失敗,系統自動爲變量j賦值爲垃圾值。這就是爲什麼出現上面現象 的原因。如果輸出控制符改爲%c那就一點問題都沒有了,因爲mmmm是滿足這個控制符的。 ---------------------------------------------------------- */ }
我們看到用戶的非法輸入給後面造成了嚴重的影響
-
控制非法輸入
# include<stdio.h> int main(void) { int i,j,k; char ch; printf("請進行第一次輸入...\n"); scanf("%d",&i); printf("i=%d\n",i); while(ch=getchar()!='\n') continue; printf("----------------\n"); printf("請進行第二次輸入....\n"); scanf("%d",&j); printf("j=%d\n",j); while(ch=getchar()!='\n') continue; printf("----------------\n"); printf("請進行第三次輸入....\n"); scanf("%d",&k); printf("k=%d\n",k); return 0; /* ----------------vc++6.0中輸出得結果----------------------- 請進行第一次輸入... 23mmmmm i=23 ---------------- 請進行第二次輸入.... 45mmmmmmmmmm j=45 ---------------- 請進行第三次輸入.... 78mmmmmmmmmmm k=78 ----------------------------------------------------------- 心得: 我們看到加入一個while循環後就解決了這個問題。實際上也是比較好理解的就不細講了。 */ }
運算符
-
算術運算符 + - * / %(取餘)
這裏我們重點講解 / 和 % 運算
-
/ 運算
補充一點的是這裏說的截取小數部分是直接截取掉, 而不是採取四捨五入的方式。3.1是3。3.9也是3
-
% 運算
取餘運算要求的是運算對象必須是整數。結果是整除後的餘數。其餘數的符號與被除數相同。
-
-
邏輯運算符 && || !(與或非)
&&(有一個爲假就是假,兩個爲真纔是真)
||(有一個爲真就是真,兩個爲假纔是假)
這就導致我們在判斷的時候,會出現一部分不會執行的情況。因爲前面一個就可以決定整個表達式的結果。
# include<stdio.h> int main(void) { int r,i=39,j=10; r=(i>90)&&(j=20); printf("r=%d,j=%d\n",r,j); return 0; } /* -------------vc++6.0中運行的結果------------ r=0,j=10 Press any key to continue -------------------------------------------- */
我們看到j=20並沒有執行。j還是原來的值。因爲前面已經是假了,在&&裏面有一個是假就一定是假,後面不用看了。所以導致j=20它沒有執行。
這是邏輯運算中的一個坑。
-
比較運算符 > < >= <= != ==
-
賦值運算符 =、 += 、-= 、*=、 /=、
比較運算符和邏輯運算符比較簡單就不仔細的講解了。
流程控制
-
什麼是流程控制
流程控制就是控制程序的執行順序。
-
流程控制的分類
-
順序
-
選擇
-
循環
-
-
選擇if 或者switch
- if
-
if最簡單的應用
格式:
if (表達式) 語句
功能:
如果表達式爲真,則執行語句 如果表達式爲假,則不執行語句
-
C語言中對真假的表示
# include<stdio.h> int main(void) { if(1) printf("AAAA(1)\n"); if(-1) printf("AAAA(-1)\n"); if(0) printf("AAAA(0)\n"); if(2) printf("AAAA(2)\n"); return 0; } /* ------------vc++6.0中運行的結果------------- AAAA(1) AAAA(-1) AAAA(2) Press any key to continue -------------------------------------------- */
從程序中我們可以看到在C語言中除了 0 表示假的以外。別的都表示真。無論是小於還是大於 0 的數都是表示真的。
-
if 範圍
# include<stdio.h> int main(void) { if(10<5) printf("AAAA\n"); printf("BBBB\n"); return 0; } /* ------------vc++6.0中運行的結果------------- BBBB Press any key to continue -------------------------------------------- 心得: if語句的覆蓋範圍是一條語句。不加括號的話。如果要想if語句執行多條語句,只需要使用{}將語句括起來就行 */
通過程序我們可以看到 if 語句的範圍是一條語句
-
if…else
# include<stdio.h> int main(void) { int i=5,j=10; if(i>j) printf("j大於i\n"); else printf("i大於j\n"); printf("AAAAA\n"); return 0; } /* ------------vc++6.0中運行的結果------------- i大於j AAAAA Press any key to continue -------------------------------------------- */
比較簡單就不仔細的說了
-
if …else if…else if…else
# include<stdio.h> int main(void) { int i=5; if(i>0) printf("i大於0\n"); else if(i==0) printf("i等於0\n"); else printf("i小於0\n"); printf("AAAAA\n"); return 0; } /* ------------vc++6.0中運行的結果------------- i大於0 AAAAA Press any key to continue -------------------------------------------- */
這個也還行。下面我們會舉幾個例子讓大家深入的理解一下。
-
例子1:成績評判系統
# include<stdio.h> int main(void) { float grade; //學生輸入的成績 printf("-------------------歡迎來到成績評判系統-------------------------\n"); printf("請輸入你的成績....\n"); scanf("%f",&grade); if(grade>100) printf("您的輸入有誤,請從新輸入..."); else if(grade>90&&grade<=100) printf("A\n"); else if(grade>80&&grade<=90) printf("B\n"); else if(grade>60&&grade<=80) printf("C\n"); else if(grade=60) printf("D\n"); else if(grade<60&&grade>=0) printf("E\n"); else printf("您的輸入有誤,請從新輸入..."); return 0; }
-
例子2:三個數大小排序
# include<stdio.h> int main(void) { int a,b,c; printf("請任意輸入三個整數,中間用空格隔開\n"); scanf("%d %d %d",&a,&b,&c); if(a>b) { if(b>c) printf("%d>%d>%d\n",a,b,c); else { if(a>c) printf("%d>%d>%d\n",a,c,b); else printf("%d>%d>%d\n",c,a,b); } } else { if(a>c) printf("%d>%d>%d\n",b,a,c); else { if(b>c) printf("%d>%d>%d\n",b,c,a); else printf("%d>%d>%d\n",c,b,a); } } return 0; }
-
if中空語句的問題
# include<stdio.h> int main(void) { if (3>1) ; printf("AAAA\n"); printf("BBBBB\n"); return 0; } /* ------------vc++6.0中運行的結果------------------ AAAA BBBBB Press any key to continue ------------------------------------------------- */
我們看到在 if 後面加上 (;)程序實際上並不會報錯。這是因爲在C語言中將分號視爲一個語句的結尾。if(3>1) ; 這只是表示以 這個(;)結尾的語句什麼也沒有寫是一個空語句。如果我們if(3>2) pritnf(“AAAA\n”); 這樣實際上是等價於
if (3>1) printf("AAAA\n");
滿足條件的就會輸出 if 後面所寫的語句。
-
if中常見的問題解析
a. 無論if中的條件有幾個是滿足的,始終只是執行第一個條件下滿足的語句。
# include<stdio.h> int main(void) { if(3>1) printf("AAAA\n"); else if(3>2) printf("BBBB\n"); else printf("CCCC\n"); return 0; } /* -------------vc++6.0中運行的結果------------ AAAA Press any key to continue -------------------------------------------- */
b. if …else if …else if…可以不添加else,程序不會報錯。邏輯上是行的通的。
# include<stdio.h> int main(void) { if(3>1) printf("AAAA\n"); else if(3>2) printf("BBBB\n"); else if(3>=3) printf("FFFF\n"); return 0; } /* -------------vc++6.0中運行的結果------------ AAAA Press any key to continue -------------------------------------------- */
c. if…else if …else 中的else後面並不能直接添加表達式。但是闊以添加語句。
# include<stdio.h> int main(void) { if(3<1) printf("AAAA\n"); else if(3<2) printf("BBBB\n"); else (3>1) //這樣是不行的,邏輯上不同,也沒有這個寫法。如果添加了if 成爲else if 表達式 這樣當然是可以的。 printf("FFFF\n"); return 0; }
-
循環
-
什麼是循環
對語句進行重複輸入
-
循環的分類
- for 循環
- while 循環
- do while 循環
我們重點會講解 for 循環
-
for 循環
-
代碼演示
# include<stdio.h> int main(void) { int sum=0; //求和存放的地方 for(int i=0;i<10;i++) { sum+=1; } printf("sum的和是\n",sum); return 0; }
搞清楚 for 循環的執行順序是程序能否讀懂的關鍵。
把 int i=0; 看作步驟(1)
i<10; 看作步驟(2)
i++ 看作步驟(3)
sum+=i; 看作步驟(4)
這是有關循環的幾個重要的步驟:
它們執行的順序是(1)>(2)>(4)>(3)> (2)>(4)>(3)> (2)>(4)>(3)
也就是說循環執行時:
先進行(1)初始化變量,一般只會執行一次。
然後(2)再判斷循環終止條件是否滿足,滿足則執行循環體裏面的語句,不滿足則直接跳出循環
執行(3)完循環體中的語句後
再去(4)執行變量的操作。
然後重複的操作,直到條件不滿足,跳出循環。
-
求100以內奇數的和
#include<stdio.h> int main(void) { int sum=0; for(int i=1;i<=100;i+=2) { sum+=i; } printf("sum=%d\n",sum); return 0; } /* ------------vc++6.0中運行的結果----------------- sum=2500 Press any key to continue ------------------------------------------------ */
-
求100以內偶數的和
#include<stdio.h> int main(void) { int sum=0; for (int i=0;i<=100;i+=2) { sum+=i; } printf("sum=%d\n",sum); return 0; } /* -------------vc++6.0中運行的結果-------------- sum=2550 Press any key to continue ---------------------------------------------- */
-
求解1+1/2+1/3+…+1/10
#include<stdio.h> int main(void) { int k=1; //分子的固定值 double sum=0; //用於存放總和 for(int i=1;i<=10;i++) { sum+=(k/i); } printf("sum=%lf\n",sum); return 0; } /* -------------vc++6.0中運行的結果-------------------- sum=1.000000 Press any key to continue ---------------------------------------------------- 心得: 這個結果明顯時錯誤得,我們來看看爲什麼時錯誤!提示一下是因爲做除法運算得時候出現直接捨棄小數位得原因。如何解決請去看除法運算。 */
因爲for 循環只要弄清楚了執行得順序就變得比較簡單了。這裏就不再多講解了。
-
返回目錄 -