实验结论:

1,二分查找:

①:利用数组传递变量:

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

运行截图:

 

 

②:利用指针变量:

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

运行截图:

 

 

 

2. 选择法排序:

①:对整数排序:(照搬老师的成果QAQ)

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

 

②:对字符串排序:

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

 

用指针处理字符串部分,因为是老师写好的完整代码,所以在总结和体会中再po出吧

 

 

 

 

第二部分:总结与体会:

第一:关于二分查找: 这个方法和高中的数学其实很相似,所以理解起来也没有很复杂,大致方法我再抄一下老师写的便于我更好的记忆:

二分查找   待查找的数据序列必须满足两个条件:① 顺序存储;② 元素有序。

二分查找的方法:
把待查找数据项x与有序序列的中间项元素进行比较:(设有序数据序列是由小→大的)
如果item == 中间项元素,则表示找到;
如果item < 中间项元素,则在序列的前半部分以二分法继续查找;
如果item> 中间项元素,则在序列的后半部分以二分法继续查找

做程序时候的话 自己感觉还是不是很好上手,可能是自己真的在计算机这方面很不熟悉吧 碰到自己填程序了就觉得大脑放空,完全不知道怎么补足,理解别人的完整程序还是可以的 所以我发现我只会依葫芦画瓢,不太行,自己还是得多去上上机,练练能力

在形参、实参写法,以及函数实现中数组元素表示的差异:

纯用数组的话,理解起来比较容易 上手方便,但是做起来比较繁琐不太方便

使用指针变量以后会使次函数里面的一些语句变得简单和清楚,但是自己写出来不太会想到这个方法。

 

 

 

第二,实验内容2:选择法排序

使用选择法对字符串排序时注意事项:

首先我觉得看见字符串 交换比较复制的时候就不能用****==***  等等等等之类的赋值语句了 应该要用几种专门的公式来进行比较复制等操作,这是最为关键的我觉得

其次,在字符串进行操作时,应该记得定义的时候用char 输出的时候用%s 这些小细节应当注意了。

 

 

 

第三,实验内容3:使用指针变量对字符串进行处理
注意事项总结:

首先:字符串操作的那些注意事项参考上一条

其次,使用指针变量时候应该注意每次使用*p时 应该要先给它指向一个数组,不然就会出现错误,

最后一些指针变量使用起来的便捷写法,我们应该看得懂并理解,必要时可以使用就最好了(虽然我觉得我写不了)

在给指针变量指向一个数组以后,它就可以代表这个数组进行一些操作了 这点也是要注意的哦

(水平有限 理解的就这么多了 课后会自我巩固的QAQ)

 

互评:①:https://www.cnblogs.com/gundongtiao/p/10926672.html

②:https://www.cnblogs.com/qwer9107/p/10931562.html

③:https://www.cnblogs.com/silentisland/p/10913271.html