C語言程序設(shè)計(jì)教程(第二版)c第2章_第1頁
C語言程序設(shè)計(jì)教程(第二版)c第2章_第2頁
C語言程序設(shè)計(jì)教程(第二版)c第2章_第3頁
C語言程序設(shè)計(jì)教程(第二版)c第2章_第4頁
C語言程序設(shè)計(jì)教程(第二版)c第2章_第5頁
已閱讀5頁,還剩45頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

《C語言程序設(shè)計(jì)教程》

(第二版)Lizq98@李志球、劉昊編著第2章

順序結(jié)構(gòu)程序設(shè)計(jì)

了解C語言基本語句的使用方法◆

掌握賦值語句的使用方法◆

掌握數(shù)據(jù)輸出函數(shù)的調(diào)用規(guī)則、格式說明字符的意義◆

掌握數(shù)據(jù)輸入函數(shù)的調(diào)用規(guī)則和地址運(yùn)算符的使用◆

掌握順序結(jié)構(gòu)程序設(shè)計(jì)方法◆

掌握goto語句的作用和使用方法◆

掌握程序中語義錯(cuò)誤和邏輯錯(cuò)誤的調(diào)試方法《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@第2章

順序結(jié)構(gòu)程序設(shè)計(jì)

目錄

2.1C基本語句簡介

2.2數(shù)據(jù)輸出函數(shù)

2.3數(shù)據(jù)輸入函數(shù)

2.4順序結(jié)構(gòu)程序設(shè)計(jì)舉例

2.5語句標(biāo)號與goto語句

2.6程序調(diào)試方法

小結(jié)

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.1C基本語句簡介

2.1.1基本語句

C語言語句都以分號“;”為語句結(jié)束標(biāo)志,有一個(gè)分號就代表一個(gè)語句的結(jié)束。1.說明語句說明語句用于說明變量的類型、存儲類別或函數(shù)的類型等。例如:

floata,b,c[10];/*

變量說明語句

*/

intarea(a,b);/*函數(shù)說明語句*/C語言中的說明語句應(yīng)該出現(xiàn)在程序可操作語句的前面。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.1C基本語句簡介

2.1.1基本語句

2.表達(dá)式語句表達(dá)式語句由一個(gè)表達(dá)式加一個(gè)分號構(gòu)成。

a=6,b=8,c=10;

i++;

y=a+b*c/d;

y*=12+x;《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.1C基本語句簡介

2.1.1基本語句

3.復(fù)合語句

1)復(fù)合語句

在程序中將若干語句用一對花括號“{}”括起來構(gòu)成的語句稱為復(fù)合語句。如:{s=3.14159*r*r;v=s*h;

printf("%f",v);}

復(fù)合語句在語法上它被認(rèn)為是一條語句,復(fù)合語句中語句數(shù)量不限,而且最后一個(gè)語句的分號也不能省略。

3.復(fù)合語句2)分程序復(fù)合語句中有了說明語句就是分程序。如:{intr;floats,h,v;s=3.14159*r*r;v=s*h;

printf("%f",v);}

復(fù)合語句還可以嵌套,即在復(fù)合語句中可以包含其它的復(fù)合語句。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.1C基本語句簡介

2.1.1基本語句

4.空語句只有一個(gè)分號構(gòu)成的語句稱為空語句,空語句在語法上它占據(jù)一個(gè)語句的位置,執(zhí)行時(shí)不做任何操作。一個(gè)空語句可用于表示程序的轉(zhuǎn)折點(diǎn)或以后在這個(gè)位置加上新的語句或表示什么也不操作。

5.返回語句return

返回語句“return”用在被調(diào)用函數(shù)中,執(zhí)行到該語句時(shí),就將控制返回到調(diào)用函數(shù)中,如例1.6中返回到主函數(shù)main()中。有如下兩種格式:

(1)return;

(2)return<表達(dá)式>;《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.1C基本語句簡介

2.1.2賦值語句

在賦值表達(dá)式的后面加上一個(gè)分號,就構(gòu)成了賦值語句。例如;

a=b+3

是賦值表達(dá)式,而

a=b+3;

則是賦值語句。賦值表達(dá)式和賦值語句是兩個(gè)不同的概念。

賦值語句可以由形式多樣的賦值表達(dá)式構(gòu)成,使用相當(dāng)靈活。如“i=1,j=2;”就是合法的賦值語句,應(yīng)該掌握好賦值表達(dá)式的運(yùn)算規(guī)律才能寫出正確的賦值語句。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.1C基本語句簡介

2.1.3注釋

注釋不是C語言語句,但它們經(jīng)常使用。注釋可以用于說明變量的含義、程序段的功能、程序較難讀懂等地方,幫助用戶閱讀程序。注釋應(yīng)簡明扼要,除了最簡單和最直觀的函數(shù)外,都應(yīng)有注釋。例如在函數(shù)開始處說明其功能,如何調(diào)用及返回值的類型等。例如:

for(i=0;i<=1000;i++);

