第五次上机实验

1、补足程序,附上程序代码与运行截图

// 练习:使用二分查找,在一组有序元素中查找数据项
//  形参是数组,实参是数组名 
#include  <stdio.h>
const int N=5;
int binarySearch(int x[], int n, int item);
int main() {
    int a[N]={1,3,9,16,21};
    int i,index, key;
    
    printf("数组a中的数据:\n");
    for(i=0;i<N;i++)
       printf("%d ",a[i]);
    printf("\n");
    
    printf("输入待查找的数据项: ");
    scanf("%d", &key);
    
    // 调用函数binarySearch()在数组a中查找指定数据项item,并返回查找结果给index 
    // 补足代码① 
    // ××× 
    index=binarySearch(a,N,key);
    
    if(index>=0) 
        printf("%d在数组中,下标为%d\n", key, index);
    else
        printf("%d不在数组中\n", key); 
   
   return 0;
}


//函数功能描述:
//使用二分查找算法在数组x中查找特定值item,数组x大小为n 
// 如果找到,返回其下标 
// 如果没找到,返回-1 
int binarySearch(int x[], int n, int item) {
    int low, high, mid;
    
    low = 0;
    high = n-1;
    
    while(low <= high) {
        mid = (low+high)/2;
        
        if (item == x[mid])
            return mid;
        else if(item<x[mid])
            high = mid - 1;
        else
            low = mid + 1;
    }
    
    return -1;
}

补足程序(2),附上程序代码与运行截图:

// 练习:使用二分查找,在一组有序元素中查找数据项
//  形参是指针变量,实参是数组名
#include  <stdio.h>
const int N=5;
int binarySearch(int *x, int n, int item);
int main() {
    int a[N]={1,3,9,16,21};
    int i,index, key;
    
    printf("数组a中的数据:\n");
    for(i=0;i<N;i++)
       printf("%d ",a[i]);
    printf("\n");
    
    printf("输入待查找的数据项: ");
    scanf("%d", &key);
    
    // 调用函数binarySearch()在数组a中查找指定数据项item,并返回查找结果
    // 补足代码①
    // ××× 
    index=binarySearch(a,N,key);
    if(index>=0) 
        printf("%d在数组中,下标为%d\n", key, index);
    else
        printf("%d不在数组中\n", key); 
   
   return 0;
}

//函数功能描述:
//使用二分查找算法在x指向的数据项开始的n个数据中,查找item
// 如果找到,返回其位置
// 如果没找到,返回-1 
int binarySearch(int *x, int n, int item) {
    int low, high, mid;
    
    low = 0;
    high = n-1;
    
    while(low <= high) {
        mid = (low+high)/2;
        
        if (item == *(x+mid))
            return mid;
        else if(item<*(x+mid))
            high = mid - 1;
        else
            low = mid + 1;
    }
    
    return -1;
}

2、选择法排序。附上程序代码与运行截图:

// 练习:使用选择法对字符串按字典序排序
#include <stdio.h>
#include <string.h>
void selectSort(char str[][20], int n ); // 函数声明,形参str是二维数组名 
int main() {
    char name[][20] = {"John", "Alex", "Joseph", "Candy", "Geoge"};
    int i;
    
    printf("输出初始名单:\n");
    for(i=0; i<5; i++)
        printf("%s\n", name[i]);
        
    selectSort(name, 5);  // 调用选择法对name数组中的字符串排序
    
    printf("按字典序输出名单:\n");
    for(i=0; i<5; i++)
        printf("%s\n", name[i]);
     
    return 0;
} 

// 函数定义
// 函数功能描述:使用选择法对二维数组str中的n个字符串按字典序排序 
void selectSort(char str[][20], int n) {
    // 补足代码
    // ×××
    int i,j=0,k,m;
    char  t[20];
    for(i=0;i<4;i++)                    //从第一个元素开始按顺序依次比较,共要比较四次
{
for(k=1;(j+k)<5;k++) //第j行元素需要与j+1,j+2……行直到最后一行元素比较,比如第一行元素j=0,假设它最小的话,它需要与元素j=1,2,3,4比较,k便是1,2,3,4.
{
if(strcmp(str[j],str[j+k])>0)//如果前一行元素比后第k行大,根据要求,它不满足最小的要求
{ j
=j+k; //由上面知道,str[j+k]比str[j]小,我们选择它,str[j]不需要再往下比了,于是将j+k的值赋给j,作为新的需要被比较的元素str[j] m=j; //用m记录目前最小元素的下标j k=0; //由于是从j+1,j+2……这样一次去比较的,且if结束后,k++会执行,为了下一次新str[j]一次向下比较即与str[j+1],str[j+2]……比较,将0赋值给k } else m=j; //这也是记录目前最小元素的下标,目的是防止后面出现某一元素一直不符合if条件(即它最小),本层循环后,进行原数组赋值变动时,m还是上一个for循环遗留的结果,导致原数组赋值出错 } strcpy(t,str[m]); //将选出的最小元素赋值给中间变量 strcpy(str[m],str[i]); //将原数组的第i+1行元素赋值给第m+1行元素,这里便是交换,比如第一个找出的最小元素,他与原数组第一行元素对换,以此类推 strcpy(str[i],t); //将中间变量赋值给第i+1行元素,完成原数组元素互换
                                        //至此我们对于原数组只进行了两个元素的交换,即所找到的最小元素与由上至下,例如第一个最小元素与原数组第一行元素的互换
        j=i+1;                          //由于,比如i此时等于0,即第一行元素已经是最小值,接下来只需要从第一行开始重复上述步骤,找出第二个最小值,故j=i+1,即从str[1]开始向下比较
  }
}

实验总结与体会:

①实验内容1中,对于数组名与指针变量,在实参写法上,两者保持一致;在形参写法上,前者为a[ ],对数组的初始化,后者为*x,指向数组的第一个元素;函数实现中,前者元素采用a[i]形式,后者采用*(x+i)形式。我个人觉得两者好像没什么区别,因为间接访问*(x+i)就等效于a[i],两者都表示数组的第(i+1)个元素。

在实验内容1中,需要注意(1)数组的调用形式;(2)需要有接受子函数返回值的变量;

②实验内容2中,我一开始时纠结于如何“选择最值”,看了pdf中的网页链接的动图与代码演示后才依葫芦画瓢写了出来。需要注意(1)明确每一步目的是什么(2)如何选出与存放最值(3)二维数组中每行首元素的表示方式(4)数组元素中的比较函数strcmp与赋值函数strcpy的具体含义。

③实验内容三中,我个人觉得需要注意的(1)while(       )什么时候运行,什么时候不运行;(2)数组作为实参的写法(3)对于下标i的控制

第三道练习的条件表达式while(p<=head),我觉得功能是s[head]是第一个不为*的元素,故这一项元素以及前面所有元素都要保留。

最后的s[i]='\0'我觉得可能是因为原数组是由每一项都是' '元素构成的,所以最后需要一个字符终止符。

猜你喜欢

转载自www.cnblogs.com/yuan82/p/10908930.html