实验5

Part 1.二分查找

实现方式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("输入待查找的数据项:\n");
    scanf("%d",&key);
    index=binarySearch(a,N,key);
    if(index>=0)
    printf("%d在数组中,下标为%d\n",key,index);
    else
    printf("%d不在数组中\n",key);
    return 0;
}
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("输入待查找的数据项:\n");
    scanf("%d",&key);
    index=binarySearch(a,N,key);
    if(index>=0)
    printf("%d在数组中,下标为%d\n",key,index);
    else
    printf("%d不在数组中\n",key);
    return 0;
}
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;
}

Part 2 用选择法排序对一组数据由小到大排序

1.

#include <stdio.h>
const int N=5;
void selectSort(int [], int);  
void input(int [], int);
void output(int [], int);
int main() {
    int a[N];
    printf("输入%d个整数\n", N);
    input(a, N);
    printf("排序前的数据:\n");
    output(a,N);
    selectSort(a,N); 
    printf("排序后的数据:\n");
    output(a, N);
    return 0;     
} 
void input(int a[], int n) {
    int i;
    for(i=0; i<n; i++)
        scanf("%d", &a[i]);
} 
void output(int a[], int n) {
    int i;
    for(i=0; i<n; i++)
        printf("%d ", a[i]);
    printf("\n");
}
void selectSort(int a[], int n) {
    int i, j, k, temp;
    for(i=0; i<n-1; i++) {
        k = i;  
        for(j=i+1; j<n; j++)
            if (a[j] < a[k])
                k = j; 
                if(k != i) { 
            temp = a[i];
            a[i] = a[k];
            a[k] = temp;
        }
    }
} 

 

2.

#include <stdio.h>
#include <string.h>
void selectSort(char str[][20], int n ); 
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);  
    
    printf("按字典序输出名单:\n");
    for(i=0; i<5; i++)
        printf("%s\n", name[i]);
     
    return 0;
} 
void selectSort(char str[][20], int n) {
    int i,j,k;
    char temp[20];
    for(i=0;i<n-1;i++){
        k=i;
        for(j=i+1;j<n;j++){
            if(strcmp(str[k],str[j])>0)
            k=j;
        }
        if(k!=i){
            strcpy(temp,str[i]);
            strcpy(str[i],str[k]);
            strcpy(str[k],temp);
        }
    } 
}

 

Part 3用指针处理字符串

练习1

#include <stdio.h>
void delPrefixStar(char []); 
int main() {
    char string[80];
    printf("输入一个字符串:\n");
    gets(string);
    printf("\n删除<前导*>之前的字符串:\n");
    puts(string);
    delPrefixStar(string);  
    printf("\n删除<前导*>之后的字符串:\n");
    puts(string);
    return 0;
} 
void delPrefixStar(char s[]) {
    char *target, *source;
    source = s;
    while(*source == '*') 
        source++;
    target = s;
    while( *target++ = *source++);
}

练习2

#include <stdio.h>
void delStarButPrefix(char []);

int main() {
    char string[80];
    printf("输入一个字符串:\n");
    gets(string);
    
    printf("\n删除<前导*>前的字符串:\n");
    puts(string);
    
    delStarButPrefix(string);  
    
    printf("\n删除<前导*>之后的字符串:\n");
    puts(string);
    
    return 0;
} 
void delStarButPrefix(char s[]) {
    int i=0;              
    char *p = s;
    while(*p && *p == '*') {
        p++;
        i++;
    }
    while(*p) {
        if(*p != '*') {
            s[i] = *p;
            i++;
        }
        p++;
    } 
    s[i] = '\0';   
}

实验体会

1.数组名作为参数时,实参是a,形参是x[ ],函数中的数组元素表示是x[n]

2.指针变量作为参数时,实参是a,形参是*x,函数中的数组元素表示是*(x+n)

3.用二分法查找时元素必须是有序的

4.字符串的比较和赋值,不能直接直接使用关系运算符和赋值运算符,要借助字符串处理函数

比较函数是strcmp(字符串1,字符串2),赋值函数是strcpy(字符串1,字符串2)

 总结

 指针很难,要好好学习,多练习

 

posted @ 2019-05-27 23:26  殷煦  阅读(101)  评论(0编辑  收藏  举报