C語言程序設(shè)計03_第1頁
C語言程序設(shè)計03_第2頁
C語言程序設(shè)計03_第3頁
C語言程序設(shè)計03_第4頁
C語言程序設(shè)計03_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C語言程序設(shè)計第3章程序控制結(jié)構(gòu)第3章程序控制結(jié)構(gòu)本章主要內(nèi)容:C語言語句關(guān)系運算和邏輯運算順序結(jié)構(gòu)程序設(shè)計選擇結(jié)構(gòu)程序設(shè)計循環(huán)結(jié)構(gòu)程序設(shè)計

一定要掌握C語言的基本語句,如賦值語句,函數(shù)調(diào)用語句,分支語句和循環(huán)語句,并能靈活使用這些語句設(shè)計各種結(jié)構(gòu)的程序。

第3章程序控制結(jié)構(gòu)實際問題的求解算法往往是復(fù)雜的,包括順序的計算步驟,以及許多不同計算路徑和一些重復(fù)的計算過程。這些計算路徑的選擇和計算過程的重復(fù),需要某些條件的判斷,因此,算法的流程是重要的。算法即問題的求解過程,最終要用計算機程序語言(如C語言)的程序來描述,也可以說需要用程序語言的語句實現(xiàn)。編寫程序的過程中,算法的流程控制映射為程序的控制結(jié)構(gòu)。在C語言中,程序的控制結(jié)構(gòu)分為順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu),任何復(fù)雜的程序都是由這三種基本結(jié)構(gòu)組成的。通過本章的學習,理解并掌握C語言中的語句類型和實現(xiàn)三種結(jié)構(gòu)程序的語句的使用方法。3.1C語言語句

C語言語句可以看作計算機系統(tǒng)的操作指令,用來完成一定的操作任務(wù)。C語言語句可以分為以下5種類型。

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

表達式;例如:

x=y+z; /*賦值表達式加分號,賦值語句*/a=520; /*賦值表達式加分號,賦值語句*/

y+z; /*合法語句,但無實際意義*/

i++;++i; /*增1語句,i值增1*/

分號是C語言中語句的標志,一個語句必須以分號結(jié)束,沒有分號,則不是語句。3.1C語言語句

2.函數(shù)調(diào)用語句由函數(shù)調(diào)用加上分號“;”組成。其一般形式為:

函數(shù)名(參數(shù)列表);

例如:

printf("\n");

調(diào)用庫函數(shù)printf(),輸出換行字符。

3.控制語句

C語言有9個控制語句,用于完成選擇、重復(fù)和跳轉(zhuǎn)操作等控制功能,以實現(xiàn)程序的各種控制結(jié)構(gòu)??煞譃槿悾孩欧种дZ句:if、switch語句。⑵循環(huán)語句:for、while、do-while語句。⑶跳轉(zhuǎn)語句:break、continue、goto、return語句。3.1C語言語句

4.復(fù)合語句復(fù)合語句是用花括號將若干語句組合在一起,又稱為分程序,邏輯上是一條語句。復(fù)合語句的一般形式:

{語句1;語句2;…;語句n}

例如:

{ i++;

printf("%d\n",i);}5.空語句只有一個分號的語句稱為空語句。它的一般形式是:

;空語句是什么也不做的語句。

if、while、for和do-while控制的語句只能是一條且必須有一條,所以這些語句的內(nèi)嵌語句一般是復(fù)合語句或空語句。

3.2順序結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)程序相對比較簡單。這種程序中主要使用賦值語句及數(shù)據(jù)的輸入和輸出語句(函數(shù))。程序運行時,依書寫順序,每條語句執(zhí)行一次。本節(jié)主要介紹賦值語句數(shù)據(jù)輸出函數(shù)數(shù)據(jù)輸入函數(shù)

3.2.1賦值語句賦值語句是一個應(yīng)用十分普遍且簡單的語句。賦值語句的一般形式為:。

賦值表達式;賦值語句是一種表達式語句,在賦值表達式的后面加上一個分號,就構(gòu)成了賦值語句。例如: c=a+b*8 i++ j+=5是賦值表達式,而

c=a+b*8; i++; j+=5;是賦值語句。3.2.2數(shù)據(jù)輸出

一個完整的程序,通常要求具備輸入和輸出功能。數(shù)據(jù)離開主機稱為“輸出”,數(shù)據(jù)進入主機稱為“輸入”。如下圖所示:C語言本身沒有輸入輸出語句,輸入輸出操作是通過調(diào)用庫函數(shù)來實現(xiàn)的。在C標準函數(shù)庫中提供了這些函數(shù),如scanf和printf函數(shù)等。使用輸入/輸出函數(shù)時,應(yīng)在程序的開頭寫上命令:#include<stdio.h>1.字符輸出函數(shù)(putchar函數(shù))字符輸出函數(shù)的一般形式為:

putchar(字符型或整型數(shù)據(jù))主機CPU內(nèi)存外設(shè):如顯示器、打印機、鍵盤、掃描儀、磁盤輸出輸入3.2.2數(shù)據(jù)輸出

putchar()函數(shù)的功能是向終端(顯示器)輸出一個字符。其中,函數(shù)的參數(shù)(圓括號中的數(shù)據(jù))可以是字符常量、變量或表達式,也可以是轉(zhuǎn)義字符,還可以是整數(shù)。請看下面的程序:【例3-1】在屏幕上輸出“BOY”。(演示)

#include<stdio.h>voidmain(){ chara,b,c;

a='B';b='O';c='Y';

putchar(a);putchar(b);putchar(c);}程序運行結(jié)果:BOY3.2.2數(shù)據(jù)輸出【例3-2】輸出換行字符。

(演示)

#include<stdio.h>voidmain(){ chara,b,c; a='B’;b='O’;c='Y’;;

putchar(a);putchar('\n');

putchar(b);putchar('\n');

putchar(c);putchar('\n');}程序運行結(jié)果:BOY3.2.2數(shù)據(jù)輸出2.格式輸出函數(shù)(printf函數(shù))printf函數(shù)可以輸出多個任意類型的數(shù)據(jù)。它的功能是在終端設(shè)備上按指定的格式輸出數(shù)據(jù)。printf函數(shù)的一般形式為:

printf(格式控制串,輸出項表)例如:printf(“x=%d,y=%d\n"

,x,y)①格式控制串通常由格式說明和普通字符兩種內(nèi)容。格式說明由“%”和格式字符組成,如%d、%f等,它指定所在位置輸出數(shù)據(jù)的格式,實際輸出的數(shù)據(jù)在輸出項中給出。普通字符是希望原樣輸出的字符,其作用是說明、標注,使輸出數(shù)據(jù)的意義更明確。如x=、y=、換行字符\n等。②輸出項表是用逗號分隔開的若干個表達式(當然,也可以是常量或變量),表達式的值將在對應(yīng)的格式說明處輸出,表達式的類型應(yīng)與格式說明要求的數(shù)據(jù)類型對應(yīng)一致。請看下面的程序格式控制串輸出項表3.2.2數(shù)據(jù)輸出#include<stdio.h>voidmain(){

inta=123,b=456,c;/*定義整型變量a,b,c并初始化a,b*/

c=a;a=b;b=c;

/*將變量a和b的值交換*/

printf("a=%d,b=%d\n",a,b);}程序的輸出結(jié)果是:a=456,b=123分析:printf()函數(shù)中的格式控制串是:"a=%d,b=%d\n",其含義是先輸出“a=”,然后在第一個格式說明“%d”處按十進制整數(shù)格式輸出第一個表達式的值,再輸出“,b=”后,在第二個格式說明“%d”處按十進制整數(shù)格式輸出第二個表達式的值,最后輸出換行字符“\n”。格式說明與表達式的對應(yīng)關(guān)系如下圖所示:

printf("a=%d,b=%d\n",a,b);3.2.2數(shù)據(jù)輸出③格式說明及其作用如下表所示:3.2.2數(shù)據(jù)輸出④格式說明中還可以使用格式修飾符,其一般形式為:

“%m.n格式字符”如:printf("x=%5d,y=%7.2f",x,y);格式修飾符及其作用如下表所示:例3-3分析下面程序的輸出3.2.2數(shù)據(jù)輸出#include<stdio.h>voidmain(){inti=-1;longl=-1;unsignedu=65535;floatf=123.456;charc='a';

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

printf("l=%ld,l=%lo,l=%lx,l=%lu\n",l,l,l,l);

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

printf("f=%f,f=%7.2f,f=%-7.2f\nf=%e,f=%g\n",f,f,f,f,f);

printf("c=%c,c=%3c,c=%-3c\n",c,c,c);

printf("s=%s,s=%7.3s,s=,%-.3s\n","12345","12345","12345");

printf("x=%d,y=%c\n",'a',65);}3.2.3數(shù)據(jù)輸入數(shù)據(jù)輸入指的是程序運行時,通過輸入設(shè)備(鍵盤)為程序提供數(shù)據(jù)。相應(yīng)的,在程序中就要使用數(shù)據(jù)輸入函數(shù)。與輸出函數(shù)對應(yīng),常用的輸入函數(shù)有:字符輸入函數(shù)(getchar)和格式輸入函數(shù)(scanf)。1.字符輸入函數(shù)(getchar函數(shù))getchar函數(shù)與putchar函數(shù)的作用正好相反,它的功能是從輸入終端設(shè)備(一般指鍵盤)上讀取(輸入)一個字符。getchar函數(shù)的一般形式為:

getchar();功能是從終端設(shè)備輸入(讀取)一個字符,函數(shù)的值為輸入的字符??梢詫⑦@個值賦給一個字符(或整型)變量,從而將這個字符保存起來。在程序中的使用形式一般為:charc;…c=getchar();3.2.3數(shù)據(jù)輸入例3-4鍵盤輸入一個小寫字母,輸出對應(yīng)的大寫字母。#include<stdio.h>voidmain(){ charc;

