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行的内容,然后直接退出。求助问题所在,怎么处理。 #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\尼科彻斯> jackz007 发表于 2022-7-20 00:05
编译、运行实况:
谢谢你的答复,但是这个答复有点答非所问了。要看怎么做,我可以直接在作业里回复小甲鱼就能够看到结果了。我问的是,我写的代码里,45~57行里出现了什么错误,造成每次运行时显示了第47行的屏幕打印后,就自己结束了程序。帮忙看看我的代码问题。谢谢。 这个涉及到输入缓冲区的问题
你这个程序,首先读取了一个整数,如13,你在输入了13之后,肯定会回车,但scanf只拿走了13,并没有拿走那个'\n',也就是回车,导致后面的getchar在读取输入缓冲区时,直接就读到了'\n',从而造成了你无法输入
解决方法:清空缓冲区
在ch=getchar();前,先执行fflush(stdin);清空缓冲区 临时号 发表于 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]