鱼C论坛

 找回密码
 立即注册
查看: 1968|回复: 4

[已解决]s1e21 最后一个题目的显示出了问题,求助

[复制链接]
发表于 2022-7-19 22:13:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 顶级太阳 于 2022-7-19 22:14 编辑

我写的代码如下:
#include<stdio.h>
#define max 1024
int sum=0,a,b,c,t,i,j,flag=1;  //sum为中间计算结果,a为输入要验证的值,b为计算式初值,c为计算式末值,t为计算中间结果,i为要求的计算数,flag用于标注存在计算失败的标志位。
int nkcs[max][3];
char ch;
int main()
{
        printf("请输入一个整数:");
        scanf("%d",&i);
  
  for(j=3;j<=i;j++)
   {
        sum=j*j*j;
        b=1;
        c=3;
        t=b;
        while(t!=sum)
        {
                if(t<sum)
                {
                        t+=c;
                        c+=2;
                
                }
                if(t>sum)
                {
                        t-=b;
                        b+=2;
                }
                if(c>sum)
                {
                        printf("尼科彻斯定理验证失败,失败时,初始值为%d,结束值为%d\n",b,c);
                        flag=0;   //出现不符合时,设标记位
                        break;
                }
          }
   nkcs[j-3][0]=j;
   nkcs[j-3][1]=b;
   nkcs[j-3][2]=c-2;

  }
//以上循环内为验证尼科彻斯定理,每个值的结果入二维数组
//判断是否有不符合结论
        if(flag)
        {
                printf("经验证,3~%d之间的所有整数均符合尼科彻斯定理! \n",i);
                printf("是否打印所有式子(y/n):");
                ch=getchar();
                if(ch=='y'||ch=='Y')    //格式输出
                {        
                          for(j=0;j<i-2;j++)
                          {

                                printf("%d^3==%d==%d+%d",nkcs[j][0],nkcs[j][0]*nkcs[j][0
]*nkcs[j][0],nkcs[j][1],nkcs[j][1]+2);
                                if(nkcs[j][2]-nkcs[j][1]>4)printf("...+%d\n",nkcs[j][2]);                                 else  if(nkcs[j][2]==nkcs[j][1]+4)printf("+%d\n",nkcs[j][2]);

                          }
                }

        }        

finish:  return 0;
}

前面所有内容,包括数组里存储的结果都一步步进行了验证,没有问题。只是最后的格式输出部分,在第1题里运行已经没有问题了。到了这个题目,进行循环输出多个结果时,每次询问是否打印后,屏幕显示了第47行的内容,然后直接退出。求助问题所在,怎么处理。
最佳答案
2022-7-20 12:51:45
这个涉及到输入缓冲区的问题
你这个程序,首先读取了一个整数,如13,你在输入了13之后,肯定会回车,但scanf只拿走了13,并没有拿走那个'\n',也就是回车,导致后面的getchar在读取输入缓冲区时,直接就读到了'\n',从而造成了你无法输入
解决方法:清空缓冲区
在ch=getchar();前,先执行fflush(stdin);清空缓冲区
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-20 00:05:26 | 显示全部楼层
#include <stdio.h>

int nico(int n)
{
        int h , k                                             ;
        h = n * n - n                                         ;
        if(! (h % 2)) h ++                                    ;
        printf("%d = %d" , n * n * n , h)                     ;
        for(k = 1 ; k < n ; k ++) printf(" + %d" , h + 2 * k) ; 
        printf("\n")                                          ;
        return h                                              ;
}

int main(void)
{
        int count , j                                                            ;
        char judge                                                               ;
       
        printf("请输入一个整数:")                                               ;
        scanf("%d" , & count)                                                    ;
        printf("经验证 ,3 ~ %d 之间所有的整数均符合尼科彻斯定理!\n\n" , count) ;
        printf("是否打印所有的式子(y/n) :")                                     ;
        fflush(stdin)                                                            ;
        judge = getchar()                                                        ;
        if(judge == 'Y' || judge == 'y') for(j = 3 ; j <= count ; j ++) nico(j)  ;
}
        编译、运行实况:
