第五次实验~~

实验结论:

1.二分查找

(1)

#include  <stdio.h>
const int N=5;
int binarySearch(int x[], int n, int item);
int main() {
    int a[N]={1,4,7,20,35};
    int i,index, key;
    
    printf("数组a中的数据:\n");
    for(i=0;i<N;i++)
       printf("%d ",a[i]);
    printf("\n");
    
    printf("输入待查找的数据项: ");
    scanf("%d", &key);
    
    index = binarySearch(a, N, key);
    
    
    if(index>=0) 
        printf("%d在数组中,下标为%d\n", key, index);
    else
        printf("%d不在数组中\n", key); 
    getchar();
   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,5,13,17,31};
    int i,index, key;
    
    printf("数组a中的数据:\n");
    for(i=0;i<N;i++)
       printf("%d ",a[i]);
    printf("\n");
    
    printf("输入待查找的数据项: ");
    scanf("%d", &key);

    index = binarySearch(a, 5, 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>
#include <string.h>
void selectSort(char str[][20], int n ); // 函数声明,形参str是二维数组名 
int main() {
    char name[][20] = {"Aggie", "Jack", "John", "Mike", "Stark"};
    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 k,i,j;
    char temp[8];
    for(i=0;i<n-1;i++){
        k=i;
        for(j=i+1;j<n;j++){
        
        if(strcmp(str[j],str[k])<0){
            k=j;
        }
    }
        if(k!=i){
            strcpy(temp,str[i]);
            strcpy(str[i],str[k]);
            strcpy(str[k],temp);
        }
        
    }
     
}

 

 

3.用指针处理字符串

认真理解阅读后回答老师在代码里让我思考的问题:

while(p<=head){
        s[i]=*p;
        p++;
        i++;
    }

我认为这里的条件表达式要这样写的原因是:让后续判断p是否为*号时从不是*号的第一个字符开始,其次这一个循环的作用就是先把第一个字符之前的*号全都复制到s[i]里去(这里表达可能不准确),然后同时让p对应第一个非*的字符位置以便于后面的判断。

    s[i] = '\0';

对于这一步在第二和第三个练习中都有出现,但是在第一个练习中没有,这里进行对比:

在第一个实验中关于赋值的表达式是这样的:

    while( *target++ = *source++);

如此在赋值的最后到了/0这个结束符时,这个表达式会先赋值再判断,于是不用写上面的s[i]='/0'这个东西。

而对于第二三个练习中:

while(*p) {
        if(*p != '*') {
            `s[i] = *p;
            i++;
        }
        p++;
    while(*p) {
        s[i] = *p;
        i++;
        p++;
    }

这样的条件表达式就会在结束符在被赋值之前就结束了,所以要加上上述的那个赋值表达式。

因为这是一个字符串,所以在字符串的最后必须要有一个结束符/0,所以需要这个表达式。

 

实验总结:

1.数组名作为参数 vs. 指针变量作为参数,在形参、实参写法,以及函数实现中数组元素表示的差异:

(1)数组名在作为参数时,其形参的写法为类似int sort ( int x[ ] , int x)或者int sort(int *x,int x),实参写法为类似sort(a,N)

(2)指针变量在作为参数时,其形参的写法int sort(int *,int *),实参的写法为类似sort(pa,pb)[其中的pa和pb为已经定义且有指向的指针变量]

(3)在以数组名为参数的函数里,数组元素表示为a[ i ]。在以指针变量为参数的函数里,数组元素表示为*(pa+i)。

 

2.在使用选择排序法时的注意事项:

(1)两次循环的范围:第一个循环的范围是i<n-1;第二个循环的范围是j<n>

 

3.使用指针变量对字符串进行处理注意事项总结:

(1)处理的思想应该是用另一个字符串数组来储存处理后的字符串,把处理好的字符串赋值到新的字符串数组中,而不是在本身内部变化。

(2)条件表达式的书写技巧,对于循环范围的观察是关键的细节,不然可能功亏一篑。

(3)在字符串的最后有结束符,结束符的存在与否也很关键且易错。

 

吐槽踩坑环节:visual studio真的用不来,各种可以在devc上正常的代码在那上面就是会不行,没有错误也不是危险警告,哎,visual studio本来看着高端一点想用,至此我放弃了。这次实验自己编写的部分较少所以没怎么踩坑,只是在想练习中的思考题的时候脑壳痛(还好想出来了,虽然不知道对不对,但是能说服我自己)。现在c语言的内容变得好难,痛苦。现在对指针的应用还是很不熟练,对很多的定义概念还是模糊不清。

 

 https://www.cnblogs.com/rainbowhorse/p/10913360.html

https://www.cnblogs.com/sfyq/p/10931605.html

https://www.cnblogs.com/QYAS/p/10931318.html

 

 

posted @ 2019-05-21 17:45  yzxyzx  阅读(163)  评论(3编辑  收藏  举报