| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2142 人关注过本帖
标题:对10个职工的姓名职工号按从小到大排序,程序有点长,但问题只在第二个函数 ...
只看楼主 加入收藏
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
结帖率:85.71%
收藏
已结贴  问题点数:30 回复次数:8 
对10个职工的姓名职工号按从小到大排序,程序有点长,但问题只在第二个函数,只看第二个就可以
图片附件: 游客没有浏览图片的权限,请 登录注册

#include <stdio.h>
#include <string.h>
int a;
static void scan_f(char str1[][5],int str2[]);//输入职工姓名和号码 ,原题第一问
static void rank(char str1[][5],int str2[]);//对职工进行排序,从小到大 ,号码和姓名都进行排序 ,原题第二问
static int seek(char str1[][5],int str2[]);//用折半查找法,输入号码,输出职工姓名 ,原题第三问
int main()
{
    char str1[10][5];
    int z;
    int str2[10];
    scan_f(str1,str2);
    rank(str1,str2);
    printf("\nplease enter the number of the employee:");
    scanf("%d",&a);
    z=seek(str1,str2);
    printf("\nthe name is :%s",str1[z]);
}
static void scan_f(char str1[][5],int str2[])
{
    int i,j;
    printf("please input the two strings:\n");
    for(i=0;i<=9;i++)
    {
      printf("input the number:");
      scanf("%d",&str2[i]);
      printf("input the name:");
      getchar();//吸收enter
      gets(str1[i]);
    }
}
static void rank(char str1[][5],int str2[])
{
    int i,j,temp,k;
    char str3[5],str4[5];//一个用来存储空白字符,一个用来暂时存储数组
    for(k=8;k>=0;k--)
    for(i=0;i<=k;i++)
    {
      if(str2[i]>str2[i+1])
      {
        temp=str2[i+1];//利用沉底法对职工号码进行排序
        strcpy(str3,str1[i]);//利用strcopy函数进行字符串之间的赋值,使职工姓名和号码同步变化
        str2[i+1]=str2[i];
        strcpy(str1[i],str1[i+1]);
        str2[i]=temp;
        strcpy(str1[i+1],str3);
      }
    }
      for(i=0;i<=9;i++)//输出职工号码和对应姓名
    {
      printf("number:%d\n",str2[i]);
      printf("name:");
      for(j=0;j<=4;j++)
      {
         printf("%c",str1[i][j]);
      }
      printf("\n");
    }
}
static int seek(char str1[][5],int str2[])
{
    int z,i,min,max;
    if(a>str2[5])//利用折半查找法检索员工
    {
        min=6;
        max=9;
    }
    else if(a==str2[5])
         z=5;
         else {
                  min=0;
                  max=4;
               }
    for(i=min;i<=max;i++)
        if(str2[i]==a)
        {
          z=i;
          break;
        }
    return z;//返回str2对应的i
   
}
因位是第一次发图片,不知道图片大家是否看的到,这个程序一切正常,只有第二个函数运行时出了问题:3号职工运行结果本该是number:3,name:Li,但实际运行却是number:3,name:Li g,多出来一个空格和g。大家无论解答不解答,能否告诉我图片是否看的到??谢谢
搜索更多相关主题的帖子: include 姓名 
2017-02-06 19:46
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
图片看得清楚。
static void rank(char str1[][5],int str2[])
{
    ....
    ....
    for(i=0;i<=9;i++)//输出职工号码和对应姓名
    {
      printf("number:%d\n",str2[i]);
      printf("name:");
     // for(j=0;j<=4;j++)
      //{
            printf("%s",str1[i]);                //直接输出对应字符串
      //}
      printf("\n");
    }
}

static int seek(char str1[][5],int str2[])
{
    int z,i,min,max;
    ...
    ...
    else if(a==str2[5])
         z=5;
         return z;               //不然也给min,max赋个值
         else {
                  min=0;
                  max=4;
               }
    for(i=min;i<=max;i++)
        if(str2[i]==a)
        {
          z=i;
          break;
        }
    return z;//返回str2对应的i
   
}

早知做人那么辛苦!  当初不应该下凡
2017-02-06 20:17
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
虽然题主写的折半查找法没啥问题~但建议题主还是去看看规范的写法(相当于二分法查找)~

折半查找不是简单一次折半~而是每查找一遍折半一遍~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-07 07:26
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
收藏
得分:0 
回复 3楼 九转星河
版主说得是,我也知道这不是真正意义的折半查找法,只是看题目元素比较少才只拆了一次,太懒了,,,,

