電子工業社-C語言程序設計(第2版)呼克佑全套教案課件_第1頁
電子工業社-C語言程序設計(第2版)呼克佑全套教案課件_第2頁
電子工業社-C語言程序設計(第2版)呼克佑全套教案課件_第3頁
電子工業社-C語言程序設計(第2版)呼克佑全套教案課件_第4頁
電子工業社-C語言程序設計(第2版)呼克佑全套教案課件_第5頁
已閱讀5頁,還剩432頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C語言程序設計第1章C語言與程序設計第1章C語言與程序設計本章主要內容:

C語言發展簡史與特點

計算機解題過程

算法及其表示

常用算法策略介紹

結構化程序設計方法。第1章C語言與程序設計計算機系統的組成計算機系統由硬件和軟件組成。硬件是組成計算機的物理設備,由運算器、控制器、存儲器、輸入設備和輸出設備組成。軟件是指程序及其相關文檔,程序是計算任務的處理對象和處理規則的描述,文檔是為了便于了解程序所需的闡明性資料。程序必須裝入機器內部才能工作,文檔一般是給人看的,不一定裝入機器。程序是軟件系統中不可或缺的重要組成部分,是用計算機語言編寫的。學習計算機語言和程序設計技術,就是要學會用計算機語言編寫解決實際問題的程序,這對于軟件開發人員來說是重要的一步。

第1章C語言與程序設計學習計算機語言當然也包括C語言,主要是學習語法和語義兩個方面。計算機語言的語法是嚴格定義的,不允許有語法錯誤。語法是一些規定,如各種語句及各種語法成分都有各自的規定。同時計算機語言的語義是唯一的,沒有二義性的,各種語句及語法成分有各自的語義。只有掌握計算機語言的語法,理解語義,才能正確使用計算機語言編寫出沒有語法錯誤和邏輯錯誤的程序。第1章C語言與程序設計程序設計是給出解決特定問題程序的過程,包括問題分析、算法設計、程序源代碼設計、測試、調試和維護。源代碼可以用C語言編寫,也可以用其他計算機語言編寫。程序設計的目的是得到一個指令序列,提供給計算機來執行,使得問題得到解決。在程序設計過程中,往往需要不同方面、不同領域的專業知識,包括應用領域知識、特定算法知識和形式邏輯知識等。

C語言程序設計是一門實踐性很強的課程。在學習過程中,不僅要掌握基本概念、語法和語義等內容,還需要注重實驗環節,通過自己動手編寫程序,在完成C語言程序的編輯、編譯、調試和運行的過程中,加深對C語言的理解。1.1C語言發展簡史

C語言是一種廣泛使用的面向過程的計算機程序設計語言,既適合于系統程序設計,又適合于應用程序設計。C語言在操作系統、軟件工程、圖形學、數值分析等諸多領域得到了廣泛的應用。早期的計算機語言,除了匯編語言之外,高級程序設計語言有FORTRAN語言、ALGOL語言和COBOL語言等。后來出現了大量的各種各樣的高級語言,較有影響的有BASIC語言、PASCAL語言、C語言、C++語言和Java語言等。C語言的發展歷程大致如下圖所示。1.2C語言的特點C語言的特點可概括如下:

(1)C語言簡潔、緊湊、靈活。C語言的核心內容很少,只有32個關鍵字,9種控制語句。

(2)表達方式簡練、實用。C語言有一套強有力的運算符,達44種。

(3)具有豐富的數據類型。C語言具有現代語言的各種數據類型,如字符型、整型、實型、數組、指針、結構體和共用體等。

(4)具有低級語言的特點,使用地址訪問內存。

(5)C語言是一種結構化語言,適合于大型程序的模塊化設計。C語言提供了編寫結構化程序的基本控制語句,例如if~else語句、switch語句、while語句和do~while語句等。C語言程序是函數的集合,函數是構成C語言程序的基本單位,每個函數具有獨立的功能。1.2C語言的特點(6)各種版本的編譯器都提供了預處理命令和預處理程序。

(7)可移植性好。程序從一個環境不經改動或稍加改動就可以移植到另一個完全不同的環境中運行。

(8)生成的目標代碼質量高。由C源程序編譯和連接得到的目標代碼的運行效率比用匯編語言編寫的也不過只低10%~20%,可充分發揮機器的效率。

(9)C語言語法限制不嚴,程序設計自由度大。1.3計算機解題過程

對于比較復雜的問題,需要使用軟件工程的方法來解決,超出本書的范圍。這里僅從學習C語言的角度簡要認識計算機解題的過程。計算機的解題過程如右圖所示,大致分為4個階段,分別是分析問題、設計算法、編寫程序和運行驗證。1.4算法及其表示C語言解題時,在程序中有兩方面的描述,即數據描述和處理步驟(算法)描述,后者處理前者的數據。因此,編寫C語言程序之前,應該將問題所涉及的數據、已知條件和問題的解決步驟分析清楚。下面通過兩個簡單的實例來說明這一點

。【例1-1】求兩個任意數的和與平均值。(1)數據描述問題中有4個數據,兩個任意數、任意數之和以及平均值。在程序中定義4個浮點型變量存儲這些數據,即:floata,b,sum,average;1.4算法及其表示(2)處理步驟描述

第1步:輸入兩個任意數,存儲在變量a和b中。第2步:計算兩數之和與平均值,存儲在變量sum和average中。第3步:輸出變量sum和average的值,得到問題所要求的結果。根據上述分析,程序設計如下:1.4算法及其表示#include<stdio.h>voidmain(){ floata,b,sum,average; /*定義變量*/scanf("%f,%f",&a,&b); /*輸入兩個實型數*/sum=a+b; /*求兩個數的和*/average=(a+b)/2; /*求兩個數的平均值*/printf("sum=%f,average=%f\n",sum,average); /*輸出結果*/}1.4算法及其表示

