实验5

ex1:

 1 #include <stdio.h> 
 2 
 3 const int N=3;
 4 int main() {
 5     int a[N] = {1, 2, 3};  
 6     int i;
 7     
 8     printf("通过数组名及下标直接访问数组元素:\n");
 9     for(i=0; i<N; i++)
10         printf("%d: %d\n", &a[i], a[i]);
11         
12     printf("通过地址间接访问数组元素:\n");
13     for(i=0; i<N; i++)
14         printf("%d: %d\n", a+i, *(a+i));
15 
16     return 0;
17 }

 

Q1:数组元素在内存中是否是连续存放的?
A:是的
Q2:对于数组元素及其地址的访问,以下访问方式是否是等价的?
         a+i和&a[i]都表示数组元素a[i]的地址
         *(a+i)和a[i]都表示数组元素a[i]
A:是等价的
 
ex2:
 1 #include <stdio.h>
 2 const int LINE = 2;
 3 const int COL = 3;
 4 
 5 int main() {
 6     int a[LINE][COL] = {1,2,3,4,5,6};  
 7     int i,j;
 8     
 9     printf("通过数组名及下标直接访问数组元素:\n");
10     for(i=0; i<LINE; i++)
11         for(j=0; j<COL; j++)
12             printf("%d: %d\n", &a[i][j], a[i][j]);
13         
14     printf("通过地址间接访问数组元素:\n");
15     for(i=0; i<LINE; i++)
16         for(j=0; j<COL; j++)
17             printf("%d: %d\n", a[i]+j, *(a[i]+j));
18     
19     printf("二维地址中a+i表示的地址:\n");
20     for(i=0; i<LINE; i++) 
21         printf("a + %d: %d\n", i, a+i);
22     
23     return 0;
24 }

 

 

 

结合运行结果观察并理解:
Q1. c语言中,二维数组在内存中是否是按行存放的?
A1.是的
Q2. 对于二维数组元素及其地址的访问,以下方式是否是等价的?
         a[i]+j和&a[i][j]都表示二维数组元素a[i][j]的地址
         *(a[i]+j)和a[i][j]都表示二维数组元素a[i][j]
A2.是的
Q3. 对于二维数组a[2][3],以下方式是否是等价的?
         a和&a[0]都表示二维数组第0行的地址
         a+1和&a[1]都表示二维数组第1行的地址
A3.是的
 
 
ex3:
 1 // 使用指针变量间接访问一维数组 
 2 #include <stdio.h> 
 3 #include <stdlib.h> 
 4 
 5 const int N=3;
 6 
 7 int main() {
 8     int a[N];
 9     int *p,i;
10     
11     // 通过指针变量p,完成数组元素输入
12     for(p=a; p<a+N; p++)
13         scanf("%d", p);
14     
15     // 过指针变量p,完成数组元素输出
16     for(p=a; p<a+N; p++)
17         printf("%d ", *p);
18     printf("\n");
19     
20     p = a;
21     //通过指针变量p,完成数组元素输入
22     for(i=0; i<N; i++)
23         scanf("%d", p+i); 
24         
25     // 通过指针变量p,完成数组元素输出
26     for(i=0; i<N; i++)
27         printf("%d ", *(p+i));
28     printf("\n"); 
29 
30     return 0;
31 }

结合运行结果,观察并思考:

1. 程序中,指针变量p在使用时是否指向确定的地址?
2. 程序源码中,line12-line13执行完后,指针变量p指向哪里?line16-line17执行完后,指针变量p
指向哪里?
3. 程序源码中,line22-line27执行完后,指针变量p指向哪里?line26-line27执行完后,指针变量p
指向哪里?
4. 对比line16-line17和line26-line27,体会它们通过指针变量间接访问一维数组时的差异和灵活
性。 
 
 
答:1.否
       2.line12-line13执行完后,指针变量p指向a[3]
          line16-line17执行完后,指针变量p指向a[3]
       3.line16-line17执行完后,指针变量p指向a[0]
          line26-line27执行完后,指针变量p指向a[0]
       4.还在体会中
 
ex4:
 1 // 使用指针变量间接访问二维数组 
 2 #include <stdio.h> 
 3 
 4 int main() {
 5     int a[2][3] = {1,2,3,4,5,6};
 6     int i,j;
 7     int *p;  // p是指针变量,存放int型数据的地址 
 8     int (*q)[3]; // q是指针变量,存放包含有3个元素的一维数组的地址
 9     
10     // 通过指针变量p间接访问,输出二维数组a的元素值
11     for(p=a[0]; p<a[0]+6; p++)
12         printf("%d ", *p);
13     printf("\n");
14     
15     // 通过行指针变量q间接访问,输出二维数组a的元素值 
16     for(q=a; q<a+2; q++)
17         for(j=0; j<3; j++)
18             printf("%d ", *(*q+j));
19     printf("\n");
20     
21 
22     return 0;
23 }

 

 问题:

1. 程序源码中,line11改成如下形式是否可以?

 1 for(p=&a[0][0]; p<&a[0][0] + 6; p++) 

2. 程序源码中,line18中,*q+j*(*q+j)分别表示什么?

 3. 结合line11-line12line16-line18,理解和体会二维数组中,指向数组元素的指针变量p和指向
一维数组的指针变量q的不同。 
4. 基于对这个实验的理解,回答以下问题。
设有如下代码片段:
1 int a[2][3];
2 int (*q)[3]; 
3 int *p; 
4 p = a[0]; 
5 q = a;

则,以下能够正确表示数组元素a[1][2]地址的有?

A. &a[1][2]
B. a[0] + 5
C. p + 5
D. *q + 5
E. *(q+1) + 2
F. &a[0][0] + 1*3 + 2
G. a[0] + 1*3 + 2
 
答:
1.可以
2.*q+j表示a[0][j]的地址
   *(*q+j)表示a[0][j]元素值
3.指向唯一元素的代码稍简洁一点
   指向一堆数组在需要精确调用时更方便
4.都有
 
ex5:
 1 // 练习:使用二分查找,在一组有序元素中查找数据项
 2 //  形参是数组,实参是数组名 
 3 #include  <stdio.h>
 4 
 5 const int N=5;
 6 
 7 int binarySearch(int x[], int n, int item); // 函数声明 
 8 
 9 int main() {
10     int a[N]={2,7,19,45,66};
11     int i,index, key;
12     
13     printf("数组a中的数据:\n");
14     for(i=0;i<N;i++)
15        printf("%d ",a[i]);
16     printf("\n");
17     
18     printf("输入待查找的数据项: ");
19     scanf("%d", &key);
20     
21     // 调用函数binarySearch()在数组a中查找指定数据项key,并返回查找结果给index
22     index=binarySearch(a,N,key);23     
24     
25     if(index>=0) 
26         printf("%d在数组中,下标为%d\n", key, index);
27     else
28         printf("%d不在数组中\n", key); 
29    
30    return 0;
31 }
32 
33 //函数功能描述:
34 //使用二分查找算法在数组x中查找特定值item,数组x大小为n 
35 // 如果找到,返回其下标 
36 // 如果没找到,返回-1 
37 int binarySearch(int x[], int n, int item){
38     int low, high, mid;
39     
40     low = 0;
41     high = n-1;
42     
43     while(low <= high){
44         mid = (low+high)/2;
45         
46         if (item==x[mid])
47             return mid;
48         else if(item<x[mid])
49             high = mid - 1;
50         else
51             low = mid + 1;
52     }
53     
54     return -1;
55 }

 

 

 

 1 // 练习:使用二分查找,在一组有序元素中查找数据项
 2 //  形参是指针变量,实参是数组名 
 3 #include  <stdio.h>
 4 
 5 const int N=5;
 6 
 7 int binarySearch(int *x, int n, int item); // 函数声明 
 8 
 9 int main() {
10     int a[N]={2,7,19,45,66};
11     int i,index, key;
12     
13     printf("数组a中的数据:\n");
14     for(i=0;i<N;i++)
15        printf("%d ",a[i]);
16     printf("\n");
17     
18     printf("输入待查找的数据项: ");
19     scanf("%d", &key);
20     
21     // 调用函数binarySearch()在数组a中查找指定数据项key,并返回查找结果给index
22     index=binarySearch(a,N,key);
23     
24     if(index>=0) 
25         printf("%d在数组中,下标为%d\n", key, index);
26     else
27         printf("%d不在数组中\n", key); 
28    
29    return 0;
30 }
31 
32 //函数功能描述:
33 //使用二分查找算法在从x中查找特定值item,数组x大小为n 
34 // 如果找到,返回其下标 
35 // 如果没找到,返回-1 
36 int binarySearch(int *x, int n, int item) {
37     int low, high, mid;
38     
39     low = 0;
40     high = n-1;
41     
42     while(low <= high) {
43         mid = (low+high)/2;
44         
45         if ( item == *(x+mid) )
46         {
47         return*(x+mid);
48         break;
49         }
50         else if(item < *(x+mid))
51             high=mid-1; 
52         else
53             low=mid+1; 
54     }
55     
56     return -1;
57 }

 

 

ex6:
 1 // 示例: 使用选择法排序对一组整数由小到大排序
 2 #include <stdio.h>
 3 
 4 const int N=5;
 5 void selectSort(int [], int);   // 函数声明(函数声明中可以省略变量名、数组名,但是数组名后面的[]不是能少)
 6 void input(int [], int);
 7 void output(int [], int);
 8 int main() {
 9     int a[N];
10     
11     printf("输入%d个整数\n", N);
12     input(a, N);
13     
14     printf("排序前的数据:\n");
15     output(a,N);
16     
17     selectSort(a,N); // 调用selectSort()对数组a中的N个元素排序
18     
19     printf("排序后的数据:\n");
20     output(a, N);
21     
22     return 0;     
23 } 
24 
25 // 函数定义
26 // 函数功能描述:输入n个整数到数组a中 
27 void input(int a[], int n) {
28     int i;
29     for(i=0; i<n; i++)
30         scanf("%d", &a[i]);
31 }
32 
33 // 函数定义
34 // 函数功能描述:输出数组a中的n个整数 
35 void output(int a[], int n) {
36     int i;
37     for(i=0; i<n; i++)
38         printf("%d ", a[i]);
39     printf("\n");
40 }
41 
42 // 函数定义
43 // 函数功能描述:使用选择法对数组a中的n个整数由小到大排序
44 void selectSort(int a[], int n) {
45     int i, j, k, temp;
46     
47     for(i=0; i<n-1; i++) {
48         k = i;  // k用于记录当前最小元素的下标 
49         
50         for(j=i+1; j<n; j++)
51             if (a[j] < a[k])
52                 k = j;   // 如果a[j]比当前最小元素还要小,就更新k,确保它总是存放最小元素的下标 
53                 
54         if(k != i) {  // 找到最小元素后,交换a[i]和a[k] 
55             temp = a[i];
56             a[i] = a[k];
57             a[k] = temp;
58         }
59     }
60 }

 

 

 
 1 // 练习:使用选择法对字符串按字典序排序
 2 #include <stdio.h>
 3 #include <string.h>
 4 const int N = 5;
 5 
 6 void selectSort(char str[][20], int n ); // 函数声明,形参str是二维数组名 
 7 int main() {
 8     char name[][20] = {"Bob", "Bill", "Joseph", "Taylor", "George"};
 9     int i;
10     
11     printf("输出初始名单:\n");
12     for(i=0; i<N; i++)
13         printf("%s\n", name[i]);
14         
15     selectSort(name, N);  // 调用选择法对name数组中的字符串排序
16     
17     printf("按字典序输出名单:\n");
18     for(i=0; i<N; i++)
19         printf("%s\n", name[i]);
20     
21     return 0;
22 } 
23 
24 // 函数定义
25 // 函数功能描述:使用选择法对二维数组str中的n个字符串按字典序排序 
26 void selectSort(char str[][20], int n) 
27 {
28 int i,j,k,sign;
29     char temp[20];
30     for (i=0; i<n-1; i++)
31     {
32         k=i;
33         for (j=i+1; j<n; j++)
34         {
35             sign=strcmp(str[j], str[k]);
36             if (sign<0)
37             k=j;
38             
39         }
40         if (k!=i)
41         {
42             strcpy(temp, str[i]);
43             strcpy(str[i], str[k]);
44             strcpy(str[k], temp);
45         }
46     }
47 }

 

 

 

posted @ 2020-12-18 00:45  卷心菜投手  阅读(52)  评论(2编辑  收藏  举报