/*空循環(huán),用于延時(shí)*/說明:(1)注釋都由“/*”開始,以“*/”結(jié)束。在星號及斜杠之間不允許有空格。編譯程序遇到注釋會忽略注釋中所有文本內(nèi)容。(2)注釋可出現(xiàn)在程序的任何位置,但它不能出現(xiàn)在關(guān)鍵字或標(biāo)識符中間,也最好不在表達(dá)式的中間出現(xiàn)。(3)注釋不可嵌套。(4)VC編譯系統(tǒng)中注釋除了上述形式外,還可以使用雙斜杠“//”開頭,而且不需要成對出現(xiàn)。例如:

//這是一個(gè)VC下的程序《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.1C基本語句簡介

2.1.4文件包含命令

C語言編譯系統(tǒng)都標(biāo)準(zhǔn)函數(shù)庫,里面有相當(dāng)完整的函數(shù)供用戶使用,例如常用的數(shù)學(xué)函數(shù)。要使用這些函數(shù),可在程序的開頭用文件包含“#include”命令,將這些函數(shù)包含到程序中。例如:#include<stdio.h>#include"math.h"

用戶也可以編制一些功能模塊存放在指定的目錄中,使用時(shí)也是通過文件包含命令的方法實(shí)現(xiàn)。文件包含命令不是C語言語句,它必須用"#"號開頭,命令最后后面不能加";"號。1.文件包含命令格式格式1:#include<文件名>格式2:#include“文件名”2.說明(1)<文件名>是被包含的文件全名,必要時(shí)需要指定文件所在的路徑名。(2)兩種格式的區(qū)別如下:使用尖括號方式用于直接到指定的默認(rèn)目錄中查找并包含該文件。而使用雙撇號格式,系統(tǒng)先到當(dāng)前工作目錄和相關(guān)的可搜索目錄中查找,如果找不到再到存放頭文件的默認(rèn)目錄中查找,找到后將其包含。

(3)使用文件包含命令可使C語言程序書寫簡練,可讀性強(qiáng)。(4)一個(gè)程序可包含多個(gè)文件包含命令。(5)文件包含可以嵌套,也就是說在被包含的文件中還可以出現(xiàn)文件包含命令。(6)文件包含命令通常放在程序的首部,以保證使用正常。(7)被包含的文件通常后綴為“.h”的頭文件。但也可以是其他的源文件,例如,后綴為“.C”的文件等。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.2數(shù)據(jù)輸出函數(shù)

2.2.1printf函數(shù)(格式輸出函數(shù))

1.printf函數(shù)調(diào)用格式

printf("格式控制",輸出項(xiàng)表);

例如:

printf("x=%d,y=%d",x,y);

2.功能

按格式控制字符串指定的格式,將輸出項(xiàng)表中的內(nèi)容輸出到終端設(shè)備上。

3.說明(1)格式控制是用雙引號括起來的字符串,也稱轉(zhuǎn)換控制字符串,它包括格式說明和普通字符兩種。格式說明由“%”開頭后跟格式字符,如%d、%f等,作用是將后面輸出項(xiàng)表中對應(yīng)的輸出數(shù)據(jù)按此格式輸出。普通字符不用“%”開頭,輸出時(shí)原樣輸出,它可以作為提示信息,使輸出的數(shù)據(jù)意義更明確。如"x=、y="等。(2)輸出項(xiàng)表中各輸出項(xiàng)之間用逗號分隔,輸出項(xiàng)可以是常量、變量和表達(dá)式。輸出項(xiàng)個(gè)數(shù)要和格式說明的個(gè)數(shù)相同,且數(shù)據(jù)類型要對應(yīng)一致,否則會導(dǎo)致數(shù)據(jù)輸出不正確,而且編譯系統(tǒng)也不顯示出錯(cuò)信息。(3)格式說明字符及含義如表2.1所示,最常用的為前四個(gè)d、f、c和s。有一些系統(tǒng)要求格式字符只能為小寫字母,因此書寫程序時(shí)使用小寫字母,使程序具有通用性。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.2數(shù)據(jù)輸出函數(shù)

2.2.1printf函數(shù)(格式輸出函數(shù))

格式符含義%d輸出帶符號的十進(jìn)制整數(shù)%f以小數(shù)形式輸出實(shí)數(shù)。小數(shù)位數(shù)由精度說明指定,默認(rèn)值為6%c輸出單個(gè)字符%s輸出字符串中的字符,直至遇到“\0”,或輸出指定的字符數(shù)%o以無符號八進(jìn)制形式輸出整數(shù)(不輸出前導(dǎo)0)%x或%X以無符號十六進(jìn)制形式輸出整數(shù)(不輸出前導(dǎo)0x或0X)%u以無符號十進(jìn)制形式輸出整數(shù)%e或%E以指數(shù)形式輸出單、雙精度實(shí)數(shù)。小數(shù)位數(shù)由精度說明指定%g或%G自動(dòng)選用%f或%e格式中輸出寬度較短的一種,不輸出無意義的0%p輸出變量的內(nèi)存地址%%輸出一個(gè)%《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.2數(shù)據(jù)輸出函數(shù)

2.2.1printf函數(shù)(格式輸出函數(shù))

(4)格式說明中在%和格式字符中間還可以使用格式修飾符

