鱼C论坛

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

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

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

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

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

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

我写的代码如下:
  1. #include<stdio.h>
  2. #define max 1024
  3. int sum=0,a,b,c,t,i,j,flag=1;  //sum为中间计算结果,a为输入要验证的值,b为计算式初值,c为计算式末值,t为计算中间结果,i为要求的计算数,flag用于标注存在计算失败的标志位。
  4. int nkcs[max][3];
  5. char ch;
  6. int main()
  7. {
  8.         printf("请输入一个整数:");
  9.         scanf("%d",&i);
  10.   
  11.   for(j=3;j<=i;j++)
  12.    {
  13.         sum=j*j*j;
  14.         b=1;
  15.         c=3;
  16.         t=b;
  17.         while(t!=sum)
  18.         {
  19.                 if(t<sum)
  20.                 {
  21.                         t+=c;
  22.                         c+=2;
  23.                
  24.                 }
  25.                 if(t>sum)
  26.                 {
  27.                         t-=b;
  28.                         b+=2;
  29.                 }
  30.                 if(c>sum)
  31.                 {
  32.                         printf("尼科彻斯定理验证失败,失败时,初始值为%d,结束值为%d\n",b,c);
  33.                         flag=0;   //出现不符合时,设标记位
  34.                         break;
  35.                 }
  36.           }
  37.    nkcs[j-3][0]=j;
  38.    nkcs[j-3][1]=b;
  39.    nkcs[j-3][2]=c-2;

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

  52.                                 printf("%d^3==%d==%d+%d",nkcs[j][0],nkcs[j][0]*nkcs[j][0
  53. ]*nkcs[j][0],nkcs[j][1],nkcs[j][1]+2);
  54.                                 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]);

  55.                           }
  56.                 }

  57.         }       

  58. finish:  return 0;
  59. }
复制代码


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

使用道具 举报

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

  2. int nico(int n)
  3. {
  4.         int h , k                                             ;
  5.         h = n * n - n                                         ;
  6.         if(! (h % 2)) h ++                                    ;
  7.         printf("%d = %d" , n * n * n , h)                     ;
  8.         for(k = 1 ; k < n ; k ++) printf(" + %d" , h + 2 * k) ;
  9.         printf("\n")                                          ;
  10.         return h                                              ;
  11. }

  12. int main(void)
  13. {
  14.         int count , j                                                            ;
  15.         char judge                                                               ;
  16.       
  17.         printf("请输入一个整数:")                                               ;
  18.         scanf("%d" , & count)                                                    ;
  19.         printf("经验证 ,3 ~ %d 之间所有的整数均符合尼科彻斯定理!\n\n" , count) ;
  20.         printf("是否打印所有的式子(y/n) :")                                     ;
  21.         fflush(stdin)                                                            ;
  22.         judge = getchar()                                                        ;
  23.         if(judge == 'Y' || judge == 'y') for(j = 3 ; j <= count ; j ++) nico(j)  ;
  24. }
复制代码

        编译、运行实况:
  1. H:\[Exercise]\[00.00]\00.C\尼科彻斯>g++ -o x x.c

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

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

  17. H:\[Exercise]\[00.00]\00.C\尼科彻斯>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2022-7-20 12:51:45 | 显示全部楼层    本楼为最佳答案   
这个涉及到输入缓冲区的问题
你这个程序,首先读取了一个整数,如13,你在输入了13之后,肯定会回车,但scanf只拿走了13,并没有拿走那个'\n',也就是回车,导致后面的getchar在读取输入缓冲区时,直接就读到了'\n',从而造成了你无法输入
解决方法:清空缓冲区
在ch=getchar();前,先执行fflush(stdin);清空缓冲区
小甲鱼最新课程 -> https://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()进行这一次的读取,于是没有尝试这种方法。
希望为后来者有借鉴作用。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 01:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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