內容來自慕課網,我的學習筆記。加上了mtianyan標籤標記知識點。程序員
C語言入門 -> Linux C語言編程基本原理與實踐 -> Linux C語言指針與內存 -> Linux C語言結構體編程
https://www.imooc.com/course/...小程序
C語言一經出現就以其功能豐富、表達能力強、靈活方便、應用面廣等特色迅速在全世界普及和推廣。C語言不但執行效率高並且可移植性好,能夠用來開發應用軟件、驅動、操做系統等。C語言也是其它衆多高級語言的鼻祖語言,因此說學習C語言是進入編程世界的必修課。數組
#include<stdio.h> int main() { /*在雙引號中間輸入Hello World*/ printf("Hello World"); return 0; }
注:在最新的C標準中,main函數前的類型爲int
而不是void
編輯器
簡單來講,一個C程序就是由若干頭文件
和函數
組成。函數
#include <stdio.h>
就是一條預處理命令, 它的做用是通知C語言編譯系統在對C程序進行正式編譯以前需作一些預處理工做。函數
就是實現代碼邏輯的一個小的單元。一個C程序有且只有一個主函數,即main
函數。學習
printf()
是格式輸出函數,這裏就記住它的功能就是在屏幕上輸出指定的信息 \n
是轉義字符中的換行符。(注意:C程序必定是從主函數開始執行的)
註釋是寫給程序員看的,不是寫給電腦看的。spa
C語言註釋方法有兩種:操作系統
多行註釋:/* 註釋內容 */
單行註釋:
//註釋一行
指針
C語言規定,標識符能夠是字母(A~Z,a~z)
、數字(0~9)
、下劃線_
組成的字符串,而且第一個字符必須是字母或下劃線。在使用標識符時還有注意如下幾點:
- 標識符的長度最好不要超過8位,由於在某些版本的C中規定標識符前8位有效,當兩個標識符前8位相同時,則被認爲是同一個標識符。
Imooc
和imooc
是兩個不一樣的標識符。變量就是能夠變化的量,而每一個變量都會有一個名字(標識符)。變量佔據內存中必定的存儲單元。使用變量以前必須先定義變量,要區分變量名和變量值是兩個不一樣的概念。
變量定義的通常形式爲:數據類型 變量名;多個類型相同的變量:數據類型 變量名, 變量名, 變量名...;
注意:在定義中不容許連續賦值,如int a=b=c=5;
是不合法的。
變量的賦值分爲兩種方式:
C語言中,數據類型可分爲:
最經常使用的整型, 實型與字符型(char,int,float,double):
整型數據是指不帶小數的數字(int,short int,long int, unsigned int, unsigned short int,unsigned long int):
注:
int
short int
long int
是根據編譯環境的不一樣,所取範圍不一樣。 short int
和long int
至少是表中所寫範圍, 可是int
在表中是以16位編譯環境寫的取值範圍。int
的取值範圍在於他佔用的字節數 ,不一樣的編譯器,規定是不同。int
是佔2個字節,TC是按ANSI標準的,它的int
是佔2個字節的。可是在VC裏,一個int
是佔4個字節的。浮點數據是指帶小數的數字。
生活中有不少信息適合使用浮點型數據來表示,好比:人的體重(單位:公斤)、商品價格、圓周率等等。
由於精度的不一樣又分爲3種(float,double,long double):
注:C語言中不存在字符串變量,字符串只能存在字符數組中,這個後面會講。
格式化輸出語句,也能夠說是佔位輸出,是將各類類型的數據按照格式化後的類型及指定的位置從計算機上顯示。
其格式爲:printf("輸出格式符",輸出項)
;
當輸出語句中包含普通字符時,能夠採用一下格式:
printf("普通字符輸出格式符", 輸出項);
注意:格式符的個數要與變量、常量或者表達式的個數一一對應
在程序執行過程當中,值不發生改變的量稱爲常量。
mtianyan: C語言的常量能夠分爲直接常量和符號常量。
直接常量也稱爲字面量,是能夠直接拿來使用,無需說明的量,好比:
在C語言中,能夠用一個標識符來表示一個常量,稱之爲符號常量。符號常量在使用以前必須先定義,其通常形式爲:
#define 標識符 常量值
#include <stdio.h> #define POCKETMONEY 10 //定義常量及常量值 int main() { // POCKETMONEY = 12; //小明私自增長零花錢對嗎? printf("小明今天又獲得%d元零花錢\n", POCKETMONEY); return 0; }
符號常量不能夠被改變。
數據類型存在自動轉換的狀況.
自動轉換髮生在不一樣數據類型運算時,在編譯的時候自動完成。
char
類型數據轉換爲int
類型數據遵循ASCII
碼中的對應值.
注:
字節小的能夠向字節大的自動轉換,但字節大的不能向字節小的自動轉換char能夠轉換爲int,int能夠轉換爲double,char能夠轉換爲double。可是不能夠反向。
強制類型轉換是經過定義類型轉換運算來實現的。其通常形式爲:
(數據類型) (表達式)
其做用是把表達式的運算結果強制轉換成類型說明符所表示的類型
在使用強制轉換時應注意如下問題:
(int)(x/2+y)
寫成(int)x/2+y
則成了把x
轉換成int
型以後再除2
再與y
相加了。C語言中運算符:
※ 算術運算符 ※ 賦值運算符 ※ 關係運算符 ※ 邏輯運算符 ※ 三目運算符
c語言基本運算符:
除法運算中注意:
若是相除的兩個數都是整數的話,則結果也爲整數, 小數部分省略,如8/3 = 2
;而兩數中有一個爲小數,結果則爲小數,如:
9.0/2 = 4.500000
。
mtianyan: 取餘運算中注意:
該運算只適合用 兩個整數進行取餘運算,如:10%3 = 1
;mtianyan: notes: 而10.0%3則是錯誤的;運算後的符號取決於被模數的符號,如
(-10)%3 = -1;
而10%(-3) = 1;
mtianyan: %%
表示這裏就是一個%
符.
注:C語言中沒有乘方這個運算符,也不能用×, ÷
等算術符號。
++
,其功能是使變量的值自增1--
,其功能是使變量值自減1。它們常用在循環中。自增自減運算符有如下幾種形式:
C語言中賦值運算符分爲簡單賦值運算符和複合賦值運算符
簡單賦值運算符=
號了,下面講一下複合賦值運算符:
複合賦值運算符就是在簡單賦值符=
以前加上其它運算符構成.
例如
+=、-=、*=、/=、%=
分析:定義整型變量a並賦值爲3,a += 5;
這個算式就等價於a = a+5;
將變量a和5相加以後再賦值給a
注意:複合運算符中運算符和等號之間是不存在空格的。
C語言中的關係運算符:
關係表達式的值是真
和假
,在C程序用整數1
和0
表示。
注意:>=, <=, ==, !=
這種符號之間不能存在空格。
C語言中的邏輯運算符:
邏輯運算的值也是有兩種分別爲真
和假
,C語言中用整型的1和0來表示。其求值規則以下:
&&
參與運算的兩個變量都爲真時,結果才爲真,不然爲假。例如:5>=5 && 7>5 ,運算結果爲真;
||
參與運算的兩個變量只要有一個爲真,結果就爲真。 兩個量都爲假時,結果爲假。例如:5>=5||5>8,運算結果爲真;
!
參與運算的變量爲真時,結果爲假;參與運算量爲假時,結果爲真。例如:!(5>8),運算結果爲真。
C語言中的三目運算符:?:
,其格式爲:
表達式1 ? 表達式2 : 表達式3;
執行過程是:
先判斷表達式1的值是否爲真,若是是真的話執行表達式2;若是是假的話執行表達式3。
#include <stdio.h> int main() { //定義小編兜裏的錢 double money =12.0 ; //定義打車回家的費用 double cost =11.5 ; printf("小編能不能打車回家呢:"); //輸出y小編就打車回家了,輸出n小編就不能打車回家 printf("%c\n",money>=cost?'y':'n' ); return 0; }
各類運算符號的順序:
優先級別爲1的優先級最高,優先級別爲10的優先級別最低。
C語言中的分支結構語句中的if條件
語句。
簡單if語句的基本結構以下:
if(表達式) { 執行代碼塊; }
其語義是:若是表達式的值爲真,則執行其後的語句,不然不執行該語句。
注意:if()
後面沒有分號,直接寫{}
簡單的if-else
語句的基本結構:
語義是: 若是表達式的值爲真,則執行代碼塊1,不然執行代碼塊2。
注意:
if()
後面沒有分號,直接寫{},else後面也沒有分號,直接寫{}
C語言中多重if-else
語句,其結構以下:
語義是:依次判斷表達式的值,當出現某個值爲真時,則執行對應代碼塊,不然執行代碼塊n。
注意:當某一條件爲真的時候,則不會向下執行該分支結構的其餘語句。
C語言中嵌套if-else
語句。嵌套if-else
語句的意思,就是在if-else
語句中,再寫if-else
語句。其通常形式爲:
反覆不停的執行某個動做就是江湖人稱的循環 。
C語言中有三種循環結構,先看一下C語言while循環的結構
其中表達式表示循環條件,執行代碼塊爲循環體。
while語句的語義是:計算表達式的值,當值爲
真(非0)
時, 執行循環體代碼塊。
{}
括起來,組成複合語句。C語言中的do-while
循環,通常形式以下:
do-while循環語句的語義是:
它先執行循環中的執行代碼塊,而後再判斷while中表達式是否爲真,若是爲真則繼續循環;若是爲假,則終止循環。所以, do-while循環至少要執行一次循環語句。
注意:mtianyan: 使用do-while
結構語句時,while括號後必須有分號。
c語言中for循環通常形式:
它的執行過程以下:
注意:for循環中的兩個分號必定要寫
在for循環中:
;
分開。使用for語句應該注意:
(;;)
不能缺省。num/100
能夠得到,由於 int
是整數型,小數部分會省略。好比 765/100
的結果是7
num%100/10
。好比765%100
先獲得65
,65/10
獲得6
num%10
。765%10
獲得5
while, do-while和for三種循環在具體的使用場合上是有區別的,以下:
- 在知道循環次數的狀況下更適合使用for循環;
在不知道循環次數的狀況下適合使用while或者do-while循環:
可是從本質上講,while,do-while和for循環之間是能夠相互轉換的。
多重循環就是在循環結構的循環體中又出現循環結構。
在實際開發中通常最多用到三層重循環。
由於循環層數越多,運行時間越長,程序越複雜,因此通常用2-3層多重循環就能夠了。另外不一樣循環之間也是能夠嵌套的。
多重循環在執行的過程當中,外層循環爲父循環,內層循環爲子循環,
父循環一次,子循環須要所有執行完,直到跳出循環。父循環再進入下一次,子循環繼續執行...
mtianyan: 打印三角形星星堆
#include <stdio.h> int main() { int i, j, k; for(i=1; i<5; i++) { /* 觀察每行的空格數量,補全循環條件 */ for(j=i; j<5; j++) { printf(" "); //輸出空格 } /* 觀察每行*號的數量,補全循環條件 */ for( k=0;k<2*i-1;k++) { printf("*"); //每行輸出的*號 } printf("\n"); //每次循環換行 } return 0; }
#include <stdio.h> int main() { // 定義相乘數字i,j以及結果result int i, j, result; for(i=9;i>=1;i--) { for(j=1;j<=i;j++) { printf("%d*%d=%d ",i,j,result=i*j); } printf("\n"); } return 0; }
那麼循環5次的時候,須要中斷不繼續訓練。在C語言中,可使用break
語句進行該操做.
使用break
語句時注意如下幾點:
- 在沒有循環結構的狀況下,break不能用在單獨的if-else語句中。
那麼循環5次的時候,須要中斷後繼續訓練。在C語言中,可使用continue
語句進行該操做
continue語句的做用是結束本次循環開始執行下一次循環。
break語句與continue語句的區別是:
break是跳出當前整個循環,continue是結束本次循環開始下一次循環。
switch語句結構以下:
mtianyan: switch
語句時還應注意如下幾點:
default
子句能夠省略不用。#include <stdio.h> int main() { /* 定義須要計算的日期 */ int date = 0; int year = 2008; int month = 8; int day = 8; switch(month) { case 12:date+=30; case 11:date+=31; case 10:date+=30; case 9:date+=31; case 8:date+=31; case 7:date+=30; case 6:date+=31; case 5:date+=30; case 4:date+=31; case 3: if((year%4==0&&year%100!=0)||year%400==0) { date+=29; } else { date+=28; } case 2: date+=31; case 1: date+=day; printf("%d年%d月%d日是該年的第%d天",year,month,day,date); break; default: printf("error"); break; } return 0; }
正確: continue只能用在循環體內
C語言中也有這樣的語句,就是goto
語句,goto語句是一種無條件分支語句.
goto 語句的使用格式爲:
goto 語句標號;
C語言提供了大量的庫函數: 好比stdio.h
提供輸出函數
自定義函數的通常形式:
注意:
[]
包含的內容能夠省略,數據類型說明省略,默認是 int
類型函數; 參數省略表示該函數是無參函數,參數不省略表示該函數是有參函數;main
函數以前,若是要放在main函數後面的話, 須要在main函數以前先聲明自定義函數,聲明格式爲:[數據類型說明] 函數名稱([參數]);
咱們須要用到自定義的函數的時候,就得調用它,那麼在調用的時候就稱之爲函數調用。
在C語言中,函數調用的通常形式爲:
函數名([參數]);
注意:
- 對無參函數調用的時候能夠將
[]
包含的省略。
[]
中能夠是常數,變量或其它構造類型數據及表達式,多個參數之間用逗號分隔。在函數中不須要函數參數的稱之爲無參函數,在函數中須要函數參數的稱之爲有參函數。
有參和無參函數的通常形式以下:
有參函數和無參函數的惟一區別在於:函數 ()
中多了一個參數列表。
函數的參數分爲形參和實參兩種。
就相似小明,說了的話而不實際行動;
就如小剛能實際行動起來。
函數的形參和實參具備如下特色:
函數調用結束返回主調函數後則不能再使用該形參變量。
不管實參是何種類型的量,在進行函數調用時,它們都必須具備 肯定的值,以便把這些值傳送給形參。所以應預先用賦值等辦法使實參得到肯定值。
函數的返回值是指函數被調用以後,執行函數體中的程序段所取得的並返回給主調函數的值。
函數的返回值要注意如下幾點:
return
語句返回主調函數。return語句的通常形式爲:
return 表達式 或者爲: return (表達式);
notes: 若是二者不一致,則以函數返回類型爲準,自動進行類型轉換。
void
。注意:
void
函數中能夠有執行代碼塊,可是不能有返回值.mtianyan:
void
函數中若是有return
語句,該語句只能起到結束函數運行的功能。其格式爲:return;
遞歸就是一個函數在它的函數體內調用它自身。
執行遞歸函數將反覆調用其自身,每調用一次就進入新的一層。
注意遞歸函數必須有結束條件
5的階乘這個例子進行一下剖析,看一看他的運算過程:
程序在計算5的階乘的時候,先執行遞推,當n=1或者n=0的時候返回1,再回推將計算並返回。由此能夠看出遞歸函數必須有結束條件。
遞歸函數特色:
一句話總結遞歸:自我調用且有完成狀態
任務
猴子第一天摘下N個桃子,當時就吃了一半,還不過癮,就又多吃了一個。次日又將剩下的桃子吃掉一半,又多吃了一個。之後天天都吃前一天剩下的一半零一個。到第10天在想吃的時候就剩一個桃子了,問第一天共摘下來多少個桃子?並反向打印天天所剩桃子數。
#include <stdio.h> int getPeachNumber(int n) { int num; if(n==10) { return 1; } else { num = (getPeachNumber(n+1)+1)*2; printf("第%d天所剩桃子%d個\n", n, num); } return num; } int main() { int num = getPeachNumber(1); printf("猴子第一天摘了:%d個桃子。\n", num); return 0; }
有5我的坐在一塊兒,問第5我的多少歲?他說比第4我的大2歲。問第4我的歲數,他說比第3我的大2歲。問第3我的,又說比第2人大兩歲。問第2我的,說比第1我的大兩歲。最後 問第1我的,他說是10歲。請問第5我的多大?
程序分析:
利用遞歸的方法,遞歸分爲回推和遞推兩個階段。要想知道第5我的歲數,需知道第4人的歲數,依次類推,推到第1人(10歲),再往回推。
#include <stdio.h> int dfs(int n) { return n == 1 ? 10 : dfs(n - 1) + 2; } int main() { printf("第5我的的年齡是%d歲", dfs(5)); return 0; }
C語言中的變量,按做用域範圍可分爲兩種,即局部變量和全局變量。
mtianyan: C語言根據變量的生存週期來劃分,能夠分爲靜態存儲方式和動態存儲方式。
C語言中存儲類別又分爲四類:
一、用關鍵字auto定義的變量爲自動變量,auto能夠省略,auto不寫則隱含定爲「自動存儲類別」,屬於動態存儲方式。如:
二、用static修飾的爲靜態變量,若是定義在函數內部的,稱之爲靜態局部變量;若是定義在函數外部,稱之爲靜態外部變量。以下爲靜態局部變量:
注意:靜態局部變量屬於靜態存儲類別,在靜態存儲區內分配存儲單元,在程序整個運行期間都不釋放;靜態局部變量在編譯時賦初值,即只賦初值一次;若是在定義局部變量時不賦初值的話,則對靜態局部變量來講,編譯時自動賦初值0(對數值型變量)或空字符(對字符變量)。
三、爲了提升效率,C語言容許將局部變量得值放在CPU中的寄存器中,這種變量叫「寄存器變量」,用關鍵字register做聲明。例如:
mtianyan: 注意:只有局部自動變量和形式參數能夠做爲寄存器變量;一個計算機系統中的寄存器數目有限,不能定義任意多個寄存器變量;局部靜態變量不能定義爲寄存器變量。
四、用extern聲明的的變量是外部變量,外部變量的意義是某函數能夠調用在該函數以後定義的變量。如:
靜態變量只賦值一次
hello.c
#include <stdio.h> #include "test.c" //引用test.c文件 extern void printLine() //這裏定義的方法對嗎? { printf("**************\n"); } int main() { say(); return 0; }
test.c
#include <stdio.h> void printLine(); static void say(){ printLine(); printf("I love imooc\n"); printf("good good study!\n"); printf("day day up!\n"); printLine(); }
對於hello.c來講,直接引入了test.c文件。那麼就能夠調用testc中的static方法say()
而對於test.c並無引入,能夠經過聲明來調用另外一個源文件中暴露出來的方法。
北京市出租車打車計費規則以下:
小明天天上下班都要打車,公司和家的距離爲12千米,上午上班時間爲9點,下午下班時間爲6點。
請編寫一個小程序計算小明天天打車的總費用。
#include <stdio.h> float taxifee(int clock,int miles) { float money; if(miles<=3) { money=14; printf("費用爲14\n"); } else { if(clock>=23 || clock<5) { money=13+1+2.3*(miles-3)*1.2; printf("夜間車費爲:%f\n",money); } else { money=13+1+2.3*(miles-3); printf("日間車費爲:%f\n",money); } } return money; } int main() { printf("打的總費用:%.1f\n",taxifee(9,12)+taxifee(18,12)); return 0; }
程序中也須要容器,只不過該容器有點特殊,它在程序中是一塊連續的,大小固定而且裏面的數據類型一致的內存空間,它還有個好聽的名字叫數組。能夠將數組理解爲大小固定,所放物品爲同類的一個購物袋,在該購
物袋中的物品是按必定順序放置的。
咱們來看一下如何聲明一個數組:
數據類型 數組名稱[長度];
數組只聲明也不行啊,看一下數組是如何初始化的。說到初始化,C語言中的數組初始化是有三種形式的,分別是:
咱們將數據放到數組中以後又如何獲取數組中的元素呢?
獲取數組元素時: 數組名稱[元素所對應下標];
如:初始化一個數組 int arr[3] = {1,2,3};
那麼arr[0]就是元素1。
注意:
數組就能夠採用循環的方式將每一個元素遍歷出來,而不用人爲的每次獲取指定某個位置上的元素,例如咱們用for循環遍歷一個數組:
注意如下幾點:
因爲C語言是沒有檢查數組長度改變或者數組越界的這個機制,可能會在編輯器中編譯並經過,可是結果就不能確定了,所以仍是不要越界或者改變數組的長度
c語言獲取數組長度
int length = sizeof(arr)/sizeof(arr[0]);
數組能夠由整個數組看成函數的參數,也能夠由數組中的某個元素看成函數的參數:
數組做爲函數參數時注意如下事項:
以升序排序爲例冒泡排序的思想:相鄰元素兩兩比較,將較大的數字放在後面,直到將全部數字所有排序。就像小學排隊時按大小個排同樣,將一個同窗拉出來和後面的比比,若是高就放後面,一直把隊伍排好。
#include <stdio.h> int main() { double arr[]={1.78, 1.77, 1.82, 1.79, 1.85, 1.75, 1.86, 1.77, 1.81, 1.80}; int i,j; printf("\n************排隊前*************\n"); for(i=0;i<10;i++) { if(i != 9) printf("%1.2f, ", arr[i]); //%1.2f表示小數點前一位,小數點後精確到兩位 else printf("%1.2f", arr[i]); //%1.2f表示小數點前一位,小數點後精確到兩位 } for(i=8; i>=0; i--) { for(j=0;j<=i;j++) { if( arr[j]>arr[j+1]) //當前面的數比後面的數大時 { double temp; //定義臨時變量temp temp=arr[j];//將前面的數賦值給temp arr[j]=arr[j+1]; //先後之數顛倒位置 arr[j+1]=temp;//將較大的數放在後面 } } } printf("\n************排隊後*************\n"); for(i=0;i<10;i++) { if(i != 9) printf("%1.2f, ", arr[i]); //%1.2f表示小數點前一位,小數點後精確到兩位 else printf("%1.2f", arr[i]); //%1.2f表示小數點前一位,小數點後精確到兩位 } return 0; }
當咱們購物以後,拎着購物袋回到家,會一一檢查購物袋中的物品看是否缺乏或者都是想購之物。
那麼應用到程序中,可使用數組查找功能,看看是否存在該數據,若是存在並返回該元素的下標。
#include <stdio.h> int getIndex(int arr[5],int value) { int i; int index; for(i=0;i<5;i++) { /* 請完善數組查詢功能 */ if(arr[i]==value) { index=i; break; } index=-1; } return index; } int main() { int arr[5]={3,12,9,8,6}; int value = 8; int index = getIndex(arr,value); //這裏應該傳什麼參數呢? if(index!=-1) { printf("%d在數組中存在,下標爲:%d\n",value,index); } else { printf("%d在數組中不存在。\n",value); } return 0; }
C語言中,是沒有辦法直接定義字符串數據類型的,可是咱們可使用數組來定義咱們所要的字符串。通常有如下兩種格式:
注意:
在輸出字符串的時候要使用:printf(「%s」,字符數組名字);
或者puts(字符數組名字)
;。
經常使用的字符串函數以下(strlen,strcmp,strcpy,strcat,atoi):
使用字符串函數注意如下事項:
多維數組的定義格式是:
數據類型 數組名稱常量表達式1...[常量表達式n];
定義了一個名稱爲num,數據類型爲int的二維數組。其中第一個[3]表示第一維下標的長度,就像購物時分類存放的購物;第二個[3]表示第二維下標的長度,就像每一個購物袋中的元素。
多維數組的初始化與一維數組的初始化相似也是分兩種:
多維數組初始化要注意如下事項:
二維數組定義的時候,能夠不指定行的數量,可是必須指定列的數量
二維數組定義的時候,能夠不指定行的數量,可是必須指定列的數量。
多維數組也是存在遍歷的,和一維數組遍歷同樣,也是須要用到循環。不同的就是多維數組須要採用嵌套循環
注意:多維數組的每一維下標均不能越界
#include <stdio.h> #define N 10 //打印分數 void printScore(int score[]) { int i; printf("\n"); for(i=0;i<N;i++) { printf("%d ",score[i]); } printf("\n"); } //計算考試總分 int getTotalScore(int score[]) { int sum = 0; int i; for(i=0;i<N;i++) { sum+=score[i]; } return sum; } //計算平均分 int getAvgScore(int score[]) { return getTotalScore(score)/N; } //計算最高分 int getMax(int score[]) { int max = -1; int i; for(i=0;i<N;i++) { if(score[i]>max) { max = score[i]; } } return max; } //計算最低分 int getMin(int score[]) { int min =100; int i; for(i=0;i<N;i++) { if(score[i]< min) { min = score[i]; } } return min; } //分數降序排序 void sort(int score[]) { int i,j; for(i=N-2;i>=0;i--) { for(j=0;j<=i;j++) { if(score[j]<score[j+1]) { int temp; temp = score[j]; score[j] = score[j+1]; score[j+1]=temp; } } } printScore(score); } int main() { int score[N]={67,98,75,63,82,79,81,91,66,84}; int sum,avg,max,min; sum = getTotalScore(score); avg = getAvgScore(score); max = getMax(score); min = getMin(score); printf("總分是:%d\n",sum); printf("平均分是:%d\n",avg); printf("最高分是:%d\n",max); printf("最低分是:%d\n",min); printf("----------成績排名---------\n"); sort(score); return 0; }