C語言數(shù)組結(jié)構(gòu)介紹課件_第1頁
C語言數(shù)組結(jié)構(gòu)介紹課件_第2頁
C語言數(shù)組結(jié)構(gòu)介紹課件_第3頁
C語言數(shù)組結(jié)構(gòu)介紹課件_第4頁
C語言數(shù)組結(jié)構(gòu)介紹課件_第5頁
已閱讀5頁,還剩37頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第6章 數(shù)組數(shù)組的概念數(shù)組:若干相同類型的數(shù)據(jù)項的集合。數(shù)組的用途:用于存儲相同類型的多個數(shù)據(jù),可以減少命名上的麻煩,并且方便統(tǒng)一運算。一維數(shù)組的定義、引用和初始化

一維數(shù)組的定義、引用和初始化一維數(shù)組的定義格式:類型說明符數(shù)組名[常量表達式]; 例如,intscore[50];定義了一個一維數(shù)組,共有50個數(shù)組元素,每個都是int類型,序號從score[0]~score[49],其中score為數(shù)組名,[]內(nèi)的數(shù)值必須為整形常量,或整形常量表達式,如30+20,不允許為變量,也不允許為浮點數(shù)。常量表達式稱為數(shù)組的長度,也就是數(shù)組元素的個數(shù)。一維數(shù)組的引用

格式:數(shù)組名[下標]下標可以是常數(shù)或者常數(shù)表達式,也可以是變量或者變量表達式,但必須是整數(shù)。數(shù)組不可整體引用,不可整體賦值,想給一維數(shù)組score里面的50個數(shù)組元素都賦值為0,使用score=0是錯誤的,可以使用循環(huán)結(jié)構(gòu)來賦值:for(i=0;i<50;i++) score[i]=0;使用數(shù)組不但簡化了變量的命名,還簡化了變量的使用。數(shù)組元素(用下標去引用)相當(dāng)于一個普通變量,可以出現(xiàn)在該類變量可以出現(xiàn)的所有場合。數(shù)組名不是一個普通的變量名,而是第一個數(shù)組元素的地址。如果沒有對所有的數(shù)組元素進行賦初值,例如intscore[]={0,1,2,3,4,5,6,7,8};編譯系統(tǒng)測出賦初值的個數(shù)為9,就認為數(shù)組的長度是9而不是10。【例6.3】輸入10個數(shù),用冒泡法排序(從小到大)冒泡排序是相鄰的兩個數(shù)進行比較,如果前一個比后一個大,就交換,每一輪都會把本輪要比較的所有的數(shù)中最大的那個數(shù)放到最后,小的數(shù)往前面移動,就像水里的氣泡逐漸往上浮一樣。#include<stdio.h>#defineN10main(){ inta[N]; inti,j,temp; for(i=0;i<N;i++) scanf("%d",&a[i]); printf("beforsorting:\n"); for(i=0;i<N;i++) printf("%-5d",a[i]); printf("\n"); for(i=0;i<N-1;i++) for(j=0;j<N-i-1;j++) if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } printf("aftersorting:\n"); for(i=0;i<N;i++) printf("%-5d",a[i]); printf("\n");}二維數(shù)組的定義、引用及初始化

