我的刷题之旅2

写几个函数:

①输入10个职工的姓名和职工号;

②按职工号由小到大顺序排列,姓名顺序也随之调整;

③要求输入一个职工号,用折半查找找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。

想了一天代码终于出来了:

#include<stdio.h>
#include<string.h>

void putin(int num[],char name[10][8])
{
    int i;
    for( i=0; i<10; i++)
    {
        printf("请输入职工号和姓名:");
        scanf("%d",&num[i]);//
        getchar();//jialezhegecaikeyishuzifu
        gets(name[i]);


    }

}


void sort(int num[],char name[10][8])
{
    char h[8];
    for(int i=0; i<9; i++)
    {
        for(int j=i+1; j<10; j++)
        {
            if(num[j]<num[i])
            {
                int t=num[j];
                strcpy(h,name[j]);
                num[j]=num[i];
                strcpy(name[j],name[i]);
                num[i]=t;
                strcpy(name[i],h);

            }
        }
    }
    for(int i=0;i<10;i++)
        printf("  %d  %s \n ",num[i],name[i]);//sbawohaicanle
}
void search(int n,int num[],char name[10][8])
{
    int sta=0,en=9,mid;
    int i;
    for( i=0; i<10; i++)
    {
        mid=(sta+en)/2;
        if(n==num[mid]){printf("该职工号对应的名字为%s",name[mid]);break;}
        else if(n>mid)sta=mid+1;
        else en=mid-1;
    }
    if(i==n&&n!=mid)printf("no search");


}
int main()
{
    int n,num[10];
    char name[10][8];//可以是统一标识符表示
    putin(num,name);
    sort(num,name);
    printf("请输入职工号:");
        scanf("%d",&n);
        search(n,num,name);


    return 0;


}

总结一下我的心路和错误:

1.有时候我用字符函数不会引用字符的头文件没事,但是有时候又会报错,所以还是养成用的习惯比较好;

2.关于第一个函数里的东西我倒是纠结了好久:我在想人的名字不可能就一个字符呀,所以肯定不能用字符数组了但是没想到还可以这么用:把二维数组看作一维字符串数组,每个数组里有一个字符串,但是人的名字也有汉字呀!我在想这个汉字可以作为字符存在里面吗?又或者说,是不是占用的元素个数不一样呢?后来我查到汉字原来是字符串,每个汉字两个以上字符组成的。所以我做了这个实验:

#include<stdio.h>
int main()
{
    char a[2];
    scanf("%c",&a[0]);
    printf("%c",a[0]);
    return 0;

}

把代码再改一下#include<stdio.h>
#include<string.h>
int main()
{
    char a[]={"你"};
    printf("%d",strlen(a));
    return 0;
}

答案是二,说明一个汉字就相当于一个字符数量为二的字符串。所以在上面的题目里我们把名字长度设为八也就是四个汉字。

3.在第一个函数里如果你直接在输入之后加gets的话,你会发现自己在和后面输不了名字,从而要加个getchar()在这里getchar的作用是啥呢?你会发现其实在输入数字之后我们还会输一个回车,而这个个回车也就被存进了getchar所以才会不能输入名字,而这的getchar则是用来清除缓存的,比如残留在电脑的回车;

4.你会发现在这里我们可以看见一个问题,为什么输入的时候二维数组只有一个框框,你可以这么理解,你可以把它看成成一个字符串数组,但实际上是由于字符数组本身就是地址,这里可以说是行地址,具体的可以百度一下。这个方法是要记住的,以后会常用;

5.在第二个函数里我用的是选择排序(可以去b站自学)和复制,中途犯的一个错误的是把数组赋在了变量里,无论字符变量还是什么都不行,因为一个是字符串,一个是字符,装不下,当然,但如果是这样

 好像还是不可以TAT;突然发现一个错误,我把数组和元素概念搞混了,在定义数组时,方括号里的下标指的是数组的个数,而在元素里面因为要从0开始所以最后一个元素比总数减一;我再次打一个代码:

#include<stdio.h>
#include<string.h>
int main()
{
    int a[2]={1,2};
    int j;
    strcpy(a[2],a[1]);
    strcpy(j,a[1]);
    printf("%d %d",a[2],j);
    return 0;

}

为什么还是运行不了?我想了很久,后来才知道它只能复制字符,不能是数字;我再改:

#include<stdio.h>
#include<string.h>
int main()
{
    char a[2]={'1','2'};
    char j=0;
    strcpy(a[2],a[1]);
    strcpy(j,a[1]);
    printf("%c %c",a[2],j);
    return 0;

}
这样写也是错的,因为strcpy复制的是不同字符数组,可以这么理解。

6.刚开始在第二个函数的时候我还不明白为什么要复制,现在明白了:这里注意一下:我们为什么要在搞一个数组num来记职工号这是因为职工号不一定是单纯的是1,2,3等可能是其他的,而我们的计数又是从1-10的,而且我们刚开始输入不是按顺序来的也就是说我们记得第一个是234 小一,第二个就是224 笑梅 了所以要专门用一个数组来记数;而我们在循环里的这个是按也就是输入顺序排序的,我们现在的职工号和姓名还没有很大的联系只是num[i]对应name[i]所以在num变的时候,name对应的就不一定会变了,要让name随着num变即让num赋值的时候,name跟着,由于name原本就是字符串数组,如果要交换的话,刚开始我想为什么不可以直接和上面一样赋值呢?其实是不可以的,c语言有规定,数组不能直接给数组赋值;而我们如果要给字符串数组排序,就必须定义性新数组(不用数组做中间变量就暂存不了这么多字符),而那是不合法的。(具体很难说清,自己去试试就知道)

7.而第三个函数就是利用折半查找法(可以去自学一下)注意:在这个函数里面,我了解到,其实很多代码还是要考虑全面的,这样会大大减少时间,比如可能有些代码叫你输入大于零的整数,然后可能我们不会考虑小于零的代码,但是在有些刷题网站,这样是过不了的。所以我们还是要考虑多一点,比如这里,就因为我经常考虑不多,导致忘记了搜不到no search的情况。

小小激励一下自己:泥沙俱下并不完美的生活,正是组成宝贵生命的原材料

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值