- 第一行代碼 C語言(視頻講解版)
- 翁惠玉
- 2760字
- 2019-09-10 14:45:36
2.1 一個完整的C語言程序
一個完整的C語言程序
考慮一下如何設計一個求解一元二次方程的程序。如第 1 章所述,設計一個程序先要設計算法。如何教會計算機解一元二次方程呢?我們自己會有很多解一元二次方程的方法,例如湊一個完全平方公式、平方差公式或用十字相乘法分解因式等。但這些方法較靈活,教計算機學習這些方法略顯復雜。最簡單的是用標準的公式解一元二次方程。在眾多解一元二次方程的方法中,先確定教計算機用標準公式求解,然后可以開始設計教學過程,即算法。這個算法很簡單,它的 N-S 圖描述如圖2-1所示。根據這個算法得到的 C 語言程序如代碼清單2-1所示。

圖2-1 求解一元二次方程算法的N-S圖
代碼清單2-1 求解一元二次方程
一個完整的 C 語言程序由注釋、預編譯和主程序組成。主程序由一組函數組成,每個程序至少有一個名字為main的函數。程序運行時,從main函數的第一個語句執行到最后一個語句。
2.1.1 注釋
代碼清單2-1中的第一部分為一段注釋。在 C 語言中,注釋是從/ *開始到*/結束,其間所有的文字都是注釋,可以是連續的幾行。
注釋是寫給讀者看的,而不是寫給計算機的指令。它是開發此程序的程序員用人類習慣的語言向其他程序員傳遞該程序的有關信息。在 C 語言編譯器將程序轉換為機器語言的程序時,注釋被完全忽略。
一般來說,每個程序都以一個專門的、從整體描述程序工作過程的注釋開頭,稱為程序注釋。它包括源程序文件的名稱和一些與程序操作和實現有關的信息。如程序的實現思想、程序的開發者、修改記錄、指出可能的使用者、給出如何改變程序行為的一些建議等。注釋也可以出現在主程序中間,解釋主程序中一些比較難理解的部分。
因為注釋并不是真正可執行的語句,對程序的運行結果無任何影響,所以很多程序員往往不愿意寫。但注釋對將來程序的維護非常重要,給程序添加注釋是良好的編程風格。
2.1.2 預編譯
C 語言的編譯分成兩個階段:預編譯和編譯。先執行預編譯,再執行編譯。預編譯處理程序中的預編譯命令,即那些以#開頭的指令。如代碼清單2-1中的 #include <stdio.h>。預編譯命令有很多,常用的預編譯命令主要有庫包含。
庫包含表示程序使用了某個庫。庫是由程序員自己或其他程序員編寫的一組能夠完成特定功能的工具程序。在程序中需要用到這些功能時,程序員不需要自己編寫這些程序,可以直接調用庫中的程序。
代碼清單2-1包含了庫 stdio 和 math,stdio 是 C 語言提供的標準輸入/輸出庫。程序中所有數據的輸入/輸出都由該庫提供的功能完成。本書的每個程序幾乎都會用到這個庫,math 是數學函數庫,包含了一些常用的科學計算函數的實現。由于求解一元二次方程時要用到求平方根,該函數包含在math庫中。
使用一個庫必須在程序中給出足夠的信息,以便使編譯器知道這個庫里有哪些工具可用,這些工具又是如何使用的。大多數情況下,這些信息以頭文件的形式提供。頭文件的后綴名為“.h”。每個庫都要提供一個頭文件,這種文件為編譯器提供了對庫所提供的工具描述,以便在程序中用到這些庫的功能時,編譯器可以檢查程序中的用法是否正確。stdio.h 就是 stdio 庫的頭文件。math.h是math庫的頭文件。
將庫如何使用的信息傳遞給使用庫的程序是采用編譯預處理命令 include。#include命令的意思就是把頭文件stdio.h的內容插入到現在正在編寫的程序中。
#include命令有以下兩種格式
#include <文件名>
#include "文件名"
用尖括號標記的是 C 語言提供的標準庫。C 語言程序用尖括號通知預編譯器到系統的標準庫目錄中去尋找尖括號中的文件,并將它插入到當前的源文件。可以通過以下語句包含標準庫stdio
#include <stdio.h>
個人編寫的庫用引號標記。例如,某個程序員自己寫了一個庫user,于是#include行被寫為
#include "user.h"
當用雙引號標注時,預編譯器先到用戶的目錄中去尋找相應的文件。如果找不到,再到系統的標準庫目錄中去尋找。
2.1.3 主程序
代碼清單2-1所示程序的最后一部分是程序主體,是算法的描述。C 語言的主程序由一組函數組成,每個程序必須有一個名字叫main的函數,它是程序運行的入口。運行程序就是從main函數的第一個語句執行到最后一個語句。
每個函數由函數頭和函數體兩部分組成。代碼清單2-1中,int main()是函數頭,后面花括號括起來的部分是函數體。我們可以把函數理解成數學中的函數,函數頭是數學函數中等號的左邊部分,函數體是等號的右邊部分。函數頭中的 int 表示函數的執行結果是一個整數,main 是函數名字,()中是函數的參數,相當于數學函數中的自變量,()中為空表示沒有參數。函數體是如何從自變量得到函數值的計算過程,即算法的描述,相當于數學函數中等號右邊的表達式。
函數體可進一步細分為變量定義部分和語句部分。語句部分一般又可分為輸入階段、計算階段和輸出階段。一般各部分之間用一個空行隔開,以便于閱讀。
1.變量定義
變量是一些程序在編寫時,值尚未確定的數據代號。例如,在編寫求解一元二次方程的程序時,該方程的三個系數值尚未確定,可以用 a、b、c 三個代號來表示。在編寫程序時,兩個根的值也未確定,于是也給它們取了個代號 x1和 x2。在計算 x1、x2時,b2?4ac要用到兩次。為了節省計算時間,可以讓它只計算一次,把計算結果用代號 dlt 表示。在計算 x1和 x2時,凡需用到b2?4ac時均用dlt表示。
在程序執行過程中,變量的值會被確定。我們如何保存這些值的呢?C 語言用變量定義來為這些值準備存儲空間。代碼清單2-1中的
double a, b, c, x1, x2, dlt;
就是變量定義。它告訴編譯器要為6個變量準備存儲空間。變量前面的 double 說明變量代表的數值類型是實數。編譯器根據類型為變量在內存中預留一定量的空間。
2.輸入階段
輸入階段是完成程序運行時,從鍵盤獲取用戶輸入信息的任務。如代碼清單2-1的輸入階段要求用戶輸入一元二次方程的3個系數。
每個數據的輸入過程一般包括兩個步驟。首先,程序應在屏幕上顯示一個信息以使用戶了解程序需要什么,這類信息通常稱為提示信息。在屏幕上顯示信息是用函數 printf 來完成。如代碼清單2-1中的
printf("請輸入方程的3個系數:");
可將“請輸入方程的3個系數:”顯示在顯示器上。被括號括在一對雙引號中的信息稱為一個字符串。從鍵盤讀取數據可以用函數scanf實現。如代碼清單2-1中的
scanf("%lf %lf %lf" , &a, &b, &c);
表示讀入3個實型數,存入變量a、b和c。
3.計算階段
計算階段反映了如何從輸入數據計算得到輸出數據的過程。代碼清單2-1的計算階段包括計算b2?4ac及x1和x2。
在程序設計中,計算是通過算術表達式來實現的,算術表達式與代數中的代數式類似。表達式的計算結果可以用賦值操作存儲于一個變量中,以備在程序的后面部分使用。
4.輸出階段
程序的輸出階段是顯示計算結果。結果的顯示也是通過printf函數來完成的
printf("x1=%f x2=%f\n", x1, x2);
該語句輸出雙引號中的字符串,用變量 x1的值替代字符串中第一個%f,用變量 x2的值替代字符串中第二個%f。如果輸入的a、b、c分別是1、0、-1,則輸出的結果為
x1=1 x2=-1
函數最后一個語句是return 0,表示把0作為函數的執行結果值。一般情況下,main函數的執行結果都直接顯示在顯示器上,沒有其他執行結果。但 C 語言的程序員習慣上將 main 函數設計成返回一個整型值。當執行正常結束時返回0,非正常時返回其他值。
- 演進式架構(原書第2版)
- 黑客攻防從入門到精通(實戰秘笈版)
- 計算機圖形學編程(使用OpenGL和C++)(第2版)
- JavaScript:Functional Programming for JavaScript Developers
- Learning Data Mining with Python
- 軟件測試項目實戰之性能測試篇
- Vue.js 3.0源碼解析(微課視頻版)
- Raspberry Pi Robotic Projects(Third Edition)
- Kotlin Programming By Example
- Clojure High Performance Programming(Second Edition)
- Node.js應用開發
- Azure for Architects
- Cloud Development andDeployment with CloudBees
- Python程序設計案例教程:從入門到機器學習(微課版)
- Getting Started with Phalcon