一、數組
1.1、數組的概念
用來存儲一組相同類型數據的數據結構。有點像班上放手機的手機袋,超市的儲物櫃。
特點:只能存放一種類型的數據,如全部是int型或者全部是char型,數組里的數據成為元素。
1.2、數組的定義
格式: 類型 數組名[元素個數];
舉例:存儲5個人的年齡
int ages[5]; //在內存中開辟4x5=20個字節的存儲空間
char str[]={'x','y'};
char str[]="xy";
double array[10];
可以在定義數組的同時對數組進行初始化:
int ages[5]={17,18,19,20,21};
遍歷數組:
for(int i=0;i<5;i++)
{
printf(“ages[%d]=%d\n”,i,ages[i]);
}
注意:
(1)數組的初始化
①.int ages[5]={17,18,19,20,21};//一般寫法
②. int ages[5]={17,18};//只對前兩個元素賦值
③. int ages[5]={[3]=10,[4]=11};//對指定的元素賦值,這里為第三個和第四個
④. int ages[]={11,12,13}.//正確,右邊的元素確定,則個數可以省略這里為3個。
⑤. int ages[];//錯誤,編譯器無法知道應該分配多少的存儲空間
⑥. int ages[5];ages={17,18,19,20,21};//錯誤,只能在定義數組時這樣進行初始化
⑦. int ages[‘A’]={1,2,3};//正確,相當於是ages[65]
⑧. int count=5;int ages[count];//如果不進行初始化,則這種寫法正確,編譯器不會報錯為其分配20個字節的存儲空間,ages[0]=1;ages[1]=2;可以像這樣對數組的元素進行賦值,但是2,3,4等元素的值時不確定的。
⑨. 而int count=5;int ages[count]={1,2,3,4,5};//這種寫法是錯誤的,在定義數組時對數組進行初始化,元素的個數必須為常量或者不寫,不能是一個變量
但是訪問數組時,是利用相同的數組名和其不同的下標來訪問,下標必須從0開始計算,那么最后一個元素的下標就是“長度-1”。即數組元素的一般形式為:數組名[下標]
#include "stdio.h" void main() { //數組定義 int a[5],i; //定義長度為5的int類型數組,相當於定義了5個變量 //使用數組元素,0-5叫下標 a[0]=100; a[1]=200; a[2]=300; a[3]=400; a[4]=500; //循環輸入 for(i=0;i<5;i++) { scanf("%d",&a[i]); } //遍歷數組中的每一個元素 for(i=0;i<5;i++) { printf("%d \n",a[i]); } }
1.3、計算平均成績與總分
/* Note:Your choice is C IDE */ #include "stdio.h" void main() { //定義一個長度為10的float類型的數組, //循環輸入10個學生的成績 //計算出平均成績與總分 //數組定義 int i; float mark[10],s=0; //定義float數組,長度為10,0-9 for(i=0;i<10;i++) { printf("mark[%d]=",i); scanf("%f",&mark[i]); } for(i=0;i<10;i++) { s=s+mark[i]; } printf("總分:%.2f",s); printf("平均分:%.2f",s/10); }
1.4、數組初始化
初始化賦值的一般形式為:
類型說明符 數組名[常量表達式]={值,值……值};
其中在{ }中的各數據值即為各元素的初值,各值之間用逗號間隔。例如:
int a[10]={ 0,1,2,3,4,5,6,7,8,9 };
相當於a[0]=0;a[1]=1...a[9]=9;
可以只給部分元素賦初值,但值的個數多於數組元素個數則不行;當{ }中值的個數少於數組元素個數時,則只給前面部分元素賦值,多於數組元素個數時,則越界。
只能給元素逐個賦值,不能給數組整體賦值。
如給全部元素賦值,則在數組說明中,可以不給出數組元素的個數。
#include "stdio.h" void main() { int i,a[]={1,2}; for(i=0;i<3;i++) { printf("%d\n",a[i]); } }
1
2
1.5、求數組中最大數
#include "stdio.h" void main() { int a[]={95,59,98,0,35,46,8,-1,99,98},max,i; //假定最大數為a[0] max=a[0]; //遍歷,枚舉 for(i=1;i<10;i++) { if(a[i]<max) { max=a[i]; } } printf("%d",max); }
99
1.6、冒泡排序
冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序算法。
-
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
-
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。
-
針對所有的元素重復以上的步驟,除了最后一個。
-
持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
/* Note:Your choice is C IDE */ #include "stdio.h" void main() { //冒泡排序 int a[]={195,99,98,0,-35,46,8,-10,99,98},i,j,t; for(i=0;i<9;i++) { for(j=0;j<9-i;j++) { if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } for(i=0;i<10;i++) printf("%d \n",a[i]); }
N個數排序,外重循環N-1,內重循環N-1-i,比較交換
二、字符串
2.1、字符串概念與定義
C語言中的字符數組就是一個字符串,字符串是一個特殊的字符數組。
單字符數組的定義
例如:
char c[10]; /*單字符數組,即一串字符*/
單字符數組的初始化
例如:
char c[10]={'H','e','l','l','o','\0'};
char c[]={'H','e','l','l','o',0};
這種初始化方法,系統不會自動給其加上字符串結束符,即’\0’字符,所以要人為加上。
字符串結束標志:在C語言中沒有專門的字符串變量,通常用一個字符數組來存放一個字符串。字符串常量總是以'\0'作為字符串的結束符。因此當把一個字符串存入一個數組時,也把結束符'\0'存入數組,並以此作為該字符串是否結束的標志。有了'\0'標志后,就不必再用字符數組的長度來判斷字符串的長度了。
/* Note:Your choice is C IDE */ #include "stdio.h" void main() { //字符串 (糖葫蘆) char str[]={'H','e','l','l','o','\0'}; int i; char str1[]="Kitty"; printf("%s",str1); for(i=0;i<5;i++) printf("\n %c",str1[i]); }
2.2、字符串輸入與輸出
2.2.1、使用scanf與printf可以完成字符串的輸入
char str[100];
scanf("%[^\n]s",str);
printf("%s",str);
2.2.2、使用gets,puts完成
/* Note:Your choice is C IDE */ #include "stdio.h" #include "string.h" void main() { //數組字符串輸入時不需要&取地址 char name[100]; gets(name); //從鍵盤輸入字符串 puts(name); //輸出字符串 }
2.3、字符串連接函數strcat
格式:
strcat (字符數組名1,字符數組名2)
功能:
把字符數組2中的字符串連接到字符數組1 中字符串的后面,並刪去字符串1后的串標志“\0”。本函數返回值是字符數組1的首地址。
注意:第一個參數只能是字符數組變量,而不能是字符串常量
#include "stdio.h" #include "string.h"; void main() { char str1[100]="Hello"; char str2[]=" Kitty"; //使用strcat函數將str2的內容復制到 //str1中,只適用於字符串 strcat(str1,str2); printf("%s \n",str1); printf("%s \n",str2); }
2.4、字符串拷貝函數strcpy
格式:
strcpy (字符數組名1,字符數組名2)
功能:
把字符數組2中的字符串拷貝到字符數組1中。字符串結束標志“\0”也一同拷貝。字符數組2,也可以是一個字符串常量。這時相當於把一個字符串賦予一個字符數組
/* Note:Your choice is C IDE */ #include "stdio.h" #include "string.h"; void main() { char str1[100]="Boy!"; char str2[]="Girl!"; printf("%s \n",str1); printf("%s \n",str2); //將str2的內容復制到str1中 strcpy(str1,str2); printf("%s \n",str1); printf("%s \n",str2); }
2.5、字符串比較函數strcmp
格式:
strcmp(字符數組名1,字符數組名2)
功能:
按照ASCII碼順序比較兩個數組中同位字母的大小,並由函數返回值返回比較結果。
字符串1=字符串2的話,返回值=0;
字符串2>字符串2的話,返回值 >0;
字符串1<字符串2的話,返回值 <0。
本函數也可用於比較兩個字符串常量,或比較數組和字符串常量。
/* Note:Your choice is C IDE */ #include "stdio.h" #include "string.h"; void main() { char str1[]="abe123"; char str2[]="abd"; //-1 小於 //0 等於 //1 大於 printf("%d",strcmp(str1,str2)); }
1
2.6、獲得字符串長度函數strlen
格式:
strlen(字符數組名)
功能:
計算數組里字符串的實際長度(不含字符串結束標志‘\0’) 並將長度作為函數返回值;也可以計算字符串常量的長度。
/* Note:Your choice is C IDE */ #include "stdio.h" #include "string.h"; void main() { char str1[]="abe123"; //獲得字符串長度,中文占兩位 printf("\n %d",strlen(str1)); }
6
2.7、數組移動作業 P181
/* Note:Your choice is C IDE */ #include "stdio.h" void main() { //10 int a[]={3,6,9,15,18,26,98,0,0,0},n,p=7,i; //輸入要插入的數 scanf("%d",&n); //確定位置 for(i=0;i<7;i++) { if(a[i]>=n)//如果數組中的當前數與n相同 { p=i; break; } } //移動 for(i=7;i>=p;i--) { a[i]=a[i-1]; } //插入 a[p]=n; //顯示結果 for(i=0;i<8;i++) { printf("%d \t",a[i]); } }
三、二維數組
一組數組是線性的,二組數組是平面的
/* Note:Your choice is C IDE */ #include "stdio.h" void main() { int a[3][3],i,j; a[0][0]=1; a[0][1]=5; for(i=0;i<3;i++) { for(j=0;j<3;j++) { a[i][j]=i*j; } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf("a[%d][%d]=%d \t",i,j,a[i][j]); } printf("\n"); } }
/* Note:Your choice is C IDE */ #include "stdio.h" void main() { int a[3][3]={{1,2,3},{4,5,6},{7,8,9}},i,j; for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf("a[%d][%d]=%d \t",i,j,a[i][j]); } printf("\n"); } }
四、上課示例與作業源文件下載