我的刷题之旅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://scyanting.com/article/ijese.html