嵌入式C語言基礎編程——5年程式設計師給你講解程序設計之三種結構

it百科大學堂 發佈 2020-05-13T13:03:29+00:00

加法運算語句,但計算結果不能保留,無實際意義;自增 1 語句,i 值增 1。input a long integer 1234567890。

本文主要是對C基礎編程關於程序設計的初步講解,屬於C編程入門的小白基礎課,後續會深入講解C高級相關的概念(C大神可先略過)。 本人近期會陸續上傳IT編程相關的資料和視頻教程,可以關注一下互相交流:C C++ Java python linux ARM 嵌入式 物聯網等。想學編程的朋友進入主頁即可看到相關教程和資料。

本文主要給大家講解最簡單的 C 程序設計—順序程序設計:

從程序流程的角度來看,程序可以分為三種基本結構, 即順序結構、分支結構、循環結構。 這三種基本結構可以組成所有的各種複雜程序。C語言提供了多種語句來實現這些程序結構。本章介紹這些基本語句及其在順序結構中的應用,使讀者對C程序有一個初步的認識, 為後面各章的學習打下基礎。


4.1 C語句概述

C程序的結構:

C程序的執行部分是由語句組成的。 程序的功能也是由執行語句實現的。

C 語句可分為以下五類:

1) 表達式語句

2) 函數調用語句

3) 控制語句

4) 複合語句

5) 空語句

1. 表達式語句:表達式語句由表達式加上分號";"組成。其一般形式為:

表達式;

執行表達式語句就是計算表達式的值。例如:

x=y+z; 賦值語句;

y+z; 加法運算語句,但計算結果不能保留,無實際意義;

i++; 自增 1 語句,i 值增 1。

2. 函數調用語句:由函數名、實際參數加上分號";"組成。其一般形式為:

函數名(實際參數表);

執行函數語句就是調用函數體並把實際參數賦予函數定義中的形式參數,然後執行 被調函數體中的語句,求取函數值 (在後面函數中再詳細介紹) 。

例如:

printf("C Program");調用庫函數,輸出字符串。

3. 控制語句:控制語句用於控制程序的流程, 以實現程序的各種結構方式。它們由特定的語句定義符組成。C語言有九種控制語句。 可分成以下三類:

1) 條件判斷語句:if 語句、switch 語句;

2) 循環執行語句:do while 語句、while 語句、for 語句;

3) 轉向語句:break 語句、goto 語句、continue 語句、return 語句。

4. 複合語句:把多個語句用括號{}括起來組成的一個語句稱複合語句。 在程序中應把複合語句看成是單條語句,而不是多條語句。

例如:

是一條複合語句。

複合語句內的各條語句都必須以分號";"結尾,在括號"}"外不能加分號。

5. 空語句:只有分號";"組成的語句稱為空語句。空語句是什麼也不執行的語句。在程序中空語句可用來作空循環體。

例如

本語句的功能是,只要從鍵盤輸入的字符不是回車則重新輸入。 這裡的循環體為空語句。


4.2 賦值語句

賦值語句是由賦值表達式再加上分號構成的表達式語句。 其一般形式為:

變量=表達式;

賦值語句的功能和特點都與賦值表達式相同。 它是程序中使用最多的語句之一。在賦值語句的使用中需要注意以下幾點:

1. 由於在賦值符"="右邊的表達式也可以又是一個賦值表達式, 因此,下述形式

變量=(變量=表達式); 是成立的,從而形成嵌套的情形。其展開之後的一般形式為:

變量=變量=…=表達式;


4.3 數據輸入輸出的概念及在 C 語言中的實現

1) 所謂輸入輸出是以計算機為主體而言的。

2) 本章介紹的是向標準輸出設備顯示器輸出數據的語句。

3) 在C語言中,所有的數據輸入/輸出都是由庫函數完成的。 因此都是函數語句。

4) 在使用C語言庫函數時,要用於編譯命令

#include

將有關"頭文件"包括到源文件中。

使用標準輸入輸出庫函數時要用到 stdio.h 文件,因此源文件開頭應有以下預編譯命令:

#include <stdio.h>

stdio 是 standard input &outupt 的意思。


4.3.1 putchar 函數(字符輸出函數)


putchar 函數是字符輸出函數, 其功能是在顯示器上輸出單個字符。其一般形式為:

putchar(字符變量)

例如:

對控制字符則執行控制功能,不在螢幕上顯示。 使用本函數前必須要用文件包含命令:

#include<stdio.h>

【例 4.1】輸出單個字符。



4.3.2 getchar 函數(鍵盤輸入函數)

getchar 函數的功能是從鍵盤上輸入一個字符。

其一般形式為: getchar();

通常把輸入的字符賦予一個字符變量,構成賦值語句,如:

