




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Chapter6陣列(Array)不切實際的使用了太多的變數
/*不切實際的例子,用了一堆變數*/#include<stdio.h>intmain(void){//用10個變數來儲存學生的成績intA,B,C,D,E,F,G,H,I,J;
//從標準輸入取得10位學生的成績
//分別儲存在A–J的變數裡面
//對每位學生的成績作處理
//讓使用者查詢每位學生的成績
//結論是:不切實際的使用了太多變數
}2陣列是什麼陣列是由相同型態的相關資料項所組成的一種資料結構陣列元素都是連續的存放在記憶體裡面的陣列必須有哪些東西陣列名稱陣列名稱也是識別字一對中括號[]陣列足標(Subscript)必須是整數或整數運算式怎麼存取陣列內的元素透過陣列名稱[陣列足標]name[0],name[1],name[2]陣列的名稱c陣列裡面的所有元素都具有相同的名稱陣列c內元素的位置編號c[6]-4560721543-89062-31c[0]c[1]c[2]c[3]c[9]c[8]c[7]c[5]c[4]3怎麼使用陣列使用陣列元素就好像使用變數一樣c[3]=1;printf("%d",c[3]);陣列足標可以是運算式c[5-2]跟c[3]跟c[10-7]是一樣的c[10]跟c[x]是一樣的(如果x=10)c[5]跟c[x+y]是一樣的(如果x+y=5)4宣告陣列如同變數一樣,陣列在使用前必須先宣告宣告方法陣列型態
陣列名稱[陣列大小]陣列大小必須為常數值,不能是變數值例子:int
c[10];float
grade[64];
如何宣告同一型態的許多陣列?如同我們宣告相同型態的變數一樣intc[10],d[100],x[8];陣列的足標從0開始,n-1結束intc[3]擁有三個陣列元素c[0]、c[1]、c[2]intx[n]擁有n個陣列元素x[0]、x[1]…x[n-1]5陣列初始化(1/2)宣告的時候給定初始值intc[5]={1,2,3,4,5};編譯器會在編譯的時候偷偷幫我們加入以下的指令c[0]=1;c[1]=2;c[2]=3;c[3]=4;c[4]=5;如果初始值的數目小於陣列的元素個數,剩下的元素將自動設定為零intc[5]={1,2,3};c[0]=1,c[1]=2,c[2]=3,c[3]=0,c[4]=0如果初始值的數目大於陣列的元素個數,會造成語法錯誤intc[5]={1,2,3,4,5,6};如果省略陣列元素個數,則編譯器會根據初始值的個數來決定陣列的大小intc[]={1,2,3};產生3個元素的陣列6透過指定運算子來初始化陣列的元素,通常會配合重複結構來做設定的動作intcount,c[5];for(count=0;count<5;count++)c[count]=count;初始化的動作是在執行時期才會做的如果陣列的元素數目過多,會很浪費執行時間尤其是位於某函式裡面的陣列,每次呼叫這個函式,都需要初始化陣列一次減少初始化所需的時間把陣列的儲存媒體變成靜態staticintc[5];則初始化的動作會在程式開始執行前就做好陣列初始化(2/2)7意見調查分析程式
/*統計40位學生對餐廳的意見評分*/#include<stdio.h>#definePERSON
40#defineSIZE
10voidmain(){intcount;intresponse[PERSON]={1,2,6,4,8,5,9,7,8,
10,1,6,3,8,6,10,3,8,2,7,6,5,7,6,8,6,7,
5,6,6,5,6,7,5,6,4,8,6,8,10};intfrequency[SIZE]={0};
for(count=0;count<PERSON;count++)
++frequency[response[count]-1];
printf("%s%17s\n","評分等級","人數");for(count=0;count<SIZE;count++)
printf("%8d%17d\n",count+1,frequency[count]);
}評分等級人數22225115713123456789108樹狀圖程式
/*用來印出樹狀統計圖的程式*/#include<stdio.h>#defineSIZE
10voidmain(){inti,j;intn[SIZE]={19,3,15,7,11,9,13,5,17,1};printf("%s%13s%17s\n","分數","人數","統計圖");for(i=0;i<SIZE;i++){
printf("%4d%13d",i*10,n[i]);//印出分數跟人數
for(j=0;j<n[i];j++)//畫出長條圖printf("%s","▊");
printf("\n");
}
}9再看Fibonacci數列
/*用陣列來儲存Fibonacci數列*/#include<stdio.h>#defineSIZE
10voidmain(){inti;intF[SIZE]={0,
1};
for(i=2;i<SIZE;i++)
F[i]=F[i-1]+F[i-2];
for(i=0;i<SIZE;i++)
printf("F(%2d)=%2d\n",i+1,F[i]);
}F(1)=0F(2)=1F(3)=1F(4)=2F(5)=3F(6)=5F(7)=8F(8)=13F(9)=21F(10)=3410使用陣列時要注意的事當使用陣列的元素時,不能超出陣列的範圍intc[5];則使用c[6]時,會得到意想不到的結果同理,使用c[-1]時,也會得到意想不到的結果編輯器並不會幫我們檢查陣列的足標是不是在合理的範圍內我們必須要自行檢查11字元陣列charstring[]="first";"first"是字串常數(StringLiterals)編譯器會根據字串的長度來決定字元陣列的大小string這個陣列到底多大?string[0]='f',string[1]='i',string[2]='r',string[3]='s',string[4]='t',string[5]='\0';
'\0'稱為字串結束字元(nullcharacter)C裡面所有字串均以此字元作為結束此種用法只能在宣告時使用不能寫成charstring[6];string="first";也可以個別設定字元陣列的元素charstring[]={'f','I','r','s','t','\0'};12基本的字串處理#include<string.h>char*strcpy(char*目的字串,char*來源字串)包含結尾符號(NULL):’\0’char*strncpy(char*目的字串,char*來源字串,n)不包含結尾符號(NULL):’\0’char*strcat(char*字串1,char*字串2)字串2第一個字元會蓋掉字串一的NULLchar*strncat(char*字串1,char*字串2,n)字串2的n個字元會皆在字串1的後面,並在最後補上結尾符號’\0’13字串轉換#include<stdlib.h>intatoi(char*string),longatol(char*string),doubleatof(char*string)字串轉數字的函式,輸入皆為字串longstrtol(char*來源字串,char**剩餘字串,int基底),doublestrtod(char*來源字串,char**剩餘字串)優點:能將剩餘的部分傳回,以方便做其他處理14從鍵盤讀取字串
/*透過scanf從鍵盤讀取字串到程式裡面*/#include<stdio.h>intmain(void){charstring[40];inti;
printf(“請輸入字串:");
scanf("%s",string);
printf(“您輸入的字串為:%s\n",string);
//印出字元陣列裡面的個別元素for(i=0;string[i]!='\0';i++)
printf("%c",string[i]);
printf("\n");return0;}請輸入自串:thisis您輸入的字串為:thisthis15Get家族#include<stdio.h>char*gets(char*s)一次抓一字串,需要給記憶體intgetchar(void)一次抓一字元,傳回該字元的ASCII碼16用gets()改寫
/*透過scanf從鍵盤讀取字串到程式裡面*/#include<stdio.h>intmain(void){charstring[40];inti;
printf(“請輸入字串:");
gets(string);
printf(“您輸入的字串為:%s\n",string);
//印出字元陣列裡面的個別元素for(i=0;string[i]!='\0';i++)
printf("%c",string[i]);
printf("\n");return0;}請輸入自串:thisis您輸入的字串為:thisisthisis17用getchar()改寫
/*透過scanf從鍵盤讀取字串到程式裡面*/#include<stdio.h>intmain(void){charstring[40];inti=0,c;
printf(“請輸入字串:");
do{ c=getchar(); string[i++]=c; }while(c!=‘\n’);
string[i]=‘\0’;
printf(“您輸入的字串為:%s\n",string);
//印出字元陣列裡面的個別元素for(i=0;string[i]!='\0';i++)
printf("%c",string[i]);
printf("\n");return0;}請輸入自串:thisis您輸入的字串為:thisisthisis18從鍵盤讀取字串說明如果使用scanf來讀取必須使用轉換指定詞%s後面直接給定字元陣列的名稱即可,無須加上&字元陣列的名稱就是其在記憶體裡面的起始位址scanf會從輸入緩衝區讀取字元進來,一直遇到空白字元為止潛在性的危險?當使用者輸入的字串長度大於用來接收的字元陣列大小時怎麼印出來?透過printf,並且使用轉換指定詞%sprintf會一直列印此陣列中的字元,一直遇到結束的null字元為止19若想傳遞陣列引數(Arguments)至某個函式時,只需指定陣列的名稱即可intpass[20];function_call(pass);C會自動的以模擬傳參考呼叫(CallbyReference)的方式來將陣列傳給函式亦即被呼叫的函式能更改位於呼叫者中的原始陣列陣列的名稱其實便是陣列的第一個元素的位址所以事實上我們是把位址傳過去被呼叫的函式就知道陣列放在哪個記憶體位址當然我們也可以只傳入陣列的某個元素就好像我們傳入一般的變數一樣call_function(pass[10]);傳遞陣列到函式裡面20函式的原型宣告怎麼寫若某一個函式想要接收一個陣列(位址),要怎麼寫原型宣告voidfunction_call(inta[]);
或者voidfunction_call(int[]);但是通常我們會在傳入的時候,順便跟函式講我們傳入的陣列的大小可以避免函式存取到不是在陣列範圍裡面的東西voidfunction_call(int[],int);中括號裡面不需要指定陣列的大小,就算指定,編譯器也不會理它,所以我們必須另外用一個引數來告訴函式我們傳入的陣列大小21傳入陣列到函式
/*傳入陣列到函式裡面*/#include<stdio.h>voidtestfunc(int[],int);voidmain(){inta[5]={1,2,3,4,5},count;
printf("呼叫前陣列內容:");
for(count=0;count<5;count++)//印出陣列元素
printf("%d",a[count]);
testfunc(a,5);
printf("\n呼叫後陣列內容:");
for(count=0;count<5;count++)//印出陣列元素
printf("%d",a[count]);}voidtestfunc(intb[],intsize){
intcount;for(count=0;count<size;count++)
b[count]*=2;
}呼叫前陣列內容:12345呼叫後陣列內容:24681022多維陣列(Multiple-SubscriptedArrays)多維陣列儲存的順序常用來表示以列(row)和行(column)組成的表格若要指出多維陣列裡面的某一個元素用兩個足標一個指出所在的列,一個標示所在的行多維陣列的維度可以超過2個ANSIC規定至少必須支援12維第0列第1列第2列第0行第1行第2行第3行a[0][0]a[1][0]a[2][0]a[0][1]a[1][1]a[2][1]a[0][2]a[1][2]a[2][2]a[0][3]a[1][3]a[2][3]列足標陣列名稱行足標23多維陣列(Multiple-SubscriptedArrays)多維陣列連續空間先行(column)再列(row)a[0][0]a[0][1]a[0][2]a[0][3]a[1][3]a[2][0]a[2][1]a[2][2]a[1][0]a[1][1]a[1][2]a[2][3]24多維陣列設定初值可以在宣告的時候設定其初始值範例一:intb[2][2]={{1,2},{3,4}};intb[2][2]={1,2,3,4};範例二:intb[2][2]={{1},{3,4}};intb[2][2]={1,0,3,4};範例三:intb[2][2]={{1,2},{3}};intb[2][2]={1,2,3};10341234123025矩陣相乘ABCC[0][0]=A[0][0]*B[0][0]+A[0][1]*B[1][0];C[0][1]=A[0][0]*B[0][1]+A[0][1]*B[1][1];C[0][2]=A[0][0]*B[0][2]+A[0][1]*B[1][2];…C[2][1]=A[2][0]*B[0][1]+A[2][1]*B[1][1];C[2][2]=A[2][0]*B[0][2]+A[2][1]
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 品牌代言合同范本
- 商店用人安全合同范本
- 回收废旧电缆合同范本
- 别墅伐木协议合同范例
- 出国回民劳务合同范本
- 微生物测试题(附答案)
- 病理学模拟题与参考答案
- 人教版部编版小学语文一年级上册认识声母b教学设计教案
- 医药公司财务部年终总结
- 2025年医用氩气系统项目建议书
- 关于鲁迅简介
- 余华读书分享名著导读《文城》
- Horiba 流量计中文说明书
- 鉴定前设施设备检查记录表样本
- 植物组织培养(园林植物教研组)-说课稿
- 高三二轮专题复习化学课件-分布系数(分数)图像
- 变更更正户口项目申请表
- (译林版)六年级英语完形填空100篇(含答案和讲解)
- 云南省蒙自市长桥海水库扩建工程环评报告
- 大数据分析教学大纲教案
- 质量手册(依据ISO9001:2023年标准)
评论
0/150
提交评论