我的刷题之旅2-创新互联
写几个函数:
成都创新互联:自2013年起为各行业开拓出企业自己的“网站建设”服务,为近1000家公司企业提供了专业的网站设计制作、网站设计、网页设计和网站推广服务, 定制网站建设由设计师亲自精心设计,设计的效果完全按照客户的要求,并适当的提出合理的建议,拥有的视觉效果,策划师分析客户的同行竞争对手,根据客户的实际情况给出合理的网站构架,制作客户同行业具有领先地位的。①输入10个职工的姓名和职工号;
②按职工号由小到大顺序排列,姓名顺序也随之调整;
③要求输入一个职工号,用折半查找找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。
想了一天代码终于出来了:
#include
#include
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]
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
int main()
{
char a[2];
scanf("%c",&a[0]);
printf("%c",a[0]);
return 0;
}
把代码再改一下#include
#include
int main()
{
char a[]={"你"};
printf("%d",strlen(a));
return 0;
}
答案是二,说明一个汉字就相当于一个字符数量为二的字符串。所以在上面的题目里我们把名字长度设为八也就是四个汉字。
3.在第一个函数里如果你直接在输入之后加gets的话,你会发现自己在和后面输不了名字,从而要加个getchar()在这里getchar的作用是啥呢?你会发现其实在输入数字之后我们还会输一个回车,而这个个回车也就被存进了getchar所以才会不能输入名字,而这的getchar则是用来清除缓存的,比如残留在电脑的回车;
4.你会发现在这里我们可以看见一个问题,为什么输入的时候二维数组只有一个框框,你可以这么理解,你可以把它看成成一个字符串数组,但实际上是由于字符数组本身就是地址,这里可以说是行地址,具体的可以百度一下。这个方法是要记住的,以后会常用;
5.在第二个函数里我用的是选择排序(可以去b站自学)和复制,中途犯的一个错误的是把数组赋在了变量里,无论字符变量还是什么都不行,因为一个是字符串,一个是字符,装不下,当然,但如果是这样
好像还是不可以TAT;突然发现一个错误,我把数组和元素概念搞混了,在定义数组时,方括号里的下标指的是数组的个数,而在元素里面因为要从0开始所以最后一个元素比总数减一;我再次打一个代码:
#include
#include
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
#include
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的情况。
小小激励一下自己:泥沙俱下并不完美的生活,正是组成宝贵生命的原材料。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
新闻名称:我的刷题之旅2-创新互联
分享URL:http://ybzwz.com/article/ijese.html