| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 851 人关注过本帖
标题:求救,输出问题~~
只看楼主 加入收藏
q7q8q7
Rank: 1
来 自:河工大
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-9-30
收藏
 问题点数:0 回复次数:7 
求救,输出问题~~
很郁闷的啊,找不到那里出问题了,程序长了点,主要是为了练习格式,帮忙看下哈。
#include <stdio.h>
int n,num;
char a[10],x;
void sort(char a[],int n)
{
    int i,j,k;
    char t;
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
            if(a[k]<a[j])k=j;
            if(k!=i)
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
    }
}
void search(char a[],int n,char x)
{
    int left=0,right=n-1,mid,flag=0;
    if(n>2)
        while((flag==0)&&(right>left))
        {
            mid=(left+right)/2;
            if(x==a[mid])
            {
                flag=1;
                num=mid;
            }
            else if(x<a[mid])right=mid-1;
            else left=mid+1;
        }
    else num=(a[1]>a[2])?1:2;
}
void input(char a[])
{
    int i;
    printf("please input the quantity of students!\n(Quantity must smaller than 11 and biger than 1):");
    scanf("%d",&n);
    while((n<=1)||(n>=11))
    {
        printf("please input the right one:");
        scanf("%d",&n);
    }
    printf("\nplease input the code of students:\n");
    for(i=0;i<n;i++)
    {
        printf("student_%d:",i+1);
        scanf("%c",&a[i]);
        printf("\n")

    }
    printf("now,the queue is:");
    for(i=0;i<n;i++)
        printf("%5c",a[i]);
    printf("\n");
    printf("please input the element of you want to search:");
    scanf("%c",&x);
}
void output1(char a[])
{
    int i;
    printf("we can get the orderly queue:\n");
    for(i=0;i<n;i++)
        printf("%5c",a[i]);
    printf("\n");
}
void output2(char a[])
{
    printf("the element you search at the %d of queue.\n",num);
    printf("\n        thanks for your test,Bye-bye (*^__^*) \n");
}
void main()
{
    input(a);
    sort(a,n);
    output1(a);
    search(a,n,x);
    output2(a);
}


在运行input函数,读入数组a时,总是直接跳了一个存储区,如:输入N为2,屏幕会打印出   
please input the code of students:
student_1:
student_2:
student_1没读入,直接跳到了student_2,然后读入了一个字符就结束了,我看了半天不明白,谁能帮我看下啊,谢谢了。
搜索更多相关主题的帖子: 函数 输出格式 循环 形参 
2008-10-14 21:50
q7q8q7
Rank: 1
来 自:河工大
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-9-30
收藏
得分:0 
没人帮忙看下么,虽然长了点,但只是输出问题啦,不用全部看啊,谢谢了
2008-10-14 22:06
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
键盘缓存区的问题。现在把你的程序稍稍改动了一下,输入问题可以解决了。

代码:
#include <stdio.h>
#define Y {char c;c=getchar()!='\n';}
int n,num;
char a[10],x;
void sort(char a[],int n)
{
    int i,j,k;
    char t;
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
            if(a[k]<a[j])k=j;
            if(k!=i)
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
    }
}
void search(char a[],int n,char x)
{
    int left=0,right=n-1,mid,flag=0;
    if(n>2)
        while((flag==0)&&(right>left))
        {
            mid=(left+right)/2;
            if(x==a[mid])
            {
                flag=1;
                num=mid;
            }
            else if(x<a[mid])right=mid-1;
            else left=mid+1;
        }
    else num=(a[1]>a[2])?1:2;
}
void input(char a[])
{
    int i;
    do
    {
        printf("please input the quantity of students!\n(Quantity must smaller than 11 and biger than 1):\n");
        scanf("%d",&n);
        Y;
        if((n<=1)||(n>=11))
            printf("error,please input the right one:\n");

    }while(n<=1||n>=11);

    printf("\nplease input the code of students:\n");
    for(i=0;i<n;i++)
    {
        printf("student_%d:",i+1);
        scanf("%c",&a[i]);
        Y;
        printf("\n");
    }
    printf("now,the queue is:");
    for(i=0;i<n;i++)
        printf("%5c",a[i]);
    printf("\n");
    printf("please input the element of you want to search:");
    scanf("%c",&x);
}
void output1(char a[])
{
    int i;
    printf("we can get the orderly queue:\n");
    for(i=0;i<n;i++)
        printf("%5c",a[i]);
    printf("\n");
}
void output2(char a[])
{
    printf("the element you search at the %d of queue.\n",num);
    printf("\n        thanks for your test,Bye-bye (*^__^*) \n");
}
void main()
{
    input(a);
    sort(a,n);
    output1(a);
    search(a,n,x);
    output2(a);
}
2008-10-14 22:42
q7q8q7
Rank: 1
来 自:河工大
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-9-30
收藏
得分:0 
恩,有点长+本人很迷糊,现在就去看,总结什么的明天一定补上,先谢谢楼上的了,呵呵
2008-10-14 22:59
q7q8q7
Rank: 1
来 自:河工大
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-9-30
收藏
得分:0 
我的程序本身还有些逻辑上的错误,我会调过来的,先说说那个什么键盘缓存区的东东吧。

使用SCANF()函数给一个字符变量赋值时,当第一次调用SCANF()函数时,程序   
等待输入,但是第二次调用时,程序并未等待输入,而是将第一次输入确认时的回车符   
直接赋给变量。有文章说是因为SCANF()函数直接读取键盘缓冲区的缘故。

这是因为第一次调用SCANF时在键盘缓存中留下了一个"回车".   
 要避免只需再第二次之前调用getchar()将"回车"读进来,也就   
 相当于清除键盘缓冲了。
也就是楼上定义的“Y” 函数了。

想要更深的了解键盘缓冲区等问题的话,不妨在网上多看看,如fflush()函数。
fflush()函数的功能就是刷新缓冲区,加上stdin参数,就是刷新标准输入流,默认情况下,也就是你的键盘输入。

不说了,很多东西我都无法把它们之间的关系搞明白,如果各位大侠又什么想法不妨说下,相信还是有很多人对这块
了解的不多,也算是帮助理解下了哈。

明天早上还要跑操~~先闪人了……
收到的鲜花
  • liyanhong2008-10-15 00:02 送鲜花  45朵   附言:好文章
2008-10-15 00:00
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
回复 5# q7q8q7 的帖子
现在是凌晨2:10分,楼主还是在线上,难道是在电脑前睡着了么?要注意身体啊,早晨还要“跑操”……

    另外,Y是宏定义。
2008-10-15 02:11
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
呵呵,本来想帮你解决问题的,结果发现我的VIM的脚本里面有个Bug,然后费力改正了……不过这个好像是VIM的Bug啊……反正我搞定了,不过就没帮你找Bug了……
顺便提一句,原因是你某个语句少了分号……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-15 07:31
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
为什么呢?为什么带匹配的:%s会删掉我第一次的mark呢?感觉完全是风马牛不相及的东西啊……搞得我只好用正向断言零宽度否匹配搞定,真是窝囊啊……

[[it] 本帖最后由 StarWing83 于 2008-10-15 07:39 编辑 [/it]]

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-15 07:37
快速回复:求救,输出问题~~
数据加载中...
 
   



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

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