格式修飾符含義%m.n以小數(shù)形式輸出實(shí)數(shù),m為輸出總寬度,n為小數(shù)位數(shù)字母l或L(%l或%L)用于整型(d、o、x、u)時(shí),輸出長整型數(shù)據(jù);用于實(shí)型(f)時(shí),輸出雙精度型數(shù)據(jù)m(正整數(shù))(%m)設(shè)定數(shù)據(jù)輸出最小寬度,當(dāng)實(shí)際數(shù)據(jù)寬度超過m時(shí),則按實(shí)際寬度輸出,如實(shí)際寬度短于m,則輸出時(shí)前面補(bǔ)0或空格n(正整數(shù))(%n)對于實(shí)數(shù),表示輸出n位小數(shù);對字符串,表示從左截取的字符個(gè)數(shù)-(%-)輸出的字符或數(shù)字在規(guī)定的域?qū)拑?nèi)向左對齊。缺省為右對齊+(%+)輸出的數(shù)字前帶有正負(fù)號0(%0)數(shù)據(jù)前的多余空格處補(bǔ)前導(dǎo)0#(%#)用于格式字符o或x前,使輸出八進(jìn)制或十六進(jìn)制數(shù)時(shí)輸出O或Ox《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.2數(shù)據(jù)輸出函數(shù)

2.2.1printf函數(shù)(格式輸出函數(shù))

【例2.1】產(chǎn)生兩個(gè)隨機(jī)數(shù),求它們的和、差、乘積。

隨機(jī)數(shù)產(chǎn)生函數(shù)rand()可以產(chǎn)生“0~32767”之間的隨機(jī)整數(shù),random(intnumber)函數(shù)產(chǎn)生“0~number-1”之間的隨機(jī)整數(shù)。程序如下:

#include"stdlib.h"

main()

{inta,b,c,d;

longe;

a=random(100);

b=random(100);

c=a+b;

d=a-b;

e=a*b;

printf("c=%d,d=%d,e=%ld,\n",c,d,e);

}《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.2數(shù)據(jù)輸出函數(shù)

2.2.1printf函數(shù)(格式輸出函數(shù))

【例2.2】輸出整數(shù)和字符。

main()

{inta=65,x=5678;longy=42789;

charb=’A’;

printf("%d,%o,%x,%u\n",x,x,x,x);

printf("%c,%d,%c,%d\n",a,a,b,b);

printf("x=%8d,y=%ld\n",x,y);

}程序運(yùn)行結(jié)果如下:5678,13056,162e,5678A,65,A,65x=5678,y=42768

編程時(shí)要注意,當(dāng)一個(gè)數(shù)據(jù)超過-32768~

32767時(shí),應(yīng)該按“%ld”格式輸出,如果還是采用“%d”格式,輸出結(jié)果不正確。例如:

main()

{inta=32767,b=32768

printf("a=%d,b=%d\n",a,b);

}

程序運(yùn)行結(jié)果將是:

a=32767,b=-32768

變量b超過int型數(shù)據(jù)范圍,所以結(jié)果不正確。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.2數(shù)據(jù)輸出函數(shù)

2.2.1printf函數(shù)(格式輸出函數(shù))

【例2.3】以小數(shù)和指數(shù)形式輸出實(shí)數(shù)。

main()

{floata=111111.111,b=333333.333,c;

c=a+b;

printf("C=%f\n",c);

printf("C=%10.3f\n",c);

printf("C=%e\n",c);

printf("C=%.3e\n",c);

}程序運(yùn)行結(jié)果如下:C=444444.437500C=444444.438C=4.44444e+05C=4.44e+05

“%.3e”說明小數(shù)位數(shù)(包括小數(shù)點(diǎn))共3位。當(dāng)單精度數(shù)不指定寬度時(shí),輸出時(shí)整數(shù)部分全部輸出,而小數(shù)部分輸出6位?!禖語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.2數(shù)據(jù)輸出函數(shù)

2.2.1printf函數(shù)(格式輸出函數(shù))

【例2.4】字符串的輸出。

main()

{printf("%3s\n","student");

printf("%8.3s\n","student");

printf("%.4s\n","student");

printf("%-8.3s\n","student");

}程序運(yùn)行結(jié)果如下:student

stustudstu格式說明中,“%.4”只指定了n,但沒指定m,系統(tǒng)自動(dòng)使m=n=4,因此,輸出時(shí)只占4列。《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.2數(shù)據(jù)輸出函數(shù)

2.2.1printf函數(shù)(格式輸出函數(shù))

【例2.5】

f、g和e格式的比較。

main()

{floata=-123.456789;

printf("用f格式輸出:%f\n",a);

printf("用g格式輸出:%g\n",a);

printf("用e格式輸出:%e\n",a);

printf("用f格式輸出:%10.2f\n",a);

printf("用g格式輸出:%10.2g\n",a);

printf("用e格式輸出:%10.2e\n",a);

}程序運(yùn)行結(jié)果如下:用f格式輸出:-123.456787用g格式輸出:-123.457用e格式輸出:-1.23457e+02用f格式輸出:-123.46用g格式輸出:-120用e格式輸出:-1.2e+02