char c;

c = getchar();

【例 4.2】輸入單個字符。

使用 getchar 函數還應注意幾個問題:

1) getchar 函數只能接受單個字符,輸入數字也按字符處理。輸入多於一個字符時,只接收第一個字符。

2) 使用本函數前必須包含文件"stdio.h"。

3) 運行含本函數程序時,等待用戶輸入。輸入完畢再回顯。

4) 程序最後兩行可用下面兩行的任意一行代替


4.4 格式輸入與輸出

4.4.1 printf 函數(格式輸出函數)

printf 函數稱為格式輸出函數,其關鍵字最末一個字母 f 即為"格式"(format)之意。其功能是按用戶指定的格式,把指定的數據顯示到顯示器螢幕上。在前面的例題中我們已多次使用過這個函數。

printf 函數調用的一般形式

printf 函數是一個標準庫函數,它的函數原型在頭文件"stdio.h"中。但作為一個特例,不要求在使用 printf 函數之前必須包含 stdio.h 文件。

printf 函數調用的一般形式為:

printf("格式控制字符串",輸出表列)

其中格式控制字符串用於指定輸出格式。格式控制串可由格式字符串和非格式字符 串兩種組成。格式字符串是以%開頭的字符串,在%後面跟有各種格式字符,以說明輸出 數據的類型、形式、長度、小數位數等。如:

"%d"表示按十進位整型輸出;

"%ld"表示按十進位長整型輸出;

"%c"表示按字符型輸出等。

非格式字符串在輸出時原樣照印,在顯示中起提示作用。

輸出表列中給出了各個輸出項,要求格式字符串和各輸出項在數量和類型上應該一 一對應。

【例 4.3】

本例中四次輸出了 a,b 的值,但由於格式控制串不同,輸出的結果也不相同。第四行的輸出語句格式控制串中,兩格式串%d 之間加了一個空格(非格式字符),所以輸出的 a,b 值之間有一個空格。第五行的 printf 語句格式控制串中加入的是非格式字符逗號, 因此輸出的 a,b 值之間加了一個逗號。第六行的格式串要求按字符型輸出 a,b 值。第七行中為了提示輸出結果又增加了非格式字符串。

格式字符串

格式字符串的一般形式為:

[標誌][輸出最小寬度][.精度][長度]類型其中方括號[]中的項為可選項。

各項的意義介紹如下:

1) 類型:類型字符用以表示輸出數據的類型,其格式符合意義如下表所示:



3) 輸出最小寬度:用十進位整數來表示輸出的最少位數。若實際位數多於定義的寬度, 則按實際位數輸出,若實際位數少於定義的寬度則補以空格或 0。

4) 精度:精度格式符以"."開頭,後跟十進位整數。本項的意義是:如果輸出數字, 則表示小數的位數;如果輸出的是字符,則表示輸出字符的個數;若實際位數大於 所定義的精度數,則截去超過的部分。

4. 長度:長度格式符為 h,l 兩種,h 表示按短整型量輸出,l 表示按長整型量輸出。

【例 4.4】



本例第七行中以四種格式輸出整型變量 a 的值,其中"%5d "要求輸出寬度為 5,而 a 值為 15 只有兩位故補三個空格。 第八行中以四種格式輸出實型量 b 的值。其中"%f"和"%lf "格式的輸出相同,說明"l"符對"f"類型無影響。"%5.4lf"指定輸出寬度為 5, 精度為 4,由於實際長度超過 5 故應該按實際位數輸出,小數位數超過 4 位部分被截去。第九行輸出雙精度實數,"%8.4lf "由於指定精度為 4 位故截去了超過 4 位的部分。第十行輸出字符量 d,其中"%8c "指定輸出寬度為 8 故在輸出字符 p 之前補加 7 個空格。


4.4.2 scanf 函數(格式輸入函數)


scanf 函數稱為格式輸入函數,即按用戶指定的格式從鍵盤上把數據輸入到指定的變量之中。

scanf 函數的一般形式

scanf 函數是一個標準庫函數,它的函數原型在頭文件"stdio.h"中,與 printf 函數相同,C語言也允許在使用 scanf 函數之前不必包含 stdio.h 文件。

scanf 函數的一般形式為:

scanf("格式控制字符串",地址表列);

其中,格式控制字符串的作用與 printf 函數相同,但不能顯示非格式字符串,也就是不能顯示提示字符串。地址表列中給出各變量的地址。地址是由地址運算符"&"後跟變量名組 成的。

例如:

&a, &b

分別表示變量 a 和變量 b 的地址。

這個地址就是編譯系統在內存中給 a,b 變量分配的地址。在C語言中,使用了地址這個概念,這是與其它語言不同的。 應該把變量的值和變量的地址這兩個不同的概念區別開來。變量的地址是 C 編譯系統分配的,用戶不必關心具體的地址是多少。