【例1-2】某體育比賽,有10個裁判為參賽選手打分,參賽選手最后得分的計算方法是:去掉一個最高分和一個最低分后其它分數的平均值。求參賽選手的最后得分。(1)數據描述問題中的原始數據有10個,還有解題過程中需要計算的最高分、最低分和最后得分。在程序中可定義一個浮點數組s存儲10個裁判分數、三個浮點變量max,min,score分別用來存儲最高分、最低分和最后得分,另外還需要若干輔助變量。1.4算法及其表示(2)處理步驟描述第1步:輸入10個裁判分數,存儲在數組s中第2步:求10個數的最高分、最低分、累加和,存儲在變量max、min和sum中。第3步:從sum中減去max和min并且除以8(=10-2)求得最后得分,存儲在變量score中。第4步:輸出變量score的值,則得到問題所要求的結果。對于第1步和第2步還需給出更詳細的步驟,以便程序實現。根據上述分析,程序設計如下:1.4算法及其表示#include<stdio.h>voidmain(){ floats[10],max,min,sum,score; /*定義變量*/ inti; for(i=0;i<10;i++) /*輸入10個數*/ scanf("%f",&s[i]); max=min=sum=s[0]; /*求最高分、最低分及和值*/ for(i=1;i<10;i++) { if(max<s[i])max=s[i]; if(min>s[i])min=s[i]; sum+=s[i]; } score=(sum-max-min)/8; /*求最后得分*/ printf("score=%.4f",score); /*輸出結果*/}1.4.1算法的概念

算法是精確定義的一系列規則的集合,這些規則規定了解決特定問題的一系列操作,以便在有限的步驟內產生出問題的答案。例1-1和例1-2中的處理步驟就是一種用自然語言描述的算法。

【例1-3】求兩個正整數m和n的最大公約數(即同時能夠整除m和n的最大正整數)。歐幾里得闡述了求兩個數的最大公約數的過程——歐幾里得算法。第1步:以n除m,并令r為所得余數(顯然n>r≥0)。第2步:若r=0,算法結束,n即為m和n的最大公約數。第3步:置m←n,n←r,返回第1步繼續。

算法中的符號←表示將該符號右邊變量或表達式的值存儲到左邊的變量中。1.4.1算法的概念

對于同一個問題,可以有不同的解題方法,即可以有不同的算法。如【例1-2】求參賽選手的最后得分問題,可以先將10個數排序,求中間8個數的平均值,還可以有其它方法。為了有效地解題,不但要求算法正確,還要考慮算法的質量

。算法千變萬化、簡繁各異,但是算法必須具有以下特性。有窮性確定性可行性輸入輸出1.4.2算法的表示

算法的基本組成結構有三種,即順序結構、分支結構和循環結構。或者說,任何一個算法,無論其多么簡單或多么復雜,都可以由這三種基本結構組合而成。算法有多種表示方法,常用的表示方法有:

(1)自然語言描述;

(2)傳統流程圖;

(3)N—S流程圖;

(4)偽代碼;

(5)計算機語言描述。1.4.2算法的表示1.自然語言描述

例1-2和例1-3介紹的算法就是用自然語言描述的。自然語言可以是中文、英文、其他民族語言或數學表達式等。用自然語言描述算法通俗易懂,其缺點是文字有可能冗長,不太嚴格,容易產生歧義,表達分支和循環結構不方便等。

2.傳統流程圖流程圖是用約定的圖框和流程線表示運算或操作流程的圖示形式。其優點是直觀形象、易于理解。美國標準化協會ANSI規定的一些常用流程圖符號如下圖所示:

1.4.2算法的表示

傳統流程圖常用圖形符號

1.4.2算法的表示

求最大公約數算法的傳統流程如下圖所示

1.4.2算法的表示3.N-S流程圖

N-S流程圖是一種結構化流程圖,適合于表示結構化算法。N-S流程圖完全取消了帶箭頭的流程線,全部算法寫在一個矩形框內,框內還可以包含從屬于它的框。基本圖形符號如下所示:圖中A和B為某種操作或功能模塊,P為判斷條件。

成立

不成立

BA

P

B

A當P成立

A

A當P成立順序結構選擇結構循環結構:while循環結構:do-while1.4.2算法的表示

求最大公約數算法的N-S流程如下圖所示

方法1方法2輸入m,nr←m處以n的余數當r≠0時執行m←n,n←rr←m處以n的余數輸出n的值即為求的結果1.4.2算法的表示4.偽代碼偽代碼采用了類似程序設計語言的語句表示算法,但是偽代碼不是一種程序設計語言,不涉及程序設計的細節。偽代碼表示算法不用圖形符號,比使用傳統流程圖和N-S流程圖表示算法更方便、緊湊并且易懂,便于將算法轉換為各種計算機語言的程序。求最大公約數算法的偽代碼(偽C語言)表示如右方所示:算法開始輸入m,n;do{r←以n除m的余數;m←n;n←r;}while(r≠0);輸出m;算法結束1.5常用算法策略介紹

算法是解決問題的方法,不同領域有不同的方法。根據問題領域的不同,算法可以分為數值問題和非數值問題的算法。數值問題的算法解決傳統的數學問題,例如求方程解的算法和求定積分算法等。與數值問題的算法相比,計算機科學對非數值問題的算法給予了更多的重視。計算機在非數值領域的應用十分廣泛,不同的應用領域有不同的非數值問題算法,已遠遠超過了在數值問題方面的應用。

算法思想種類繁多,常用的算法思想有枚舉法、遞推法、遞歸法等。本節簡要介紹這幾種方法,程序設計中常常用到這些方法。1.5.1枚舉法

枚舉法又稱為窮舉法。該方法通過逐一考察問題的所有可能解,找出問題真正的解。枚舉法要求問題的可能解必須是有限的,而且這些可能解是已知的。

【例1-4】給定一個正整數,確定它的整數立方根是否存在,若存在則找出這個立方根。

問題分析:一個正整數的整數立方根如果存在,一定在1和這個數之間,而這之間正整數的個數是有限的,所以可以設計一個基于枚舉法的算法。

算法開始輸入一個正整數給n;x←1;while(x≤n且x*x*x≠n){x←x+1;}if(x≤n)

找到n的整數立方根,輸出x的值;else

輸出n的整數立方根不存在信息;算法結束1.5.2遞推法

遞推法是從已知的初始條件或問題的最簡單情況出發,逐次推出中間結果。在理想狀態下,每遞推一次,結果逐漸接近問題的最后解。

【例1-5】計算一個正整數N的階乘。

問題分析:根據數學知識N!=1×2×3×…×N,為了求得N!,可以從1開始,求得1的階乘后再求2的階乘,再和3相乘得3的階乘,依次類推,最后求得N的階乘。算法開始輸入一個正整數給n;t←1;i←1;while(i≤n){ t←t×i; i←i+1;}輸出結果t算法結束1.5.3遞歸法

一個直接或間接調用過程(或函數)自身的算法稱為遞歸算法,一個函數如果調用自身進行計算則稱該函數為遞歸函數。一些問題的算法描述中,遞歸法往往比非遞歸法更加簡潔易懂。

【例1-6】計算一個正整數N的階乘。階乘函數f的遞歸定義為:f(1)=1(1!=1,N=1時)f(N)=N×f(N-1)(N!=N×(N-1)!,如果N>1)

前一式子給出函數的初始值,初始值是非遞歸定義的。每個遞歸函數都應該給出非遞歸定義的初始值,否則這個函數無法計算出來。后一式子用較小自變量的函數值來表達較大自變量的函數值,在定義式的兩邊都引用了階乘函數f,所以是一個遞歸定義。1.6結構化程序設計方法

編寫程序如果沒有一整套規范,就會造成程序可讀性差、無法維護等問題。結構化程序設計方法有助于解決這個問題。對于過程性的計算機語言程序來說,使用結構化程序方法可以提高程序的可閱讀性和可修改性,提高編寫程序的效率,縮短修改程序的時間。結構化程序設計是由E.W.Dijikstra在1965年提出的,對程序設計及軟件開發產生了深遠的影響。結構化程序設計以功能模塊和過程設計為主,其要點如下:

(1)自頂向下,逐步求精

(2)模塊化

(3)結構化1.6結構化程序設計方法

結構化程序設計要求程序中的每個基本結構是單入口和單出口的;沒有死循環,即沒有一段程序無休止執行;沒有死語句,即沒有絕對不會被執行的語句。本章作業

習題一一、2,4,6

二、1,2,3(1)~(4)C語言程序設計第2章C語言基礎知識第2章C語言基礎知識本章主要內容:簡單的C語言程序實例字符集、關鍵字和標識符數據類型常量和變量運算符、表達式、運算符優先級和結合性數據類型轉換05六月2025332.1簡單的C語言程序

【例2-1】一個經典C程序,輸出“Hello,World”。

#include<stdio.h>voidmain(void){ printf("Hello,world\n");}將上述程序輸入計算機并存儲在一個文件中,再對源程序文件進行編譯、連接生成可執行程序,最后運行生成的可執行程序,運行結果如下圖所示。(演示)05六月2025342.1簡單的C語言程序

【例2-2】計算兩個整數之和并且輸出結果。/*計算兩個整數之和,并輸出*/#include<stdio.h>voidmain(void){ intvalue1,value2,sum; /*定義變量*/ value1=30; /*為變量賦值*/ value2=45; sum=value1+value2; /*求和*/

printf("sum=%d\n",sum);/*輸出結果*/}05六月2025352.1簡單的C語言程序

【例2-3】編寫程序,輸出兩個整數中的較大值。#include<stdio.h>/*定義函數,求兩個整數中的較大值*/intmax(intx,inty){ intz; /*說明變量*/ if(x>y)z=x; /*將較大者賦值給z*/ elsez=y; returnz; /*返回z的值*/}05六月2025362.1簡單的C語言程序voidmain(void){ inta,b,c; /*說明變量*/ printf("a,b="); /*輸出提示信息*/ scanf("%d,%d",&a,&b); /*輸入兩個整數*/ c=max(a,b); /*調用函數*/ printf("max=%d\n",c); /*輸出結果*/}05六月2025372.1簡單的C語言程序對C程序的初步認識

1.C程序是由一個或多個函數組成的。一個C程序必須有一個名為main的函數,也可以有一個main函數和若干個其它函數;因此,函數是組成C程序的基本單位。2.一個函數由兩部分組成,即函數頭(函數首部)和函數體。例1-3中函數max的函數頭是:intmax(intx,inty),其中的int是函數返回值類型,max是函數名,圓括號中的x和y是形式參數,x,y前面的int是參數的類型;函數頭后面用花括號括起來的部分是函數體,一般包括說明部分(變量說明和函數聲明)和執行部分。05六月2025382.1簡單的C語言程序

3.C程序總是從main函數開始執行的。無論main()函數寫在程序的什么位置,C程序總是從main函數開始執行的,main函數以外的函數只能被調用。人們習慣將main函數寫在所有其它函數的前面。4.C程序書寫格式自由。編寫C程序時,一行內可以寫一個語句,也可以寫多個語句;一個語句也可以分寫在多行上;每個語句和說明的最后必須有一個分號,分號是語句結束的標志。05六月2025392.1簡單的C語言程序5.伴隨C編譯系統,C環境通常都提供了大量的庫函數供用戶使用。各種不同版本的C編譯系統可能對應不同的庫函數,包括輸入輸出操作也是由庫函數scanf和printf等完成的。熟悉和掌握C語言庫函數的使用,也是C語言學習的一個重要內容。6.可以用/*……*/對C程序的任何部分作注釋,以增加程序的可讀性另外:通過上面例題程序,引出:類型、常量、變量、運算符、表達式、語句等基本語法成分。05六月2025402.2關鍵字和標識符

