




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言程序設計任務式教程(微課版)
VisualC++1計算機工程學院模塊3數組與字符串任務1一維數組任務2二維數組任務3字符與字符串2計算機工程學院
任務1一維數組
學習目標了解一維數組基本概念;掌握數組類型變量的定義與引用;掌握數組元素的引用;領會一維數組元素的查找、排序、刪除、修改和統計等算法。
3計算機工程學院案例一競賽成績的錄入和輸出
1.問題描述錄入10名學生的計算機課程的競賽成績并輸出。
1.1.1案例講解4計算機工程學院2.編程分析
一維數組中的數組元素是排成一行的一組下標變量,用一個統一的數組名來標識,用下標來指示其在數組中的具體位置。下標從0開始排列。一維數組通常是和一重循環相配合,對數組元素依次進行處理。
5a0a1a2a3a4a5a6a7a8a9計算機工程學院3.編寫源程序
/*EX3_1.C*/#include<stdio.h>voidmain(){intintArray[10],intI; printf("請輸入十個數:\n"); for(intI=0;intI<10;intI++) scanf("%d",&intArray[intI]);for(intI=0;intI<10;intI++) printf("%4d",intArray[intI]); }6計算機工程學院4.運行結果
圖3-1案例1運行結果7計算機工程學院5.歸納分析
數組是一些具有相同數據類型的數組元素的有序集合。數組中的每一個元素(即每個成員、也可稱為下標變量)具有同一個名稱,不同的下標,每個數組元素可以作為單個變量來使用。在數組元素引用時應注意以下幾點:
(1)引用時只能對數組中元素引用,而不能對整個數組引用。如【EX3_1】中的a。(2)在引用數組元素時,下標可以是整型常數、已賦值的變量或含變量的表達式。如【EX3_1】中intArray[intI]的下標intI就是已賦值的變量。(3)由于數組元素本身可看作同一類型的單個變量,因此,對變量的各種操作也都適用于數組元8計算機工程學院素。如例【EX3_1】中對數組元素intArray[intI]的賦值操作和輸出操作(4)引用數組元素時,下標上限(即最大值)不能超界。也就是說,若數組含有n個元素,下標的最大值為n-1,(因下標從0開始);若超出界限,C編譯程序并不給出錯誤信息(即其不檢查數組是否超界),程序仍可以運行,但可能會改變該數組以外其它變量或其它數組元素的值,由此會造成不正確的結果。如【EX3_1】,若誤將第一個for語句中的intI<10寫成intI<=10,就會出現下標超界現象。9計算機工程學院案例二競賽成績的計算
1.問題描述已錄入10名學生的計算機課程的競賽成績,計算競賽成績的最高分,最低分和平均分。10計算機工程學院2.編程分析先假設最高分和最低分初值為第1個學生的成績,然后比較10次,如果有比當前最高分還大的元素,它就替代當前最高分,如果有比當前最低分還小的元素,它就替代當前最低分。并累加各元素的值,最后輸出結果。11計算機工程學院3.編寫源程序
/*EX3_2.C*/#include<stdio.h>voidmain(){intintArray[10]={90,88,86,84,82,80,78,76,74,72};/*為了簡單起見用初始化*/intintI,intSum,intMax,intMin;intSum=0;intMax=intMin=intArray[0];/*最高分最低分初值為第0個元素*/for(intI=0;intI<10;intI++)12計算機工程學院{if(intArray[intI]>intMax)
intMax=intArray[intI];/*如果有比當前最高分還大的元素,它就替代當前最高分*/ if(intArray[intI]<intMin)intMin=intArray[intI];/*如果有比當前低分還小的元素,它就替代當前低分*/ intSum+=intArray[intI];/*累加各元素的值*/ } printf("最高分=%d最低分=%d平均分=%d\n",intMax,intMin,intSum/10); }
13計算機工程學院4.運行結果如圖3-2所示。圖3-2案例2運行結果14計算機工程學院5.歸納分析數組元素是從intArray[0]到intArray[9],千萬不要試圖使用for(intI=1;intI<=10;intI++),因為這樣會引用intArray[10],而這個元素是不存在的。15計算機工程學院案例三競賽成績的排序
1.問題描述對已知的10個學生的計算機課程的競賽成績從小到大排序,并把排序好的成績輸出。16計算機工程學院2.編程分析
選擇法排序是從待排序數列中,每次選出一個最小的數,和相應位置上的元素交換。第一次選最小的元素放到第一個位置,第二次選次小的元素放到第二個位置,如此類推就能產生一個有序序列。
排序方法:快速排序,選擇排序,插入排序,冒泡排序,堆排序,歸并排序,基數排序17計算機工程學院3.編寫源程序/*EX3_3.C*/#include<stdio.h>#defineNUMBER10/*定義數列元素個數*/#include<conio.h>voidmain(){/*初始化數組*/intintArray[NUMBER]={90,88,86,84,82,80,78,76,74,72};intintI,intJ,intK,intTemp;18計算機工程學院printf("排序前數組\n");for(intI=0;intI<NUMBER;intI++)printf("%3d",intArray[intI]);/*打印排序前數組*/for(intI=0;intI<NUMBER;intI++)
{/*第intI次排序*/intK=intI;/*記錄當前位置的下標。第一次選擇排序時,intK=0,當前位置是intArray[0]*/for(intJ=intI+1;intJ<NUMBER;intJ++)if(intArray[intJ]<intArray[k])intK=intJ;/*某次排序時,如果有任何一個值intArray[intJ]小于當前位置值intArray[k],則intK下標指定這個intJ,intArray[intK]仍是這次排序中的最小值*/
if(intI!=intK)19計算機工程學院{intTemp=intArray[intI];intArray[intI]=intArray[intK];intArray[intK]=intTemp;/*若最小值不在位置intI,則交換intArray[intI]和intArray[intK],交換前array[intK]是本次排序中的最小元素,intArray[intI]是當前比較位置*/
}}printf("\n輸出排序后結果\n");for(intI=0;intI<NUMBER;intI++)
printf("%3d",intArray[intI]);
/*輸出排序后結果*/getchar(); }20計算機工程學院4.運行結果圖3-3案例3運行結果21計算機工程學院5.歸納分析
如果待排序數列存放在數組intArray中,那么:第一次排序時,先假定最小的數是intArray[0]。然后將它依次和第1個元素到第NUMBER-1個元素比較,找出它們中的最小值。將最小值和intArray[0]交換。如果intArray[0]本身最小就不用交換。第二次排序時,intArray[0]已經是最小值了,所以這次找出次小值。取出第2到第NUMBER-1個元素中最小值和intArray[1]交換。這時intArray[1]上是次小值第三次排序就是取出第3個到第NUMBER-1個元素中的最小值和intArray[2]交換。22計算機工程學院
array[2]是第三小值。排序過程如下。粗斜體字表示本次排序中參于交換的兩個數。次數a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]初始9088868482807876747217288868482807876749027274868482807876889037274768482807886889047274767882808486889057274767880828486889023計算機工程學院案例四新隊員招錄
1.問題描述
有一只足球隊只有10名隊員,并按身高排好序,現又招錄一名新的隊員,組成一只完整的足球隊,并把重新排好序的隊員按身高由高到低輸出。24計算機工程學院2.編程分析為了把一個數按大小插入已排好序的數組中,則可把欲插入的數與數組中各數逐個比較,當找到第一個比插入數小的元素intI時,該元素之前即為插入位置。然后從數組最后一個元素開始到該元素為止,逐個后移一個單元。最后把插入數賦予元素intI即可。如果被插入數比所有的元素值都小則插入最后位置。25計算機工程學院3.編寫源程序
/*EX3_4.C*/
#include<stdio.h>
voidmain()
{
intintI,intJ,intP,intS;
float
floatArr[11]={2.07f,2.03f,1.96f,1.94f,1.85f,1.78f,1.76f,1.70f,
1.69f,1.68f},floatQ,floatN;
for(intI=0;intI<10;intI++)
{
intP=intI;
26計算機工程學院floatQ=floatArr[intI];for(intJ=intI+1;intJ<10;intJ++)if(floatQ<floatArr[intJ]){intP=intJ;floatQ=floatArr[intJ];}if(intP!=intI){intS=floatArr[intI]; floatArr[intI]=floatArr[intP]; floatArr[intP]=intS;}27計算機工程學院printf("%8.2f",floatArr[intI]);}printf("\n輸入新招錄隊員的身高\n");scanf("%f",&floatN);for(intI=0;intI<10;intI++)if(floatN>floatArr[intI])
{
for(intS=9;intS>=intI;intS--)
floatArr[intS+1]=floatArr[intS];
break;
}28計算機工程學院floatArr[intI]=floatN;printf("\n重新排好序的隊員按身高由高到低輸出\n");for(intI=0;intI<=10;intI++)
printf("%8.2f",floatArr[intI]);printf("\n");}29計算機工程學院4.運行結果如圖3-4所示。圖3-4案例4運行結果5.歸納分析
本程序首先對數組floatArr中的10個數從大到小排序并30計算機工程學院輸出排序結果。然后輸入要插入的身高floatN。再用一個for語句把floatN和數組元素逐個比較,如果發現有floatN>floatArr[intI]時,則由一個內循環把intI以下各元素值順次后移一個單元。后移應從后向前進行(從floatArr[9]開始到floatArr[intI]為止)。后移結束跳出外循環。插入點為intI,把floatN賦予floatArr[intI]即可。如所有的元素均大于被插入數,則并未進行過后移工作。此時intI=10,結果是把n賦于floatArr[10]。最后一個循環輸出插入數后的數組各元素值。程序運行時,輸入數1.77。從結果中可以看出1.77已插入到1.78和1.76之間。31計算機工程學院1.一維數組的的引入
我們先看一個例子,理解引入數組的必要性。此例需要編程讀入一系列學生的成績,然后求最高分,最低分。首先寫一串語句讀入學生成績,放到一系列變量中:
printf(“請輸入成績一\n”);scanf(“%d”,&grade1);printf(“請輸入成績二\n”);scanf(“%d”,&grade2);
3.1.2基礎理論
32計算機工程學院
然后是求最高分最低分的過程,只要寫一系列的if語句,比較輸入的成績值:
if(grade1>grade2)if(grade1>grade3)......只要有足夠的耐心,最終會得出最高成績和最低成績。如果有10個學生的成績需要處理,if
語句的個數和輸入輸出語句的個數必然超過十句。程序即使正確也非常復雜。我們如果用數組,情況就將不同。
33計算機工程學院在C語言中,我們可以定義一個名叫grades的變量,它不代表一個單一的成績值,而是代表整個成績組。組中的每一個元素都可以由一個被稱為索引或者下標的數字來標明。在數學概念里,下標變量xi是指集合x的i個元素,在C語言中,等價表示為x[i]。同樣grades[5]表示在grades的數組里的第五號元素。單獨數組元素的使用方法和任何正常變量一樣。比如我們可以將一個數組元素值賦給另一個變量:
34計算機工程學院
myg=grades[50]這一語句將grades數組中下標為50的元素的值賦給變量myg。如果再一般化一點,i是一個整型變量,那么語句
myg=grades[i];將數組中的第i號元素賦給myg。數組元素當然也可以放在等號左邊。比如
grades[i]=myg;把myg的值存入到元素grades[i]。35計算機工程學院
用單一的數組代表有關數據項集合,使我們能開發簡明而有效的程序。例如通過改變下標變量的值,我們可以非常容易地訪問數組中所有元素。一組學生成績可以用下面的語句來輸入:
for(i=0;i<100;i++){printf(“請輸入第%d個成績:”,i);scanf(“%d”,&grades[i]);}
36計算機工程學院如果要求出所有學生的總成績可以這樣寫:
for(i=0;i<100;i++)sum=sum+grades[i];這段代碼順序訪問grades數組的前100個元素(0-99),并將每個元素值加到sum中。如果sum的初值為0,循環結束后sum中存放的就是前100個數組元素之和。由此可見,使用數組大大簡化了處理同一數據集合的程序。下面將介紹數組的具體使用方法。
37計算機工程學院
數組是一些具有相同數據類型的數組元素的有序集合。數組中的每一個元素(即每個成員、也可稱為下標變量)具有同一個名稱,不同的下標,每個數組元素可以作為單個變量來使用。
數組可分為一維數組和多維數組(如二維數組、三維數組…)。數組的維數取決于數組元素的下標個數,即一維數組的每一個元素只有一個下標,二維數組的每一個元素均有二個下標,三維數組的每一個元素都有三個下標,以此類推。38計算機工程學院2.一維數組的說明、引用
(1)一維數組的定義在C語言中,變量必須先定義,后使用。數組也是如此,使用數組時必須先定義,后引用。定義一維數組的一般形式為:
類型標識符數組名[常量表達式];其中類型標識符是數組中數組元素的數據類型。39計算機工程學院數組名是用戶定義的數組標識符。方括號中的常量表達式表示數據元素的個數,也稱為數組的長度。例如:
inta[10];
說明整型數組a,有10個元素。
floatb[10],c[20];
說明實型數組b,有10個元素,實型數組c,有20個元素。
charch[20];
說明字符數組ch,有20個元素。40計算機工程學院
(2)一維數組元素的引用數組不能整體使用,只能逐個引用數組元素。數組元素的一般引用形式為:
數組名[下標]下標可以是整型常數、整型變量和整型表達式,其起始值為0。例如a[2+1]表示數組a中的第四個元素,a[i+j]表示數組a中的第i+j+1個元素(i和j為整型變量)。在引用時應注意下標的值不要超過數組的范圍。數組的下標的最大值為數組的長度-1。41計算機工程學院3.一維數組的初始化所謂數組的初始化,就是指在定義數組的同時對數組的各個元素賦初值。
(1)全部元素的初始化
格式:數據類型
數組名[數組長度]={數組元素值表}“數組元素值表”是用逗號分隔的各數組元素的初值。例如:
42計算機工程學院inta[6]={10,20,30,40,50,60};表示a數組共有6個數組元素。
floatr[]={12.5,-3.11,8.6};表示r數組共有3個實型元素。
(2)部分元素的初始化格式:數據類型
數組名[數組長度]={數組部分元素值表}例如:
intb[10]={1,2,3};表示b數組共有3個整型元素。43計算機工程學院(3)一維數組的存儲任何一個一維數組在內存中都占用一段連續的空間,依次存儲它的各元素的值。元素占用的字節數由數組的數據類型決定。例如int型數組a的每個元素占2字節,6個元素占12個字節。44計算機工程學院上述數組a的存儲情況如圖3-5所示圖3-5數組a的存儲情況數組a→10a[0]20a[1]30a[2]40a[3]50a[4]60a[5]45計算機工程學院我們通過一個實例來說明數組的存放形式和使用方法。如果有語句序列:
intvalues[10];values[0]=197;values[2]=-100;values[5]=350;values[3]=values[0]+values[5];values[9]=values[5]/10;--values[2];語句執行后,數組values[]的存儲情況如表3-146計算機工程學院表3-1數組values[]執行代碼前后的內容數組元素執行前的值執行前的值values[0]隨機值197values[0]隨機值隨機值values[0]隨機值-101values[0]隨機值547values[0]隨機值隨機值values[0]隨機值350values[0]隨機值隨機值values[0]隨機值隨機值values[0]隨機值隨機值values[0]隨機值3547計算機工程學院從這段程序可以看出:數組元素和普通變量一樣能使用單目運算符;說明一個數組后,如果不初始化,數組元素的值是隨機值,存取未經初始化的數組元素是沒有意義的。比如存取values[1]就沒有意義。48計算機工程學院【實驗3-1】對已知的十個元素,求其最大元素,并把最大元素和所在位置輸出。(1)編程分析①假設首元素為最大值元素,用max標識。②將其余元素依次與max比較,并將大值保存在max中,將大值元素下標保存在m中。③輸出max和m。
3.1.3技能訓練
49計算機工程學院(2)編寫源程序
/*EX3_5.C*/#include"stdio.h"#defineN10voidmain(){inta[N]={20,9,10,-16,-9,18,96,7,11,33};inti,max=a[0],m=0;for(i=1;i<N;i++)if(max<a[i])50計算機工程學院
{max=a[i];m=i;}printf("max=%d,為第%d個元素\n",max,m+1); }(3)在VC++集成環境中輸入上述程序,文件存成EX3_5.C。如圖3-6所示。圖3-6運行結果51計算機工程學院【實驗3-2】數據分類問題。定義一個長度是20的一維數組b,依次對數組a中元素進行掃描,將負數在b中由前到后存儲,將其他數據在b中由后向前存儲。最終b存儲的是分類后的數據。(1)編程分析①定義一個長度為20的一維數組a。②用鍵盤向一維數組輸入20個整數,并依次輸出這20個數據。③對數據分類。④輸出分類后的數據。
52計算機工程學院(2)編寫源程序
/*EX3_6.C*/#include"stdio.h"#defineN20voidmain(){inta[N],b[N],i,j=0,k=N-1;printf("請輸入數據:\n");for(i=0;i<N;i++)scanf("%d",&a[i]);53計算機工程學院
for(i=0;i<N;i++){printf("%d",a[i]);if(a[i]<0)b[j++]=a[i];/*將負數放在b的前部*/elseb[k--]=a[i];}/*將其他數放在b的后部*/printf("\n");for(i=0;i<N;i++)printf("%d",b[i]); }54計算機工程學院(3)在VC++集成環境中輸入上述程序,文件存成EX3_6.C.如圖3-7所示。①調試程序時通常先將N定義為一個小數值,當程序調試成功后再將N定義為常數20,這樣可以提高程序的調試效率②在設計調試用數據時,應考慮各種數據情況,以便提高程序的可靠性。圖3-7運行結果55計算機工程學院【練習】有15個數按由小到大順序存放在一個數組中,輸入一個數,要求用折半查找法找出該數是數組中第幾個元素的值。如果該數不在數組中,則打印出“無此數”。
3.1.4拓展與練習
56計算機工程學院(1)編程分析折半查找是一種高效的查找方法,它必須在一個有序的數列中進行,基本原理如下:設數列已升序排序,存儲在數組a中,對在查找范圍內的數據設置3個特殊點,首位置為top,末位置為bot,中間位置為mid=(top+bot)/2,查找過程為:①比較x與a[mid],若x=a[mid],查找成功,結束;否則,若x>a[mid],則top=mid+1;若x<a[mid],則bot=mid-1。
57計算機工程學院②若top>bot,則查找失敗,結束;否則轉①。如下是在數列{3,6,7,8,21,23,36,38,67,69,80,82,85,88,96}中查找69時,top、bot、mid的變化情況:圖3-8折半查找法
58計算機工程學院(2)編寫源程序
/*EX3_7.C*/#include"stdio.h"#defineN15main(){inta[N],i,x,top,bot,mid;printf("輸入從小到大排好序的15個數");for(i=0;i<N;i++)/*建立升序數組a,用于折半查找*/scanf("%d",&a[i]);printf("輸入要查找的數");scanf("%d",&x);/*輸入要查找的數值*/59計算機工程學院
top=0;/*設置初始查找邊界*/bot=N-1;do{mid=(top+bot)/2;/*確定中間位置*/if(a[mid]==x)break;/*找到x后終止循環*/elseif(a[mid]<x)top=mid+1;/*確定后半段為下一次查找的范圍*/elsebot=mid-1;/*確定前半段為下一次查找的范圍*/60計算機工程學院}while(bop<top); if(bot<top) printf(“%d:無此數\n”,x); else printf(“成功查找到該數a[%d]是%d.\n”,mid,x);}計算機工程學院(3)在VC++集成環境中輸入上述程序,文件存成EX3_7.程序運行結果如圖3-9所示。圖3-9運行結果62計算機工程學院1.編程規范
(1)數組名的書寫規則應符合標識符的書寫規定。數組名不能與其它變量名相同。
3.1.5編程規范與常見錯誤
63計算機工程學院例如:
main(){inta;floata[10];……}變量名與數組名重名是錯誤的。64計算機工程學院2.常見錯誤
(1)數組下標從0開始計算,如a[5]表示數組a有5個元素。分別為a[0],a[1],a[2],a[3],a[4]。(2)定義數組時,數組長度值不能為變量。例如:#defineFD5main(){inta[3+2],b[7+FD];……}是合法的。
65計算機工程學院
但是下述說明方式是錯誤的。
main(){intn=5;inta[n];……}
(3)允許在同一個類型說明中,說明多個數組和多個變量。
例如:
inta,b,c,d,k1[10],k2[20];66計算機工程學院數組的類型實際上是指數組元素的取值類型。對于同一個數組,其所有元素的數據類型都是相同的。(4)C語言規定,在對數組進行定義或對數組元素進行引用時必須要用方括號(對二維數組或多維數組的每一維數據都必須分別用方括號括起來),例如以下寫法都將造成編譯時出錯:inta(10);intb[5,4];
printf(″%d\n″,b[1+2,2]);
67計算機工程學院一維數組的說明、引用
一維數組的定義在C語言中,變量必須先定義,后使用。數組也是如此,使用數組時必須先定義,后引用。定義一維數組的一般形式為:
類型標識符數組名[常量表達式];其中類型標識符是數組中數組元素的數據類型。計算機工程學院
任務2二維數組
學習目標了解二維數組的基本概念、掌握數組類型變量的定義與引用、掌握數組元素的引用。69計算機工程學院案例一案例講解
1.問題描述以矩陣格式輸出一個二維數組,數組的主對角線上的元素賦值為l,其他元素賦初值為0。3.2.1案例講解70計算機工程學院2.編程分析如果有一個一維數組,它的每一個元素是類型相同的一維數組時,就形成一個二維數組。我們可以把二維數組看作是一種特殊的一維數組:它的元素又是一個一維數組。
例如:int
intArr[3][4];可以把a看作是一個一維數組,它有三個元素:intArr[0]、intArr[1]、intArr[2],每個元素又是一個包含4個元素的一維數組。可以把intArr[0]、intArr[1]、intArr[2]看作是一維數組的名字。71計算機工程學院3.編寫源程序/*EX3_8.C*/voidmain(){intintArr[6][6],intI,intJ;for(intI=1;intI<6;intI++)for(intJ=1;intJ<6;intJ++)
intArr[intI][intJ]=(intI/intJ)*(intJ/intI);for(intI=1;intI<6;intI++){72計算機工程學院
for(intJ=1;intJ<6;intJ++)printf("%2d",intArr[intI][intJ]);printf("\n");}}4.運行結果如圖3-10所示。73圖3-10案例1運行結果計算機工程學院5.歸納分析
與一維數組元素引用相同,任何二維數組元素的引用都可以看成一個變量的使用,可以被賦值,可以參與組成表達式,也可輸入輸出。但要注意,其下標取值應限定在數組大小范圍內,不能超界使用。74計算機工程學院案例二兩個矩陣的和
1.問題描述有矩陣a和b如下圖所示,求它們的和矩陣c兩個M×N階的矩陣a、b,其和矩陣也是一個M×N
階的矩陣c。75計算機工程學院2.編程分析求和公式如下:
c[i][j]=a[i][j]+b[i][j]
3.編寫源程序76計算機工程學院/*EX3_9.C*/#include<stdio.h>#defineM3#defineN2voidmain(){intintArra[M][N]={9,-16,6,21,25,18};/*數組a初始化*/intintArrb[M][N]={16,89,26,-27,36,81};/*數組b初始化*/intintI,intJ,intArrc[M][N];for(intI=0;intI<M;intI++)for(intJ=0;intJ<N;intJ++)77計算機工程學院intArrc[intI][intJ]=intArra[intI][intJ]+intArrb[intI][intJ];/*生成c數組*/for(intI=0;intI<M;intI++)/*輸出a、b、c三個數組*/{for(intJ=0;intJ<N;intJ++)/*輸出a數組的第intI行*/printf("%5d",intArra[intI][intJ]);printf("");for(intJ=0;intJ<N;intJ++)/*輸出b數組的第intI行*/printf("%5d",intArrb[intI][intJ]);printf("");for(intJ=0;intJ<N;intJ++)/*輸出c數組的第intI行*/printf("%5d",intArrc[intI][intJ]);printf("\n");}}78計算機工程學院4.運行結果如圖3-11所示。79圖3-11案例2運行結果計算機工程學院5.歸納分析 二維數組中的數組元素被排成行列形式的一組雙下標變量,用一個統一的數組名和雙下標變量來標識、第一個下標表示行,第二個下標表示列。下標也從0開始排列。二維數組通常是和雙重循環相配合,對數組元素依次進行處理。80計算機工程學院1.二維數組的的說明、引用和存儲
(1)二維數組的說明①語法類型標識符數組名[常量表達式1][常量表達式2];②說明常量表達式包含常量和符號常量,不能包含變量。
3.2.2基礎理論
81計算機工程學院如果有一個一維數組,它的每一個元素是類型相同的一維數組時,就形成一個二維數組。我們可以把二維數組看作是一種特殊的一維數組:它的元素又是一個一維數組。例如:float
a[3][4];可以把a看作是一個一維數組,它有三個元素:a[0]、a[1]、a[2],每個元素又是一個包含4個元素的一維數組。可以把a[0]、a[1]、a[2]看作是一維數組的名字。C語言中,二維數組中元素的排列順序是:按行存放,即在內存中先順序存放第一行的元素,82計算機工程學院再存放第二行的元素。數組a在內存中的存放順序為:
a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]通常形象的把第一個下標稱為行下標,第二個下標稱為列下標。例如intvar[i][j],i代表行下標j代表列下標;多維數組的定義方法與二維數組相仿:例如intvar[3][4][5],代表一個三維數組;83計算機工程學院(2)二維數組的引用①引用形式數組名[下標][下標]②說明例如:a[1][1]=3;a[2][1]=a[1][1];printf("%d\n",a[1][1]);數組不能整體使用,只能逐個引用數組元素。下標可以是整型常數、整型變量和整型表達式。84計算機工程學院(3)二維數組的存儲對于m×n的二維數組a,各元素的存儲次序如下:
a[0][0]、a[0][1]…a[0][n-1]、a[1][0]、a[1][1]…a[1][n-1]……a[m-1][0]、a[m-1][1]…a[m-1][n-1]
系統為其分配的存儲單元數為m×n,每個元素占用的存儲單元數取決于數組的數據類型。例如2×2數組example的存儲情況如圖3-12所示:
85計算機工程學院圖3-12數組example的存儲情況
example→example[0][0]example[0][1]example[1][0]example[1][1]86計算機工程學院2.二維數組的初始化
二維數組的初始化有以下幾種:
(1)分組初始化
inta[2][5]={{1,3,5,7,9},{2,4,6,8,10}};這種賦值方法比較直觀,把第一個花括號內的數據賦給第一行的元素,第二個花括號內的數據賦給第二行的元素。
87計算機工程學院(2)不分行初始化
inta[2][5]={1,3,5,7,9,2,4,6,8,10};可以將所有數據寫在一個花括號內,按數組排列的順序對各元素賦初值。(3)部分行初始化inta[2][5]={{1,3,5},{2,4,6}};
賦初值后數組各元素值為:a[0][0]=1,a[0][1]=3,a[0][2]=5,a[0][3]=0,a[0][4]=0,a[1][0]=2,a[1][1]=4,a[1]2]=6,a[1][3]=0,a[1][4]=0,88計算機工程學院
(4)省略行數
inta[2][3]={1,3,5,7,9,11};
等價于:inta[][3]={1,3,5,7,9,11};
但不能寫成:inta[2][]={1,3,5,7,9,11};
對數組中的全體元素都賦初值時,二維數組的定義中第一維的長度也可以省略,但二維的長度不能省略。89計算機工程學院
如:
在分行初始化時,由于給出的初值已清楚的表明了行數和各行中元素的個數,因此第一維的大小可以不定義。如:intb[][3]={{1},{0,2},{3,2,1}};顯然這是一個三行三列的數組,其各元素的值為:
1 0 00 2 0
3 2 190計算機工程學院【實驗3.2.1】產生一個M×N的隨機數矩陣(數值范圍在1~100之間),找出其中的最大值元素。3.2.3技能訓練91計算機工程學院(1)編程分析
設矩陣數組為a,首先把第一個元素a[0][0]作為當前最大值max,然后把當前最大值max與每一個元素a[i][j]進行比較,若a[i][j]>max,把a[i][j]作為新的當前最大值,并記錄下其下標i和j。當全部元素比較完后,max是整個矩陣全部元素的最大值。92計算機工程學院(2)編程源程序
/*EX3_10.C*/#include<stdio.h>#include"stdlib.h"#defineM3#defineN4voidmain()
{
inti,j,row=0,col=0,max;
inta[M][N];
printf("建立隨機數數組\n");93計算機工程學院for(i=0;i<M;i++)/*建立隨機數數組*/for(j=0;j<N;j++)a[i][j]=rand()%100;max=a[0][0];/*初始化最大值變量*/for(i=0;i<M;i++)/*遍歷a數組的每一個元素,以確定最大值*/for(j=0;j<N;j++)if(a[i][j]>max)/*將一個更大的值保存在max變量中*/{max=a[i][j];
94計算機工程學院row=i; col=j;}for(i=0;i<M;i++)/*輸出隨機數數組*/{
for(j=0;j<N;j++)
printf("%5d",a[i][j]);
printf("\n"); }printf(“隨機數矩陣中最大值元素a[%d][%d]=%d\n",row,col,max);/*輸出結果*/}95計算機工程學院(3)在VC++集成環境中輸入上述程序,文件存成EX3_10.C。如圖3-13所示。圖3-13運行結果96計算機工程學院【實驗3.2.2】一個學習小組有5個人,每個人有三門課的考試成績,如表3-2。求全組分科的平均成績和各科總平均成績。表3-2成績表張王李趙周數學8061598576C語言7565638777數據結構927170908597計算機工程學院(1)編程分析可定義一個二維數組a[5][3]存放五個人三門課的成績。再定義一個一維數組v[3]存放所求得各分科平均成績,設變量average為全組各科總平均成績。98計算機工程學院(2)編程源程序/*EX3_11.C*/#include<stdio.h>voidmain(){inti,j,s=0,average,v[3],a[5][3];printf("輸入五個學生三門課的成績\n");for(i=0;i<3;i++){for(j=0;j<5;j++)99計算機工程學院{scanf("%d",&a[j][i]);s=s+a[j][i];}v[i]=s/5;s=0; }average=(v[0]+v[1]+v[2])/3;printf("數學%d\nC語言%d\n數據結構%d\n",v[0],v[1],v[2]);printf("各科總平均成績%d\n",average); }100計算機工程學院(3)在VC++集成環境中輸入上述程序,文件存成EX3_11.C。如圖3-14所示。圖3-14運行結果101計算機工程學院【練習1】某年級共有3個班級,每班有N名學生,開設兩門課程,要求分別對每個班級的學習成績進行分等統計,并將統計結果保存在一個二維數組中。/*EX3_12.C*/#include<stdio.h>#defineM3/*定義班級數為3*/#defineN5/*班級人數為5*/main(){
3.2.4拓展與練習
102計算機工程學院floata,b;intave,i,j;staticintresult[M][5];/*定義保存統計結果的二維數組*/for(j=0;j<M;j++){for(i=1;i<=N;i++){printf("Class%dachievement%d(a,b):",j+1,i);scanf("%f,%f",&a,&b);/*輸入一個學生的兩門課成績*/ave=(a+b)/2;
103計算機工程學院switch(ave/10)/*對第j的班級的學習成績分等統計*/{case10:case9:result[j][0]++;break;/*j班優秀人數統計*/case8:result[j][1]++;break;/*j班良好人數統計*/case7:result[j][2]++;break;/*j班中等人數統計*/case6:result[j][3]++;break;/*j班及格人數統計*/default:result[j][4]++;}}104計算機工程學院}/*j班不及格人數統計*/for(j=0;j<M;j++){for(i=0;i<5;i++)printf("%5d",result[j][i]);printf("\n");}}105計算機工程學院
上機運行程序并分析結果106圖3-15運行結果計算機工程學院1.常見錯誤
(1)常量表達式可以包含常量和符號常量,但不能包含變量。
例如:①inta[3][4];
②#defineM
3
#defineN
4
inta[M][N];
③inta[3][1+3];
3.2.5編程規范與常見錯誤
107計算機工程學院
都是定義了一個3*4的二維數組a
,但不允許有如下定義:
①intn=4,m=3;
inta[m][n]
②intb[3,4]
③intc(2)(3);108計算機工程學院
(2)二維數組可以看作一個特殊的一維數組,它的每個元素又是一個一維數組。例如上面定義二維數組a可以看作:數組a包含a[0]、a[1]、a[2]三個元素,而這三個元素均為一維數組。
a[0]包含a[0][0]、a[0][1]、a[0][2]、a[0][3]元素
a[1]包含a[1][1]、a[1][1]、a[1][2]、a[1][3]元素
a[0]包含a[0][0]、a[0][2]、a[0][2]、a[0][3]元素
109計算機工程學院矩陣乘法main(){ inti,j,k,intc[2][2]; inta[2][3]={1,2,3,4,5,6}; intb[3][2]={1,2,3,4,5,6}; for(i=0;i<2;i++) for(j=0;j<3;j++) { c[i][j]=0; for(k=0;k<3;k++) c[i][j]=a[i][k]*b[k][j]+c[i][j]; } for(i=0;i<2;i++) { for(j=0;j<3;j++) if(i==j) printf("%5d",c[i][j]); }}c[i][j]=a[i][k]*b[k][j]+c[i][j];計算機工程學院
任務3字符與字符串
學習目標掌握字符與字符串的區別,字符串的輸入和輸出,領會字符串操作函數。111計算機工程學院案例一字符統計
1.問題描述輸入20個字符,分別統計其中的數字個數和其他字符的個數。2.編程分析字符數組中的每個元素均占一個字節,且以ASCII代碼的形式來存放字符數據。
3.3.1案例講解
112計算機工程學院3.編寫源程序
/*EX3_13.C*/#include<stdio.h>voidmain(){charcharArrS[20];intintI,intNumber=0,intOther=0;printf("輸入20個字符");for(intI=0;intI<20;intI++)/*建立有20個元素的字符數組charArrS*/scanf("%c",&charArrS[intI]);113計算機工程學院
for(intI=0;intI<20;intI++)/*對charArrS中的數字和其他字符進行分類統計*/
switch(charArrS[intI])
{case'0':
/*這10個連續的case用于判斷數值型字符*/
case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':
114計算機工程學院case'9':
intNumber++;/*對數字字符計數*/
break;default:
intOther++;/*對數字以外的其他字符計數*/}printf("數字個數%d,其他字符的個數%d\n",intNumber,intOther); }115計算機工程學院4.運行結果如圖3-16所示。圖3-16案例1運行結果116計算機工程學院5.歸納分析字符串是一種常用的數據,處理人名,地址,文章等內容。單個字符(常量)放在一個字符變量中,字符串放在字符數組中。案例二字符的刪除
1.問題描述由鍵盤任意輸入一字符串和一個字符,要求從該串中刪除所指定的字符。117計算機工程學院2.編程分析在C語言中沒有專門的字符串變量,通常用一個字符數組來存放一個字符串。前面介紹字符串常量時,已說明字符串總是以'\0'作為串的結束符。因此當把一個字符串存入一個數組時,也把結束符'\0'存入數組,并以此作為該字符串的結束。
118計算機工程學院3.編寫源程序/*EX3_14.C*/#include<stdio.h>main(){charcharx,charArrS[20];intintI,intJ;printf("輸入一字符串");gets(charArrS);printf("要刪除指定的字符\n");119計算機工程學院
scanf("%c",&charx);for(intI=intJ=0;charArrS[intI]!='\0';intI++)if(charArrS[intI]!=charx)charArrS[intJ++]=charArrS[intI];
charArrS[intJ]='\0';
printf("從該串中刪除所指定的字符后新產生的新字符串\n");
puts(charArrS);}120計算機工程學院4.運行結果如圖3-17所示。圖3-17案例2運行結果121計算機工程學院5.歸納分析字符串結束符'\0'是由C編譯系統自動加上的。由于采用了'\0'標志,所以在用字符串賦初值時一般無須指定數組的長度,而由系統自行處理。122計算機工程學院
字符數組是存放字符型數據的數組,其中每個數組元素存放的值均是單個字符。字符數組也有一維數組和多維數組之分。比較常用的是一維字符數組和二維字符數組。1.字符數組的說明、引用和初始化字符數組的定義、初始化及引用同前面介紹的一維數組、二維數組類似,只是類型說明符為char,對字符數組初始化或賦值時,數據
3.3.2基礎理論
123計算機工程學院使用字符常量或相應的ASCII碼值。例如:charc[10],str[5][10];
/*字符數組的定義*/
又如:charc[3]={'r','e','d'};/*字符數組的初始化*/
printf("%c%c%c\n",c[0],c[1],c[2]);/*
字符數組元素的引用*/一個字符串可以放在一個一維數組中。如果有多個字符串,可以用一個二維數組來存放。
124計算機工程學院(1)字符數組的定義 用來存放字符數據的數組是字符數組。字符數組中的一個元素存放一個字符。例如:charstr[12];(2)字符數組的初始化
在定義一個字符數組的同時,可以給它指定初值。有兩種初始化的方法:①逐個為數組中各元素賦初值。如:125計算機工程學院charstr[8]={'C','o','m','p','u','t','e','r'
};在對數組中的全體元素都賦初值時,字符數組的大小可以省略。
charstr[]={'C','o','m','p','u','t','e','r'
};②對一個字符數組指定一個字符串初值。例如
charstr[]={“Computer”};注意單個字符用單引號括起來,而字符串用雙引號括起來,在指定字符串初值的情況下,將字符串中的各字符逐個地按順序賦給數組中的各126計算機工程學院元素。注意:系統會自動在一個字符串的后面加一個“\0”字符,并把它一起存入字符數組中。因此,上面的數組雖未定義大小,但系統自動將它定義為str[9],而不是str[8];C語言允許在初始化一個一維字符數組時,省略字符串外面的花括號。如:charstr[]="Computer";
str的每個元素為char型,占1字節。
127計算機工程學院圖3-18一組字符數組初始化數組str→Cstr[0]ostr[1]mstr[2]pstr[3]ustr[4]tstr[5]estr[6]rstr[7]128計算機工程學院(3)字符數組的引用。與普通數組相同。(4)字符串和字符串結束標志
C語言允許用字符串的方式對數組作初始化賦值。例如:charc[]={'c','','p','r','o','g','r','a','m'};
可寫為:charc[]={"Cprogram"};
或去掉{
}寫為:charc[]="Cprogram";用字符串方式賦值比用字符逐個賦值要多占一個字節,用于存放字符串結束標志‘\0’。上面的數組c在內存中的實際存放情況為:
129計算機工程學院(5)字符串的輸入輸出
①用"%c"格式符輸入輸出字符。②用"%s"格式符輸入輸出字符串。例如:
charc[6];scanf("%s",c);printf("%s",c);說明:C語言中,數組名代表該數組的起始地址,cprogram'\0'130計算機工程學院因此,scanf()函數中數組名前不再
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中語文寫作教學中的家庭參與策略研究論文
- 新時代背景下高中生傳統文化素養提升策略研究論文
- 藝術部主任管理制度
- 蘇州燃氣罐管理制度
- 茶水爐衛生管理制度
- 高校重修后管理制度
- 一年級《小青蛙》課件
- 視頻監控系統防雷方案
- 道德與法治(陜西卷)(考試版A3)
- 2025年四川省德陽市中考歷史真題試卷(含答案)
- 部編版六年級道德與法治上冊期末復習課件
- 氫能源行業的投資機會分析
- 供電公司負責人講安全課
- 【物理】《滑輪》(教學設計)-2024-2025學年人教版(2024)初中物理八年級下冊
- 火車站高鐵站消防培訓
- 專項10:現代文閱讀 媒體文閱讀(練習)-【中職專用】2025年對口升學語文二輪專項突破(解析版)
- 降低患者跌倒的發生率
- 2024中華人民共和國學前教育法詳細解讀課件
- 湖北省武漢市2024年中考數學試卷(含答案)
- 2023-2024學年山東省濰坊市高二下學期期中考試歷史試題(解析版)
- 人教A版(2019)高中數學必修第二冊 6.1 《平面向量的概念》教學設計
評論
0/150
提交評論