使用格式“10.2”輸出時(shí)右對齊,而如果采用“-10.2”,則輸出時(shí)左對齊?!禖語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.2數(shù)據(jù)輸出函數(shù)

2.2.2其它輸出函數(shù)

其它的一些輸出函數(shù)包含在“stdio.h”中。因此使用這些函數(shù)前需要使用預(yù)編譯命令“#include”將“stdio.h”文件包含到源程序文件中。即:

#include<stdio.h>1.putchar函數(shù)(字符輸出函數(shù))

putchar函數(shù)是字符輸出函數(shù),其作用是向終端輸出單個(gè)字符。

1)putchar函數(shù)調(diào)用格式

putchar(字符型或整型變量);

2)說明(1)putchar(ch)函數(shù)的作用與printf(“%c”,ch)相同,因此putchar函數(shù)完全可以由printf函數(shù)取代。(2)putchar函數(shù)的參數(shù)如果是整型常量,那么這個(gè)常量作為字符的ASCII代碼,輸出時(shí)是數(shù)據(jù)所對應(yīng)的ASCII字符。函數(shù)參數(shù)需要使用單引號(’)括起來。(3)函數(shù)參數(shù)也可以為控制字符或轉(zhuǎn)義字符。例如需要輸出單引號,應(yīng)使用putchar(’\’’)。

2.puts()函數(shù)(字符串輸出函數(shù))puts()數(shù)用來輸出字符串并換行,調(diào)用格式如下:puts(字符串或一維字符數(shù)組名或字符指針);說明:

puts(p)和printf("%s\n",p)功能一樣,其中p是字符數(shù)組名或字符指針。因此puts函數(shù)也可以由printf函數(shù)取代。

3.printf、putchar和puts的比較

(1)putchar函數(shù)只有一個(gè)參數(shù),這個(gè)參數(shù)是要輸出的字符。

(2)puts函數(shù)也只有一個(gè)參數(shù),這個(gè)參數(shù)是要輸出的字符串。puts函數(shù)輸出字符串后自動(dòng)回車換行。例如,語句“putchar(’A’);”輸出字符A;語句“puts("ABCD");”輸出字符串ABCD后自動(dòng)換行。(3)putchar函數(shù)和puts函數(shù)不能控制字符或字符串的輸出格式,所以當(dāng)不需要控制輸出字符或字符串格式,調(diào)用putchar或puts函數(shù)要比調(diào)用printf函數(shù)簡便得多。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.3數(shù)據(jù)輸入函數(shù)

2.3.1scanf函數(shù)(格式輸入函數(shù))

1.scanf函數(shù)調(diào)用格式

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

例如:

scanf("%d,%d",&x,&y);

其中,變量x、y前的“&”是求地址運(yùn)算符,&x表示取變量x的地址,也就是內(nèi)存中存儲x值的數(shù)據(jù)單元地址。2.功能從鍵盤上輸入數(shù)據(jù),按格式控制所指定的格式(數(shù)據(jù)形式)賦給相應(yīng)的輸入項(xiàng),并存放在地址列表所對應(yīng)變量的地址單元中。

3.說明(1)地址列表由變量地址組成,變量名前必須要加地址符“&”。多個(gè)變量地址之間用逗號“,”分隔。格式個(gè)數(shù)應(yīng)與地址列表中輸入項(xiàng)數(shù)要一一對應(yīng)且數(shù)據(jù)類型匹配。(2)格式控制”%”后的格式符有d、o、x、c、s、e、f等,其含義和輸出函數(shù)printf中的規(guī)定基本類似。(3)格式控制字符串必須用雙引號括起,字符串中含有普通字符時(shí),鍵盤輸入數(shù)據(jù)時(shí),普通字符也必須按原樣輸入。3.說明

(4)輸入數(shù)據(jù)時(shí),當(dāng)遇到空格、回車、跳格鍵(TAB)、數(shù)據(jù)寬度結(jié)束或非法輸入時(shí),C語言系統(tǒng)認(rèn)為其中的一個(gè)數(shù)據(jù)輸入結(jié)束。

(5)格式說明中可以指明數(shù)據(jù)寬度的正整數(shù)、小寫字母1和h等修飾符。在TurboC環(huán)境下輸入長整型數(shù)據(jù)時(shí),必須使用“%ld”,輸入雙精度實(shí)數(shù)時(shí),必須使用“%lf”或“%le”

。

(6)實(shí)型數(shù)據(jù)輸入時(shí)不能指定小數(shù)位寬度。

(7)使用“%c”格式輸入字符時(shí),輸入的空格或轉(zhuǎn)義字符都是有效的字符?!禖語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.3數(shù)據(jù)輸入函數(shù)

2.3.1scanf函數(shù)(格式輸入函數(shù))

【例2.7】輸入立方體的長、寬、高,求立方體的體積。

main(){inta,b,c;

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

printf("%ld",a*b*c);

}程序運(yùn)行結(jié)果如下:102030<CR>6000

或:10<CR>2030<CR>

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.3數(shù)據(jù)輸入函數(shù)2.3.2其他輸入函數(shù)1.getchar函數(shù)(字符輸入函數(shù))

getchar()函數(shù)用來從鍵盤讀入一個(gè)字符。

1)getchar函數(shù)調(diào)用格式