從語法角度來看,計算機語言程序的最小單位是字符,即程序是由字符組成的。程序是符合語法規定的字符的有序序列。這些字符除了字母、數字和標點符號之外,還可以是制表符、回車符和換行符等。

計算機語言有若干語法元素,如關鍵字、標識符、常量、變量、運算符和表達式等,C語言也不例外。由語法元素構成語句,由語句構成程序。因此,C語言程序包含三個層次,它們是語法元素(也稱為單詞)、語句和程序。05六月2025412.2.1字符集C語言字符集包括以下的內容:(1)字母:大寫字母A~Z、小寫字母a~z。(2)數字:0~9。(3)下畫線:_。(4)標點符號:,(逗號)、;(分號)、"(雙引號)、'(單引號)等。(5)特殊字符:+(加號)、-(減號)、*(乘號)、/(除號)、%(百分號)、=(等于號)、()(圓括號)、[](方括號)、{}(花括號)、>(大于號)、<(小于號)、!(感嘆號)、\(反斜杠)、|(豎線)、Tab(制表符)、

(空格符)等。制表符、空格符、回車符和換行符等是單詞的分隔符。標點符號和特殊字符也是單詞的分隔符,同時自身也可能是運算符。05六月2025422.2.2關鍵字

關鍵字又稱保留字,是語言中被賦予特定含義的單詞符號。ANSIC定義的核心關鍵字有32個,下表給出了ANSIC定義的關鍵字分類,其中選擇語句、循環語句和控制轉移關鍵字合起來又稱為控制流關鍵字。

關鍵字用途int、char、float、double、long、short、signed、unsigned、struct、union、enum、void、auto、extern、register、static、typedef類型if、else、switch、case、default選擇語句do、while、for循環語句break、continue、goto、return控制轉移const、volatile、sizeof其他05六月2025432.2.3標識符

程序中,通常需要對函數、變量、符號常量、數據類型和數組等進行命名,這些名稱統稱為標識符。標識符是一個具有特定規則的字符序列,用來作為這些對象的名稱。需要注意,C語言中大小寫字符是有區別的。例如,2.1節中的變量名value1、value2、sum和函數名printf、max都是標識符。而max和Max不是同一個標識符。

標識符是符合以下語法規則的字符序列:(1)首字符必須是字母或下畫線。(2)只能包含字符A~Z、a~z、0~9及_(下畫線)。(3)標識符不能是關鍵字。(4)標識符不能跨行書寫。05六月2025442.2.3標識符

例如,以下這些字符序列是合法的C語言標識符:

abcABCAbcbufferdata1_abcfilename而以下這些字符序列則是非法的C語言標識符:

+abc$xyz2apple%cat

通常遵循以下原則來使用標識符:(1)選擇具有一定意義的英文單詞做標識符。例如,用day表示日期、sum表示和等等。(2)適當地使用下畫線。例如,用load_num表示調入數據等。(3)使用約定俗成的標識符。例如,temp表示中間變量,x、y和z表示需要計算的變量等。(4)標識符的長度不要過長。(5)用大小寫區別命名。例如,loadnum和loadNum是兩個不同的標識符,后者則相對易于閱讀。程序中,變量通常使用小寫字母開頭的標識符,而符號常量往往使用大寫字母的標識符。05六月2025452.3數據類型

程序處理的對象是數據。數據有許多種類,如123是一個整數,3.14是一個帶小數點的浮點數,A是一個字符等等。不同種類的數據在計算機中的存儲形式是不同的,處理方法也是不同的。為了描述不同種類的數據特征,引入了數據類型的概念。

數據類型決定了數據在計算機中的存儲形式。如整數123,它的類型是整型(int),在內存中使用4個字節(32位)存儲;又如字符A,是字符型(char)數據,在內存中使用1個字節(8位)存儲,等等。C語言提供了如下的數據類型:(教材表2-3)05六月2025462.3.1C語言的數據類型數據類型基本類型構造類型指針類型空類型(void)基本整型(int)短整型(shortint)長整型(longint)無符號整型無符號基本整型(unsignedint)無符號短整型(unsignedshortint)無符號長整型(unsignedlongint)整型字符型(char)實型(浮點型)單精度實型(float)雙精度實型(double)枚舉類型(enum)數組類型共用體類型(union)結構體類型(struct)05六月2025472.3.1C語言的數據類型

數據類型決定此類數據的存儲空間、表示形式、取值范圍和可以參與的運算。例如,有符號整數類型的數據帶有一個二進制的正負符號位,通常在最左邊,負整數采用補碼表示;浮點類型根據精度的不同使用不同的字節數表示,其尾數部分和指數部分有各自的編碼方式。

需要注意的是,數據類型本身只是數據的一種抽象描述,只有用它定義的變量才分配存儲空間。

一定要理解數據類型的概念,知道C語言中有哪些數據類型!

本章介紹基本數據類型:整型、浮點型和字符型。05六月2025482.3.2整數類型C語言的整數類型包括帶符號和無符號兩類。從使用的空間字節數來看,又分為整型、短整型和長整型。下表給出了16位機整數類型的存儲字節數和表示范圍

。類

型存儲表

圍shortint2字節-32768~32767(-215~215-1)unsignedshortint2字節0~65535(0~216-1)int2字節-32768~32767(-215~215-1)unsignedint2字節0~65535(0~216-1)longint4字節-2147483648~2147483647(-231~231-1)unsignedlongint4字節0~4294967295(0~232-1)a15a14a13a12a11a10a9a8a7a6a5a4a3a2a1a0intunsignedint符號位也是數值位例如:05六月2025492.3.2整數類型

下面以16位機上C語言為例,簡單介紹整數類型的存儲形式,帶符號整數類型數據在存儲單元中是以補碼形式存儲的。例如:87的存儲形式為:-87的存儲形式為:-1的存儲形式為:87L的存儲形式為:11111111111111110000000001010111111111111010100100000000010101110000000000000000(考慮:-87L和-1L的存儲形式)05六月2025502.3.3浮點類型C語言用浮點類型來表示人們概念中的實數(含有小數)。C語言的浮點類型有單精度浮點型(float)、雙精度浮點型(double)和長雙精度浮點型(longdouble),常見的浮點類型如下表所示:類

型存儲表

圍精度float4字節±3.4×10-38~3.4×10387位數有效字double8字節±1.7×10-308~1.7×1030816位有效數字longdouble10字節±3.4×10-4932~3.4×10493219位有效數字

當精度要求不高時,一般使用單精度浮點型,如日常生活中的溫度、速度、長度、面積和體積等都可以使用該類型;雙精度浮點型提供了更高的精度,可以滿足絕大多數的應用需求;對精度有極高的要求時,需要使用長雙精度浮點型。05六月2025512.3.4字符類型

字符類型(char)主要用于文字或文本數據的處理,是C語言中的重要類型之一。目前,最常用的字符集是ASCII(美國信息交換標準碼)字符集,參見附錄A。它用7位二進制編碼表示128個字符。ASCII碼中,數字字符0~9用0110000~0111001碼表示,大寫字母A~Z用1000001~1011010碼表示。

C語言允許把字符作為整數來使用,所以字符類型與整數類型一樣,也分有符號和無符號兩種類型,如下表所示:

類型存儲表示范圍char1字節-128~127(-27~27-1)unsignedchar1字節0~255(0~28-1)

字符類型的數據在內存中存儲的是其ASCII碼值。例如,字符'0'和'A'的存儲形式如下:010000010011000005六月2025522.4常量和變量C語言中的數據有常量和變量兩種形式。常量是在程序運行過程中其值不能改變的量。變量是在程序運行過程中,其值可以在其類型規定的范圍內變化的量。每個常量和變量都屬于某種類型。變量代表特定類型的存儲空間(也稱為存儲單元),當變量的存儲空間的內容發生變化時,變量的值隨之改變。變量必須遵守“先定義,后使用”的原則,并且使用數據類型進行定義,一旦定義了變量就會為該變量分配相應的存儲空間。

從使用的角度理解,程序中需要存儲數據時,就要定義相應的變量。05六月2025532.4.1常量(數據的表示)

C語言的常量有整數常量、浮點數常量、字符常量和字符串常量。常量可以出現在表達式中,直接參與計算。例如,12、3.14、'A'、“Hello”都是(直接)常量的例子。

C語言也提供預處理命令#define定義符號常量,使用標識符作為符號常量的名稱,符號常量可以像常量一樣使用。以下的程序段定義了符號常量PI,代表圓周率3.14159,然后用PI計算圓的周長和面積。

#definePI3.14159doubleradius=10,circumference,area;circumference=2*PI*radius;/*圓的周長*/area=PI*radius*radius; /*圓的面積*/

一定要掌握各種常量在程序中的書寫方法!05六月2025541.整數常量

整數常量有十進制、八進制和十六進制三種表示形式:

(1)十進制整數常量:由正負號(+或-)和數字0~9組成,首字符不能是0。例如,128、-98、0、100。

(2)八進制整數常量:以0開頭,由數字0~7組成,首字符必須是0。例如,0127表示八進制數127,即(127)8,等于十進制數87。再如,0144,等于十進制數100。

(3)十六進制整數常量:以0x或0X開頭,由0~9、a~z或A~Z組成。例如,0x1C表示十六進制數1C,即(1C)16

,等于十進制數28。再如,0x64,等于十進制數100。上述三種形式表示的整數是int型。若要表示long型常量時,需在整數后面加字母L或l。例如,87L是一個長整數常量。(提問:存儲87和87L分別使用幾個字節?)05六月2025552.浮點數常量

浮點數常量有十進制表示法和指數表示法,浮點數常量必須包含小數點或指數部分,可以帶正、負符號。

(1)十進制表示法與數學表示相同,包含整數部分和小數部分,但是沒有指數部分,例如:

987.-123.456.456。

(2)指數表示法包含尾數部分和指數部分,尾數部分可以是整數或十進制浮點數;指數部分是以字符E或e開頭,后面跟一個可以帶正、負符號的整數。例如:

-123E3表示-123×103987.654e-10表示987.654×10-10。

上述兩種方法表示的浮點數是double型浮點數,若要表示float型或longdouble型浮點數時,需加后綴F或L。請指出下面常量的類型。

123.123123.L123L123.F05六月2025563.字符常量

字符常量是用單引號括起來的單個字符。例如,'A'、'g'、'?'、'6'都是字符常量。注意,其中的單引號不是字符常量的一部分,只起分隔作用,稱為字符常量定界符。

對于無法顯式地書寫或無法從鍵盤直接輸入的字符,。C語言提供了一種特殊的表示法——轉義序列,通常稱為轉義符。轉義符有字符轉義符和數字轉義符兩種。字符轉義符由反斜杠(\)加一個字母組成,如'\n'表示換行符。數字轉義符又有8進制轉義符和16進制轉義符兩種。例如:\n 換行 \'

單引號\t 水平制表 \“

雙引號\v 垂直制表 \\ 反斜杠\b 退格 \ddd 碼值為八進制ddd的字符\r 回車 \xhh 碼值為十六進制hh的字符\f 走紙換頁

請看下面的例子:05六月2025573.字符常量⑴換行字符:'\n'

'\12'

或'\xA'⑵回車字符:'\r'

或'\15'或

'\xD'⑶字母A:'A'

或'\101'

或'\x41'⑷字母a:'a'

或'\141'

或'\x61'字符數據在內存中存儲字符的ASCII碼值,占用1個字節(8位),如字符A的存儲形式:a7a6a5a4a3a2a1a001000001

字符數據也可以理解成值為字符碼值的整數,也就是說,字符數據可以作為整數使用;反過來,整數也可以作為字符使用,此時,把整數的低8位作為字符的ASCII碼值。05六月2025584.字符串常量

字符串常量是用一對雙引號引起來的零個或多個字符序列。例如,以下這些都是字符串常量:

"How

are

you","123.4","a","