變量的地址和變量值的關係如下: 在賦值表達式中給變量賦值,如:

a=567

則,a 為變量名,567 是變量的值,&a 是變量 a 的地址。

但在賦值號左邊是變量名,不能寫地址,而 scanf 函數在本質上也是給變量賦值,但要求寫變量的地址,如&a。 這兩者在形式上是不同的。&是一個取地址運算符,&a 是一個表達式,其功能是求變量的地址。

【例 4.7】

在本例中,由於 scanf 函數本身不能顯示提示串,故先用 printf 語句在螢幕上輸出提示, 請用戶輸入 a、b、c 的值。執行 scanf 語句,則退出 TC 螢幕進入用戶螢幕等待用戶輸入。用戶輸入 7 8 9 後按下回車鍵,此時,系統又將返回 TC 螢幕。在 scanf 語句的格式串中由於沒有非格式字符在"%d%d%d"之間作輸入時的間隔,因此在輸入時要用一個以上的空格或回車鍵作為每兩個輸入數之間的間隔。如:

7 8 9

7

8

9

格式字符串

格式字符串的一般形式為:

%[輸入數據寬度][長度]類型

其中有方括號[]的項為任選項。各項的意義如下:

1) 類型:表示輸入數據的類型,其格式符合意義如下表所示。



2) 寬度:用十進位整數指定輸入的寬度(即字符數)。例如:

scanf("%5d", &a); 輸入:12345678

只把 12345 賦予變量 a,其餘部分被截去。又如:

scanf("%4d%4d", &a, &b); 輸入:12345678

將把 1234 賦予 a,而把 5678 賦予 b。

3) 長度:長度格式符為 l 和 h,l 表示輸入長整型數據(如%ld) 和雙精度浮點數(如%lf)。h 表示輸入短整型數據。

使用 scanf 函數還必須注意以下幾點

1) scanf 函數中沒有精度控制,如:scanf("%5.2f",&a);是非法的。不能企圖用此語句輸入小數為 2 位的實數。

2) scanf 中要求給出變量地址,如給出變量名則會出錯。如 scanf("%d",a);是非法的, 應改為 scnaf("%d",&a);才是合法的。

3) 在輸入多個數值數據時,若格式控制串中沒有非格式字符作輸入數據之間的間隔則 可用空格,TAB 或回車作間隔。C 編譯在碰到空格,TAB,回車或非法數據(如對"%d" 輸入"12A"時,A 即為非法數據)時即認為該數據結束。

4) 在輸入字符數據時,若格式控制串中無非格式字符,則認為所有輸入的字符均為有 效字符。

例如:

scanf("%c%c%c", &a, &b, &c); 輸入為:

d e f

則把'd'賦予 a, ' ' 賦予 b,'e'賦予 c。只有當輸入為:

def

時,才能把'd'賦於 a,'e'賦予 b,'f'賦予 c。如果在格式控制中加入空格作為間隔,

如:

scanf ("%c %c %c",&a,&b,&c); 則輸入時各數據之間可加空格。

【例 4.8】



由於 scanf 函數"%c%c"中沒有空格,輸入 M N,結果輸出只有 M。而輸入改為 MN 時則可輸出 MN 兩字符。

【例 4.9】


本例表示 scanf 格式控制串"%c %c"之間有空格時,輸入的數據之間可以有空格間隔。

5) 如果格式控制串中有非格式字符則輸入時也要輸入該非格式字符。 例如:

scanf("%d, %d, %d", &a, &b, &c);

其中用非格式符" , "作間隔符,故輸入時應為: 5, 6, 7

又如:

scanf("a=%d, b=%d, c=%d", &a, &b, &c); 則輸入應為:

a=5, b=6, c=7

6) 如輸入的數據與輸出的類型不一致時,雖然編譯能夠通過,但結果將不正確。

【例 4.10】


由於輸入數據類型為整型,而輸出語句的格式串中說明為長整型,因此輸出結果和輸入 數據不符。如改動程序如下:

【例 4.11】



運行結果為:

input a long integer 1234567890

1234567890

當輸入數據改為長整型後,輸入輸出數據相等。

【例 4.12】


輸入三個小寫字母,輸出其 ASCII 碼和對應的大寫字母。

【例 4.13】


輸出各種數據類型的字節長度。

4.5 程序舉例

【例 4.14】輸入三角形的三邊長,求三角形面積。

已知三角形的三邊長 a,b,c,則該三角形的面積公式為:

源程序如下:

源程序如下:

4.6 本章小結

1. 賦值語句是由賦值表達式再加上分號構成的表達式語句

2. 格式化輸入輸出參看 4.4 節

關鍵字: