




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第四章數(shù)組Chapter4Array第四章數(shù)組Chapter4Array1數(shù)組必須先說明后使用。說明的目的如下:⒈說明數(shù)組的名字(標識)。⒉說明數(shù)組的類型。⒊說明數(shù)組的維數(shù)。⒋確定各維下標的變化范圍。編譯系統(tǒng)將根據(jù)說明,開辟內存單元按特有的順序和相應的類型為各元素分配內存單元。數(shù)組必須先說明后使用。說明的目的如下:⒈說明數(shù)組的名字(標識24.2一維數(shù)組⒈一維數(shù)組的說明說明方式:
typearray1[常量表達式],…,arrayn[常量表達式];類型說明符,根據(jù)需要可加修飾說明。說明數(shù)組的類型。數(shù)組名,用標識符命名。用[]包含的常量表達式。數(shù)組的下標從0變化到常量達式的值減一。int
id[5],iyear[10];float
fScore[36];當說明數(shù)組后,編譯時系統(tǒng)會根據(jù)定義的類型分配連續(xù)的一段內存單元給數(shù)組的各元素。id[0]id[1]id[2]id[3]id[4]系統(tǒng)為數(shù)組分配的連續(xù)內存單元,每個單元占兩個BYTE。首地址用數(shù)組名id表示。4.2一維數(shù)組⒈一維數(shù)組的說明說明方式:3⒉一維數(shù)組的初始化數(shù)組的元素可以在說明數(shù)組時初始化。inta[10]={1,2,3,4,5,6,7,8,9,10};/*說明數(shù)組,同時初始化全部元素。*/
floatfValue[10]={1.0,2.0,3.0};/*說明數(shù)組,給部分元素初值,其余元素為0。*/unsigneda[]={0x0000,0x0001,0x0002};/*當數(shù)組元素全部賦初值時,可以不指定長度*/
⒉一維數(shù)組的初始化數(shù)組的元素可以在說明數(shù)組時初4⒊數(shù)組的引用原則:只能引用數(shù)組元素,而不能引用整個數(shù)組。引用方式:數(shù)組名[整型表達式]/*下標變量*/每個數(shù)組元素,可以出現(xiàn)在簡單變量能夠出現(xiàn)的任何地方。
a[1]=12;s=a[2]+a[1]*20;⒊數(shù)組的引用原則:只能引用數(shù)組元素,而不能引5⒋舉例求10個學生一門課程的平均分,并輸出低于平均成績的分數(shù)。#include<stdio.h>voidmain(void){
float
fScore[10],aver=0;
inti;for(i=0;i<10;i++){
scanf(“%f”,&fScore[i]);aver+=fScore[i];
}aver/=10;for(i=0;i<10;i++){
if(fScore[i]<aver)printf(“num=%d,score=%f”,i+1,fScore[i]);
}}說明數(shù)組。循環(huán)輸入各元素的值并累加。循環(huán)判斷條件,滿足條件輸出。⒋舉例求10個學生一門課程的平均分,并輸出低于平均成績的分數(shù)64.2多維數(shù)組在實際應用中,經(jīng)常會遇到一些用多維索引的數(shù)據(jù)。如:四個學生三門課的成績。可以用下表表示:92.580.591.099.083.590.070.066.060.078.056.059.0顯然,該表的每一項需要有兩個索引項。表現(xiàn)為數(shù)組的兩個下標。超過一個下標的數(shù)組稱為多維數(shù)組。行:代表某個學生。列:代表某門課程。4.2多維數(shù)組在實際應用中,經(jīng)常會遇到一些7⒈多維數(shù)組的說明說明方式:
typearray[常量表達式1]…[常量表達式n],…;n個整型常量表達式數(shù)組元素的個數(shù)?inta[2][3],b[4][5][2];⒉多維數(shù)組在內存中的順序inta[3][3];二維結構:a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]排列順序:先行后列。a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]下標為0的行總原則:最后一個下標先變化,變化一個周期后,倒數(shù)第二個開始變化,…如此類推。a為數(shù)組在內存中的首地址。intb[2][3][4];內存中的排列?⒈多維數(shù)組的說明說明方式:n個整型常量表達式數(shù)組元素的個數(shù)8⒊多維數(shù)組賦初值數(shù)組可以在說明時初始化。⑴全部賦初值inta[2][3]={{1,2,3},{4,5,6}};下標為0的一行下標為1的一行intb[2][3]={1,2,3,4,5,6};按內存順序賦初值。⑵部分賦初值inta[2][3]={{1},{2}};0行的0列的元素賦初值。0行其余值為0。inta[2][3]={1,2};⑶對全體數(shù)組元素賦初值,第一維下標可以省略。inta[][3]={1,2,3,4,5,6};⒊多維數(shù)組賦初值數(shù)組可以在說明時初始化。⑴全部賦初值int9⒋數(shù)組元素的引用數(shù)組定義后,具備簡單變量的一切性質,可以作為表達式的運算對象,也可以被賦值。引用時,只能引用數(shù)組元素,方式如下:array[exp1]…[expn]inta[10][10],y,i=2;a[i+2][6]=20;y=a[i+2][6]*100/30;a[10][11]=34;對4行6列的元素賦值。參加表達式運算。C語言不作下標檢查,語法正確,但使用危險,可能造成程序的錯誤!整型表達式。⒋數(shù)組元素的引用數(shù)組定義后,具備簡單變量的一104.4字符數(shù)組與字符串C語言沒有字符串變量,可以定義字符數(shù)組,每個元素存放一個字符,從而達到存放字符串的目的。⒈字符數(shù)組的說明charcharray[constexp1]…[constexpn],…;char
a[10],b[2][12];⒉字符數(shù)組的初始化一維數(shù)組賦初值char
str1[6]={’h’,’e’,’l’,’l’,’o’,’\0’};char
str2[]={”hello”};用單個字符對每一個元素賦值。用字符串對數(shù)組賦初值??梢灾付ㄩL度,也可不指定長度。
系統(tǒng)會在字串的結尾加\0,表示字符串結束。因此,說明數(shù)組時,長度指定應至少比實際長度大1,保證賦初值正確。\0存儲結構:hello\04.4字符數(shù)組與字符串C語言沒有字符串11二維數(shù)組賦初值二維數(shù)組的每一行可以存放一個字符串。char
str[3][6]={”wang”,”zhang”,”liu”};wang\0zhang\0liu\0str數(shù)組在內存中的首地址。存儲結構二維數(shù)組賦初值二維數(shù)組的每一行可以存放一個字符串。char12⒊字符數(shù)組的輸入輸出⑴格式輸入輸出函數(shù)輸出:
for(i=0;i<STRLEN;i++)printf(“%c”,str[i]);/*通過循環(huán)輸出各元素*/
printf(”%s”,str);/*用字符串形式輸出*/輸入:scanf(”%s”,str);/*用字符串輸入整個數(shù)組*/用scanf函數(shù)輸入時space作為輸入的分隔符,因此輸入帶空格的字符串,會造成輸入不全。chara[20];scanf(”%s”,a);輸入:ChinaAnhuiHefei
結果a數(shù)組的內容是:China\0為了解決這個問題,系統(tǒng)定義如下專用于字符數(shù)組的i/o函數(shù)。⒊字符數(shù)組的輸入輸出⑴格式輸入輸出函數(shù)輸出:輸入:s13⑴gets()字符串輸入函數(shù)用法:charstr[80];gets(str);作用:讀入一個以換行符為終結符的字符串到str中,用\0代替換行符。數(shù)組名作為函數(shù)的參數(shù)。⑵puts()字符串輸出函數(shù)用法:charstring[]=”China”;puts(string);數(shù)組名作為函數(shù)的參數(shù)。作用:輸出以NULL即\0結尾的字符串string,自動加上換行符。⑴gets()字符串輸入函數(shù)用法:charstr[814字符輸入輸出舉例#include<stdio.h>voidmain(void){charstr[80];inti;gets(str);for(i=0;str[i]!='\0';i++)if(str[i]>='a'&&str[i]<='z')str[i]-=32;puts(str);}chp4ex0判斷字符串結束。字符輸入輸出舉例#include<stdio.h>chp415⒋常用的字符處理函數(shù)C語言定義了一系列的字符處理函數(shù)用于字符串的處理,該類函數(shù)的原型定義在string.h中。因此,在使用該類函數(shù)時,應在程序的開始處,加#include<string.h>⑴字符串拷貝函數(shù)strcpy(str1,str2)作用:將str2拷貝到str1中。用法:charstr1[10],str2[]={”Computer”};strcpy(str1,str2);/*str1的內容是“Computer”*/strcpy(str2,”Program”);/*str2的內容是“Program”*/說明:①str1的長度要足夠長;②str1只能是字符數(shù)組名,str2可以是字符數(shù)組或字符串常量。⒋常用的字符處理函數(shù)C語言定義了一系列的字符處16⑵字符串連接函數(shù)strcat(str1,str2)作用:將str2連接到str1后(去掉str1的\0)。用法:charstr1[15]={“Anhui”},str2[]={”Hefei”};strcat(str1,str2);puts(str1);/*輸出結果為AnhuiHefei*/說明:①str1的長度要足夠長;②str1只能是字符數(shù)組名,str2可以是字符數(shù)組或字符串常量。⑶測試字符串長度函數(shù)strlen(str)作用:測試字符串的實際長度。函數(shù)運算得到整型值,該值是字符串的長度!intiLenStr;charstr[]={“China”};iLenStr=strlen(str);printf(“%d”,iLenStr);結果?⑵字符串連接函數(shù)strcat(str1,str2)作用:將17⑷字符串的比較strcmp(str1,str2)作用:對str1和str2進行逐位無符號字符(ASCII碼)比較,直到對應位字符能夠確定關系或到串尾為止。返回整型比較結果。字符的數(shù)值關系也就是字符的ASCII碼值的數(shù)值關系。比較結果如下:比較結果strcmp的值str1<str2<0str1==str2==0str1>str2>0charstr1[]={”abcd”};charstr2[]={“abcd”};intiRe1,iRe2,iRe3;iRe1=strcmp(str1,”abdc”);iRe2=strcmp(str1,str2);iRe3=strcmp(”abcde”,str2);abcdabdccd‘c’-’d’-1結果小于0。⑷字符串的比較strcmp(str1,str2)18⑸strlwr(str)將str中的大寫字母轉換成小寫字母。⑹strupr(str)將str中的小寫字母轉換成大寫字母#include<stdio.h>#include<string.h>voidmain(void){charstr1[]="cprogramming!123",str2[]="Computer";strlwr(str2);strupr(str1);puts(str1);puts(str2);}CPROGRAMMING!123computer⑸strlwr(str)將str中的大寫字母轉換成小寫字母。19舉例:統(tǒng)計三行文字中大寫字母、小寫字母及數(shù)字的個數(shù)。#include<stdio.h>#include<string.h>voidmain(void){charstr[80];inti,j,iAnum=0,ianum=0,i0num=0;for(i=0;i<3;i++){
gets(str);
for(j=0;j<strlen(str);j++)
{if(str[j]>=‘A’&&str[j]<=‘Z’)iAnum++;if(str[j]>=‘a(chǎn)’&&str[j]<=‘z’)ianum++;if(str[j]>=‘0’&&str[j]<=‘9’)i0num++;}
}
printf(“%6d,%6d,%6d”,iAnum,ianum,i0num);}行循環(huán)列循環(huán)chp4ex2舉例:統(tǒng)計三行文字中大寫字母、小寫字母及數(shù)字的個數(shù)。#inc20數(shù)組的常用算法數(shù)組是同類型數(shù)據(jù)的集合。便于整體處理數(shù)據(jù),數(shù)組操作的主要算法有:⒈求極值;⒉排序;⒊查找;數(shù)組的常用算法數(shù)組是同類型數(shù)據(jù)的集合。便于整21⒈求極值及其位置算法演示
⑴一維數(shù)組的極值#include<stdio.h>voidmain(void){inta[10]={1,6,-2,5,4,32,47,-66,13,14};intiMax,iPos,i;
iPos=0;iMax=a[0];
for(i=1;i<10;i++)
if(a[i]>iMax){iMax=a[i];iPos=i;}printf(“Max=%5dPosition=%5d”,iMax,iPos);}假定最大值及其位置。循環(huán)比較當前元素比最大值大,將其賦值為新的最大值并記錄其位置。chp4ex3⒈求極值及其位置算法演示⑴一維數(shù)組的極值#inc22⑵二維數(shù)組求極值#include<stdio.h>voidmain(void){floata[3][4]={1.0,3.0,5.2,7.4,4.6,5.5,4.2,1.2,10.5,
0.23,1.3,0.5};
inti,j,iRow=0,iCol=0;for(i=0;i<3;i++)for(j=0;j<4;j++)
if(a[i][j]<a[iRow][iCol]){iRow=i;iCol=j;}printf(”%f7.2,iRow%5d,iCol%5d”,a[iRow][iCol],iRow,iCol);}假定最小值的位置。二重循環(huán)遍歷所有元素比較求最小值,記錄其位置。chp4ex4⑵二維數(shù)組求極值#include<stdio.h>假定最23⒉排序⑴排序的概念
排序是將一組隨機排放的數(shù)按下標順序從大到小或從小到大重新排列。1,5,4,6,7,99,7,6,5,4,11,4,5,6,7,9降序升序⑵冒泡排序算法冒泡排序算法演示⒉排序⑴排序的概念排序是將一組隨機24冒泡排序程序如下:#include<stdio.h>voidmain(void){inti,j,a[10]={4,3,5,1,10,12,2,6,7,9},iTemp;
for(i=0;i<9;i++)
for(j=i+1;j<10;j++)
if(a[i]<a[j]){iTemp=a[i];a[i]=a[j];a[j]=iTemp;}for(i=0;i<10;i++)printf(”%4d”,a[i]);}外層循環(huán)i變化內層循環(huán)j變化比較交換chp4ex5冒泡排序程序如下:#include<stdio.h>外層25思考題⒈升序的條件如何構造?
⒉聯(lián)合排序問題已知一個班有36個同學,a數(shù)組存放一門課的成績,m數(shù)組存放其學號。要求將成績從大到小排序。
提示:應考慮的問題是當a數(shù)組元素比較交換時,m數(shù)組如何處理?a[5]89.5
m[5]1005a[7]90.0
m[7]1007被動排序方。思考題⒈升序的條件如何構造?⒉26⑶選擇排序冒泡排序在內層循環(huán)的比較中,滿足條件的每次都需要交換。其中一些交換是無效的,交換算法會占用系統(tǒng)時間,從而降低算法效率。選擇排序算法的基本思路,每輪排序將a[i]假定為極值,每次在a[i]到a[MAX]中找出個極值,記錄其位置,最后讓極值位置的元素與a[i]交換。
選擇排序保證每輪排序只有一次交換,且為有效的交換!選擇排序算法演示⑶選擇排序冒泡排序在內層循環(huán)的比較中,滿足條27選擇排序程序#include<stdio.h>voidmain(void){inti,j,iMax,a[10]={4,3,5,1,10,12,2,6,7,9},iTemp;
for(i=0;i<9;i++)
{
iMax=i;
for(j=i+1;j<10;j++)
if(a[iMax]<a[j])iMax=j;
if(iMax!=i){iTemp=a[i];a[i]=a[iMax];a[iMax]=iTemp;}
}
for(i=0;i<10;i++)printf(”%4d”,a[i]);}排序循環(huán)假定最大值位置。循環(huán)比較找出最大值的位置。與本次比較的第一個元素交換。chp4ex6升序如何構造?選擇排序程序#include<stdio.h>排序循環(huán)假28⒊查找查找是在一組數(shù)中,尋找一個特定的數(shù),并顯示結果。⑴順序查找
順序查找算法:構造循環(huán),使循環(huán)的變量遍歷數(shù)組每個元素的下標。循環(huán)的過程中讓特定的數(shù)和每個元素比較,相等則表示找到該數(shù),并輸出其下標(位置)。程序設計中標志的設置和應用:
在程序設計中,經(jīng)常要記錄一些狀態(tài),作為判斷的條件。因此需要在程序中設置一些標志,通常標志是整型變量。如查找問題,可以先設置一個整型變量iFlag=0表示沒有找到,在查找的過程中一旦找到后,將iFlag賦值為1,結束查找后,可以由iFlag值所代表的邏輯狀態(tài),確定是否已找到特定的數(shù)。⒊查找查找是在一組數(shù)中,尋找一個特定的數(shù),并顯示結果29標志設置框圖intiFlag;iFlag=0;是否找到?iFlag=1;yesno標志設置框圖intiFlag;iFlag=0;是否找到?30順序查找程序#include<stdio.h>voidmain(void){inti,j,iFlag,a[10]={4,3,5,1,10,12,2,6,7,9};
iFlag=0;scanf(“%d”,&j);
for(i=0;i<10;i++)
if(j==a[i]){iFlag=1;printf(“Thepositionis%d\n”,i);}if(iFlag==1)printf(“Found!%d”,j);elseprintf(“Notfound!);}設置標志為沒找到。循環(huán)遍歷所有元素比較設置標志輸出位置。chp4ex7順序查找程序#include<stdio.h>設置標志為31⑵折半查找——適用于在有序數(shù)組中查找在一個有序的一維數(shù)組中查找某一個數(shù)。已知某數(shù)組按升序排列,給定一個數(shù),找出該數(shù)在數(shù)組中的位置。
可以通過將區(qū)間折半,快速縮小查找區(qū)間,提高效率!折半查找算法演示⑵折半查找——適用于在有序數(shù)組中查找在一個有32折半查找程序#include<stdio.h>voidmain(void){intiTop,iBot,iMid,iS,iFlag,a[10]={1,2,3,5,6,8,9,10,11,12};
iFlag=0;iTop=0;iBot=9;
scanf(“%d”,&iS);
do{
iMid=(iTop+iBot)/2;
if(iS==a[iMid]){iFlag=1;printf(“iShasbefound:a[%d]”,iMid);}
elseif(iS<a[iMid])iBot=iMid-1;elseiTop=iMid+1;
}while(iTop<=iBot&&iFlag==0);if(iFlag==0)printf(“Notfound!\n”);}初始化查找標志及頂、底。查找循環(huán)折半。找到。沒找到,調整iTop或iBotchp4ex8折半查找程序#include<stdio.h>初始化查找33字符數(shù)組字符數(shù)組34⑴統(tǒng)計字符串中的各元音字母的個數(shù)#include<stdio.h>voidmain(void){charstr[80],ch[6]={‘a(chǎn)’,’e’,’i’,’o’,’u’,’\0’};inti,iCount[5]={0,0,0,0,0};gets(str);
for(i=0;str[i]!=‘\0’;i++){
switch(str[i]){case‘a(chǎn)’:case‘A’:iCount[0]++;break;case‘e’:case‘E’:iCount[1]++;break;case‘i’:case‘I’:iCount[2]++;break;case‘o’:case‘O’:iCount[3]++;break;case‘u’:case‘U’:iCount[4]++;}
}for(i=0;i<5;i++)printf(“Numof%c:%5d”,ch[i],iCount[i]);}循環(huán)遍歷數(shù)組元素判斷字母。chp4ex9判斷字符串是否結束的方法。i<strlen(str)⑴統(tǒng)計字符串中的各元音字母的個數(shù)#include<stdi35⑵字符的加密解密
將字符串中的字母加密,密鑰為循環(huán)平移兩個字母。如A加密成C...,Z加密成B。如:Iamastudent.Zip230009加密后:
Kcocuvwfgpw.Bkr230009加密算法可以描述為:如果str[i]是字母循環(huán)平移兩個字符;以大寫字母為例,循環(huán)平移兩個字符的加密算法:
str[i]=(str[i]-’A’+2)%26+’A’⑵字符的加密解密將字符串中的字母加密,密鑰為循36程序如下:#include<stdio.h>#include<string.h>voidmain(void){inti;charstr[80],chKey=2;
gets(str);
for(i=0;i<strlen(str);i++){
if(str[i]>='a'&&str[i]<='z')str[i]=(str[i]-'a'+chKey)%26+'a'; elseif(str[i]>='A'&&str[i]<='Z') str[i]=(str[i]-'A'+chKey)%26+'A';
}
puts(str);}密鑰。輸入待加密的字符串。循環(huán)遍歷字符。是字母,則加密!chp4exa設計解密算法!程序如下:#include<stdio.h>密鑰。輸入待加37數(shù)組與矩陣inta[3][3]a[0][0]a[0][1]a[0][2]
a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]該表示方法,在數(shù)學上稱為“矩陣”,當行、列數(shù)相同時,稱為“方陣”,也稱為“行列式”。
數(shù)組與矩陣inta[3][3]a[0][0]38矩陣的相關算法⒈生成特殊矩陣⑴生成單位方陣單位方陣:1
0000
1
0000
1
0000
1主對角線元素為1,其余為0。if(i==j)a[i][j]=1,其余為0。#include<stdio.h>voidmain(void){inta[4][4]=,i,j;
for(i=0;i<4;i++)for(j=0;j<4;j++)
{if(i==j)a[i][j]=1;elsea[i][j]=0;
}
for(i=0;i<4;i++){for(j=0;j<4;j++)
printf(“%4d”,a[i][j]);
printf(“\n”);}}chp4exb矩陣的相關算法⒈生成特殊矩陣⑴生成單位方陣單39⑵生成三角陣三角陣的概念,以對角線為界,一半元素為0的方陣。123405670091000011
上三角陣。當i<=j時值非0為上三角陣當i>=j值非0為下三角陣ij如何生成元素為行、列下標和的下三角陣?⑵生成三角陣三角陣的概念,以對角線為界,一半元素為0的方陣。40⑶與下標相關矩陣形成如下矩陣:
147 258 3690123012在列方向上每跨一列,要走三步;在行方向上每跨一行,要走一步,只能橫向或縱向行走,且不走遠路,確定從一行一列走到任意行列所走的步數(shù)。18顯然,所走的步數(shù)和當前行列的位置有關。s=i*1+j*3⑶與下標相關矩陣形成如下矩陣:041147
258
369a[i][j]=i*1+j*3+1#include<stdio.h>voidmain(void){inta[3][3],i,j;
for(i=0;i<3;i++)for(j=0;j<3;j++)
a[i][j]=i+j*3+1;
for(i=0;i<3;i++){for(j=0;j<3;j++)printf(“%4d”,a[i][j]);printf(“\n”);}}chp4exc生成如下矩陣: 15913 591317 9131721147
258
3642⒉矩陣及元素求和⑴求方陣主、輔對角線之和。
1
52
6
-9
8
7
3
5
4
0
1
9
84
2主對角線:滿足下標為[i][i]的元素和。輔對角線:滿足下標為[i][jMAX-i]的所有元素之和。如何構造程序?⒉矩陣及元素求和⑴求方陣主、輔對角線之和。1543⑵求兩個矩陣之和c[i][j]=a[i][j]+b[i][j]對應元素之和,要求a、b行列數(shù)相同。#include<stdio.h>voidmain(void){inta[2][3]={1,2,3,4,5,6};intb[2][3]={1,3,5,2,4,6},c[2][3],i,j;
for(i=0;i<2;i++)for(j=0;j<3;j++)c[i][j]=a[i][j]+b[i][j];for(i=0;i<2;i++){for(j=0;j<3;j++)printf(“%4d”,c[i][j]);printf(“\n”);}}chp4exd對應元素和。⑵求兩個矩陣之和c[i][j]=a[i][j]+b[i][j44⒊矩陣的轉置運算轉置陣的概念:123456a142536b
矩陣a的轉置陣b,b矩陣行、列的最大下標應和矩陣a列、行的最大下標相同。遍歷所有下標,賦值:b[i][j]=a[j][
i
]⑴求非方陣的轉置陣a、b互為轉置陣。⒊矩陣的轉置運算轉置陣的概念:123145⑵求方陣的轉置陣如果求方陣的轉置陣,行、列相同不需要定義新的數(shù)組。1591326101437111548121612345678910111213141516算法:對角線兩邊的對稱元素交換。chp4exe#include<stdio.h>voidmain(void){inta[3][3]={1,2,3,4,5,6,7,8,9},i,j,iTemp;for(i=0;i<3;i++)for(j=0;j<i;j++)
{iTemp=a[i][j];a[i][j]=a[j][i]; a[j][i]=iTemp;}for(i=0;i<3;i++){for(j=0;j<3;j++)printf(“%4d”,a[i][j]);printf(“\n”);}}Why?⑵求方陣的轉置陣如果求方陣的轉置陣,行、列相同不需要定義新的46第四章數(shù)組Chapter4Array第四章數(shù)組Chapter4Array47數(shù)組必須先說明后使用。說明的目的如下:⒈說明數(shù)組的名字(標識)。⒉說明數(shù)組的類型。⒊說明數(shù)組的維數(shù)。⒋確定各維下標的變化范圍。編譯系統(tǒng)將根據(jù)說明,開辟內存單元按特有的順序和相應的類型為各元素分配內存單元。數(shù)組必須先說明后使用。說明的目的如下:⒈說明數(shù)組的名字(標識484.2一維數(shù)組⒈一維數(shù)組的說明說明方式:
typearray1[常量表達式],…,arrayn[常量表達式];類型說明符,根據(jù)需要可加修飾說明。說明數(shù)組的類型。數(shù)組名,用標識符命名。用[]包含的常量表達式。數(shù)組的下標從0變化到常量達式的值減一。int
id[5],iyear[10];float
fScore[36];當說明數(shù)組后,編譯時系統(tǒng)會根據(jù)定義的類型分配連續(xù)的一段內存單元給數(shù)組的各元素。id[0]id[1]id[2]id[3]id[4]系統(tǒng)為數(shù)組分配的連續(xù)內存單元,每個單元占兩個BYTE。首地址用數(shù)組名id表示。4.2一維數(shù)組⒈一維數(shù)組的說明說明方式:49⒉一維數(shù)組的初始化數(shù)組的元素可以在說明數(shù)組時初始化。inta[10]={1,2,3,4,5,6,7,8,9,10};/*說明數(shù)組,同時初始化全部元素。*/
floatfValue[10]={1.0,2.0,3.0};/*說明數(shù)組,給部分元素初值,其余元素為0。*/unsigneda[]={0x0000,0x0001,0x0002};/*當數(shù)組元素全部賦初值時,可以不指定長度*/
⒉一維數(shù)組的初始化數(shù)組的元素可以在說明數(shù)組時初50⒊數(shù)組的引用原則:只能引用數(shù)組元素,而不能引用整個數(shù)組。引用方式:數(shù)組名[整型表達式]/*下標變量*/每個數(shù)組元素,可以出現(xiàn)在簡單變量能夠出現(xiàn)的任何地方。
a[1]=12;s=a[2]+a[1]*20;⒊數(shù)組的引用原則:只能引用數(shù)組元素,而不能引51⒋舉例求10個學生一門課程的平均分,并輸出低于平均成績的分數(shù)。#include<stdio.h>voidmain(void){
float
fScore[10],aver=0;
inti;for(i=0;i<10;i++){
scanf(“%f”,&fScore[i]);aver+=fScore[i];
}aver/=10;for(i=0;i<10;i++){
if(fScore[i]<aver)printf(“num=%d,score=%f”,i+1,fScore[i]);
}}說明數(shù)組。循環(huán)輸入各元素的值并累加。循環(huán)判斷條件,滿足條件輸出。⒋舉例求10個學生一門課程的平均分,并輸出低于平均成績的分數(shù)524.2多維數(shù)組在實際應用中,經(jīng)常會遇到一些用多維索引的數(shù)據(jù)。如:四個學生三門課的成績??梢杂孟卤肀硎荆?2.580.591.099.083.590.070.066.060.078.056.059.0顯然,該表的每一項需要有兩個索引項。表現(xiàn)為數(shù)組的兩個下標。超過一個下標的數(shù)組稱為多維數(shù)組。行:代表某個學生。列:代表某門課程。4.2多維數(shù)組在實際應用中,經(jīng)常會遇到一些53⒈多維數(shù)組的說明說明方式:
typearray[常量表達式1]…[常量表達式n],…;n個整型常量表達式數(shù)組元素的個數(shù)?inta[2][3],b[4][5][2];⒉多維數(shù)組在內存中的順序inta[3][3];二維結構:a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]排列順序:先行后列。a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]下標為0的行總原則:最后一個下標先變化,變化一個周期后,倒數(shù)第二個開始變化,…如此類推。a為數(shù)組在內存中的首地址。intb[2][3][4];內存中的排列?⒈多維數(shù)組的說明說明方式:n個整型常量表達式數(shù)組元素的個數(shù)54⒊多維數(shù)組賦初值數(shù)組可以在說明時初始化。⑴全部賦初值inta[2][3]={{1,2,3},{4,5,6}};下標為0的一行下標為1的一行intb[2][3]={1,2,3,4,5,6};按內存順序賦初值。⑵部分賦初值inta[2][3]={{1},{2}};0行的0列的元素賦初值。0行其余值為0。inta[2][3]={1,2};⑶對全體數(shù)組元素賦初值,第一維下標可以省略。inta[][3]={1,2,3,4,5,6};⒊多維數(shù)組賦初值數(shù)組可以在說明時初始化。⑴全部賦初值int55⒋數(shù)組元素的引用數(shù)組定義后,具備簡單變量的一切性質,可以作為表達式的運算對象,也可以被賦值。引用時,只能引用數(shù)組元素,方式如下:array[exp1]…[expn]inta[10][10],y,i=2;a[i+2][6]=20;y=a[i+2][6]*100/30;a[10][11]=34;對4行6列的元素賦值。參加表達式運算。C語言不作下標檢查,語法正確,但使用危險,可能造成程序的錯誤!整型表達式。⒋數(shù)組元素的引用數(shù)組定義后,具備簡單變量的一564.4字符數(shù)組與字符串C語言沒有字符串變量,可以定義字符數(shù)組,每個元素存放一個字符,從而達到存放字符串的目的。⒈字符數(shù)組的說明charcharray[constexp1]…[constexpn],…;char
a[10],b[2][12];⒉字符數(shù)組的初始化一維數(shù)組賦初值char
str1[6]={’h’,’e’,’l’,’l’,’o’,’\0’};char
str2[]={”hello”};用單個字符對每一個元素賦值。用字符串對數(shù)組賦初值??梢灾付ㄩL度,也可不指定長度。
系統(tǒng)會在字串的結尾加\0,表示字符串結束。因此,說明數(shù)組時,長度指定應至少比實際長度大1,保證賦初值正確。\0存儲結構:hello\04.4字符數(shù)組與字符串C語言沒有字符串57二維數(shù)組賦初值二維數(shù)組的每一行可以存放一個字符串。char
str[3][6]={”wang”,”zhang”,”liu”};wang\0zhang\0liu\0str數(shù)組在內存中的首地址。存儲結構二維數(shù)組賦初值二維數(shù)組的每一行可以存放一個字符串。char58⒊字符數(shù)組的輸入輸出⑴格式輸入輸出函數(shù)輸出:
for(i=0;i<STRLEN;i++)printf(“%c”,str[i]);/*通過循環(huán)輸出各元素*/
printf(”%s”,str);/*用字符串形式輸出*/輸入:scanf(”%s”,str);/*用字符串輸入整個數(shù)組*/用scanf函數(shù)輸入時space作為輸入的分隔符,因此輸入帶空格的字符串,會造成輸入不全。chara[20];scanf(”%s”,a);輸入:ChinaAnhuiHefei
結果a數(shù)組的內容是:China\0為了解決這個問題,系統(tǒng)定義如下專用于字符數(shù)組的i/o函數(shù)。⒊字符數(shù)組的輸入輸出⑴格式輸入輸出函數(shù)輸出:輸入:s59⑴gets()字符串輸入函數(shù)用法:charstr[80];gets(str);作用:讀入一個以換行符為終結符的字符串到str中,用\0代替換行符。數(shù)組名作為函數(shù)的參數(shù)。⑵puts()字符串輸出函數(shù)用法:charstring[]=”China”;puts(string);數(shù)組名作為函數(shù)的參數(shù)。作用:輸出以NULL即\0結尾的字符串string,自動加上換行符。⑴gets()字符串輸入函數(shù)用法:charstr[860字符輸入輸出舉例#include<stdio.h>voidmain(void){charstr[80];inti;gets(str);for(i=0;str[i]!='\0';i++)if(str[i]>='a'&&str[i]<='z')str[i]-=32;puts(str);}chp4ex0判斷字符串結束。字符輸入輸出舉例#include<stdio.h>chp461⒋常用的字符處理函數(shù)C語言定義了一系列的字符處理函數(shù)用于字符串的處理,該類函數(shù)的原型定義在string.h中。因此,在使用該類函數(shù)時,應在程序的開始處,加#include<string.h>⑴字符串拷貝函數(shù)strcpy(str1,str2)作用:將str2拷貝到str1中。用法:charstr1[10],str2[]={”Computer”};strcpy(str1,str2);/*str1的內容是“Computer”*/strcpy(str2,”Program”);/*str2的內容是“Program”*/說明:①str1的長度要足夠長;②str1只能是字符數(shù)組名,str2可以是字符數(shù)組或字符串常量。⒋常用的字符處理函數(shù)C語言定義了一系列的字符處62⑵字符串連接函數(shù)strcat(str1,str2)作用:將str2連接到str1后(去掉str1的\0)。用法:charstr1[15]={“Anhui”},str2[]={”Hefei”};strcat(str1,str2);puts(str1);/*輸出結果為AnhuiHefei*/說明:①str1的長度要足夠長;②str1只能是字符數(shù)組名,str2可以是字符數(shù)組或字符串常量。⑶測試字符串長度函數(shù)strlen(str)作用:測試字符串的實際長度。函數(shù)運算得到整型值,該值是字符串的長度!intiLenStr;charstr[]={“China”};iLenStr=strlen(str);printf(“%d”,iLenStr);結果?⑵字符串連接函數(shù)strcat(str1,str2)作用:將63⑷字符串的比較strcmp(str1,str2)作用:對str1和str2進行逐位無符號字符(ASCII碼)比較,直到對應位字符能夠確定關系或到串尾為止。返回整型比較結果。字符的數(shù)值關系也就是字符的ASCII碼值的數(shù)值關系。比較結果如下:比較結果strcmp的值str1<str2<0str1==str2==0str1>str2>0charstr1[]={”abcd”};charstr2[]={“abcd”};intiRe1,iRe2,iRe3;iRe1=strcmp(str1,”abdc”);iRe2=strcmp(str1,str2);iRe3=strcmp(”abcde”,str2);abcdabdccd‘c’-’d’-1結果小于0。⑷字符串的比較strcmp(str1,str2)64⑸strlwr(str)將str中的大寫字母轉換成小寫字母。⑹strupr(str)將str中的小寫字母轉換成大寫字母#include<stdio.h>#include<string.h>voidmain(void){charstr1[]="cprogramming!123",str2[]="Computer";strlwr(str2);strupr(str1);puts(str1);puts(str2);}CPROGRAMMING!123computer⑸strlwr(str)將str中的大寫字母轉換成小寫字母。65舉例:統(tǒng)計三行文字中大寫字母、小寫字母及數(shù)字的個數(shù)。#include<stdio.h>#include<string.h>voidmain(void){charstr[80];inti,j,iAnum=0,ianum=0,i0num=0;for(i=0;i<3;i++){
gets(str);
for(j=0;j<strlen(str);j++)
{if(str[j]>=‘A’&&str[j]<=‘Z’)iAnum++;if(str[j]>=‘a(chǎn)’&&str[j]<=‘z’)ianum++;if(str[j]>=‘0’&&str[j]<=‘9’)i0num++;}
}
printf(“%6d,%6d,%6d”,iAnum,ianum,i0num);}行循環(huán)列循環(huán)chp4ex2舉例:統(tǒng)計三行文字中大寫字母、小寫字母及數(shù)字的個數(shù)。#inc66數(shù)組的常用算法數(shù)組是同類型數(shù)據(jù)的集合。便于整體處理數(shù)據(jù),數(shù)組操作的主要算法有:⒈求極值;⒉排序;⒊查找;數(shù)組的常用算法數(shù)組是同類型數(shù)據(jù)的集合。便于整67⒈求極值及其位置算法演示
⑴一維數(shù)組的極值#include<stdio.h>voidmain(void){inta[10]={1,6,-2,5,4,32,47,-66,13,14};intiMax,iPos,i;
iPos=0;iMax=a[0];
for(i=1;i<10;i++)
if(a[i]>iMax){iMax=a[i];iPos=i;}printf(“Max=%5dPosition=%5d”,iMax,iPos);}假定最大值及其位置。循環(huán)比較當前元素比最大值大,將其賦值為新的最大值并記錄其位置。chp4ex3⒈求極值及其位置算法演示⑴一維數(shù)組的極值#inc68⑵二維數(shù)組求極值#include<stdio.h>voidmain(void){floata[3][4]={1.0,3.0,5.2,7.4,4.6,5.5,4.2,1.2,10.5,
0.23,1.3,0.5};
inti,j,iRow=0,iCol=0;for(i=0;i<3;i++)for(j=0;j<4;j++)
if(a[i][j]<a[iRow][iCol]){iRow=i;iCol=j;}printf(”%f7.2,iRow%5d,iCol%5d”,a[iRow][iCol],iRow,iCol);}假定最小值的位置。二重循環(huán)遍歷所有元素比較求最小值,記錄其位置。chp4ex4⑵二維數(shù)組求極值#include<stdio.h>假定最69⒉排序⑴排序的概念
排序是將一組隨機排放的數(shù)按下標順序從大到小或從小到大重新排列。1,5,4,6,7,99,7,6,5,4,11,4,5,6,7,9降序升序⑵冒泡排序算法冒泡排序算法演示⒉排序⑴排序的概念排序是將一組隨機70冒泡排序程序如下:#include<stdio.h>voidmain(void){inti,j,a[10]={4,3,5,1,10,12,2,6,7,9},iTemp;
for(i=0;i<9;i++)
for(j=i+1;j<10;j++)
if(a[i]<a[j]){iTemp=a[i];a[i]=a[j];a[j]=iTemp;}for(i=0;i<10;i++)printf(”%4d”,a[i]);}外層循環(huán)i變化內層循環(huán)j變化比較交換chp4ex5冒泡排序程序如下:#include<stdio.h>外層71思考題⒈升序的條件如何構造?
⒉聯(lián)合排序問題已知一個班有36個同學,a數(shù)組存放一門課的成績,m數(shù)組存放其學號。要求將成績從大到小排序。
提示:應考慮的問題是當a數(shù)組元素比較交換時,m數(shù)組如何處理?a[5]89.5
m[5]1005a[7]90.0
m[7]1007被動排序方。思考題⒈升序的條件如何構造?⒉72⑶選擇排序冒泡排序在內層循環(huán)的比較中,滿足條件的每次都需要交換。其中一些交換是無效的,交換算法會占用系統(tǒng)時間,從而降低算法效率。選擇排序算法的基本思路,每輪排序將a[i]假定為極值,每次在a[i]到a[MAX]中找出個極值,記錄其位置,最后讓極值位置的元素與a[i]交換。
選擇排序保證每輪排序只有一次交換,且為有效的交換!選擇排序算法演示⑶選擇排序冒泡排序在內層循環(huán)的比較中,滿足條73選擇排序程序#include<stdio.h>voidmain(void){inti,j,iMax,a[10]={4,3,5,1,10,12,2,6,7,9},iTemp;
for(i=0;i<9;i++)
{
iMax=i;
for(j=i+1;j<10;j++)
if(a[iMax]<a[j])iMax=j;
if(iMax!=i){iTemp=a[i];a[i]=a[iMax];a[iMax]=iTemp;}
}
for(i=0;i<10;i++)printf(”%4d”,a[i]);}排序循環(huán)假定最大值位置。循環(huán)比較找出最大值的位置。與本次比較的第一個元素交換。chp4ex6升序如何構造?選擇排序程序#include<stdio.h>排序循環(huán)假74⒊查找查找是在一組數(shù)中,尋找一個特定的數(shù),并顯示結果。⑴順序查找
順序查找算法:構造循環(huán),使循環(huán)的變量遍歷數(shù)組每個元素的下標。循環(huán)的過程中讓特定的數(shù)和每個元素比較,相等則表示找到該數(shù),并輸出其下標(位置)。程序設計中標志的設置和應用:
在程序設計中,經(jīng)常要記錄一些狀態(tài),作為判斷的條件。因此需要在程序中設置一些標志,通常標志是整型變量。如查找問題,可以先設置一個整型變量iFlag=0表示沒有找到,在查找的過程中一旦找到后,將iFlag賦值為1,結束查找后,可以由iFlag值所代表的邏輯狀態(tài),確定是否已找到特定的數(shù)。⒊查找查找是在一組數(shù)中,尋找一個特定的數(shù),并顯示結果75標志設置框圖intiFlag;iFlag=0;是否找到?iFlag=1;yesno標志設置框圖intiFlag;iFlag=0;是否找到?76順序查找程序#include<stdio.h>voidmain(void){inti,j,iFlag,a[10]={4,3,5,1,10,12,2,6,7,9};
iFlag=0;scanf(“%d”,&j);
for(i=0;i<10;i++)
if(j==a[i]){iFlag=1;printf(“Thepositionis%d\n”,i);}if(iFlag==1)printf(“Found!%d”,j);elseprintf(“Notfound!);}設置標志為沒找到。循環(huán)遍歷所有元素比較設置標志輸出位置。chp4ex7順序查找程序#include<stdio.h>設置標志為77⑵折半查找——適用于在有序數(shù)組中查找在一個有序的一維數(shù)組中查找某一個數(shù)。已知某數(shù)組按升序排列,給定一個數(shù),找出該數(shù)在數(shù)組中的位置。
可以通過將區(qū)間折半,快速縮小查找區(qū)間,提高效率!折半查找算法演示⑵折半查找——適用于在有序數(shù)組中查找在一個有78折半查找程序#include<stdio.h>voidmain(void){intiTop,iBot,iMid,iS,iFlag,a[10]={1,2,3,5,6,8,9,10,11,12};
iFlag=0;iTop=0;iBot=9;
scanf(“%d”,&iS);
do{
iMid=(iTop+iBot)/2;
if(iS==a[iMid]){iFlag=1;printf(“iShasbefound:a[%d]”,iMid);}
elseif(iS<a[iMid])iBot=iMid-1;elseiTop=iMid+1;
}while(iTop<=iBot&&iFlag==0);if(iFlag==0)printf(“Notfound!\n”);}初始化查找標志及頂、底。查找循環(huán)折半。找到。沒找到,調整iTop或iBotchp4ex8折半查找程序#include<stdio.h>初始化查找79字符數(shù)組字符數(shù)組80⑴統(tǒng)計字符串中的各元音字母的個數(shù)#include<stdio.h>voidmain(void){charstr[80],ch[6]={‘a(chǎn)’,’e’,’i’,’o’,’u’,’\0’};inti,iCount[5]={0,0,0,0,0};gets(str);
for(i=0;str[i]!=‘\0’;i++){
switch(str[i]){case‘a(chǎn)’:case‘A’:iCount[0]++;break;case‘e’:case‘E’:iCount[1]++;break;case‘i’:case‘I’:iCount[2]++;break;case‘o’:case‘O’:iCount[3]++;break;case‘u’:case‘U’:iCount[4]++;}
}for(i=0;i<5;i++)printf(“Numof%c:%5d”,ch[i],iCount[i]);}循環(huán)遍歷數(shù)組元素判斷字母。chp4ex9判斷字符串是否結束的方法。i<strlen(str)⑴統(tǒng)計字符串中的各元音字母的個數(shù)#include<stdi81⑵字符的加密解密
將字符串中的字母加密,密鑰為循環(huán)平移兩個字母。如A加密成C...,Z加密成B。如:Iamastudent.Zip230009加密后:
Kcocuvwfgpw.Bkr230009加密算法可以描述為:如果str[i]是字母循環(huán)平移兩個字符;以大寫字母為例,循環(huán)平移兩個字符的加密算法:
str[i]=(str[i]-’A’+2)%26+’A’⑵字符的加密解密將字符串中的字母加密,密鑰為循82程序如下:#include<stdio.h>#include<string.h>voidmain(void){inti;charstr[80],chKey=2;
gets(str);
for(i=0;i<strlen(str);i++){
if(str[i]>='a'&&str[i]<='z')str[i]=(str[i]-'a'+chKey)%26+'a'; elseif(str[i]>='A'&&str[i]<='Z') str[i]=(str[i]-'A'+chKey)%26+'A';
}
puts(str);}密鑰。輸入待加密的字符串。循環(huán)遍歷字符。是字母,則加密!chp4exa設計解密算法!程序如下:#include<stdio.h>密鑰。輸入待加83數(shù)組與矩陣inta[3][3]a[0][0]a[0][1]
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勤雜工合同范例
- 合伙種葡萄合同范本
- 合伙開店股合同范例
- 醫(yī)療勞動合同范本
- 合同范本 模板
- 合伙經(jīng)營酒吧合同范本
- 鄉(xiāng)鎮(zhèn)山林承租合同范本
- 半價打包餐飲服務合同范本
- ppp項目政府合同范本
- 雙方合作開發(fā)合同范例
- 建(構)筑物消防員初級技能培訓課件
- 2025-2030年中國天線行業(yè)市場需求狀況規(guī)劃研究報告
- 2024年南京旅游職業(yè)學院高職單招職業(yè)技能測驗歷年參考題庫(頻考版)含答案解析
- 如何提升自我管理能力
- 2025年潛江市城市建設發(fā)展集團招聘工作人員【52人】高頻重點提升(共500題)附帶答案詳解
- 人教版(新)九年級下冊化學全冊教案教學設計及教學反思
- 2024年05月富德生命人壽保險股份有限公司招考筆試歷年參考題庫附帶答案詳解
- 部隊安全手機保密課件
- 光伏電站安全培訓課件
- 小學生勤儉節(jié)約課件
- 2025年上半年重慶市渝北區(qū)大灣鎮(zhèn)招錄村綜合服務專干13人重點基礎提升(共500題)附帶答案詳解
評論
0/150
提交評論