",""

字符串中的字符數稱為字符串的長度,零個字符的字符串稱為空串。字符串存儲在一塊連續的內存中,自動在字符串的末尾加一個結束標志'\0'(空字符)。例如:

⑴字符串"a"的存儲形式為:

'H'

'o'

'w'

'

'

'a'

'r'

'e'

'

'

'y'

'o'

'u'

'\0'

'a''\0'⑵字符串:"Howareyou"的存儲形式為:注意:字符常量與長度為1的字符串常量的區別。如'a'與"a"的區別字符串結束標記05六月2025592.4.2變量(數據的存儲)C語言的變量代表的是一塊存儲空間。在程序運行過程中,如果變量的存儲空間的內容被改變,則意味著變量的值改變了。每一個變量必須在定義之后才能使用,可以使用各種數據類型來定義變量,并且用標識符作為變量名稱。一個變量有三個要素:變量名,存儲單元,變量的當前值。例如,以下的變量說明語句:

inta=10;定義整型變量a,并設置初值為10。下圖可幫助理解。a10變量名存儲空間變量的當前值變量名是a,存儲單元(方框表示),變量值為10(寫在方框內)。當給變量賦值后,存儲單元中數據發生變化,變量的值也變化。05六月2025602.4.2變量

1.變量定義變量定義語句的一般形式如下:

數據類型變量名列表;

數據類型可以是表2-3中的變量類型,也可以是程序員自己定義的類型。變量名列表是由逗號(,)分隔開的若干變量或含有初始化值的變量。每一個變量名必須是一個合法的標識符,并且不能同名。例如:intx=10,y; /*定義整型變量x,y*/longz; /*定義長整型變量z*/charch; /*定義字符型變量ch*/

變量定義之后便有了相應的存儲單元,就能夠在程序中使用定義了的變量。如果變量沒有聲明就使用,編譯程序就會給出出錯信息。

(提問:定義變量的目的?)05六月2025612.4.2變量

2.變量初始化定義變量的同時為變量指定一個初值,稱為變量的初始化。例如:inta=10;/*定義a為整型變量,初值為10*/floatb=10.23;/*定義b為實型變量,初值為10.23*/charc='A';/*定義c為字符型變量,初值為'A'*/也可以對變量名列表中的部分變量進行初始化。例如:inta,b,c=6;/*定義a,b,c為整型變量,c初值為6*/如果對幾個變量賦以同一個初值,應寫成:inta=6,b=6,c=6;/*定義a,b,c為整型變量,初值都為6*/而不能寫成以下這樣:inta=b=c=6;(×)因為不符合變量定義的語法格式!(請指出具體錯誤)05六月2025622.5運算符和表達式

使用運算符可以完成一些簡單的數據運算,而復雜的數據運算只能通過程序控制實現。除了輸入輸出和控制語句,幾乎所有的操作都可以使用運算符實現。

C語言運算符按其功能分類有:算術運算符、關系運算符、邏輯運算符、賦值運算符、位運算符、遞增遞減運算符等。

按參與運算的操作數個數來分有:單目運算符、雙目運算符和三目運算符。用運算符將操作數(常量、變量和函數)按一定的規則連接起來,就構成了表達式。表達式的種類也很多,如算術表達式、關系表達式、邏輯表達式等等。表達式總是有值的,表達式的值是按照運算符的優先級和結合性(運算方向)規則求得的,因此,書寫表達式時要注意運算符的優先等級和運算方向。05六月2025632.5運算符和表達式C語言的運算符有15個運算級別和兩種運算方向。

15個運算級別依次用1~15表示,數字越小,運算級別越高。兩種運算方向是自左至右(左結合性)和自右至左(右結合性)。

表達式的計算規則:運算級別不同時,先進行運算級別高的運算,再進行運算級別低的運算;運算級別相同時,運算順序由結合方向決定。C語言的運算符詳見附錄B。與人們日常的表達式書寫習慣一樣,C語言的表達式是中綴表示法,即對于雙目運算符而言,運算符寫在兩個操作數的中間,如a+b和a-b;一般的單目運算符則寫在操作對象的左邊,如-a、+b和++c;只有單目的自增和自減運算符可以寫在操作數的右邊,如a++和b--。05六月2025642.5.1算術運算符及其表達式1.算術運算符

C語言的算術運算符用來計算數值類型數據,是應用最為廣泛的一類運算符,,包括加、減、乘、除和取正、負等,如下表所示:優先級運算符含

義舉

例備

注2++自增++x或x++單目運算符,相當于x=x+1-

-自減-

-x或x-

-單目運算符,相當于x=x-1+取正值+(x+y)單目運算符-取負值-(x–y)單目運算符3*乘法x*y雙目運算符/除法x/z雙目運算符%取模(余數)x%y雙目運算符4+加法x+y雙目運算符-減法x–y雙目運算符05六月2025652.5.1算術運算符及其表達式

算術運算符使用說明:

(1)-(取負)、++、--是單目運算符,*、/、%、+、-是雙目運算符。例如:

-xi++--ix+y(2)+、-、*、/與數學中運算類似。除法運算符在用于兩個整型數據運算時,其運算結果也是整數,余數部分被舍棄。例如:

5/2.0=2.55/2=2(不是2.5)

7/4=1-7/4=-17/-4=-1(3)求余運算符(%)的運算對象只能是整型數據,它的作用是求整數除法的余數,余數的符號與左操作數的符號相同。例如:

8%2=07%4=3-7%4=-37%-4=3-7%-4=-305六月2025662.5.1算術運算符及其表達式(4)自增(++)、自減(--)運算符自增、自減運算符的作用是使變量的值增1或減1,運算對象只能是變量,不能是常量或表達式,如果寫成6++或(a+b)++都是錯誤的。自增、自減運算符是單目運算符,運算符可以寫在變量的前面,也可以寫在變量的后面,例如:①i++,i--注意:(i++)或(i--)是表達式

++i,--i