getchar();

2)說明

(1)getchar()函數(shù)只能接收單個(gè)字符。空格和制表符(Tab)等也作為有效字符接收。

(2)getchar函數(shù)沒有參數(shù),函數(shù)的返回值為輸入字符的ASCII碼,因此,getchar函數(shù)得到的字符可以賦給一個(gè)字符變量或整型變量。如:

intc;

c=getchar();1.getchar函數(shù)(字符輸入函數(shù))

2)說明

(3)getchar()接收鍵盤輸入的字符時(shí),屏幕上沒有提示信息,如果需要,可使用printf()函數(shù)配合以顯示提示信息。字符輸入結(jié)束后并不立即響應(yīng),而是按回車鍵后才從緩沖區(qū)中讀入剛輸入的字符。(4)如果輸入時(shí)只鍵入回車鍵,由于它包含兩個(gè)鍵:回車和換行,getchar函數(shù)的返回值為換行符(ASCII值為10),不是回車(ASCII值為13)。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.3數(shù)據(jù)輸入函數(shù)2.3.2其他輸入函數(shù)2.gets函數(shù)

gets函數(shù)用來從鍵盤讀取字符串直到回車結(jié)束,但不接受回車符。

1)gets函數(shù)格式

gets(字符數(shù)組名或字符指針);

2)說明

gets函數(shù)與scanf("%s",p)類似,但又有區(qū)別。用scanf("%s",p)輸入字符串時(shí),遇到空格認(rèn)為是輸入字符串結(jié)束,但gets(p)函數(shù)將接收字符串包括空格,直到回車為止。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.3數(shù)據(jù)輸入函數(shù)2.3.2其他輸入函數(shù)

3.getch函數(shù)和getche函數(shù)兩個(gè)函數(shù)都是從鍵盤讀取一個(gè)字符。

1)getch函數(shù)和getche函數(shù)格式

getch();/*屏幕不回顯*/

getche();

/*從鍵盤讀取一個(gè)字符且顯示在屏幕上*/

2)功能

getch函數(shù)和getche函數(shù)常用于程序運(yùn)行過程中需要暫停的地方,所讀取的字符程序可以去引用,也可以不用。

3.getch函數(shù)和getche函數(shù)

3)說明

(1)getch與getche功能與getchar函數(shù)類似。差別是:首先是getch、getche直接從鍵盤獲取鍵值,無需等待用戶按回車鍵。

(2)當(dāng)鍵盤輸入的只是回車鍵,getch、getche將回車符返回(ASCII碼值13),而不返回?fù)Q行符,而getchar()返回?fù)Q行符(ASCII碼值10)。(3)getch函數(shù)不回顯用戶輸入的字符,這在編寫諸如輸入密碼等程序段時(shí)很有用。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.4順序結(jié)構(gòu)程序設(shè)計(jì)舉例

順序結(jié)構(gòu)程序設(shè)計(jì)較為簡單,它一般由三個(gè)部分組成。

(1)提供數(shù)據(jù)部分

(2)計(jì)算處理部分

(3)輸出結(jié)果部分

提供數(shù)據(jù)部分可以使用表達(dá)式語句或數(shù)據(jù)輸入函數(shù),實(shí)現(xiàn)原始數(shù)據(jù)的輸入。輸出結(jié)果部分主要通過輸出函數(shù)來完成。計(jì)算處理部分是利用C語言提供的各種函數(shù)和運(yùn)算符對數(shù)據(jù)進(jìn)行加工的過程。下面舉例說明順序結(jié)構(gòu)程序設(shè)計(jì)方法?!禖語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.4順序結(jié)構(gòu)程序設(shè)計(jì)舉例【例2.8】鍵盤輸入一個(gè)小寫字母后,輸出其對應(yīng)的大寫字母和ASCII碼值。#include<stdio.h>main(){charc,d;c=getchar();d=c-32;

printf("%5c,%5d",d,d);}程序運(yùn)行結(jié)果如下:b<CR>B,66《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.4順序結(jié)構(gòu)程序設(shè)計(jì)舉例

【例2.9】已知圓柱的半徑和高,求圓柱的體積。#definePI3.14159main(){floatr,h,v;

printf("Pleaseinputr,h:");

scanf("%f,%f",&r,&h);v=PI*r*r*h;

printf("r=%f,h=%f,v=%f\n",r,h,v);}程序運(yùn)行結(jié)果如下:Pleaseinputr,h:3.1,2.5<CR>r=3.100000,h=2.500000,v=75.476692

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.4順序結(jié)構(gòu)程序設(shè)計(jì)舉例

【例2.10】輸入三角形的三條邊長,求三角形的面積,要求輸出時(shí)小數(shù)點(diǎn)后保留三位小數(shù)。#include<math.h>main(){floatx,y,z,p,area;

printf("Pleaseinputx,y,z:");

scanf("%f,%f,%f",&x,&y,&z);p=1.0/2*(x+y+z);area=sqrt(p*(p-x)*(p-y)*(p-z));

printf("area=%7.3f\n",area);}程序運(yùn)行結(jié)果如下:Pleaseinputx,y,z:3.0,4.0,5.0<CR>area=6.000

