| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2158 人关注过本帖
标题:对10个职工的姓名职工号按从小到大排序,程序有点长,但问题只在第二个函数 ...
取消只看楼主 加入收藏
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
结帖率:85.71%
收藏
已结贴  问题点数:30 回复次数:4 
对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: 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: 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
快速回复:对10个职工的姓名职工号按从小到大排序,程序有点长,但问题只在第二个 ...
数据加载中...
 
   



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

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