实验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,于是乱码问题解决了(虽然不清楚会不会有副作用)。

希望这个表能帮助到有需要的人。

 

posted @ 2021-05-21 23:20  namelessbird  阅读(80)  评论(1编辑  收藏  举报