因?yàn)樾枰褂脭?shù)學(xué)函數(shù)sqrt

,所以需要使用文件包含

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.4順序結(jié)構(gòu)程序設(shè)計(jì)舉例

【例2.11】交換兩個(gè)整型變量的值。

1)數(shù)據(jù)類型定義兩個(gè)變量分別設(shè)為整型變量為a和b。2)算法(1)輸入兩個(gè)整數(shù)a、b;(2)交換a、b的值;(3)輸出交換值后的a、b的值。交換a、b值的方法有好多種,下面介紹較為簡單的兩種:每一種方法使用第三個(gè)變量c(中間變量)暫存其中一個(gè)數(shù)。第二種方法利用其中一個(gè)變量保存兩數(shù)之和,通過減法來實(shí)現(xiàn)。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.4順序結(jié)構(gòu)程序設(shè)計(jì)舉例

【例2.11】交換兩個(gè)整型變量的值。

main(){inta,b,c;

printf("\n輸入變量的值給a和b:");

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

printf("交換后的值:a=%d,b=%d",a,b);

}

程序運(yùn)行結(jié)果如下:輸入變量的值給a和b

:15,28<CR>交換后的值:a=28,b=15

可以改為a=a+b;b=a-b;a=a-b;重要例題思考:程序(1)中兩數(shù)交換時(shí),若將3個(gè)賦值語句的順序調(diào)換一下,例如:“a=b;b=c;c=a;”,程序運(yùn)行結(jié)果會怎樣?

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.4順序結(jié)構(gòu)程序設(shè)計(jì)舉例

【例2.12】雞兔同籠問題,己知雞兔總頭數(shù)為h(heads),總腿數(shù)為f(feet),問雞兔各有多少只?

計(jì)算機(jī)本身不能建立數(shù)學(xué)模型或解方程。因此需要算法分析,并建立相應(yīng)的數(shù)學(xué)模型:

1)設(shè)雞為x只,兔為y只,得方程組:

x+y=h(1)

2*x+4*y=f(2)

求解方程,得x,y的求解公式:

x=(4*h-f)/2

y=(f-2*h)/2

2)數(shù)據(jù)結(jié)構(gòu)分析設(shè)計(jì)

存放頭、腳數(shù)的變量h、f,存放雞、兔數(shù)的變量x、y。頭、腳是整型變量;雞、兔數(shù)在頭、腳數(shù)也應(yīng)是整型,因?yàn)橛谐ㄟ\(yùn)算,為了避免運(yùn)算結(jié)果不正確,所以定義x、y為實(shí)型變量。

3)算法(自然語言)

(1)說明變量x,y,f,h

(2)輸入數(shù)據(jù)h,f

(3)計(jì)算x,y

(4)輸出結(jié)果

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.4順序結(jié)構(gòu)程序設(shè)計(jì)舉例

【例2.12】雞兔同籠問題。

main()

{floatx,y;

intf,h;

printf("請輸入雞兔總頭數(shù)和總腿數(shù):\n");

scanf("%d,%d",&h,&f);x=(4.0*h-f)/2.0;

y=(f-2*h)/2.0;

printf("\n雞的數(shù)量為:%2.0f,兔的數(shù)量為:%2.0f\n",x,y);

}

程序運(yùn)行結(jié)果如下:請輸入雞兔總頭數(shù)和總腿數(shù):20,50<CR>雞的數(shù)量為:15,兔的數(shù)量為:5《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.5語句標(biāo)號和goto語句順序結(jié)構(gòu)程序設(shè)計(jì)并不需要使用goto語句,有了goto語句,就不是順序結(jié)構(gòu)了。本節(jié)提前介紹goto語句,主要是了解利用goto語句實(shí)現(xiàn)程序轉(zhuǎn)向的方法,并介紹兩個(gè)利用goto語句實(shí)現(xiàn)無窮循環(huán)的例子,初步了解簡單的循環(huán)結(jié)構(gòu)。當(dāng)程序執(zhí)行到goto語句時(shí),控制立即無條件轉(zhuǎn)移到程序的相應(yīng)地方,從而改變了程序的執(zhí)行順序。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.5語句標(biāo)號和goto語句

1.語句標(biāo)號

C語言中,任何語句都可以帶有標(biāo)號,標(biāo)號一般作為無條件轉(zhuǎn)向語句goto的目標(biāo)。標(biāo)號是由任意合法的標(biāo)識符加上冒號組成,在程序中標(biāo)號可以和變量同名。如“end:”、“l(fā)oop:”、“abc:”、“a1:”等,語句標(biāo)號不能用數(shù)字開頭,如“10:”、“20:”等是錯(cuò)誤的標(biāo)號。2.goto語句(無條件轉(zhuǎn)向語句)

1)goto語句的格式

goto語句標(biāo)號;

例如:

gotoend;

end:printf("程序結(jié)束\n");

2.goto語句(無條件轉(zhuǎn)向語句)

2)功能當(dāng)程序執(zhí)行到goto語句時(shí),控制就無條件地轉(zhuǎn)到語句標(biāo)號所在位置繼續(xù)執(zhí)行程序。3)說明(1)goto語句和其所轉(zhuǎn)向的語句標(biāo)號必須在同一個(gè)函數(shù)體中。即goto語句限制轉(zhuǎn)向范圍,它只允許在函數(shù)體內(nèi)進(jìn)行。(2)在結(jié)構(gòu)化程序設(shè)計(jì)時(shí),要求盡量少用或不使用goto語句,因?yàn)間oto語句使程序流程毫無規(guī)律,程序可讀性也差。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.5語句標(biāo)號和goto語句

【例2.13】計(jì)算多個(gè)圓的圓面積,每個(gè)圓的半徑從鍵盤輸入。

#definePI3.14159/*宏定義*/

main()

{floatr;

loop:

scanf("%f",&r);

printf("半徑為:%f,面積為:%f\n",r,PI*r*r);

gotoloop;

}

本例是一個(gè)無窮循環(huán),要結(jié)束程序的運(yùn)行通過強(qiáng)制中斷(按Ctrl-C或連續(xù)按兩次Ctrl-Break)。一般,goto語句需要和下一章if語句配合,來構(gòu)成循環(huán)結(jié)構(gòu)。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.5語句標(biāo)號和goto語句

【例2.14】學(xué)生某門課程的綜合成績計(jì)算方法是:平時(shí)成績占30%,期末考試成績占70%,編程逐個(gè)計(jì)算全班所有同學(xué)該門課程的綜合成績。

main()

{

floatx,y;

loop:

printf("請輸入學(xué)生平時(shí)和期末考試成績:");

scanf("%f,%f",&x,&y);

printf("綜合成績?yōu)椋?7.1f\n",x*0.3+y*0.7);

gotoloop;

}

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.5語句標(biāo)號和goto語句

3.goto語句使用場合

goto語句可以用于以下幾個(gè)場合:

(1)根據(jù)需要改變程序的流向。但這會使程序流程毫無規(guī)律,不符合結(jié)構(gòu)化程序設(shè)計(jì)要求。

(2)重復(fù)執(zhí)行重復(fù)次數(shù)不確定的某個(gè)程序段。這種結(jié)構(gòu)只有通過強(qiáng)制中斷(按Ctrl-C或連續(xù)按兩次Ctrl-Break)才能結(jié)束程序運(yùn)行。

(3)goto語句和if語句(下一章介紹)配合,來構(gòu)成循環(huán)結(jié)構(gòu)。

(4)goto語句常用于從循環(huán)體中跳到循環(huán)體外或結(jié)束本次循環(huán)(但可以用break和continue語句實(shí)現(xiàn))。因此,結(jié)構(gòu)化程序設(shè)計(jì)要求少用或盡量不用goto語句。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.6程序調(diào)試方法

源程序中難免會存在一些錯(cuò)誤,發(fā)現(xiàn)和修改程序中的錯(cuò)誤并得到正確運(yùn)行結(jié)果的過程稱為調(diào)試。第1章介紹的排除編譯和連接錯(cuò)誤的程序調(diào)試方法只能發(fā)現(xiàn)一些諸如變量沒定義、語句缺少分號、括號不配對、命令關(guān)鍵字錯(cuò)誤等一些語法錯(cuò)誤。

語義錯(cuò)誤是指語句雖然合法,但計(jì)算結(jié)果不可預(yù)知。例如除法運(yùn)算中除數(shù)為0、運(yùn)算結(jié)果超過變量定義的數(shù)值范圍(如整型為-32768~32767)等。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.6程序調(diào)試方法

存在邏輯錯(cuò)誤的程序雖然可以運(yùn)行并能得到運(yùn)行結(jié)果,但運(yùn)行結(jié)果不一定正確。如“1/2”和“1/2.0”,因?yàn)閿?shù)據(jù)類型不同造成運(yùn)算結(jié)果一個(gè)為“0”一個(gè)為“0.5”;又如乘法運(yùn)算“t=t*i”,t的初值應(yīng)該為1但如果賦初值為0,那變量的結(jié)果還是為0。

對于程序中的語義錯(cuò)誤或邏輯錯(cuò)誤,可以通過程序調(diào)試方法發(fā)現(xiàn)并修改。TC集成環(huán)境下可以有單步執(zhí)行、設(shè)置斷點(diǎn)、觀察程序運(yùn)行過程中表達(dá)式值等調(diào)試方法?!禖語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.6程序調(diào)試方法2.6.1單步執(zhí)行

1.進(jìn)入單步執(zhí)行

單步執(zhí)行就是逐行執(zhí)行語句,TC中操作方法是通過選擇“Run”菜單命令下的“Traceinto”(功能鍵【F7】)或“Stepover”(功能鍵【F8】)執(zhí)行程序。在源程序沒有語法錯(cuò)誤的情況下,按下【F7】或【F8】鍵,程序中main()處就用亮條顯示,表明程序從這里開始執(zhí)行,以后每按一次【F7】鍵就執(zhí)行一行程序。這時(shí)用戶可對程序執(zhí)行過程進(jìn)行跟蹤,并檢查有關(guān)變量或表達(dá)式值的變化情況,以便發(fā)現(xiàn)問題所在。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.6程序調(diào)試方法2.6.1單步執(zhí)行