就變量的值而言,這兩種寫法都使變量的值增1(或減1),而對表達式的值來說結果是不一樣的。第①種情況表達式值是變量i增1(或減1)之前的值;第②種情況表達式值是變量i增1(或減1)之后的值。設變量i的值為5,則表達式i++的值為5,而++i的值為6,變量i的值變為6。05六月2025672.5.1算術運算符及其表達式

2.算術表達式

算術表達式由算術運算符、操作數和圓括號組成。含有算術運算符,符合C語言表達式語法的式子稱為算術表達式。這里的操作數可以是常量、變量和函數。允許用圓括號改變計算優先順序,圓括號在表達式中是成對出現的,圓括號括起來的式子也可以作為操作數,圓括號是允許嵌套的。表達式((a+b)*c-d)/e就是一個含有多重圓括號嵌套的表達式,該表達式的計算過程如下:((a+b)*c-d)/e①②③④請列舉一些數學公式,寫成C語言表達式,注意圓括號的使用。05六月2025682.5.2賦值運算符及其表達式C語言的賦值運算符比較特殊,從語法上看是一個運算符,從語義上看是賦值。賦值運算符的優先級為14,僅比逗號運算符的優先級高,運算方向為自右至左。

1.賦值運算符

C語言中賦值運算符是“=”,變量通過賦值得到一個新的值。由賦值運算符(=)構成的賦值表達式的一般形式是:

v=e或變量=表達式

其中,v是變量(或存儲單元),e是表達式。其語義是對賦值運算符右邊的表達式e進行求值,將表達式e的值存儲在賦值運算符左邊的變量(或存儲單元)v中。例如:

x=3y=4z=x+y賦值表達式也有值,賦值表達式的值就是賦值給變量的值。

c=(a=3)+(b=4)變量a,b,c的值依次為3,4,7。分析表達式:a=b=c=10的賦值過程。05六月2025692.5.2賦值運算符及其表達式2.復合賦值運算符算術運算符(+、-、*、/、%)和位運算符(&、|、^、<<、>>)與賦值運算符組合構成復合賦值運算符。復合賦值運算符有如下10個:

+=-=*=/=%=&=|=^=<<=>>=

用op代表上述算術運算符或位運算符,一個由復合賦值運算符構成的賦值表達式的一般形式是:

vop=e等價于:

v=vope例如:i+=2等價于i=i+2i%=2等價于i=i%2 i*=a+2等價于i=i*(a+2),而不是i=i*a+2i>>=3等價于i=i>>305六月2025702.5.3其他運算符

1.逗號運算符(,)由逗號運算符構成的表達式,其一般形式為:

表達式1,表達式2,表達式3,…,表達式n

其作用是從左至右依次求解各個表達式,最后一個表達式的值就是整個逗號表達式的值。例如:

a=2*3,b=3*4,c=5+25

上述逗號表達式求解后,變量a,b,c的值依次為6,12,30,整個逗號表達式的值為30。又如:

x=(a=2*3,b=3*4,c=5+25

)

賦值給x的是圓括號中逗號表達式的值3005六月2025712.5.3其他運算符

2.條件運算符(?:)條件運算符是C語言中唯一的三目運算符。由條件運算符構成的表達式的一般形式為:

表達式l?表達式2:表達式3

求解過程是:如果表達式1為真(非0),則表達式2的值就是整個表達式的值,否則表達式3的值是整個表達式的值。條件運算符的運算優先級高于賦值運算符和逗號運算符。例如,假設:a=3,b=4,則表達式

a>b?a:b

的值為4。05六月2025722.5.3其他運算符3.求字節數運算符(sizeof)

求字節數運算符sizeof是一個單目運算符,書寫形式上有點像函數。該運算符的操作數可以是數據類型、變量名或表達式。通過該運算符可以求得指定類型、變量或表達式值所屬類型數據使用的存儲單元字節數。求字節數運算符sizeof構成的表達式的一般形式為:

sizeof(類型符或變量名)

例如:sizeof(char)的值是1;

sizeof(float)的值是4;

sizeof(3.14)的值是8;設有變量說明:intx;

sizeof(x)的值是4;(演示例題程序:例2-5~例2-9)05六月2025732.6數據類型轉換不同類型的數據可以進行混合運算。C語言規定,不同類型的數據混合運算時,先將各種類型數據轉換成同一類型數據,然后再運算求值。數據類型轉換有三種情況:1.自動轉換(隱式轉換)轉換規則如右圖所示:規范化轉換:表達式中有short,char類型,在運算前先轉換成int型,unsignedshort類型先轉換成unsignedint型,float類型先轉換成double型,這種轉換稱為規范化(橫向箭頭)。longunsigneddoublefloatintchar,short高低保值轉換:運算符兩端操作類型不一致,在運算前先將類型等級較低的數據轉換成等級較高的,稱為保值轉換(縱向箭頭)。分析下面表達式計算過程中,數據類型轉換情況。('a'-32)-32L+(1.23f+2.34)05六月2025742.6數據類型轉換2.賦值類型轉換(隱式轉換)賦值運算時,如果賦值運算符右側表達式值的類型與左側變量的類型不一致,則將右側表達式的值自動轉換成左側變量的類型,并將值存儲在左側變量中。例如:charc;inti;floatf;c='a'-32;i=123.456;f=3.14*10*10;3.強制類型轉換(顯式轉換)有時根據實際需求,需要將某種類型轉換成另外一種類型,如取整數和四舍五入等。C語言提供了強制類型轉換,其語法形式如下:

(類型名)表達式

將表達式的值強制轉換成類型名指定類型的數據。例如:(int)3.1415轉換結果為整數3(double)(10+20)轉換結果為30.005六月202575本章作業

習題二所有習題(一、二、三)05六月202576C語言程序設計第3章程序控制結構第3章程序控制結構本章主要內容:

C語句概述關系運算和邏輯運算順序結構程序設計選擇結構程序設計循環結構程序設計

一定要掌握C語言的基本語句,如賦值語句,函數調用語句,分支語句和循環語句,并能靈活使用這些語句設計各種結構的程序。

第3章程序控制結構

實際問題的求解算法往往是復雜的,包括順序的計算步驟,以及許多不同計算路徑和一些重復的計算過程。這些計算路徑的選擇和計算過程的重復,需要某些條件的判斷,因此,算法的流程是重要的。算法即問題的求解過程,最終要用計算機程序語言(如C語言)的程序來描述,也可以說需要用程序語言的語句實現。編寫程序的過程中,算法的流程控制映射為程序的控制結構。在C語言中,程序的控制結構分為順序結構、選擇結構和循環結構,任何復雜的程序都是由這三種基本結構組成的。通過本章的學習,理解并掌握C語言中的語句類型和實現三種結構程序的語句的使用方法。3.1C語言語句概述C語言語句可以看作計算機系統的操作指令,用來完成一定的操作任務。C語言語句可以分為以下5種。

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

表達式;例如:

x=y+z; /*賦值表達式加分號,賦值語句*/a=520; /*賦值表達式加分號,賦值語句*/y+z; /*合法語句,但無實際意義*/i++;++i; /*增1語句,i值增1*/

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

2.函數調用語句由函數調用加上分號“;”組成。其一般形式為:

函數名(參數列表);

例如:

printf("\n");

調用庫函數printf(),輸出換行字符。

3.控制語句

C語言有9個控制語句,用于完成選擇、重復和跳轉操作等控制功能,以實現程序的各種控制結構。可分為三類:⑴分支語句:if、switch語句。⑵循環語句:for、while、do-while語句。⑶跳轉語句:break、continue、goto、return語句。3.1C語言語句4.復合語句復合語句是用花括號將若干語句組合在一起,又稱為分程序,邏輯上是一條語句。復合語句的一般形式:

{語句1語句2

語句n}

例如:

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

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

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

3.2順序結構程序設計

順序結構程序相對比較簡單。這種程序中主要使用賦值語句及數據的輸入和輸出語句(函數)。程序運行時,依書寫順序,每條語句執行一次。本節主要介紹賦值語句字符輸入輸出函數格式輸入輸入函數

3.2.1賦值語句

賦值語句是一個應用十分普遍且簡單的語句。賦值語句的一般形式為:

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

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

一個完整的程序,通常要求具備輸入和輸出功能。數據離開主機稱為“輸出”,數據進入主機稱為“輸入”。如下圖所示:C語言本身沒有輸入輸出語句,輸入輸出操作是通過調用庫函數來實現的。使用輸入輸出函數時,應在程序的開頭寫上命令:#include<stdio.h>最基本的輸入輸出函數有4個:(1)字符輸入/輸出函數getchar()和putchar();(2)格式輸入/輸出函數scanf()和printf()。主機CPU內存外設:如顯示器、打印機、鍵盤、掃描儀、磁盤輸出輸入3.2.2數據輸入輸出字符輸入/輸出函數比較簡單,在此一并給出這兩個函數調用的一般形式: getchar(

) putchar(字符型或整型數據)getchar()函數的功能是從終端設備(鍵盤)讀取(輸入)一個字符,函數的值即為讀取的字符,可以將函數的值賦給一個字符變量,從而將這個字符保存起來,在程序中的使用形式一般為:

charch;…ch=getchar(

);

3.2.2數據輸入輸出

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

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

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

putchar(a);putchar(b);putchar(c);}程序運行結果:BOY3.2.2數據輸入輸出【例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');}程序運行結果:BOY3.2.2數據輸入輸出例3-3鍵盤輸入一個小寫字母,輸出對應的大寫字母。#include<stdio.h>voidmain(){ charc;

c=getchar(); c=c+32; putchar(c);}程序運行情況:a(鍵盤輸入)A(程序輸出)3.2.3格式輸入輸出1.格式輸出函數(printf函數)printf函數可以輸出整型、浮點型、字符型和字符串數據。功能是按指定的格式輸出數據。printf函數的一般形式為:

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

,x,y)①格式控制串通常有格式說明和普通字符兩種內容。格式說明由%和格式字符組成,如%d、%f等,它指定所在位置輸出數據的格式,實際輸出的數據在輸出項表中給出。普通字符是希望原樣輸出的字符,其作用是說明、標注,使輸出數據的意義更明確。如x=、y=、換行字符\n等。②輸出項表是用逗號分隔開的若干個表達式(當然,也可以是常量或變量),表達式的值將在對應的格式說明處輸出,表達式的類型應與格式說明要求的數據類型對應一致。請看下面的程序格式控制串輸出項表3.2.3格式輸入輸出#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);}程序的輸出結果是:a=456,b=123分析:printf()函數中的格式控制串是:"a=%d,b=%d\n",其含義是先輸出“a=”,然后在第一個格式說明“%d”處按十進制整數格式輸出第一個表達式的值,再輸出“,b=”后,在第二個格式說明“%d”處按十進制整數格式輸出第二個表達式的值,最后輸出換行字符“\n”。格式說明與表達式的對應關系如下圖所示:

printf("a=%d,b=%d\n",a,b);3.2.3格式輸入輸出③格式說明及其作用如下表所示:(詳見教材表3-1)3.2.3格式輸入輸出④格式說明中還可以使用格式修飾符,其一般形式為:

“%m.n格式字符”如:printf("x=%5d,y=%7.2f",x,y);格式修飾符及其作用如下表所示:(詳見教材表3-2)例3-4分析下面程序的輸出3.2.3格式輸入輸出#include<stdio.h>voidmain(){shortints=-1;inti=-1;unsignedu=65535;floatf=123.456;charc='a';printf("s=%hd,s=%ho,s=%hx,s=%hu\n",s,s,s,s);printf("i=%d,i=%o,i=%x,i=%u\n",i,i,i,i);printf("u=%d,u=%o,u=%x,u=%u\n",u,u,u,u);

pri

溫馨提示

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

評論

0/150

提交評論