c=getchar(); c=c+32;

putchar(c);}程序運行情況:a(鍵盤輸入)A(程序輸入)3.2.3數(shù)據(jù)輸入2.格式輸入函數(shù)(scanf函數(shù))scanf函數(shù)可以通過鍵盤輸入多個任意類型的數(shù)據(jù)。它的功能是按指定的格式從鍵盤上輸入數(shù)據(jù)。scanf函數(shù)的一般形式為:

scanf(格式控制串,地址表列);例如:格式控制串的含義與printf函數(shù)中的基本相同,例中“%d%d”表示要從鍵盤輸入兩個整數(shù);&x和&y是分配給變量x和y存儲空間的起始地址。該函數(shù)調(diào)用的作用是從鍵盤上輸入2個整數(shù)(%d指定整數(shù)),將其存儲在地址&x和&y所指定的存儲區(qū)域中,可以理解為從鍵盤上輸入2個整數(shù),存儲在變量x和y中。請看下面的示例內(nèi)存………&x&yxyscanf("%d%d”

,&x,&y);格式字符串地址表列項3.2.3數(shù)據(jù)輸入例3-5輸入矩形的兩個邊長,求矩形的面積。#include<stdio.h>voidmain(){

intw,h,a; /*變量定義*/

printf(“輸入矩形的長和寬:”); /*輸出提示信息*/

scanf("%d%d",&w,&h);/*從鍵盤輸入2個整數(shù)*/

printf("Areais%d\n",w*h); /*輸出結(jié)果*/}程序運行如下:68(鍵盤輸入68后,按回車,數(shù)據(jù)之間用空格分隔)Areais48程序運行時,當執(zhí)行到scanf函數(shù)調(diào)用時,程序暫停運行,等待用戶從鍵盤上輸入數(shù)據(jù),當用戶按格式要求輸入數(shù)據(jù)并按回車鍵后,數(shù)據(jù)將被保存在地址指定的存儲區(qū)域中,或者說數(shù)據(jù)被賦值給“&”后的變量中。有關(guān)scanf函數(shù)的格式說明詳見教材,下面是幾點說明:3.2.3數(shù)據(jù)輸入①地址表列是用逗號分隔的若干個地址。②程序運行時,若輸入數(shù)據(jù)個數(shù)少于格式說明要求的數(shù)據(jù)個數(shù)時,程序?qū)⒌却^續(xù)輸入,直到滿足要求;反之,多余數(shù)據(jù)將作為下一個輸入函數(shù)的輸入數(shù)據(jù)。③在格式控制串中,如果沒有格式說明以外的字符,則輸入的數(shù)據(jù)之間用空格、TAB(制表鍵)或回車分隔。例如:scanf("%d%d%d",&a,&b,&c);輸入的數(shù)據(jù)可以有多種形式:第1種:102030↙第2種:10↙2030↙第3中:1020(按Tab鍵)30↙3.2.3數(shù)據(jù)輸入④如果在格式說明中含有普通字符,輸入數(shù)據(jù)時,這些普通字符不會顯示到屏幕上,而是要求將這些普通字符也原樣輸入。例如:scanf("%d,%d",&x,&y);格式串中有一個逗號,輸入的兩個數(shù)據(jù)之間也要一個逗號,如:6,8又如:scanf("x=%d,y=%d",&x,&y);輸入數(shù)據(jù)的形式應(yīng)是:x=6,y=8再如:scanf("%d:%d:%d",&tt,&mm,&ss);輸入數(shù)據(jù)的形式應(yīng)是:15:25:50如果需要在屏幕上顯示一些輸入數(shù)據(jù)的提示信息,可以使用printf函數(shù),例如:printf(“Pleaseinputa,b,c:");scanf("%d,%d,%d“,&a,&b,&c);⑤可以指定輸入數(shù)據(jù)的寬度,系統(tǒng)自動截取所需的數(shù)據(jù)長度,但不能指定實型數(shù)據(jù)的寬度。例如:scanf("%2d%3d",&a,&b);當輸入12345時,系統(tǒng)自動將12賦給a,將345賦給b。而:scanf("%6.3f",&a);是錯誤的。3.2.3數(shù)據(jù)輸入⑥使用“%c”格式輸入字符時,輸入的空格、回車或轉(zhuǎn)義字符都是有效的字符。例如:scanf("%c%c%c",&x,&y,&z);當輸入abc時,系統(tǒng)將字符a賦給x,將第一個空格字符賦給y,將字符b賦給z。⑦scanf函數(shù)從鍵盤輸入數(shù)據(jù)時,若遇與格式要求不一致的字符,則認為與該格式說明對應(yīng)的數(shù)據(jù)結(jié)束。例如:scanf("%d%c%f",&a,&b,&c);執(zhí)行該函數(shù)調(diào)用時,若輸入1234a1234.5↙格式控制串中的%d要求輸入連續(xù)的數(shù)字,在讀取1234后遇字母a,整數(shù)讀取結(jié)束,將1234保存在變量a中;%c要求讀取一個字符,將字符a保存在變量b中;其后的1234.5按%f格式讀取,保存在變量c中。若在1234和字母a之間有一個空格,則讀取并存儲在變量a,b,c的數(shù)據(jù)依次是:1234、空格和0。3.2.4程序舉例例3-6輸入三角形的三邊長,求三角形的面積。分析:已知三角形的三邊長度求三角形的面積,要使用海倫公式:C語言源程序如下:#include"math.h"voidmain(){ floata,b,c,s,area;