............
2017-02-07 15:22
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
收藏
得分:0 
回复 2楼 炎天
额,按照你的意思把程序稍微改了下,程序如下:
#include <stdio.h>
#include <string.h>
int a;
static void scan_f(char str1[][5],int str2[]);//输入职工姓名和号码
static void rank(char str1[][5],int str2[]);//对职工进行排序,从小到大 ,号码和姓名都进行排序
static int seek(char str1[][5],int str2[]);//用折半查找法,输入号码,输出职工姓名
int main()
{
    char str1[10][5];
    int z;
    int str2[10];
    scan_f(str1,str2);
    rank(str1,str2);
    printf("\nplease enter the number of the employee:");
    scanf("%d",&a);
    z=seek(str1,str2);
    printf("\nthe name is :%s",str1[z]);
}
static void scan_f(char str1[][5],int str2[])
{
    int i,j;
    printf("please input the two strings:\n");
    for(i=0;i<=9;i++)
    {
      printf("input the number:");
      scanf("%d",&str2[i]);
      printf("input the name:");
      getchar();//吸收enter
      gets(str1[i]);
    }
}
static void rank(char str1[][5],int str2[])
{
    int i,j,temp,k;
    char str3[5],str4[5];//一个用来存储空白字符,一个用来暂时存储数组
    for(k=8;k>=0;k--)
    for(i=0;i<=k;i++)
    {
      if(str2[i]>str2[i+1])
      {
        temp=str2[i+1];//利用沉底法对职工号码进行排序
        strcpy(str3,str1[i]);//利用strcopy函数进行字符串之间的赋值,使职工姓名和号码同步变化
        str2[i+1]=str2[i];
        strcpy(str1[i],str1[i+1]);
        str2[i]=temp;
        strcpy(str1[i+1],str3);
      }
    }
      for(i=0;i<=9;i++)//输出职工号码和对应姓名
    {
      printf("number:%d\n",str2[i]);
      printf("name:");
      printf("%s",str1[i]);
      printf("\n");
    }
}
static int seek(char str1[][5],int str2[])
{
    int z,i,min,max;
    if(a>str2[5])//利用折半查找法检索员工
    {
        min=6;
        max=9;
    }
    else if(a==str2[5])
         {
           z=5;
           min=5;
           max=5;
        }
         else {
                  min=0;
                  max=4;
               }
    for(i=min;i<=max;i++)
        if(str2[i]==a)
        {
          z=i;
          break;
        }
    return z;//返回str2对应的i
   
}
运行结果如下,虽然不知道为什么之前那个问题神奇的不见了,但出现了一个新的问题:2号的名字错误
图片附件: 游客没有浏览图片的权限,请 登录注册

问题在哪???2号把原本的名字和1号的合起来了,,,

............
2017-02-07 15:42
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
收藏
得分:0 
回复 6楼 炎天
按照你的改了后的确没问题了,我还有两个问题想请教
1,你要我把5全改为6是因为strcpy复制字符串时会把'\0'也复制过去吗?
2,我最初的代码为什么按你的把%c改为%s输出最初的问题就消失了???不解

............
2017-02-08 19:21
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:30 
刚刚又看问题,发现我之前回答言不达意,
回到1楼的问题,   引用 number:3,name:Li,但实际运行却是number:3,name:Li g,多出来一个空格和g
char s1[5]="1234",  s2[3]="56"
strcpy(s1, s2), 此时 s1[0]='5', s1[1]='6', s1[2]='\0', s1[3]='4', s1[4]='\0'
这是你原来写得
      for(j=0;j<=4;j++)
      {
         printf("%c",str1[i][j]);
      }
强行输出5个字符
就会输出 56 4 (6和4后面都有一个空格).
printf("%s", str1[i])   就会输出56    ,'\0'字符串结束

OK 现在转到5楼的问题
ZhangWang 多了Wang
定义str1[10][5],
gets(str1[0])
gets(str1[1])
gets(str1[2])
依次输入Zhang   Wang  Li
printf("%s",str1[0])  则会输出ZhangWang , 二维数组的储存地址是连续的, str1[0][4]='g'所以停不下来接着读,str1[1][4]='\0'好了停下来了





[此贴子已经被作者于2017-2-9 17:36编辑过]


早知做人那么辛苦!  当初不应该下凡
2017-02-08 23:11
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
收藏
得分:0 
回复 7楼 炎天
谢谢你的回复,甚是详细。最后一点不解,设str1[5]={“Li”},str2[5]={"Wang"},strcpy(str2,str1),由于数组长度为5,str1的实际内容应该为Li’\0''\0''\0',那么用strcpy不会把i后面的三个'\0'一起复制过去吗??还是只会复制一个’\0‘??

............
2017-02-09 17:14
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
回复 8楼 邹特强
数组长度是为5,str1的实际内容应该为Li’\0' 还剩下两个位置未定义随便
C语言标准库函数strcpy,把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间。
原型声明:char *strcpy(char* dest, const char *src);

[此贴子已经被作者于2017-2-9 17:43编辑过]


早知做人那么辛苦!  当初不应该下凡
2017-02-09 17:35
快速回复:对10个职工的姓名职工号按从小到大排序,程序有点长,但问题只在第二个 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.060395 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved