版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第6章數組Followme!
數組
C語言除了基本類型數據(整型、字符型、浮點型)外,還提供了構造類型數據,它們是由基本類型按一定規(guī)則構成的。數組就是其中最常用的一種。數組是類型相同的有序數據的集合。用數組名來表示整個集合,用數組名和下標來唯一地確定數組中的一個元素。例如:inta[5]定義了一個整型數組a,有5個元素:
a[0],a[1],a[2],a[3],a[4]
6.1
一維數組的定義和引用1.一維數組的定義格式:類型說明 數組名[常量表達式]如:inta[10];2.說明:a)數組命名:遵循變量命名規(guī)則。b)同一數組中各元素,類型一致。c)方括號中為數組長度,實際元素下標從0到長度減1,a[10]為由a[0]到a[9]d)定義數組長度只能是常量和符號常量,不能是變量。下列合法的聲明是:inta[5],inta[n],
inta[5+7],inta[F],inta[GF+2],inta[2*3]e)允許在同一個類型說明中,說明多個數組和多個變量。例如:
inta,b,c,d,k1[10],k2[20];#defineF12inta[F];3.一維數組元素的引用
數組和基本類型的變量一樣必須先定義,再使用。
數組元素是組成數組的基本單元,數組元素也是一種變量。
C規(guī)定只能逐個引用數組元素而不能一次引用整個數組。數組元素的下標只能是常量或整型表達式。
如為小數時,C編譯將自動取整。例如,a[5],a[i+j],a[i++],a[2*3]都是合法的數組元素。例:輸入一組數,然后逆序輸出:
voidmain(){inti,a[10];
for(i=0;i<=9;i++)
a[i]=i; ------此句可改為:scanf(“%d”,&a[i]);
for(i=9;i>=0;i--)printf(“%d”,a[i]);}輸出結果是:9876543210閱讀程序,選擇答案:#include<stdio.h>main(){inti,k,a[10],p[3];k=5;for(i=0;i<10;i++)a[i]=i;for(i=0;i<3;i++)p[i]=a[i*(i+1)];for(i=0;i<3;i++)k+=p[i]*2;printf(“%d\n”,k);}答案A、20 B、21C、22 D、23P[0]=a[0]=0P[1]=a[2]=2P[2]=a[6]=6K=5+P[0]×2=5K=5+P[1]×2=9K=9+P[2]×2=214.一維數組的初始化可以用賦值語句給數組元素逐個賦值,還可采用初始化賦值和動態(tài)賦值的方法。數組初始化賦值是指在數組說明時給數組元素賦予初值。
數組初始化是在編譯階段進行的。這樣將減少運行時間,提高效率。
如:inta[5]={1,2,3,4,5};相當于a[0]=1,a[1]=2…..
也可以只給部分元素賦初值:
inta[5]={1,2,3};給前3個元素賦值,后2個元素為0
給整個數組賦值,可以先不給出數組長度,如:
inta[]={1,2,3,4,5,6};長度為6,并依次賦值只能給元素逐個賦值,不能給數組整體賦值。
例如給十個元素全部賦1,只能寫為:inta[10]={1,1,1,1,1,1,1,1,1,1};而不能寫為:
staticinta[10]=1;
動態(tài)賦值是在程序執(zhí)行過程中,對數組作動態(tài)賦值。
這時可用循環(huán)語句配合scanf函數逐個對數組元素賦值。
voidmain()
{
int
i,max,a[10];
printf("input10numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
max=a[0];
for(i=1;i<10;i++)
if(a[i]>max)max=a[i];
printf("maxnum=%d\n",max);}例:輸入任意10個數到數組a,然后找出其中最大數并輸出。例6.2
用數組處理Fibonacci數列。#include<stdio.h>voidmain(){inti;intf[20]={1,1};for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];for(i=0;i<20;i++){if(i%4==0)printf("\n");printf("%12d",f[i]);}}結果是123813215589144
每打?。磦€數換行例6.4用冒泡算法對n個數排序(由小到大)。冒泡算法:設有n個需要排序的數:k1、k2…..kn第一趟冒泡排列:(進行了n-1次比較和交換)(1)比較k1和k2,如k1>k2,交換k1和k2位置,否則不交換。前2個數中大的數,在k2位置上。(2)比較k2和k3,方法同(1)。前3個數中大的數,在k3位置上。(3)同樣比較和處理,直到處理完kn-1和kn位置。最大數在kn位置上,即安置在最后一個記錄位置。第二趟冒泡排列:從(k1,k2)處理到(kn-2,kn-1),執(zhí)行n-2次比較和交換。依次類推,第三趟只需進行n-3次比較,…,第i趟只需n-i次比較即可。這樣,最多做n-1次重復就達到了排序的目的。5
792357
923572
935723
9
5723952
7395237
92537923
579
a[1]a[2]a[3]a[4]a[5]75923for(j=1;j<=4;j++)for(i=1;i<=5-j;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}j=1j=2j=323579
j=4程序:為5個數排序。#include<stdio.h>voidmain(){inta[6];inti,j,t;for(i=1;i<6;i++)scanf("%d",&a[i]);printf("\n");
for(j=1;j<=4;j++)for(i=1;i<=5-j;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}for(i=1;i<6;i++)printf("%d",a[i]);}為5個數排序。#include<stdio.h>voidmain(){inta[6];inti,j,t,min;for(i=1;i<6;i++)scanf("%d",&a[i]);printf("\n");
for(j=1;j<=4;j++){min=j;for(i=j+1;i<=5;i++)if(a[min]>a[i])min=i;t=a[j];a[j]=a[min];a[min]=t;}for(i=1;i<6;i++)printf("%6d",a[i]);}程序:用選擇算法對n個數排序(由小到大)。7
592375
9237592325973259732
59732
39752397523
5
79a[1]a[2]a[3]a[4]a[5]
75923j=1j=2j=323579j=4例6.5(P108)向一個有序數據系列中插入數據,并保持數據的有序性。
n[0]n[1]n[2]n[3]n[4]n[5]n[6]n[7]1217253456插入前:n[0]n[1]n[2]n[3]n[4]n[5]n[6]n[7]12172025345620插入后:#include"stdio.h"voidmain(){inti,j,k,num=0,m=5,n[8]={12,17,25,34,56}; printf("originaldata:");
for(i=0;i<m;i++) printf("%4d",n[i]); while(1) {printf("\nPleaseinputainsertdata:");
scanf("%d",&k);
for(i=0;i<m;i++)/*確定插入位置i*/ if(k<n[i])break;
for(j=m;j>i;j--) /*后移數據,空出插入位置n[i]*/ n[j]=n[j-1];
n[i]=k;/*插入k到n[i]*/
m++;
/*n數組增加一個元素*/ printf("Theinserteddata:");
for(i=0;i<m;i++) printf("%4d",n[i]); printf("\n");
num++;/*統(tǒng)計插入數據個數*/ if(num==3){printf("\nSorry!atmost3datacanbeinserted!\n");break;} }}程序#include"stdio.h"voidmain(){inti,j,k,m=5,n[5]={12,17,25,34,56}; printf("originaldata:"); for(i=0;i<m;i++) printf("%4d",n[i]); printf("\nPleaseinputadeletedata:"); scanf("%d",&k); for(i=0;i<m;i++) if(k==n[i])/*確定要刪除數據位置i*/ {for(j=i;j<m-1;j++)/*前移數據*/ n[j]=n[j+1]; break;}/*刪除后跳出循環(huán)*/ if(i>=m)/*如未找到刪除數據,循環(huán)變量i的值一定大于循環(huán)終值*/ printf("datanotfound!\n"); else {printf("Thelastdata:");/*輸出刪除后結果*/ for(i=0;i<m-1;i++) printf("%4d",n[i]); printf("\n");}}例6.6(P110)設有一有序數據系列,任意輸入的一個數如在系列中則將其刪除。6.2二維數組的定義一、定義
類型說明符數組名[常量表達式][常量表達式]
如:floata[3][4],b[4][7];二、說明:(1)從機制上,二維數組a[m][n],可以看作m個長度是n的一維數組線形排列
a[0][0],a[0][1],...a[0][n-1],a[1][0],a[1][1],...a[1][n-1],...[m-1][0],a[m-1][1],...a[m-1][n-1]。(2)對于高維數組的機制和二維數組是一樣的,在內存中是線型排列,最右邊的腳標變化最快。三、二維數組元素的引用二維數組每一個元素都可以象簡單變量一樣使用。引用時兩個下標都必須標出,如:a[1][2]=4
使用兩重循環(huán)引用二維數組中各元素例:#include<stdio.h>
main(){intn[3][3],i,j;for(i=0;i<3;i++)for(j=0;j<3;j++){
n[i][j]=i+j;
printf(“%d”,n[i][j]);
}printf(“\n”);}輸出結果為:0121232347-1.c四、二維數組的初始化
1.分行賦初值。如
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};2.
根據線性排列,直接賦初值。如
inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
3.對部分元素賦初值。如
inta[3][4]={{1},{5},{7}};賦值后各元素的值為:
100500700
4.
如果對全部元素都賦初值,則定義數組時對第一維的長度可以不指定,但第二維的長度不能省。如:
inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};等價于:
inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};inta[][4]={{1,2,3},{},{0,12}};C語言允許分解二維數組??梢园岩粋€二維數組看作是由一維數組的嵌套而構成的。設一維數組的每個元素都又是一個數組,就組成了二維數組。如a[3][4],可分解為三個一維數組,其數組名分別為a[0],a[1],a[2]。對這三個一維數組不需另作說明即可使用。這三個一維數組都有4個元素,例如:一維數組a[0]的元素為
a[0][0],a[0][1],a[0][2],a[0][3]。必須強調的是:a[0],a[1],a[2]不能當作下標變量使用,它們是數組名,不是一個單純的下標變量。
#include<stdio.h>voidmain(){inta[2][3]={{1,2,3},{4,5,6}};intb[3][2],i,j;for(i=0;i<=1;i++){for(j=0;j<=2;j++){printf("%5d",a[i][j]);
b[j][i]=a[i][j];}
printf("\n");}123456for(i=0;i<=2;i++){for(j=0;j<=1;j++)printf("%5d",b[i][j]);
printf("\n");}}142536例6.8
矩陣的轉置(行與列互換)。#include<stdio.h>voidmain(){inti,j,row=0,colum=0,max;inta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};/*數組初始化*/
max=a[0][0];
/*將第一個數組元素的值賦給max*/for(i=0;i<=2;i++)/*以下依次將每一個數組元素與max中值比較*/for(j=0;j<=3;j++)if(a[i][j]>max){max=a[i][j];
row=i;colum=j;}/*使max中始終放大的數,并記錄大數存放位置*/printf("max=%d,row=%d,colum=%d\n",max,row,colum);}例求3*4矩陣中最大元素的值及其位置。#include"stdio.h"voidmain(){inti,j,a[10][10];for(i=0;i<10;i++)/*將三角中所有元素均置1*/ for(j=0;j<=i;j++)a[i][j]=1;
for(i=2;i<10;i++)/*除第1列與對角線以外元素的值*/for(j=1;j<=i-1;j++)a[i][j]=a[i-1][j]+a[i-1][j-1];for(i=0;i<10;i++)/*輸出楊輝三角*/ {for(j=0;j<=i;j++) printf("%4d",a[i][j]);
printf("\n");}}例6.9輸出楊輝三角形的前10行。
6.3字符數組
C語言有表示單個字符的字符常量和字符變量也有字符串常量,但沒有字符串變量。字符串的存放可以使用字符數組,字符數組中各元素依次存放字符串的各個字符。1.字符數組的定義
charc[10];
或intc[10]; /*因為字符型和整型是通用的,但存儲空間浪費*/字符數組也可以是二維數組,例如:
charc[5][10];2.字符串結束標志\0:是字符串的結束標志
C為了能有效地測定字符串的長度,規(guī)定字符串結束標志為(\0)即在每一個字符串后面自動加一個\0,表示該字符串的結束\0的ASCII碼是:0\0代表一個空操作3.字符數組的初始化(1)初始化時把字符逐一賦給數組元素。例如char
c[11]={‘W’,’e’,’l’,’c’,’o’,’m’,’e’,
’’,’y’,’o’,’u’}賦值后數組狀態(tài):注意:初值的個數不能大于數組長度,否則會出錯。C[0]C[1]C[2]C[3]C[4]C[5]C[6]C[7]C[8]C[9]C[10]Welcomeyou小于數組長度時后面自動賦空字符(\0),不是0字符。例如:chara[10]={‘H’,’e’,’l’,’l’,’o’};賦值后數組狀態(tài):當對全體元素賦初值時可以省去長度說明。例如:charc[]={‘W’,’e’,’l’,’c’,’o’,’m’,’e’,’
’,’y’,’o’,’u’};這時c數組的長度自動定為11。
C[0]C[1]C[2]C[3]C[4]C[5]C[6]C[7]C[8]C[9]Hello\0\0\0\0\0
(2)用字符串常量對字符數組初始化
用字符串給數組賦值,數組的長度:是字符串長度+1
例如下面兩個語句的功能是等價的:
charc[]={”China”};charc[]=”China”;/*省略花括號*/字符數組的長度是6
與chard[]={‘C’,’h’,’i’,’n’,’a’}比較d數組長度為?例為字符數組a賦值并輸出#include"stdio.h"voidmain(){chara[5];intj;
for(j=0;j<5;j++)scanf("%c",&a[j]);for(j=0;j<5;j++)printf("%c",a[j]);}5.字符數組的輸入輸出字符數組的輸入輸出歸納起來有兩種方法:程序運行結果:輸入:12345↙輸出:12345
(1)逐個字符輸入輸出輸入輸出時:使用格式符“%c”。例.為字符數組b、c賦值并輸出#include"stdio.h"voidmain(){charb[8],c[]="BASIC\ndBASE";scanf("%s",b); printf("%s\n",b);printf("%s\n",c);printf("%s",&c[2]);}程序運行結果:輸入:123456↙輸出:123456BASICdBASE
SICdBASE
(2)字符串整體或部分輸入輸出輸入輸出時使用格式符“%s”。#include<stdio.h>voidmain(){chard[5][5]={{'','','*'},{'','*','','*'},{'*','','','','*'},{'','*','','*'},{'','','*'}};inti,j;for(i=0;i<5;i++){for(j=0;j<5;j++)printf("%c",d[i][j]);
printf("\n");}}********例
輸出一個鉆石圖形1.用格式符“%s”輸入輸出字符串時(1)如果是字符數組,其輸入輸出項必須是字符數組名,名前不能加地址符“&”,即以字符串的地址形式出現,數組名代表數組的起始地址。例如:scanf("%s",b);
printf("%s",b);(2)如果輸入輸出項是字符數組元素的地址,則表示輸入輸出內容是從該地址開始的字符串。例如:printf("%s",&c[2]);(3)如果輸出項以字符串常量形式出現,表示該字符串的首地址。例如:
printf("%s","abcd");2.用格式符“%s”輸出的字符串是從輸出項提供的地址開始直至碰到字符串結束標志'\0'為止。例如程序段:
chara[10]="abcd\0123";printf("a=%s\n",a);
輸出:a=abcd注意:3.用格式符“%s”不能輸入帶空格、回車或跳格的字符串。因為空格、回車或跳格是輸入數據的結束標志。例如程序段:Chara[10];scanf("%s",a);printf("%s\n",a);運行時,輸入:Howareyou↙輸出:How
為了避免這種情況:1.可以多設幾個字符數組分段存放含空格的字符串2.可以使用gets()函數。注意:C語言提供了豐富的字符串處理函數,
大致可分為:字符串的輸入、輸出、合并、比較、轉換、復制、搜索幾類。
使用這些函數可大大減輕編程的負擔。使用輸入輸出字符串函數,
在使用前應包含頭文件:“stdio.h”使用其它字符串函數則應包含頭文件:
“string.h”
下面介紹幾個最常用的字符串函數。
6.6字符串處理函數2.字符串輸入函數gets(字符數組)功能:從終端輸入一個字符串到字符數組,函數返回值是字符數組的起始地址。charstr[6];gets(str);Chi\0an用puts和gets函數只能輸入或輸出一個字符串,下面寫法是錯誤的:puts(str1,str2);或gets(str1,str2);字符串輸出函數
puts(字符數組)功能:將一個字符串輸出到終端。
charc[]=”China”charstr[]={“China\nBeijing”};puts(c);puts(str);#include"stdio.h"
#include<string.h>voidmain(){chars1[80],s2[80];inti,num=0;printf("inputstrings2:\n");
gets(s2);
for(i=0;s2[i]!='\0';i++)
/*逐個字符計數與復制*/{num++;s1[i]=s2[i];}
s1[i]='\0';
/*在目標字符串末尾加上字符串結束符*/
printf("num=%d\n",num);
puts(s1);}例8求給定字符串的長度,并將其復制到另一字符串中。
輸入:getchar() 一個字符
scanf() 任意數據
gets() 字符串輸出:putchar() 一個字符
printf() 帶格式任意數據
puts() 字符串輸入輸出函數:3.字符串連接函數語法:strcat(字符數組1,字符數組2)功能:把字符串2連接到字符串1的后面,結果放在字符數組1中,字符數組2保持原值,函數返回值是字符數組1的起始地址值。注意:字符數組1的長度必須足夠大,以容納連接后的字符串;連接時去掉前一個字符串后的\0。7-31.c例:#include<stdio.h>#include<string.h>main(){charstr1[20]="AAAAA";charstr2[]="BBBBB";
printf("%s\n",strcat(str1,str2));printf("%s,%s\n",str1,str2);}4.字符串拷貝函數語法:strcpy(字符數組1,字符串2)功能:將字符串2拷貝到字符數組1中。
注意:(1)字符數組1的長度必須足夠大。(2)字符串2可以是字符數組或字符串常量。(3)問題:strcpy函數返回值是什么?7-32.c例:#include<stdio.h>#include<string.h>main(){charstr1[20]="AAAAA";charstr2[20],str3[]="CCCCC";printf("%s\n",strcpy(str1,str3));printf("%s\n",strcpy(str2,"ABCDE"));
printf("%s,%s,%s,%s\n",str1,str2,str3);}
5.字符串比較函數語法:strcmp(字符串1,字符串2)功能:對兩個字符串自左至右按ASCii碼逐個進行比較,直到出現不同的字符或遇到\0為止。如全部字符相同,則認為相等;若出現不相同字符,以第一個不相同的字符為準。
“A”<“B”,”a”>”A”,”computer”>”compare”,說明:(1)字符串1=字符串2,函數返回0
(2)字符串1>字符串2,函數返回一正數(3)字符串1<字符串2,函數返回一負數注意:(1)字符串可以是字符數組或字符串常量。(2)下面形式的兩個字符串比較是錯誤的:
if(str1==str2)printf(“yes”);
改為:if(strcmp(str1,str2)==0)printf(“yes”);7-33.c
6.
測試字符串長度函數語法:strlen(字符串)字符串可以寫字符數組名或字符串常量功能:測定字符串的實際長度,不包括\0所占的一位。如:charstr[10]={“China”};printf(“%d”,strlen(str));輸出結果為如:strlen(“jdfhjgh”);7.strlwr(字符串)功能:將字符串中的大寫字母轉換成小寫,lwr=lowercase。8.
strupr(字符串)
功能:將字符串中的小寫字母轉換成大寫,upr=uppercase。
7-34.c例
輸入一行字符,統(tǒng)計其中有多少個單詞,單詞間用空格分開。#include<stdio.h>voidmain(){charstring[81],c;inti,num=0,word=0;gets(string);for(i=0;(c=string[i])!='\0';i++)if(c=='')word=0;elseif(word==0){word=1;num++;}printf("Thereare%dwordsintheline\n",num);}i為循環(huán)變量,num為單詞個數的統(tǒng)計值。word是單詞否的標志。為0,是單詞;為1,不是。7-8.c逐個判斷string數組中字符,只要沒碰到\0結束符就循環(huán)。碰到空格,使單詞標志word=0單詞標志word=0,num++且word=1例
有三個字符串,找出其中最大者。#include<stdio.h>#include<string.h>voidmain(){charstring[20];charstr[3][20];inti;
for(i=0;i<3;i++)gets(str[i]);
if(strcmp(str[0],str[1])>0)strcpy(string,str[0]);elsestrcpy(string,str[1]);
if(strcmp(str[2],string)>0)strcpy(string,str[2]);printf("\nthelargeststringis:\n%s\n",string);}7-9.c將str[3][20]數組分解成3個一維數組str[0]、str[1]、str[2]使用。每次循環(huán)輸入一個字符串。#include"string.h"
#include"stdio.h"voidmain()
{charst[18],c[5][18];inti,j,p;printf("inputcountry'sname:\n");
for(i=0;i<5;i++)
gets(c[i]);
/*輸入五個國家名字符串*/printf("\n");
for(i=0;i<5;i++)/*對五個國家名排序*/
{p=i;strcpy(st,c[i]);for(j=i+1;j<5;j++)
/*找出最小的字符串并拷貝到st中*/if(strcmp(c[j],st)<0){p=j;strcpy(st,c[j]);}
if(p!=i)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球法庭口譯服務行業(yè)調研及趨勢分析報告
- 2025-2030全球環(huán)網配電單元行業(yè)調研及趨勢分析報告
- 2025年全球及中國兩片式鍍錫金屬罐行業(yè)頭部企業(yè)市場占有率及排名調研報告
- 年度井中電磁波透視儀市場分析及競爭策略分析報告
- 二零二五年度民政局婚姻登記中心協(xié)議離婚書模板在線定制合同3篇
- 網絡安全意識教育內容與形式的創(chuàng)新研究
- 癌癥超聲波影像分析的商業(yè)價值
- Unit 1【單元測試·基礎卷】-2023-2024學年九年級英語上冊(牛津上海版)解析版
- 科技賦能下的教育小微企業(yè)創(chuàng)新策略報告
- 二零二五年度城市出租車經營權置換合同模板4篇
- 中央2025年國務院發(fā)展研究中心有關直屬事業(yè)單位招聘19人筆試歷年參考題庫附帶答案詳解
- 2024年09月北京中信銀行北京分行社會招考(917)筆試歷年參考題庫附帶答案詳解
- 外呼合作協(xié)議
- 小學二年級100以內進退位加減法800道題
- 保險公司2025年工作總結與2025年工作計劃
- 2024年公司領導在新年動員會上的講話樣本(3篇)
- 眼科護理進修專題匯報
- 介入手術室感染控制管理
- 2024北京初三(上)期末英語匯編:材料作文
- 2024年大型風力發(fā)電項目EPC總承包合同
- 禮儀服務合同三篇
評論
0/150
提交評論