2.單步執(zhí)行程序調(diào)試方法舉例

【例2.15】編寫程序,分別計(jì)算t=1×2×3×4×5,s=1+1/2+1/3+1/4+1/5的值。

main()

{intt=0,s=0,i=0;

loop:

i=i+1;

t=t*i;

s=s+1/i;

if(i<5)gotoloop;

printf("t=%d,s=%d\n",t,s);

}

if語句表示根據(jù)條件判斷判定程序的流向。當(dāng)“i<5”時(shí)控制轉(zhuǎn)向語句標(biāo)號“l(fā)oop:”處,當(dāng)“i≥5”時(shí)結(jié)束循環(huán),執(zhí)行if的下一個(gè)語句。程序運(yùn)行結(jié)果:t=0,s=1結(jié)果顯然錯(cuò)誤《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.6程序調(diào)試方法2.6.1單步執(zhí)行

1)單步執(zhí)行程序按【F7】鍵,編輯窗口中main()行高亮度顯示,同時(shí)觀察(Watch)窗口即取代消息(Message)窗口。觀察窗口提供了程序運(yùn)行過程中跟蹤一些重要變量和表達(dá)式值變化情況的手段。

2)觀察變量值變化按“Ctrl-F7”,在編輯窗口中出現(xiàn)一個(gè)觀察變量的輸入框,在此輸入想要觀察的變量名,例如在框內(nèi)輸入變量“t”后按回車鍵,該輸入框消失,在Watch窗口顯示變量t。反復(fù)使用“Ctrl-F7”添加多個(gè)變量到Watch窗口,例如變量“s”、“i”等,觀察變量值情況。由于這些變量尚未賦值,在Watch窗口各變量的值為“undefinedsymbol”(符號未定義)。

2)觀察變量值變化變量定義后,如果變量有初值或默認(rèn)值,則該變量就有有效值,否則該變量一開始所擁有的值為無意義的值。例如:當(dāng)單步執(zhí)行到變量定義語句“intt=0,s=0,i=0;”前時(shí),觀察窗口中變量的值可能會顯示如下:s:1809648012t:-2228224i:1735000570

所以程序剛開始運(yùn)行時(shí)部分變量雖然已有值,但這些數(shù)據(jù)顯然不符合實(shí)際。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.6程序調(diào)試方法2.6.1單步執(zhí)行

接著每按一次【F7】鍵,程序就執(zhí)行一行語句,亮條也相應(yīng)往下移動(dòng)一行。當(dāng)移動(dòng)到語句“i=i+1;”時(shí),Watch窗口中顯示各變量初值,分別為“i=0,s=0,t=0”。繼續(xù)按【F7】鍵執(zhí)行程序,同時(shí)觀察Watch窗口中各變量值的變化情況。循環(huán)3次后,變量值為“i=3,s=1,t=0”。

3)修改程序這時(shí)就可以發(fā)現(xiàn)問題所在,不管程序怎么循環(huán),t的值始終為0,s也一直為1。仔細(xì)分析程序,變量t賦初值為0錯(cuò)誤,應(yīng)該為1;而表達(dá)式“s=s+1/i”為整型運(yùn)算,除了1/1結(jié)果為1外,1/2、1/3等結(jié)果都為整數(shù)0,所以s值一直為1,應(yīng)該將變量s的類型改為float型。

《C語言程序設(shè)計(jì)教程》(第二版)Lizq98@2.6程序調(diào)試方法2.6.1單步執(zhí)行

程序修改如下:

main()

{

intt=1,i=0;

floats=0;

loop:

i=i+1;

t=t*i;

s=s+1.0/i;

if(i<5)gotoloop;

printf("t=%d,s=%d\n",t,s);

}

程序運(yùn)行結(jié)果:

t=120,s=0

結(jié)果還是錯(cuò)誤再次按【F7】鍵重新開始單步執(zhí)行程序,程序運(yùn)行結(jié)束后發(fā)現(xiàn)變量i=5、t=120都正常,而s=2.283334結(jié)果也對,但輸出卻為0。這是因?yàn)椤皃rintf(”t=%d,s=%d\n“,t,s);”中變量s的輸出格式說明不正確,應(yīng)該將“%d”改為“%f”。printf("t=%d,s=%f\n",t,s);重新運(yùn)行程序,結(jié)果為:t=120,s=2.283334

單步執(zhí)行程序?qū)τ诎l(fā)現(xiàn)諸如除法運(yùn)算中除數(shù)值為0、運(yùn)算結(jié)果超過數(shù)值范圍等錯(cuò)誤很有效。例如要計(jì)算“t=1×2×……×15”,通過單步執(zhí)行程序,觀察變量值變化就會發(fā)現(xiàn),計(jì)算進(jìn)行到×8后t的值已為“-25216”,數(shù)據(jù)值已超出整型數(shù)所表示的范圍,因此需要將變量改為長整型。而13!=6227020800,又超出長整型的數(shù)據(jù)范圍(-2,147,483,648~2,147,483,647),所以需要將變量定義為實(shí)型數(shù)據(jù)才行,這些問題都可以通過單步執(zhí)行程序調(diào)試方法,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論