程式設計與C語言

2020-08-13 07:14:00

1.1什麼是計算機程式

例如用一條指令要求計算機進行一次加法運算,用另一條指令將計算結果輸出到顯示屏。爲了使計算機執行一系列操作,必須事先編好一條條指令輸入到計算機。所謂程式,就是計算機能識別和執行的指令集合

1.2什麼是計算機語言

任何人之間的交流需要通過語言。人與計算機之間交流資訊,也需要解決語言問題。需要創造一種計算機和人都能夠識別的語言,這就是計算機語言。計算機語言的發展經歷了幾個發展階段:

機器語言:計算機基於2進位制,本質上說計算機只能識別和接受0和1組成的指令。在計算機發展的初期,一般計算機的指令長度爲16,即以16個二進制數(0或1)組成一條指令。例如,用

1010111100101110

讓計算機進行一次加法運算。這種計算機能識別和接受的二進制程式碼稱爲機器指令。機器指令的集合就是計算機的機器語言。顯然,機器語言與人們的習慣語言差別太大,難以推廣使用。

符號語言:爲了克服機器語言的缺點,人們創造出符號語言。它用一些英文字母和數位表示一個指令,例如用ADD代表」加「,SUB代表」減「等。如上面的那條機器指令就可以改用符號指令代替:

ADD A,B (執行A+B>A ,將暫存器A和B中的數相加,存放到暫存器A中)

顯然計算機無法直接識別和執行符號語言的指令,需要用一種稱爲彙編程式的軟體將符號語言的指令轉換爲機器指令,轉換的過程稱爲彙編。因此,符號語言又被稱爲彙編語言

不同型號的計算機的機器語言和彙編語言是互不通用的,用甲機器編寫的程式在乙機器上不能使用。機器語言和彙編語言是完全依賴於機器特性的,是面向機器的語言。由於它們離計算機很近,因此統稱爲計算機的低階語言

高階語言:爲了克服低階語言的缺點,20世紀50年代創造出了第一個計算機高階語言-FORTRAN語言。它很貼近於人們習慣使用的自然語言和數學語言。當然,計算機時不能直接識別高階語言程式的,也要進行「翻譯」。用一種稱爲編譯程式的軟體把高階語言寫的程式(稱爲源程式,source program)轉換爲機器指令的程式(稱爲目標程式,object program),然後讓計算機執行機器指令程式,最後得到結果。

高階語言經歷了不同的發展階段:

(1)非結構化的語言

初期的高階語言屬於非結構化的語言,編碼風格比較隨意,早期的BASIC、FORTRAN和ALGOL都屬於非結構化的語言

(2)結構化語言

爲了解決非結構化語言的問題,提出了「結構化程式設計方法」,規定程式必須有具有良好特性的基本結構(順序結構、分支結構、回圈結構)構成,程式中的流程不允許隨意跳轉,程式總是自上而下執行各個基本結構。C語言屬於結構化語言

以上兩種語言都是基於過程的語言,在編寫程式時需要具體指定過程的每一個細節,在處理規模較大的程式時就顯得捉襟見肘。在實踐中,人們提出了物件導向的程式設計方法。程式面對的不是過程的細節,而是一個個物件,物件是由數據以及數據進行的操作組成的。

(3)物件導向的語言

C++、C#、Visual Basic和Java 等語言都是支援物件導向程式設計方法的語言。

1.3 C語言的發展及其特點

C語言的祖先是BCPL語言。1967年英國劍橋大學的Martin Richards推出了沒有型別的BCPL語言。1970年美國貝爾實驗室的Ken Thompson在BCPL語言的基礎上設計出了很簡單且很接近硬體的B語言,但是過於簡單、功能有限。1972-1973年,貝爾實驗室在B語言的基礎上設計出了C語言,C語言保持了B語言的優點(精練,接近硬體),又克服了他們的缺點(過於簡單,無數據型別),C語言的特點主要表現在具有多種數據型別(如字元、數值、陣列、結構體、指針等)。開發C語言的目的是儘可能降低用它所寫的軟體對硬體平臺的依賴程度,使之具備可移植性。

C語言是一種用途廣泛、功能強大、使用靈活的過程性語言,既可用於編寫應用軟體,也能用於編寫系統軟體。C語言具有以下主要特點:

(1)語言簡潔、緊湊,使用方便、靈活

(2)運算子豐富

(3)數據型別豐富

(4)具有結構化的控制語句。用函數作爲程式的模組單位,便於實現程式的模組化

(5)語法限制不太嚴格,程式設計自由度大。例如對陣列下標越界不進行檢查,由程式編寫者保證程式的正確。對變數的型別使用比較靈活,例如整型量與字元型數據以及邏輯型數據可以通用。

(6)C語言允許直接存取實體地址,能進行位元運算,能實現彙編語言的大部分功能,可以直接對硬體進行操作。

(7)用C語言編寫的程式可移植性好

1.4 最簡單的C語言程式

1.4.1最簡單的C語言程式舉例

執行結果:

程式分析:

先看第3行,其中main是函數的名字,表示「主函數」,main之前的int表示次函數的返回值型別爲int,與之對應的是在執行主函數後會得到一個返回值,它的型別是int,這裏就是第6行的return 0每一個C程式都必須有一個main函數,函數體用花括號{}括起來。這個函數的函數體中出了返回值語句,還包括第5行的輸出語句。printf是C編譯系統提供的函數庫中的輸出函數。在呼叫函數庫中的輸入輸出語句時,編譯系統要求提供有關此函數的資訊(例如對這些輸出輸入函數的宣告、宏的定義以及全域性變數的定義等),程式的第1行「#include <stdio.h>」的作用就是用來提供這些資訊stdio.h就是系統提供的一個檔名,stdio是"standard input & output"的縮寫,檔案後綴.h的意思是標頭檔案(header file),因爲這些檔案都是放在程式各檔案模組的開頭的。輸入輸出函數的相關資訊都已經事先放在stdio.h檔案中,現在用#include 指令把這些資訊呼叫供使用

程式分析:

本程式的作用是求兩個整數a和b的和。第5行的部分是宣告,定義a、b、sum爲整型變數。第9行的printf函數的圓括號內包括兩個參數,一個是雙引號內的內容"sum is %d\n",它是輸出格式字串,作用是輸出使用者希望輸出的字元和輸出的格式。其中sum is 是使用者希望輸出的字元,%d是指定的輸出格式,d表示用"十進制整數"的形式輸出。圓括號內的第二個參數sum表示要輸出變數sum的值,在執行printf函數時會自動用sum的值去代替%d。

程式分析:

本程式包含兩個函數:主函數main和被呼叫的函數max;

max的作用是將x和y中的較大者賦給變數z,然後使用returun語句將z作爲max函數的返回值,返回給呼叫max的函數(即主函數main)。返回值是通過函數名max帶回到main函數中去的。程式的第5行是對被呼叫函數max的宣告,之所以要進行函數宣告是因爲max函數的定義在main函數之後,而對程式的編譯時自上而下的,在第9行呼叫max時編譯系統無法知道max是什麼,因而無法將它作爲函數處理。因此,爲了使編譯系統能夠識別函數,對於放在主函數之後定義的函數都需要在main當中進行函數宣告

程式第8行的scanf是輸入函數的名字,它和printf一樣都是C的標準輸入輸出函數,並且都儲存在標頭檔案「stdio.h」中,雙引號內的字串表示輸入的格式,後面表示輸入的內容。&爲取地址符,&a的含義是取a的地址,執行scanf函數,從鍵盤讀取兩個整數,送到變數a和b的地址處,然後將這兩個地址儲存的值分別賦給a和b。

1.4.2 C語言程式的結構

C語言程式的結構有以下特點:

(1)一個程式由一個或多個源程式檔案組成,而一個源程式檔案可以包括三個部分:

預處理指令,如#include <stdio.h>(還有一些預處理指令如#define);C編譯系統在對源程式進行「翻譯」之前,先由一個預編譯器對預處理指令進行預處理,對於標頭檔案來說就是將標頭檔案中的內容讀進來;將預處理的結果與程式其他部分一起組成一個完整的、可以用來編譯的最後的源程式,然後由編譯器對該源程式進行正式編譯,得到目標程式;

全域性宣告,即在函數之外進行的數據宣告;在函數外面宣告的變數稱爲全域性變數,如在程式開頭(定義函數之前)宣告的變數,則在整個源程式範圍內有效;

函數定義,例如上面的max函數;

(2)函數的C程式的重要組成部分,函數時C程式的基本單位,一個C程式是由一個或多個函陣列成,其中必須包含一個main函數(有且只能有一個)

爲了便於管理和偵錯,當程式規模較大時,可以使一個程式包含若幹個源程式檔案,每個源程式檔案又包含若幹個函數;

在進行編譯時是以源程式檔案爲物件進行的,在分別對各個源程式檔案進行編譯得到相應的目標程式後,再將這些目標程式連線成爲一個統一的二進制可執行程式,這就是C程式的模組化;

(3)一個函數包括兩部分:

函數首部:即函數的第一行,包括函數名,返回值型別,函數的形式參數,參數型別等;函數名後面必須用一對圓括號將形式參數及其型別包裹起來;

函數體:函數體又包括宣告部分和執行部分,宣告部分就是宣告除了形參之外在該函數中還會使用到的變數;執行部分就是函數中所進行的操作;

(4)程式總是從main函數開始執行,而不論main在程式中的位置如何;

(5)每個數據宣告和語句的最後必須有一個分號;

1.5 執行C程式的步驟和方法

計算機不能直接識別和執行高階語言寫的指令,必須用編譯程式(編譯器)將C源程式翻譯成二進制的目標程式,然後再將目標程式與系統的函數庫以及其他目標程式連線起來,形成可執行的目標程式。

編好的C程式一般要經過以下幾個步驟:

(1)對源程式進行預處理,這裏主要是將標頭檔案展開、替換宏等操作;

(2)編譯,編譯的作用是對源程式進行檢查,判斷有無語法方面的錯誤;

(3)彙編,將源程式翻譯爲二進制的目標程式(.obj檔案)

(4)鏈接或連線,經過彙編後的檔案還不能直接供計算機執行,因爲一個程式可能包含若幹個源程式檔案,必須把所有彙編後得到的二進制目標程式連線裝配起來,再與函數庫連線成爲一個整體,生成計算機可以執行的目標程式,稱爲可執行程式。目前很多C編譯系統都是整合環境的(IDE),把程式的預處理、編譯、彙編和連線等操作全都幾種在一個介面上,功能豐富,使用方便,如VC++6.0。

1.6 程式設計的任務

程式設計是指從確定任務到得到結果、寫出文件的全過程,一般經歷以下幾個階段:

(1)問題分析,建立模型

(2)設計演算法,即設計出解題的方法和具體步驟

(3)編寫程式,根據得到的演算法使用高階語言寫出源程式

(4)對源程式進行處理,得到可執行程式

(5)執行程式分析結果

(6)編寫程式文件,許多程式都是供別人使用的,必須向使用者提供程式說明書

例題1: