EXP5

实验任务1

 1 #include <stdio.h> 
 2 const int N=7; 
 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; }

 

由以上运行结果可知,数组元素在内存中是连续存放的。

a+i 和 &a[i]表示第i个元素的地址。

*(a+i)和a[i]都表示数组元素a[i] 。
 
 
 
实验任务2
 1 #include <stdio.h> 
 2 const int LINE = 2; 
 3 const int 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 }

 

C语言中,二维数组的地址在内存中是按行存放的。

a[i]+j和&a[i][j]都表示二维数组元素a[i][j]的地址
*(a[i]+j)和a[i][j]都表示二维数组元素a[i][j]
a和&a[0]都表示二维数组第0行的地址
a+1和&a[1]都表示二维数组第1行的地址
 
 
实验任务3
 1 // 使用指针变量间接访问一维数组 
 2 #include <stdio.h> 
 3 #include <stdlib.h> 
 4 const int N=3;
 5 int main() 
 6 { 
 7     int a[N]; int *p,i;
 8     // 通过指针变量p,完成数组元素输入 
 9     for(p=a; p<a+N; p++) 
10         scanf_s("%d", p); 
11     // 过指针变量p,完成数组元素输出 
12     for (p = a; p < a + N; p++) printf("%d ", *p);  printf("\n");
13 
14      
15 
16 
17 
18 
19     p = a; 
20     //通过指针变量p,完成数组元素输入 
21     for(i=0; i<N; i++) scanf_s("%d", p+i); 
22     // 通过指针变量p,完成数组元素输出
23     for (i = 0; i < N; i++) printf("%d ", *(p + i)); 
24     printf("\n"); return 0;
25 }

 
1. 程序中,指针变量p在使用时指向确定的地址。
2. 程序源码中,line12-line13执行完后,指针变量p指向  a[N]       
line16-line17执行完后,指针变量p指向a[N]
3. 程序源码中,line22-line27执行完后,指针变量p指向a[0], line26-line27执行完后,指针变量p
指向a[0]
4. 对比line16-line17和line26-line27,前者改变了指针变量P的指向位置,后者用变量i的变化来完成数组元素的输入与输出,没有改变指针变量P的指向。
 
 
实验任务4
 
 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.可以。

 

2. 程序源码中,line18中,q= a 时,*q+j表示二维数组第0行第j列元素的地址。  *(*q+j)表示 二维数组第q行第j列的地址所指向的元素。
 
4.A B C D E F G全部都正确。
 
 
实验任务5
 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_s("%d", &key);
20     
21     // 调用函数binarySearch()在数组a中查找指定数据项key,并返回查找结果给index
22     // 补足代码① 
23     index = binarySearch(a,N,key);
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 #define _CRT_SECURE_NO_WARNINGS
 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_s("%d", &key);
20     
21     // 调用函数binarySearch()在数组a中查找指定数据项key,并返回查找结果给index
22 
23     // ×××
24     index= binarySearch(&a[0], N, key);
25     
26     if(index>=0) 
27         printf("%d在数组中,下标为%d\n", key, index);
28     else
29         printf("%d不在数组中\n", key); 
30    
31    return 0;
32 }
33 
34 //函数功能描述:
35 //使用二分查找算法在数组x中查找特定值item,数组x大小为n 
36 // 如果找到,返回其下标 
37 // 如果没找到,返回-1 
38 int binarySearch(int x[], int n, int item) {
39     int low, high, mid;
40     
41     low = 0;
42     high = n-1;
43     
44     while(low <= high) {
45         mid = (low+high)/2;
46         
47         if (x[mid]==item)
48             return mid;
49         else if(x[mid]>item)
50             high = mid - 1;
51         else
52             low = mid + 1;
53     }
54     
55     return -1;
56 }

 

 

 

 

实验任务6

 

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

posted @ 2020-12-17 13:13  kagiii  阅读(177)  评论(3)    收藏  举报