printf("輸入三角形的三邊長度:");

scanf("%f,%f,%f",&a,&b,&c); s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c));

printf("a=%7.2f,b=%7.2f,c=%7.2f\n",a,b,c);

printf("arae=%7.2f\n",area);}3.3選擇結(jié)構(gòu)選擇結(jié)構(gòu)又稱分支結(jié)構(gòu),是程序結(jié)構(gòu)中重要的一種結(jié)構(gòu)類型。在程序設(shè)計時,當需要進行選擇、判斷處理時,就要用到分支結(jié)構(gòu)。C語言中有兩種實現(xiàn)選擇控制的語句:條件分支語句(if語句)開關(guān)分支語句(switch語句)這兩種語句各有其特點,前者用于兩個分支的選擇,后者則適合于多分支選擇。無論是if語句,還是3.4節(jié)介紹的循環(huán)語句,都要使用控制條件,在此先介紹用于描述條件的關(guān)系表達式和邏輯表達式。3.3.1關(guān)系運算符與關(guān)系表達式

1.關(guān)系運算符在程序中經(jīng)常需要比較兩個量的大小關(guān)系,以決定程序下一步的工作。比較兩個量的運算符稱為關(guān)系運算符。C語言中有6種關(guān)系運算符:

>(大于)、>=(大于或等于)、<(小于)、<=(小于或等于)==(相等)、!=(不等)

關(guān)系運算符都是雙目運算符,其結(jié)合性均為左結(jié)合。關(guān)系運算符的優(yōu)先級低于算術(shù)運算符,高于賦值運算符。。

2.關(guān)系表達式用關(guān)系運算符將兩個表達式連接起來,就構(gòu)成了關(guān)系表達式,即:

表達式1關(guān)系運算符表達式2

關(guān)系表達式的值只有兩個,“真”和“假”。關(guān)系成立時,表達式的值為真(用整數(shù)1表示),否則為假(用整數(shù)0表示)。關(guān)系運算符兩邊的表達式可以是任意表達式。例如:

3>5關(guān)系不成立,表達式的值為0(假)5>=3關(guān)系成立,表達式的值為1(真)(3>5)<=(5>=3)關(guān)系成立,表達式的值為1(真)10%2==0關(guān)系成立,表達式的值為1(真),說明10能被2整除

year%4==0關(guān)系成立時,說明變量能被4整除3.3.2邏輯運算符與邏輯表達式1.C語言有三個邏輯運算符!(邏輯非)⑵、&&(邏輯與)⑾、||(邏輯或)⑿邏輯非、邏輯與、邏輯或的含義可解釋為漢語中的否定、并且、或者。2.邏輯表達式由邏輯運算符及其操作數(shù)構(gòu)成的表達式稱為邏輯表達式。由這三個邏輯運算符和操作數(shù)構(gòu)成邏輯表達式的一般形式為:!操作數(shù)操作數(shù)1&&操作數(shù)2操作數(shù)1||操作數(shù)2操作數(shù)可以是常量、變量、函數(shù)和表達式。無論操作數(shù)的值如何,均理解為“真”(非0)和“假”(0)兩個值。邏輯運算的運算規(guī)則如下表所示。3.3.2邏輯運算符與邏輯表達式在程序中,邏輯表達式主要用來構(gòu)成復(fù)雜條件。例如:⑴“x是非負偶數(shù)”的條件可表示為:x>=0&&x%2==0⑵“某年y是閏年”的條件可表示為:

y%4==0&&y%100<>0||y%400==0邏輯表達式求值時,若前面的操作數(shù)(左操作數(shù))能夠確定表達式的值,則后面的操作數(shù)將不再求值。設(shè)x=1,y=2,z=3,則邏輯表達式(x>=y)&&(z++)的值為0(假),且z的值不變。這是因為關(guān)系表達式x>=y的值為0,根據(jù)邏輯與的運算特點將不再對表達式z++求值。若將表達式中的邏輯與(&&)改為邏輯或(||),請分析邏輯表達式的值和變量z的值。練習:⑴設(shè)m,n,a,b,c,d均為零,求解(m=a==b)||(n=c==d)后,m,n的值是__①0,0②0,1③1,0④1,1⑵設(shè)m,n,a,b,c,d均為1,求解(m=a>b)&&(n=a>b)后,m,n的值是__①0,0②0,1③1,0④1,13.3.3if語句if語句有下面3中使用形式:1.if(表達式)語句控制過程如右圖所示,如果表達式的值非0,則執(zhí)行圓括號后的語句,否則繼續(xù)執(zhí)行if語句的下一條語句。例3-7輸入一個整數(shù),輸出其絕對值。voidmain(){ intx;

scanf("%d",&x);

if(x<0)x=-x;

printf("%d\n",x);}if語句中的表達式可以是任意表達式。語句可以是單一語句,也可以是復(fù)合語句。如果if語句控制的不是單一語句,一定別忘記使用花括號將要控制的語句括起來構(gòu)成復(fù)合語句。3.3.3if語句2.if(表達式)語句1else語句2控制過程如右圖所示,如果表達式的值非0,則執(zhí)行圓括號后的語句1,否則執(zhí)行else后的語句2。例3-8輸入2個整數(shù),輸出其中的較大值。voidmain(){

intx,y;

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

if(x>y)printf("%d\n",x); elseprintf("%d\n",y);}程序中的兩條printf()函數(shù)調(diào)用語句,在程序的一次運行中,只執(zhí)行其中的一條。所以,if…else…語句的功能是在兩條被控制的語句中選擇其中的一條執(zhí)行。3.3.3if語句3.if語句的嵌套形式if語句控制的語句本身又是if語句,這種情況稱為if語句的嵌套。嵌套形式又可分為兩種:規(guī)則嵌套和任意嵌套。規(guī)則嵌套的一般形式if(表達式1)語句1elseif(表達式2)語句2……elseif(表達式n)語句nelse語句n+1被嵌套的if語句固定在else下,這種嵌套結(jié)構(gòu)又稱為elseif結(jié)構(gòu),控制過程如右圖所示:請看下面的應(yīng)用示例:3.3.3if語句例3-9輸入一個四則運算符,即+、-、*、/中的任意一個,輸出對應(yīng)的英文單詞:plus、minus、multiply、divide,若輸入了其他字符,則輸出三個問號。#include<stdio.h>voidmain(){ charc;

printf("Enteracharacter:"); c=getchar(); if(c=='+')printf("\nPlus!\n"); elseif(c=='-')printf("\nMinus!\n"); elseif(c=='*')printf("\nMultiply!\n"); elseif(c=='/')printf("\nDivide!\n"); elseprintf("\n???\n");}3.3.3if語句任意嵌套的一般形式內(nèi)嵌的if語句可以是前面介紹的3中形式之一,如果內(nèi)嵌的if語句沒有else部分,則要特別注意if與else的配對關(guān)系:else總是與它前面最近的還沒有配對的if語句配對。請分析下面if語句的嵌套關(guān)系。if(…)

if(…)語句1

else語句2else

if(…)語句3else語句4內(nèi)嵌的if內(nèi)嵌的if注意:書寫格式不決定控制關(guān)系。如果程序員希望第一個if與第一個else配對,則應(yīng)寫成:if(…)

if(…)語句1else

if(…)語句3else語句4嵌套關(guān)系是if(…)

if(…)語句1

else

if(…)語句3else語句43.3.3if語句if(…){if(…)語句1}else

if(…)語句3else語句4

使用花括號將內(nèi)嵌的if語句括起來,限定內(nèi)嵌if語句的范圍。請看下面的應(yīng)用示例:3.3.3if語句例3-10輸入一個字符,判斷其是否是A(Abort)、R(Retry)或F(Fail),并輸出相應(yīng)的信息。#include"stdio.h"voidmain(){ charc;

printf("Abort,Retry,Fail?"); c=getchar();

if(c>='A'&&c<='Z'||c>='a'&&c<='z')

if(c=='a'||c=='A')printf("Abort!\n");elseif(c=='r'||c=='R')printf("Retry!\n");elseif(c=='f'||c=='F')printf("Fail!\n");elseprintf("Otherletter!\n"); elseprintf("%cisnotalette!\n",c);}3.3.4switch語句用if語句的嵌套可以實現(xiàn)多分支的選擇,但有些情況下使用switch語句來解決多分支選擇問題更加方便有效。switch語句又稱開關(guān)語句,它的一般形式如下,控制過程如右圖所示:switch(表達式){case常量表達式1:

語句組1break;case常量表達式2:

語句組2break;…case常量表達式n:

語句組nbreak;default:

語句組n+1}表達式語句組1break;語句組2break;…語句組nbreak;語句組n+1常量1常量2…常量n首先計算表達式的值,然后依次與每一個case后的常量值進行比較,一旦相等,就執(zhí)行該case后面的語句組,直到遇到break語句為止。如果表達式的值與所有case后的常量值都不相等,則執(zhí)行default后面的語句組。3.3.4switch語句例3-11輸入一個字符,判斷其是否是A(Abort)、R(Retry)或F(Fail),并輸出相應(yīng)的信息。#include"stdio.h"voidmain(){charc;

