所謂程序,就是一組計算機能識別和執行的指令.
每一條指令使計算機執行特定的操作.一個特定的指令序列,用來完成一定的功能.
計算機的本質是程序的機器,程序和指令是計算機系統中最基本的概念.
計算機能直接識別和接受的二進制代碼稱為機器指令(machine instruction),機器指令的集合就是該計算機的機器語言(machine language).為了克服機器語言的難學難寫難記難檢查難修改難推廣使用的缺點,人們創造出了符號語言(symbolic language),它用一些英文字母和數字表示一個指令.符號語言又稱為符號匯編語言(symbolic assembler language)或匯編語言(assembeler language).
匯編語言也稱為低級語言(low level language),現在使用高級語言(high level language).
計算機不能直接識別高級語言程序,需要用一種稱為編譯程序的軟件把用高級語言寫的程序(稱為源程序,source program)轉換為機器指令的程序(稱為目標程序,object program),然後讓計算機執行機器指令程序,最後得到結果.高級語言的一個語句往往對應金條機器指令.
C:系統描述語言,C++:支持面向對象程序設計的大型語言,Visual Basic:支持面向對象程序設計的語言,Java:適於網絡的語言
C語言的特點主要表現在具有多種數據類型(如字符,數值,數組,結構體和指針等).
C語言是一種用途廣泛,功能強大,使用靈活的過程性(procedural)編程語言,既可用於編寫應用軟件,又能用於編寫系統軟件.
C語言有以下一些主要特點:
(1)語言簡潔,緊湊,使用方便,靈活.C語言一共有37個關鍵字,9種控制語句,程序書寫形式自由,主要用小寫字母表示,壓縮了一切不必要的成分.實際上,C是一個很小的內核語言,只包括極少的與硬件有關的成分,C語言不直接提供輸入和輸出語句和有關文件操作的語句和動態內存管理的語句等(這些操作是由編譯系統所提供的庫函數來實現的),C的編譯系統 相當簡潔.
(2)運算符豐富.包括34種運算符,C語言把括號,賦值和強制類型轉換等都作為運算符處理,從而使C語言的運算類型極其豐富,表達式類型多樣化.
(3)數據類型豐富.C語言提供的數據類型包括:整形,浮點型,字符型,數據類型,指針類型,結構體類型和共用體類型等,C 99又擴充了復數浮點類型,超微乎其微整型(long long)和布爾類型(bool)等.尤其是指針類型數據,使用十分靈活和多樣化,能用來實現各種復雜的數據結構(如鏈表,樹,棧等)的運算.
(4)具有結構化的控制語句(如if…else語句,while語句,do…while語言句,switch語句和for語句).用函數作為程序的模塊單位,便於實現程序的模塊化.C語言是完全模塊化和結構化的語言.
(5)語法限制不太嚴格,程序設計自由度大.例如,對數組下標越界不進行檢查,由程序編寫者自己保證程序的正確.對變量的類型使用比較靈活,例如,整形量與字符型數據以及邏輯型數據可以通用.一般的高級語言語法檢查比較嚴,能檢查出幾乎所有的語法錯誤,而C語言允許編寫者有較大的自由度,因此放寬了語法檢查.
(6)C語言允許直接訪問物理地址,能進行位(bit)操作,能實現匯編語言的大部分功能,可以直接對硬件進行操作.因此C語言既具有高級語言的功能,又具有低級語言的許多功能,可用來編寫系統軟件.C語言的這種雙重性,使它既是成功的系統描述語言,又是通用程序設計語言.
(7)用C語言編寫的程序可移植性好.由於C的編譯系統相當簡潔,因此很容易移植到新的系統.而且C編譯系統在新的系統上運行時,可以直接編譯"標准鏈接庫"中的大部分功能,不需要修改源代碼,因為標准鏈接庫是用可移植的C語言寫的.因此,幾乎在所有的計算機系統中都可以使用C語言.
(8)生成目標代碼質量高,程序執行效率高.
目前C的主要用途之一是編寫"嵌入式系統程序".
例1.1要求在屏幕上輸出以下一行信息.
This is a C program.
解題思路:在主函數中用printf函數原樣輸出以上文字.
#include <stdio.h> //這是編譯預處理指令 int main() //定義主函數 { //函數開始的標志 printf("This is a C program.\n"); //輸出所指定的一行信息 return 0; //函數執行完畢時返回函數值0 } //函數結束的標志
程序第5行"return 0;"的作用是:當main函數執行結束前將整數0作為函數值,返回到調用函數處.
C 99建議把main函數指定為int型(整型),它要求函數帶回一個整數值.在main函數中,在執行的最後設置一個”return 0;”語句,當主函數正常結束時,得到的函數值為0,當執行main函數過程中出現異常或錯誤時,函數值為一個非0的整數.這個函數值是返回給調用main函數的操作系統的.程序員可以利用操作指令檢查main函數的返回值,從而判斷main函數是否已正常執行,並據此決定以後的操作.如果在程序中不寫"return 0;"語句,有的C編譯系統會在目標程序中自動加上這一語句,因此,主函數正常結束時,也能使函數值為0.為使程序規范和可移植性,希望寫的程序一律將main函數指定為int型,並在main函數的最後加一個"return 0;"語句.
每一個C語言程序都必須有一個main函數.函數體由花括號{}括起來.本例中printf是C編譯系統提供的函數庫中的輸出函數.\n是換行符,即在輸出後,顯示屏上的光標位置移到下一行的開頭.這個光標位置稱為輸出的當前位置,即下一個輸出的字符出現在此位置上.每個語句最後都有一個分號,表示語句結束.
在使用函數庫中的輸入輸出函數時,編譯系統要求程序提供有關此函數的信息(例如對這些輸入輸出函數的聲明和宏的定義,全局量的定義等).stdio.h是系統提供的一個文件名,stdio是"standard input & output"的縮寫,文件後綴.h的意思是頭文件(header file),因為這些文件都是放在程序各文件模塊的開頭的.輸入輸出函數的相關信息已事先放在stdio.h文件中.現在,用#include指令把這些信息調入供使用.
在程序中如要用到標准函數庫中的輸入輸出函數,應該在本文件模塊的開頭寫上下面一行:
#include <stdio.h>
在程序進行預編譯處理時將每個注釋替換為一個空格,因此在編譯時注釋部分不產生目標代碼,注釋對運行不起作用.
(1)以//開始的單行注釋.(2)以/*開始,以*/結束的塊式注釋.
在字符串中的//和/*都不作為注釋的開始,而是作為字符串的一部分.
例1.2 求兩個整數之和
解題思路:設置3個變量,a和b用來存放兩個整數,sum用來存放和數.用賦值運算符"="把相加的結果傳送給sum.
#include<stdio.h> int main() { int a,b,sum; a=123; b=456; sum=a+b; printf("sum is %d\n",sum); return 0; }
第8行輸出結果,這個printf函數圓括號內有兩個參數,一個是雙撇號中的內容sum is %d\n,它是輸出格式字符串,作用是輸出用戶希望輸出的字符和輸出的格式.其中%d是指定的輸出格式,d表示用"十進制整數"形式輸出.圓括號內第2個參數sum,表示要輸出變量sum的值.在執行printf函數時,將sum變量的值(以十進制整數表示)取代雙撇號中的%d.現在sum的值是579,所以在輸出時,十進制整數579取代了%d.
由於本程序正常運行和結束,因此main函數的返回值為0.
例1.3 求兩個整數中的較大者.
#include <stdio.h> #include <stdlib.h> //主函數 int main()//定義主函數 {//主函數體開始 int max(int x,int y);//對被調用函數max的聲明 int a,b,c;//定義變量a,b,c scanf("%d,%d",&a,&b);//輸入變量a和b的值 c=max(a,b);//調用max函數,將得到的值賦給c printf("max=%d\n",c);//輸出c的值 return 0;//返回函數值為0 }//主函數體結束 //求兩個整數中的較大者的max函數 int max(int x,int y)//定義max函數,函數值為整形,形式參數x和y為整形 { int z;//max函數中的聲明部分,定義本函數中用到的變量z為整形 if(x>y)z=x;//若x>y成立,將x的值賦給變量z else z=y;//否則(即y>x),將y的值賦給變量z. return (z);//將z的值作為max函數值,返回到調用max函數的位置 }
程序中需要對被調用函數max進行聲明,在主函數中要調用max函數,而max的定義卻在main函數之後,程序的編譯是自上而下執行的,在上面調用max時,編譯系統無法知道max是什麼,因而無法把它作為函數調用處理.為了使編譯系統能識別max函數,就要在調用max函數之前用"int max(int x,int y);"對max函數進行"聲明",所謂聲明,就是告訴編譯系統max是什麼,以及它的有關信息.
scanf後面括號裡包括兩個部分內容:一是雙撇號中的內容,它指定輸入的數據是按什麼格式輸入."%d"的含義是十進制整數形式.二是輸入的數據准備放到那裡,即賦給那個變量.
在C語言中"&"是地址符,&a的含義是"變量a的地址",&b是"變量b的地址".執行scanf函數,從鍵盤讀入兩個整數,送到變量a和b的地址處,然後把這兩個整數分別賦給變量a和b.
c=max(a,b);在調用max時將a和b作為max函數的實際參數,分別傳給max函數中的形式參數x和y,然後執行max函數的函數體,使max函數中的z得到一個值,return(z)的作用是把z的值作為max函數值帶回到主函數調用max函數的位置,取代max(a,b),然後所這個值賦給變量c.
注意:本例程序中兩個函數都有return語句.兩個函數都定義為整型,都有函數值,都需要用return語句作為函數指定返回值.但是main函數中的return語句指定的返回值一般為0,而max函數的返回值是求出的最大值,只有通過return語句才能把求出的z值作為函數的值並返回調用它的位置上.在函數中執行的語句並不會自動將值返回調用處,必須用reture語句指定半那個值作為函數值.也不能不加分析地在所有函數的最後都寫上"return 0".
1.4.2 C語言程序的結構
(1)一個程序由一個或多個源程序文件組成.
在一個源程序文件中可以包括3個部分: 1.預處理指定.如#include<stdio.h>指令,就是將stdio.h頭文件的內容讀進來,放在#include指令行,取代#include<stdio.h>. 2.全局聲明.即在函數之外進行數據聲明.如把”int a,b,sum”放到main函數的前面就是全局聲明,在函數外面聲明的變量稱為全局變量.如果是在程序開頭(定義函數之前)聲明的變量,則在整個源程序文件范圍內有效.在函數中聲明的變量是局部變量,只在函數范圍內有效. 3.函數定義.每個函數用來實現一定的功能,在調用這些函數時,會完成函數定義中指定的功能.
(2)函數是C程序的主要組成部分.程序的幾乎全部工作都是由各個函數分別完成的,函數是C程序的基本單位,每個函數都用來實現一個或幾個特定的功能.編寫C程序的工作就是編寫一個個函數.
一個C語言程序是由一個或多個函數組成的,其中必須包含一個main函數(且只能有一個main函數).
一個程序包含若干個源程序文件,每個源程序文件又包含若干個函數.一個源程序文件就是一個程序模塊,即將一個程序分成若干個程序模塊.
在進行編譯時是以源程序文件為對象進行的.
在程序中被調用的函數,可以是系統提供的庫函數(例如printf和scanf函數),也可以是用戶根據自己編制設計的函數.不同編譯系統所提供的庫函數個數和功能是不完全相同的.
(3)一個函數包括兩個部分. 1.函數首部.即函數的第一行,包括函數名,函數類型,函數屬性(形式參數)名,參數類型.
#include <stdio.h> #include <stdlib.h> int main() { int a,b,c,max; printf("please input a,b,c:\n"); scanf("%d,%d,%d,",&a,&b,&c); max=a; if(max<b) max=b; if(max<c) max=c; printf("the largest number is %d\n",max); return 0; }