实验5
1.一维数组
代码如下:
1 #include <stdio.h> 2 const int N=3; 3 int main() { 4 int a[N] = {1, 2, 3}; 5 int i; 6 printf("通过数组名和下标直接访问数组元素:\n"); 7 for(i=0; i<N; i++) 8 printf("%d: %d\n", &a[i], a[i]); 9 printf("通过地址间接访问数组元素:\n"); 10 for(i=0; i<N; i++) 11 printf("%d: %d\n", a+i, *(a+i)); 12 return 0; 13 }
结果如下:
结果显示数组中每个元素占4个字节,连续存放。
a[i]与*(a+i),&a[i]与 a+i 是等价的表达式。
2.二维数组
代码如下:
1 #include <stdio.h> 2 #define LINE 2 3 #define COL 3 4 int main() { 5 int a[LINE][COL] = {1,2,3,4,5,6}; 6 int i,j; 7 printf("通过数组名和下标直接访问数组元素:\n"); 8 for(i=0; i<LINE; i++) 9 for(j=0; j<COL; j++) 10 printf("%d: %d\n", &a[i][j], a[i][j]); 11 printf("通过地址间接访问数组元素:\n"); 12 for(i=0; i<LINE; i++) 13 for(j=0; j<COL; j++) 14 printf("%d: %d\n", a[i]+j, *(a[i]+j)); 15 printf("二维地址中a+i表示的地址:\n"); 16 for(i=0; i<LINE; i++) 17 printf("a + %d: %d\n", i, a+i); 18 return 0; 19 }
不知道为什么,我的软件环境下 const int 定义常量运行时会报错,就换了个定义方法。
结果如下:
结果显示,二维数组中元素是连续存放的,由每行第一个元素划分为几组。
a[i]+j和&a[i][j],*(a[i]+j)和a[i][j] 是等价表达式。
&a[i]与a+i 都表示二维数组每行地址。
3.指针与一维数组
代码如下:
1 #include <stdio.h> 2 #define N 3 3 int main(){ 4 int a[N]; 5 int *p,i; 6 // 通过指针变量p,完成数组元素输入 7 for(p=a; p<a+N; p++) 8 scanf("%d", p); 9 //通过指针变量p,完成数组元素输出 10 for (p=a; p<a+N; ++p) 11 printf("%d ",*p); 12 printf("\n"); 13 14 p=a; 15 //通过指针变量p,完成数组元素输入 16 for(i=0; i<N; i++) 17 scanf("%d", p+i); 18 // 通过指针变量p,完成数组元素输出 19 for(i=0; i<N; i++) 20 printf("%d ", *(p+i)); 21 printf("\n"); 22 23 return 0; 24 }
结果如下:
7,8行执行完,指针p指向数组最后一个元素。
执行10,11行时先把p指针复位到数组第一位,执行完毕时p又指向数组最后一位。
16,17 与19,20 行执行完,p指针都指向数组最后一位。
4.指针与二维数组
代码如下:
1 #include <stdio.h> 2 int main(){ 3 int a[2][3] = {1,2,3,4,5,6}; 4 int i,j; 5 int *p; // p是指针变量,存放int型数据的地址 6 int (*q)[3]; // q是指针变量,存放包含有3个元素的一维数组的地址 7 // 通过指针变量p间接访问,输出二维数组a的元素值 8 for(p=a[0]; p<a[0]+6; p++) 9 printf("%d ", *p); 10 printf("\n"); 11 // 通过行指针变量q间接访问,输出二维数组a的元素值 12 for(q=a; q<a+2; q++) 13 for(j=0; j<3; j++) 14 printf("%d ", *(*q+j)); 15 printf("\n"); 16 return 0; 17 }
结果如下:
将第8行中a[0]改成&a[0][0]也可以。
第14行中*q+j表示q指向的行中第j个元素的地址,*(*q+j)则指元素本身。
p指针自身+1往后移动一位(即4字节/1个元素),行指针q自身+1往后移动一行。
&a[1][2],a[0]+5,p+5,*(q+1)+2,&a[0][0]+3+2 都可表示a[1][2]的地址。
5.二分查找
直接访问查找代码如下:
1 #include <stdio.h> 2 #define N 5 3 int binarysearch(int x[N],int n,int item); 4 int main(){ 5 int a[N]={2,7,19,45,66}; 6 int i,index,key; 7 8 printf("数组a中数据:\n"); 9 for(i=0;i<N;i++){ 10 printf("%d ",a[i]); 11 } 12 printf("\n"); 13 14 printf("输入待查找的数据项: "); 15 while(scanf("%d", &key)!=EOF) { 16 index = binarysearch(a, N, key); 17 if (index >= 0) 18 printf("%d在数组中,下标为%d\n", key, index); 19 else 20 printf("%d不在数组中\n", key); 21 printf("输入待查找的数据项: "); 22 } 23 24 return 0; 25 } 26 int binarysearch(int x[],int n,int item) { 27 int low = 0, high = n - 1, mid; 28 while(low<=high) { 29 mid = (low + high) / 2; 30 if (x[mid] == item) 31 return mid; 32 else if (x[mid]<item) 33 low = mid + 1; 34 else 35 high = mid - 1; 36 } 37 return -1; 38 }
结果如下:
指针查找代码如下:
1 #include <stdio.h> 2 #define N 5 3 int binarysearch(int *x,int n,int item); 4 int main(){ 5 int a[N]={2,7,19,45,66}; 6 int i,index,key; 7 8 printf("数组a中数据:\n"); 9 for(i=0;i<N;i++){ 10 printf("%d ",a[i]); 11 } 12 printf("\n"); 13 14 printf("输入待查找的数据项: "); 15 while(scanf("%d", &key)!=EOF) { 16 index = binarysearch(a, N, key); 17 if (index >= 0) 18 printf("%d在数组中,下标为%d\n", key, index); 19 else 20 printf("%d不在数组中\n", key); 21 printf("输入待查找的数据项: "); 22 } 23 24 return 0; 25 } 26 int binarysearch(int *x,int n,int item) { 27 int low = 0, high = n - 1, mid; 28 while(low<=high) { 29 mid = (low + high) / 2; 30 if (*(x+mid)== item) 31 return mid; 32 else if (*(x+mid)<item) 33 low = mid + 1; 34 else 35 high = mid - 1; 36 } 37 return -1; 38 }
结果如下:
6.选择排序
代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 #define N 5 4 void selectsort(char str[][20],int n); 5 int main(){ 6 char name[N][20]={"Bob","Bill","Joseph","Taylor","George"}; 7 8 printf("排序前名单:\n"); 9 for (int i = 0; i < N; ++i) { 10 printf("%s\n", name[i]); 11 } 12 13 selectsort(name,N); 14 15 printf("按字典序输出名单:\n"); 16 for (int i = 0; i <N ; ++i) { 17 printf("%s\n",name[i]); 18 } 19 20 return 0; 21 } 22 23 void selectsort(char str[][20],int n){ 24 int min,i,j; 25 char temp[20]; 26 for ( i = 0; i<n-1; ++i) { 27 min=i; 28 for (j = i+1; j<n; ++j) { 29 if (strcmp(str[j],str[min])<0) 30 min=j; 31 } 32 if (strcmp(str[j],str[min])!=0) { 33 strcpy(temp,str[i]); 34 strcpy(str[i],str[min]); 35 strcpy(str[min],temp); 36 } 37 } 38 }
结果如下:
后记(?):
这次实验中意外地解决了我用的编译器输出中文时乱码的问题,和大家分享一下。
偶然间发现了这么一个乱码对照表:
我的编译器在输出中文时会变成古文乱码,查表时知道是以GBK方式读取UTF-8编码的中文。
后来又发现我的编译器右下角有个这个:
这么说我在程序里输入的中文是以UTF-8方式编码的,但运行时用GBK方式输出,这样就说得通了。
然后我把右下角的编码方式改成了GBK,于是乱码问题解决了(虽然不清楚会不会有副作用)。
希望这个表能帮助到有需要的人。