printf("Abort,Retry,Fail?");c=getchar();

switch(c){ case'a': case'A':printf("Abort!\n");break; case'r':case'R':printf("Retry!\n");break; case'f': case'F':printf("Fail!\n");break; default:printf("Othercharacter!\n");}}分析:去掉程序中的break語句,程序運行結(jié)果如何?3.3.5程序舉例例3-12寫程序,判斷某年是否是閏年。分析:用變量y存儲年號,leap存儲閏年信息。若是閏年,使leap=1,否則leap=0,最后判斷l(xiāng)eap的值,輸出是否是閏年的信息。#include"stdio.h"voidmain(){

inty,leap;

printf("輸入年號:");

scanf("%d",&y); leap=(y%4==0)&&(y/100!=0)||(y/400==0);

if(leap)printf("%d年是閏年\n",y); elseprintf("%d年不是閏年\n",y);}分析程序中賦值語句的作用?3.3.5程序舉例例3-13寫程序,求鍵盤輸入的形式為:xopy

的算術(shù)表達式的值。其中:x、y是整數(shù),op是一個算術(shù)運算符,例如,輸入:100+200,則輸出:100+200=300。#include"stdio.h"voidmain(){

intx,y;charop;

printf("輸入一個算術(shù)式:");

scanf("%d%c%d",&x,&op,&y);/*注意格式串*/

switch(op){case'+':printf("%d+%d=%d\n",x,y,x+y);case'-':printf("%d-%d=%d\n",x,y,x-y);case'*':printf("%d*%d=%d\n",x,y,x*y);case"/':if(y!=0)printf("%d/%d=%d\n",x,y,x/y);elseprintf("除數(shù)為0\n");default:printf("輸入的個算術(shù)式錯誤\n");}}/*請分析程序有什么問題?如何修改?*/3.4循環(huán)結(jié)構(gòu)所謂循環(huán)就是有規(guī)律的重復(fù)某些操作。循環(huán)語句能夠控制計算機重復(fù)執(zhí)行指定的程序段。C語言提供了三種循環(huán)語句,它們是:while語句do~while語句for語句這三種語句在大多數(shù)場合可以置換使用,但在功能和用法上各有特點,在使用過程中要仔細體會。熟練掌握前一節(jié)的條件語句和本節(jié)的循環(huán)語句的使用,將有助于編制較復(fù)雜的程序。3.4.1while循環(huán)語句while語句的一般形式為:

while(表達式)語句控制過程如右圖所示,如果表達式的值非0,則重復(fù)執(zhí)行圓括號后的語句,直到表達式的值為0。例3-14求一系列非負整數(shù)的累加和。#include"stdio.h"voidmain(){

intx,s=0;

scanf("%d",&x);

while(x>=0)

{

s=s+x;

scanf("%d",&x);

}

printf("sum=%d\n",s);}/*注意循環(huán)結(jié)束的條件*/3.4.1while循環(huán)語句例3-15求:1+2+3+…+100。分析:用變量s保存和值,使其初值為0。使變量n依次取值1、2、3、…直到100,n的值每變化一次,就將其值累加到變量s中。voidmain(){

intn,s=0; n=1; /*為n賦初值*/

while(n<=100) /*n的值沒有超過100,循環(huán)*/

{

s=s+n; /*累加*/

n=n+1; /*n取下一個值數(shù)*/

}

printf("s=%d\n",s);}分析:①使n的值增1,有那些表達方法?s=s+n的另一種表達形式?②若變量n的初值為0,程序該如何修改?③若求:1+3+5+…+99,程序該如何修改?3.4.1while循環(huán)語句例3-16從鍵盤輸入一系列字符,直到回車換行,統(tǒng)計其中字母、數(shù)字和其它字符的個數(shù)。分析:使用getchar函數(shù)從鍵盤讀取字符,因getchar函數(shù)每次只能讀取一個字符,使用循環(huán)重復(fù)讀取,讀取一個,判斷一個;再設(shè)置3個計數(shù)器變量,初值為0,分別記錄字母、數(shù)字和其它字符的個數(shù)。#include"stdio.h"voidmain(){

intletter,digit,other;charc;letter=digit=other=0;while((c=getchar())!='\n')

if(c>='A'&&c<='Z'||c>='a'&&c<='z')letter++;elseif(c>='0'&&c<='9')digit++;elseother++;printf("letter=%d\ndigit=%d\nother=%d\n",letter,digit,other);}/*注意循環(huán)條件和劃線部分*/3.4.2do~while循環(huán)語句do~while語句的一般形式為:

do{

語句

}while(表達式);控制過程如右圖所示。例3-17求一系列非負整數(shù)的累加和。#include<stdio.h>voidmain(){