H:\[Exercise]\[00.00]\00.C\尼科彻斯>g++ -o x x.c

H:\[Exercise]\[00.00]\00.C\尼科彻斯>x
请输入一个整数:13
经验证 ,3 ~ 13 之间所有的整数均符合尼科彻斯定理!

是否打印所有的式子(y/n) :y
27 = 7 + 9 + 11
64 = 13 + 15 + 17 + 19
125 = 21 + 23 + 25 + 27 + 29
216 = 31 + 33 + 35 + 37 + 39 + 41
343 = 43 + 45 + 47 + 49 + 51 + 53 + 55
512 = 57 + 59 + 61 + 63 + 65 + 67 + 69 + 71
729 = 73 + 75 + 77 + 79 + 81 + 83 + 85 + 87 + 89
1000 = 91 + 93 + 95 + 97 + 99 + 101 + 103 + 105 + 107 + 109
1331 = 111 + 113 + 115 + 117 + 119 + 121 + 123 + 125 + 127 + 129 + 131
1728 = 133 + 135 + 137 + 139 + 141 + 143 + 145 + 147 + 149 + 151 + 153 + 155
2197 = 157 + 159 + 161 + 163 + 165 + 167 + 169 + 171 + 173 + 175 + 177 + 179 + 181

H:\[Exercise]\[00.00]\00.C\尼科彻斯>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-20 07:58:41 | 显示全部楼层
jackz007 发表于 2022-7-20 00:05
编译、运行实况:

谢谢你的答复,但是这个答复有点答非所问了。要看怎么做,我可以直接在作业里回复小甲鱼就能够看到结果了。我问的是,我写的代码里,45~57行里出现了什么错误,造成每次运行时显示了第47行的屏幕打印后,就自己结束了程序。帮忙看看我的代码问题。谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-20 12:51:45 | 显示全部楼层    本楼为最佳答案   
这个涉及到输入缓冲区的问题
你这个程序,首先读取了一个整数,如13,你在输入了13之后,肯定会回车,但scanf只拿走了13,并没有拿走那个'\n',也就是回车,导致后面的getchar在读取输入缓冲区时,直接就读到了'\n',从而造成了你无法输入
解决方法:清空缓冲区
在ch=getchar();前,先执行fflush(stdin);清空缓冲区
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-20 19:03:20 | 显示全部楼层
临时号 发表于 2022-7-20 12:51
这个涉及到输入缓冲区的问题
你这个程序,首先读取了一个整数,如13,你在输入了13之后,肯定会回车,但scanf只 ...

首先,谢谢你的指点。网上搜索了关于缓冲区问题,这个确实是在第一次输入后,scanf函数只是取出了输入的数据,没有带走输入后的回车造成的。在后面读取的时候读取了回车符,造成不正确的结果。
第二,你提示的使用fflush(stdin)函数,我在网上查找使用方法过程中,在CSDN里见到一篇帖子,里面有一个提示,说fflush(stdin)不是C语言的标准函数,是编译器扩展出来处理缓冲区的方法。那个帖子里提示在linux系统下的gcc 某些版本里没有这个函数,很不巧的是,我使用的是linux虚拟机Ubuntu系统,gcc编译器正好和那个帖子给出的版本号一致,于是就没有尝试你给的方法。
经过分析,我这段代码里前面的输入只是在第一次输入后产生了一个回车符,在缓冲区里干扰程序运行。于是在第47行添加了一个getchar(),来吞掉这个多余的回车符。再次运行,程序符合我的预期。
第三、后来这个问题在百度文库https://wenku.baidu.com/view/2a11e81fed06eff9aef8941ea76e58fafab045ae.html里见到了解决方法。但是他的帖子里给出三种解决方法。第一种就是我用的增加一个读入字符去掉多余的回车符。第二种是在利用scanf()读入的时候,在数组后面增加一个回车符,我感觉意思是多读取一个回车符。我尝试了一下,没有成功。不明白原因。第三种是在后面读取的时候,数据格式%c前面增加一个空格,把回车符中和掉。由于我使用的是getchar()进行这一次的读取,于是没有尝试这种方法。
希望为后来者有借鉴作用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-29 08:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表