顶级太阳 发表于 2022-7-19 22:13:07

s1e21 最后一个题目的显示出了问题,求助

本帖最后由 顶级太阳 于 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;
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;
   nkcs=b;
   nkcs=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,nkcs*nkcs[0
]*nkcs,nkcs,nkcs+2);
                                if(nkcs-nkcs>4)printf("...+%d\n",nkcs);                               elseif(nkcs==nkcs+4)printf("+%d\n",nkcs);

                          }
                }

        }       

finish:return 0;
}


前面所有内容,包括数组里存储的结果都一步步进行了验证,没有问题。只是最后的格式输出部分,在第1题里运行已经没有问题了。到了这个题目,进行循环输出多个结果时,每次询问是否打印后,屏幕显示了第47行的内容,然后直接退出。求助问题所在,怎么处理。

jackz007 发表于 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:\\\00.C\尼科彻斯>g++ -o x x.c

H:\\\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:\\\00.C\尼科彻斯>

顶级太阳 发表于 2022-7-20 07:58:41

jackz007 发表于 2022-7-20 00:05
编译、运行实况:

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

临时号 发表于 2022-7-20 12:51:45

这个涉及到输入缓冲区的问题
你这个程序,首先读取了一个整数,如13,你在输入了13之后,肯定会回车,但scanf只拿走了13,并没有拿走那个'\n',也就是回车,导致后面的getchar在读取输入缓冲区时,直接就读到了'\n',从而造成了你无法输入
解决方法:清空缓冲区
在ch=getchar();前,先执行fflush(stdin);清空缓冲区

顶级太阳 发表于 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()进行这一次的读取,于是没有尝试这种方法。
希望为后来者有借鉴作用。
页: [1]
查看完整版本: s1e21 最后一个题目的显示出了问题,求助