二維數(shù)組的定義格式:類型說明符數(shù)組名[常量表達1][常量表達2]; 例如,intb[3][4];定義了一個3行4列的二維數(shù)組,一共有12個數(shù)組元素,每個都是int類型,序號從b[0][0]~b[2][3]。邏輯順序如下:b[0][0]b[0][1]b[0][2]b[0][3]b[1][0]b[1][1]b[1][2]b[1][3]b[2][0]b[2][1]b[2][2]b[2][3]二維數(shù)組是按行存儲 先存完第1行,再存第2行,第3行……,直到最后一行。在內(nèi)存中存儲順序如下:第0行第1行第2行第3行b[0][0]b[0][1]b[0][2]b[0][3]b[1][0]b[1][1]b[1][2]b[1][3]b[2][0]b[2][1]b[2][2]b[2][3] 在這里已經(jīng)給數(shù)組所有元素賦初值了,第一維的長度可以省略,但是不建議省略。第二維的長度不可省略。賦值效果如下:01234567891011 二維數(shù)組(或者多維數(shù)組)省略寫第一維的情況intb[][4]={{0,1,2,3},{4,5,6,7},{8,9}};沒有問題,最后一行沒有賦值的兩個數(shù)組元素會初始化為0。012345678900但是intb[][4]={{0,1,2,3},{4,5,6,7}};還可以嗎?編譯器會認為第一維的長度是2,而不是3b[2][0]~b[2][3]的值是不確定的,引用b[2][0]~b[2][3]的值沒有意義,對b[2][0]~b[2][3]進行寫操作可能會造成系統(tǒng)嚴重錯誤(數(shù)組越界訪問)?!纠?.5】有一個3×4的二維數(shù)組a,求出值最大的數(shù)組元素的值及所在的行號和列號。程序如下:#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}};運行結(jié)果為:max=10,row=2,colum=1Pressanykeytocontinue字符數(shù)組數(shù)組不但可以用來存儲數(shù)值,也可以用來存儲字符。用來存儲字符的數(shù)組是字符數(shù)組。定義字符數(shù)組 例如:charc[10];字符數(shù)組的初始化

例如,charc[5]={'h','e','l','l','o'};初始化后,c[0]='h',c[1]='e',c[2]='l',c[3]='l',c[4]='o'如果花括號提供的字符個數(shù)超過數(shù)組長度則語法錯誤,少于則后面補空字符'\0' 例如charc[5]={'h','e','l'};則c[0]='h',c[1]='e',c[2]='l',c[3]='\0',c[4]='\0'如果花括號提供的字符個數(shù)跟數(shù)組長度相等,可以省略數(shù)組長度,例如 charc[]={'h','e','l','l','o'};也可以定義二維字符數(shù)組,例如charc[5][10];

引用字符數(shù)組的元素 引用字符數(shù)組的元素跟其他數(shù)組操作方式類似,例如c[0]='h';【例6.7】輸出一個菱形圖#include<stdio.h>voidmain(){ inti,j; charc[5][5]={{‘’,‘’,‘*’,‘’,‘’},{‘’,‘*’,‘’,‘*’,‘’},\ {'*','','','','*'},{'','*','','*',''},{'','','*','',''}}; for(i=0;i<5;i++) { for(j=0;j<5;j++) printf("%c",c[i][j]); printf("\n"); }}字符串和字符串結(jié)束標志字符串是若干字符的序列,并且以特殊字符'\0'結(jié)尾。'\0'就是ascii碼值為0的字符。字符串常量,編譯器會在末尾自動添加一個'\0'。例如"abcd",用sizeof("abcd")測算,值為5,sizeof()運算符會把結(jié)束標志算上作為字符串長度。C語言不提供字符串變量,字符串只能用字符數(shù)組來存儲。注意字符數(shù)組長度。字符數(shù)組的初始化:例如charstr[5]={'a','b','c','d','\0'};也可以寫成 charstr[]={'a','b','c','d','\0'};編譯器會測算字符串長度,并按長度為5來為數(shù)組開辟存儲空間。當(dāng)然可以定義并初始化字符數(shù)組charstr[4]={'a','b','c','d'};但由于沒有’\0’作為結(jié)束標志,并不認為是一個字符串,不能用庫函數(shù)里的字符串處理函數(shù)來進行處理,在自己編程中,由于缺少結(jié)束標志,會給編程帶來很大的麻煩??梢杂米址A縼韺ψ址麛?shù)組進行初始化,例如charstr[]="abcd";或者charstr[]={"abcd"};都可以。不能寫成charstr[4]="abcd";,由于數(shù)組長度不夠,編譯錯誤。一個字符串用一維數(shù)組存儲,多個字符串用二維數(shù)組存儲。例如:charweekday[7][10]={"Sunday",\"Monday","Tuesday","Wednesday",\"Thursday","Friday","Saturday"};注意第二維的長度應(yīng)該根據(jù)最長的字符串來設(shè)置。字符數(shù)組的輸入輸出對字符數(shù)組中的字符,可以按單個字符進行輸入或輸出,例如:

for(i=0;i<10;i++) scanf("%c",&str[i]);

for(i=0;i<10;i++) printf("%c",str[i]);如果有’\0’作為字符串結(jié)束標志,不需要知道字符串的長度就可以很方便地進行輸出,例如:

for(i=0;weekday[0][i]!='\0';i++) putchar(weekday[0][i]);用gets(),puts()函數(shù)對字符串進行整體輸入/輸出。使用gets可以輸入帶空格、制表符的字符串,末尾會自動添加‘\0’。gets();函數(shù)用數(shù)組名作為參數(shù),這樣輸入的字符串就放到對應(yīng)的數(shù)組中。不管printf(),還是puts()函數(shù),遇到‘\0’都會結(jié)束輸出。如: charstr[10]={'a','b','c','d','\0','e','f','g','\0'};不管用printf(“%s”,str);還是puts(str);只能輸出abcd,后面的efg就不能輸出了。與printf()函數(shù)不同的是,輸出完畢后,puts函數(shù)會自動換一行。puts()函數(shù)也用數(shù)組名,或者字符串常量作為參數(shù),例如puts("hello");字符串處理函數(shù)要使用字符串處理函數(shù)應(yīng)該把頭文件string.h包含進來strlen(str):測試字符串長度(不包括'\0'),注意與sizeof運算不同。strcpy(str1,str2):字符串復(fù)制,把str2的第一個字符放在str1的起始位置,后面的字符依次存放。例如: strcpy函數(shù)作用如果str1,str2原來存儲情況及復(fù)制后str1的情況如下圖所示str1abcd'\0''\0''\0''\0''\0''\0'str2ef'\0''\0''\0''\0''\0''\0''\0''\0'復(fù)制后str1ef'\0'd'\0''\0''\0''\0''\0''\0'字符數(shù)組str1長度必須大于或者等于字符串str2的長度,字符串str2的長度是指從str2的第一個數(shù)組元素開始,到第一個'\0'為止。str2也可以是常量,例如strcpy(str1,"abcd")。不能用賦值語句直接把一個字符數(shù)組或者字符串常量賦值給另一個字符數(shù)組,例如str1=str2;或者str1="abcd";是錯誤的。strcmp(str1,str2):字符串比較,str1>str2則函數(shù)值為1;str1<str2則函數(shù)值為-1;相等則函數(shù)值為0。例如, i=strcmp("hello","hello");,i的值為-1,i=strcmp("hello","hello");,i的值為0,i=strcmp("hello","hello");,i的值為1。字符串不可直接比較大小,if(str1<str2)是錯誤的。strcat(str1,str2):把str2連接到str1末尾,也就是str1數(shù)組中第一個'\0'出現(xiàn)的位置,str2的字符依次存放(包括str2中的'\0'),成為一個新的字符串 如果str1,str2原來的存儲情況如下,那么連接后結(jié)果為str1abcd'\0''\0''\0''\0'xystr2efgh'\0''\0''\0''\0''\0''\0'連接后abcdefgh'\0'y說明:第一個字符串的長度應(yīng)該足夠大,能容納得下連接后的字符串。strlwr(str):把字符串(從第1個數(shù)組元素開始,到第一個'\0'位置)大寫字母改為小寫字母。strupr(str):與strlur(str)剛好相反,把小寫字母改為大寫字母。例如,charstr[10]={'a','b','c','d','\0','e','f','g','x','y'};,則strupr()函數(shù)只處理'a','b','c','d'4個字母,'e','f','g','x','y'不進行處理。字符數(shù)組應(yīng)用舉例【例6.8】統(tǒng)計一行輸入中有多少個單詞,已知單詞之間用空格隔開。判斷出現(xiàn)一個單詞方法:從第1個輸入的字符開始掃描,直至輸入結(jié)束,如果出現(xiàn):當(dāng)前字符為非空格,而后一個字符為空格或者‘\0’,就可以判斷為出現(xiàn)一個單詞。#include<stdio.h>#include<string.h>voidmain(){

int

i,count=0; char str[100];gets(str);for(i=0;str[i]!='\0';i++) if(((str[i]>='a'&&str[i]<='z')||\ (str[i]>='A'&&str[i]<='Z'))&&\ !((str[i+1]>='a'&&str[i+1]<='z')||\ (str[i+1]>='A'&&str[i+1]<='Z'))) count++; printf("%d\n",count);}也可采用字符串處理函數(shù)isalpha來測試一個字符是否是字母#include<stdio.h>#in

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論