intx,s=0; do{

scanf("%d",&x); /*輸入一個數(shù)*/

s=s+x; /*累加*/

}while(x>=0); /*不要丟失分號*/

printf("sum=%d\n",s);}請與例3-14程序比較,有什么區(qū)別?用哪一種循環(huán)更合適?表達式語句假(0)真(非0)3.4.2do~while循環(huán)語句例3-18求:1+2+3+…+100。分析:用變量s保存和值,初值為0。使變量n依次取值1、2、3、…直到100,n的值每變化一次,就將其值累加到變量s中(與例3-15相同)。#include<stdio.h>voidmain(){

intn,s=0; n=1; /*為n賦初值*/

do{s=s+n; /*累加*/

n=n+1; /*n取下一個值數(shù)*/

}while(n<=100);/*n的值沒有超過100,循環(huán)*/

printf("s=%d\n",s);}請與例3-15程序比較,有什么區(qū)別?用哪一種循環(huán)更合適?3.4.2do~while循環(huán)語句do~while語句與while語句的區(qū)別是:do~while語句先執(zhí)行循環(huán)體,后判斷循環(huán)條件,循環(huán)體至少執(zhí)行一次;而while語句是先判斷循環(huán)條件,后執(zhí)行循環(huán)體,循環(huán)體可能一次也不執(zhí)行(當?shù)谝淮闻袛啾磉_式的值就為零時)。若已知循環(huán)體至少執(zhí)行一次,則兩條語句可替換使用。例3-19輸入兩個正整數(shù)a,b(a≤b),求a至b的連續(xù)整數(shù)的累加和。

使用while語句:voidmain(){inta,b,sum=0;

printf("Inputa,b(0≤a≤b):");

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

while(a<=b)sum+=a++;

printf("sum=%d\n",sum);}使用do~while語句void

main(){inta,b,sum=0;

printf("Inputa,b(0≤a≤b):");

scanf("%d,%d",&a,&b);do{sum+=a++;}while(a<=b);printf("sum=%d\n",sum);}從題目可知累加操作至少進行一次,所以使用do~while語句與while語句進行循環(huán)控制都很方便。

3.4.3for循環(huán)語句for語句的一般形式為:

for(表達式1;表達式2;表達式3)

語句控制過程如右圖所示。例3-20求:1+2+3+…+100。#include<stdio.h>voidmain(){

intn,sum=0;

for(n=1;n<=100;n++)sum+=n;

printf("sum=%d\n",sum);}與例3-15和例3-18程序比較可知,循環(huán)前對變量n的賦初值操作和循環(huán)體中對變量n的修改操作在此例中作為for語句的表達式1和表達式3,使程序更加簡潔、緊湊。3.4.3for循環(huán)語句for語句中的三個表達式必須用分號隔開,表達式可以缺省,但分號不能缺少。表達式1和表達式3通常是賦值表達式,用于為循環(huán)控制變量賦初值或修改這些變量的值。表達式2是循環(huán)的控制條件,值非0時,將重復(fù)執(zhí)行其后所控制的語句。例3-21寫一程序,輸出0o~360o的弧度轉(zhuǎn)換表。#definePI3.1415926voidmain(){

intdegree; doubleradians;

for(degree=0;degree<=360;degree++){ radians=(double)degree*PI/180.0;

printf("%d\t%f\n",degree,radians);}}修改程序,使度數(shù)的間隔為5o。下面以求:1+2+3+…+100為例說明for語句中表達式缺省的幾種變化。3.4.3for循環(huán)語句①表達式1缺省voidmain(){intn,sum=0;n=1;for(;n<=100;n++)sum+=n;

printf("sum=%d\n",s);}②表達式3缺省voidmain(){intn,sum=0;for(n=1;n<=100;){sum+=n;n++;}

printf("sum=%d\n",s);}③表達式1和表達式3缺省voidmain(){intn,sum=0;n=1;for(;n<=100;)sum+=n++;

printf("sum=%d\n",s);}④3個表達式都缺省voidmain(){intn=1,sum=0;for(;;){sum+=n++;if(n>100)break;}

printf("sum=%d\n",s);}3.4.3for循環(huán)語句for語句在循環(huán)控制上等價于下面的程序段:表達式1;

while(表達式2){

語句表達式3;

}例3-15、例3-18、例3-20分別用while、do-while和for語句求1~100之間整數(shù)的累加和,請同學們自行比較。while、do-while和for語句各有其特點,多數(shù)場合可以替換使用。在重復(fù)次數(shù)未知的情況下,建議使用while或do-while控制循環(huán);在重復(fù)次數(shù)已知或數(shù)據(jù)變化有規(guī)律時,使用for控制循環(huán)更方便。在實踐中,for語句的使用更頻繁一些。循環(huán)結(jié)構(gòu)程序設(shè)計在程序設(shè)計過程中,一般都會用到循環(huán)結(jié)構(gòu)。設(shè)計循環(huán)結(jié)構(gòu)程序時應(yīng)注意以下幾點:①確定循環(huán)體。分析問題,找尋規(guī)律,確定要重復(fù)的操作,即確定循環(huán)體。例如,對求和問題,循環(huán)體一般是形如:是s=s+n的累加運算。②循環(huán)前的準備。通常要為循環(huán)體中用到的變量賦初值,以便程序的執(zhí)行能進入循環(huán)或為循環(huán)處理作好準備。例如前面例子中為變量賦初值。③能正常結(jié)束循環(huán)。在循環(huán)體中,一定要有一些賦值操作,這些賦值操作使得循環(huán)條件在適當?shù)臅r候由“真”變?yōu)椤凹佟?,這樣才能使循環(huán)正常結(jié)束,除非使用break語句。④循環(huán)處理的結(jié)果。有些循環(huán)處理是求的一些結(jié)果,供后續(xù)程序使用或輸出,如求和結(jié)束后輸出和值;有些循環(huán)處理是邊處理邊輸出,如將角度轉(zhuǎn)換為弧度程序中的循環(huán)。3.4.4循環(huán)嵌套所謂循環(huán)嵌套指的是在一個循環(huán)的循環(huán)體中包含了另一個循環(huán)結(jié)構(gòu)。例3-22分析程序的輸出(根據(jù)程序運行結(jié)果分析程序的執(zhí)行過程)。C程序中的三種循環(huán)語句(while循環(huán)、do~while循環(huán)和for循環(huán))可以相互嵌套。要注意不能交叉,即一個循環(huán)結(jié)構(gòu)要完整的包含在另一循環(huán)的循環(huán)體中。請看循環(huán)嵌套示例:voidmain(){

inta,b,c;for(a=0;a<=9;a++){

for(b=0;b<=9;b++){c=10*a+b;printf("%4d",c);}

printf("\n");}}內(nèi)層循環(huán)的循環(huán)體外層循環(huán)的循環(huán)體,由一條for語句和一條輸出換行的語句所構(gòu)成的復(fù)合語句3.4.4循環(huán)嵌套例3-23寫一程序,輸入一個正整數(shù)n,輸出是否為素數(shù)的信息。分析:判斷正整數(shù)n是否為素數(shù),最簡單的方法是用[2,n-1]之間的所有整數(shù)去除n,若所有的整數(shù)都不能整除n,則n是素數(shù),否則n不是素數(shù)。voidmain(){

intn,m;

printf("輸入一個正整數(shù)(>1)");

scanf("%d",&n); m=2;

while(m<n&&n%m!=0)m++;

if(m<n)printf("%d不是素數(shù)\n",n); elseprintf("%d是素數(shù)\n",n);}上述程序中沒有循環(huán)嵌套。現(xiàn)在,對上述程序修改,使程序能輸出100以內(nèi)的所有素數(shù)。3.4.4循環(huán)嵌套例3-24輸出100以內(nèi)的所有素數(shù)。分析:要輸出100以內(nèi)的所有素數(shù),可采用枚舉法,對2~100之間的整數(shù)依次進行判斷,若是素數(shù),則輸出,否則繼續(xù)判斷下一個數(shù)。voidmain(){

intn,m;

for(n=2;n<100;n++){m=2;

while(m<n&&n%m!=0) m++;

if(m==n)printf("%4d",n);}}請設(shè)計程序驗證歌德巴赫猜想:任意一個大于6的偶數(shù)都能寫成兩個素數(shù)之和。3.4.5goto、break和continue語句break和continue語句是用于switch、while、do~while和for語句中的輔助語句,單獨使用沒有意義。goto語句是語言的保留語句,結(jié)構(gòu)化程序設(shè)計不提倡使用,只在一些特殊情況下使用。1.break語句break語句只能使用在switch語句和循環(huán)語句中,其功能是中斷switch或循環(huán)的執(zhí)行,從其所在的switch或循環(huán)中跳出。break語句的一般形式為:

break;break語句用在循環(huán)體中時,通常受條件語句的控制。例3-25分析程序輸出,理解break語句的作用。voidmain(){intn,sum;for(n=1,sum=0;n<=100;n++){if(n==50)break;sum+=n;}

printf("sum=%d\n",sum);}3.4.5goto、break和continue語句2.continue語句continue語句只能用在循環(huán)語句中,其功能是結(jié)束本次循環(huán)體的執(zhí)行,立即進行下一次重復(fù)。continue語句的一般形式為:

continue;continue通常也受條件語句的控制。例3-26分析程序輸出,理解continue語句的作用。voidmain(){intn,sum;for(n=1,sum=0;n<=100;n++){if(n==50)continue;sum+=n;}

printf("sum=%d\n",sum);}3.4.5goto、break和continue語句3.goto語句goto語句是一條無條件轉(zhuǎn)移語句,

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論