实验五

Part1   二分查找

 

// 练习:使用二分查找,在一组有序元素中查找数据项
//  形参是数组,实参是数组名 
#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,5,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;
}

利用指针变量的代码如下:

// 练习:使用二分查找,在一组有序元素中查找数据项
//  形参是指针变量,实参是数组名
#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;
}

   函数调用方式:(1)作为表达式的一部分  (2)作为C语言语句  (3)作为函数参数

若q指向一维数组,表现方式

&a[n] q+n a+n
a[n] *(q+n) *(a+n)

 

 Part2 选择排序法

#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,k;
     char temp[20];
     for(i=0;i<n;i++){
         k=i;     //k用于记录最小元素下标 
     for(j=i+1;j<n;j++) {
     if(strcmp(str[k], str[j]) > 0)  //运用strump函数与后一位数组中元素比较大小 
     k=j;}    //若当前元素更小,更新k的值,使k始终是最小元素下标 
     if(i!=k)
         {
            strcpy(temp, str[i]);
            strcpy(str[i], str[k]);
            strcpy(str[k], temp);//运用strcpy函数与交换数值的知识结合 
        }

   }
}

字符串处理函数

字符串连接函数 strcat()

strcat 是 string catenate 的缩写,意思是把两个字符串拼接在一起,语法格式为:

strcat(arrayName1, arrayName2);

arrayName1、arrayName2 为需要拼接的字符串。

strcat() 将把 arrayName2 连接到 arrayName1 后面,并删除原来 arrayName1 最后的结束标志'\0'。这意味着,arrayName1 必须足够长,要能够同时容纳 arrayName1 和 arrayName2,否则会越界(超出范围)。


 

字符串复制函数 strcpy()

strcpy 是 string copy 的缩写,意思是字符串复制,也即将字符串从一个地方复制到另外一个地方,语法格式为:

strcpy(arrayName1, arrayName2);

strcpy() 会把 arrayName2 中的字符串拷贝到 arrayName1 中,字符串结束标志'\0'也一同拷贝。

 

字符串比较函数 strcmp()

strcmp 是 string compare 的缩写,意思是字符串比较,语法格式为:

strcmp(arrayName1, arrayName2);

arrayName1 和 arrayName2 是需要比较的两个字符串。

字符本身没有大小之分,strcmp() 以各个字符对应的 ASCII 码值进行比较。strcmp() 从两个字符串的第 0 个字符开始比较,如果它们相等,就继续比较下一个字符,直到遇见不同的字符,或者到字符串的末尾。

返回值:若 arrayName1 和 arrayName2 相同,则返回0;若 arrayName1 大于 arrayName2,则返回大于 0 的值;若 arrayName1 小于 arrayName2,则返回小于0 的值。

Part 3

line29-42把字符串分成了三段,找到了head和tail的位置,以tail为例,先让tail指向字符串最后,用tail--跳过\0,再用while语句使tail遇到*就往前一格,直至到最后一个字母。line46-51把head之前的*都复制到了数组,p<=head使得p在这个语句后指向head。line53-57把字符串从head到tail中的*删除后复制到数组。由于结束后p指向未知地址,再赋值\0给s[i]作为结束。

 

实验总结

字符串函数的功能和使用规则还需要联系,对指针的运行方式不够熟练,独立编写完整程序仍存在一定困难

posted @ 2019-05-23 17:01  奥利奥利奥qxy  阅读(165)  评论(2编辑  收藏  举报