问题集锦5500307347.docx
《问题集锦5500307347.docx》由会员分享,可在线阅读,更多相关《问题集锦5500307347.docx(22页珍藏版)》请在冰点文库上搜索。
![问题集锦5500307347.docx](https://file1.bingdoc.com/fileroot1/2023-5/7/e7c3f38d-0940-4e2f-a422-f2ad5fdff911/e7c3f38d-0940-4e2f-a422-f2ad5fdff9111.gif)
问题集锦5500307347
1.问题
作业11中说“去掉重复的素数”是什么意思?
指的是输出的时候就把它们都去掉或者变成0?
那求和的时候也不计算在内么?
答:
是指输出的时候就把重复的都去掉,如果有重复的话,输出最小的10个,最大的最后可能不够10个,求和也应该相应不计算重复的。
====================================================================
2.关于作业
请问:
有方法说明的题目可不可以用其他的算法
答:
可以!
自己能发挥一下最好。
====================================================================
3.作业格式问题
第n次作业(不是上机实验)中的编程题,还需要生成、运行并截图,做成实验报告的形式吗?
答:
作业题就是源程序+运行结果,是不是截图你自己决定。
====================================================================
4.奇怪的停止工作。
。
#include
main()
{
inta,b,c,d,e;
for(a=0;a<=1;a++)
{for(b=0;b<=1;b++)
{for(c=0;c<=1;c++)
{for(d=0;d<=1;d++)
{for(e=0;e<=1;e++)
{if((a==(b+c+d+e==1))&&(b==(a+c+d+e==4))&&(c==(a+b+d+e==3))&&(d==(a+b+c+d==0)))
{printf("A说的是%s话",(a=1)?
'T':
'F');
printf("B说的是%s话",(b=1)?
'T':
'F');
printf("C说的是%s话",(c=1)?
'T':
'F');
printf("D说的是%s话",(d=1)?
'T':
'F');
printf("E说的是%s话",(e=1)?
'T':
'F');
}
}
}
运行时出现致命错误停止工作。
答:
是你程序中的输出语句:
printf("A说的是%s话",(a=1)?
'T':
'F');有问题,
输出格式%s要求输出的是字符串,但你后面给的'T'和'F'都是字符,这会产生致命错误,因此停止工作。
应该改为双引号:
"T"和"F"
====================================================================
5.老师,上次课提到的程序依然有bug
#include
main()
{charch;
do
{printf("Pleaseinput(y/n)?
");
scanf("%c",&ch);
while(getchar()!
='\n');
}while(ch!
='y'&&ch!
='n'&&ch!
='Y'&&ch!
='N');
if(ch=='y'||ch=='Y')
printf("yes!
\n");
else
printf("no!
\n");
}
就是这个程序,如果输入一串字符串,而且这串字符串恰好以n或N或y或Y开头,程序并不会继续循环,而是直接输出yes或no,这与程序的动机不符。
答:
以n或N或y或Y开头,程序确实并不会继续循环,而是直接输出yes或no。
可以再增加一个ch2,每次同时读入2个字符,即使第一个字符是n或N或y或Y,如果第二个字符不是回车符则错误。
#include
main()
{charch,ch2;
do
{printf("Pleaseinput(y/n)?
");
scanf("%c",&ch);scanf("%c",&ch2);
if(ch2!
='\n')
while(getchar()!
='\n');
}while(ch2!
='\n'||(ch!
='y'&&ch!
='n'&&ch!
='Y'&&ch!
='N'));
if(ch=='y'||ch=='Y')
printf("yes!
\n");
else
printf("no!
\n");
}
====================================================================
6.练习7第3题
这是我写的程序:
#include
#include
main()
{doublex,n=1.0,s=0.0,m=1.0;
printf("pleaseinputanumberx:
");
scanf("%lf",&x);
s+=m;
do
{m*=x*(0.5+1-n)/n;
s+=m;
n++;
}while(fabs(m)>=1e-6);
printf("%lf",s);
}
但是发现当x>1的时候就死循环了,后来上网查询发现这是(1+x)^0.5的taylor公式,但是对x的限制条件是fabs(x)<=1,所以当x>1的时候应该怎么处理这个问题?
答:
确实只能输入[-1,1]区间的数值给x,否则就不收敛了。
这种数学问题程序中不用考虑。
====================================================================
7.老师,上次课中出现的某程序运行不正确
#include
main()
{charch;
do
{printf("Pleaseinput(y/n)?
");
scanf("%c",&ch);
while(getchar()!
='\n');
}while(ch!
='y'&&ch!
='n'&&ch!
='Y'&&ch!
='N');
if(ch=='y'||ch=='Y')
printf("yes!
\n");
else
printf("no!
\n");
}
答:
我把课件ppt中的程序复制进行编译,确实出现了你所说的问题,输入任何字符包括ynYN都一律提示重新输入。
让我百思不得其解,再仔细看了一下,语句:
scanf("%c",&ch);
中的%是中文的,这是ppt不知道为何给转换了,因为这个程序是我调试成功后复制到ppt中的。
这样scanf("%c",&ch);根本没有为ch读入字符。
英文%与中文%看起来很相近,修改后就一切正常了。
====================================================================
8.第四次实验第11题
去掉重复的素数是指重复时输出的数应该小于10个,还是只仅在计算素数和的时候不重复计算?
答:
去掉重复的素数是指重复时输出的数应该小于10个。
====================================================================
9.作业问题
作业中有一题:
编制一个C程序,从键盘输入一个实数x,判断它是否是方程:
x**4-3x**2-8x-30=0的实根。
若是方程的实根,则输出“Y”,否则输出”N”.我觉得要用到fabs函数,否则对于某些有无限小数点位的解不会输出Y?
不知道我的考虑是否正确?
答:
对的,可以这么考虑,比如判断fabs(x**4-3x**2-8x-30)<1e-6
====================================================================
10.不能打开文件
生成后,会出现下面的情况,这是怎么回事?
1>------已启动生成:
项目:
o,配置:
DebugWin32------
1>LINK:
fatalerrorLNK1104:
无法打开文件“C:
\Users\DELLL\documents\visualstudio2012\Projects\o\Debug\o.exe”
==========生成:
成功0个,失败1个,最新0个,跳过0个==========
答:
可能你上次运行还没结束,可执行文件o.exe被锁定了,关闭黑色窗口再重新编译一下。
====================================================================
11.关于作业第7题
#include
intmain()
{intn=1,x=2,sum1=0,sum2=0;
do{
do{if(x%n==0)
{sum1=sum1+n;
n++;
}
elsen++;}while(nif(sum1==x)
{sum2=sum2+x;
x++;}
elsex++;}while(x<1000);
printf("%d",sum2);
}
为什么最后结果是0呢?
答:
你在内层的do-while后加一个打印语句:
printf("%d\n",sum1);
打印跟踪一下循环的执行过程,你会发现sum1的值始终为1,
if(sum1==x)从没满足过,因此sum2=sum2+x;从没执行过,所以sum2的值为0。
====================================================================
12.怎样获取printf的返回值却不打印
答:
printf函数只要执行,就会把输出的内容送到输出缓冲区中,除非不往输出缓冲区中输出。
那就这样:
charstr[200];
intk;
k=sprintf(str,"........",....);
用sprintf函数把要输出的内容输出到字符串缓冲区str中,返回值就是输出字符的个数。
sprintf函数和printf函数功能相近,只是sprintf是输出到你指定的字符串缓冲区中。
sprintf函数后面会讲。
====================================================================
13.关于作业166页第3题的疑问
对于书上166页第3题,我最开始编的程序是这样的:
#include
#include
main()
{
doublex,t=1,p=1,q=1,sum=0,i=1,n=1;
printf("Pleaseinputx=");
scanf("%lf",&x);
for(;fabs(t)>=0.000001;n=n+1)
{
sum=sum+t;
while(i<=n)
{
p=p*(0.5-i+1)*x;
q=q*i;
i=i+1;
}
t=p/q;
}
printf("%lf\n",t);
printf("%lf,%lf\n",p,q);
sum=sum+t;
printf("%lf\n",sum);
}
由于结果一直不对所以我在最后输出了t和p,q,想看看是哪里出错了,结果运行出来是这样的:
Pleaseinputx=1
0.000000
156********123704000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000.000000,1.#INF
00
1.414150
请按任意键继续...
也就是最后绝对值小于0.000001的一项是0,然后p,q都很奇怪
我设计这个程序的思路就是让p代表每一项的分子,q代表每一项的分母,然后t是每一项
后来我将程序改成如下这样:
#include
#include
main()
{
doublex,p=1,sum=0,i=1,n=1;
printf("Pleaseinputx=");
scanf("%lf",&x);
for(;fabs(p)>=0.000001;n=n+1)
{
sum=sum+p;
while(i<=n)
{
p=p*(0.5-i+1)*x/i;
i=i+1;
}
}
printf("%lf\n",p);
sum=sum+p;
printf("%lf\n",sum);
}
运行结果如下:
Pleaseinputx=1
-0.000001
1.414213
请按任意键继续...
这个结果是正确的。
但我不太明白第二个和第一个程序差别在哪里?
以及第一个到底哪里出错了?
为什么输出的p,q是那个样子的?
答:
不是讲过如何推导递推公式吗?
你程序中第二层循环:
while(i<=n)
{
p=p*(0.5-i+1)*x;
q=q*i;
i=i+1;
}
根本不需要,也不需要p和q,不能先连乘计算完分子项,再连乘计算分母项n!
最后再相除,这样结果可能会溢出。
====================================================================
作业问题
第167页第11题中题目说到一个要求:
如果10个最小素数和十个最大素数有重复的情况,则去掉重复的素数。
我自己有个想法就是判断最小素数中的最大值与最大素数中的最小值,如果前者大于后者,那么直接再用一个for循环把1到1000内的所有素数累加起来,但是我觉得麻烦了,因为如果这样的话,就要用三个For循环,是否有更简便的方法?
主要是我想不出程序最后有什么好的方法把找到的素数一一比较并判断哪几个重复了?
答:
其实本题没这么复杂,你可以试着找50以内10个最小素数和十个最大素数。
找10个最小素数时,记住最大的一个素数max,这样找十个最大素数时,
找到一个就和这个max比较,如果相等就不再找了,这个素数也不打印。
这样就没有重复的了。
====================================================================
14.166页7题
#include
#include
main()
{intx,y,k,i,n,m=1,j=0;
for(x=4;x<=6;x++)
{k=(int)sqrt((double)x);
for(i=2;i<=k;i++)
{if(x%i==0)
{n=x/i;
if(n==i)y=0;
elsey=n;m=m+y+i;
}
}
if(x==m)
{printf("%d",x);
j=j+1;
if(j%10==0)printf("\n");
}
}
}
为什么什么都打印不出来?
答:
存在三个问题:
(1)你把求素数的程序直接搬过来求因子是不对的,求因子的循环不能到sqrt(n)就结束了,应该到x/2。
(2)求因子和的m,需要每次开始都重新赋值为1.
(3)求是否是因子,没那么复杂,用
if(x%i==0)
m=m+i;
就够了。
#include
#include
main()
{intx,y,k,i,n,m=1,j=0;
for(x=4;x<=6;x++)
{m=1;
for(i=2;i<=x/2;i++)
if(x%i==0)
m=m+i;
if(x==m)
{printf("%d",x);
j=j+1;
if(j%10==0)printf("\n");
}
}
}
====================================================================
15.关于黑色星期五
我编了一个程序解决您上课提出的两个问题但对于1600年前的日历基本查找不到,不知1600年前情况的程序运行对错与否附上程序附件,希望老师指正。
#include"stdio.h"
FILE*fp1;
intw,c,y,y1,m,d=13,i,j,key;
intmonth[13]={0};
intcalendar[10000][13]={0};
voidweek1()
{
w=c/4-2*c+y+y/4+(13*(m+1))/5+d-1;
w=w%7;
if(w<0)w=w+7;
month[i]=w;
}
voidweek2()
{
w=c/4-2*c+y+y/4+(13*(m+1))/5+d+2;
w=w%7;
if(w<0)w=w+7;
month[i]=w;
}
voidweek3()
{
w=c/4-2*c+y+y/4+(13*(m+1))/5+d-1;
w=w%7;
if(w<0)w=w+7;
calendar[j][i]=w;
}
voidweek4()
{
w=c/4-2*c+y+y/4+(13*(m+1))/5+d+2;
w=w%7;
if(w<0)w=w+7;
calendar[j][i]=w;
}
main()
{intsum=0;
fp1=fopen("blackfriday.txt","w");
printf("请输入您需要的功能\n");
printf("1.计算第xxxx年有几个黑色星期五\n");
printf("2.计算公元1年以来的每年的黑色星期五总数\n");
scanf("%d",&key);
if(key==1)
{printf("请输入年份(请不要输入1582)\n");
scanf("%d",&y1);
if(y1>1582)
{
for(i=1;i<=12;i++)
{
c=y1/100;
y=y1%100;
if(i>2)m=i;
elseif(y!
=0)
{
m=12+i;y--;
}
else
{
m=12+i;y=99;c--;
}
week1();
}
}
elseif(y1<1582)
{
for(i=1;i<=12;i++)
{
c=y1/100;
y=y1%100;
if(i>2)m=i;
elseif(y!
=0)
{
m=12+i;y--;
}
else
{
m=12+i;y=99;c--;
}
week2();
}
}
for(i=1;i<=12;i++)
{
if(month[i]==5){sum=sum+1;fprintf(fp1,"%d年%2d月13日是黑色星期五\n",y1,i);}
}
fprintf(fp1,"%d年共有%d个黑色星期五\n",y1,sum);
printf("程序已经输出至文件");
}
elseif(key==2)
{
for(j=1;j<=2015;j++)
{
for(i=1;i<=12;i++)
{
c=j/100;
y=j%100;
if(j>1582)
{
if(i>2)m=i;
elseif(y!
=0)
{
m=12+i;y--;
}
else
{
m=12+i;y=99;c--;
}
week3();
}
elseif(j<1582)
{
if(i>2)m=i;
elseif(y!
=0)
{
m=12+i;y--;
}
else
{
m=12+i;y=99;c--;
}
week4();
}
}
}
for(j=1;j<=2015;j++)
{sum=0;
for(i=1;i<=12;i++)
{
if(calendar[j][i]==5){sum=sum+1;}
}
if(j!
=1582)
{if(sum)fprintf(fp1,"%d年共有%d个黑色星期五\n",j,sum);
elsefprintf(fp1,"%d年没有黑色星期五\n",j);}
}
printf("程序已经输出至文件");
}
}
答:
这个,你大可不用去考虑1582年前和1582年启用格里高利历后的差别,据我所知,1582年启用格里高利历时已经对前面的时间积累误差进行了一次性修正,把时间调快了十几天。
====================================================================
16.关于第四次实验报告的流程图
word文档上画图实在是很麻烦,可以自己手画之后拍照插入报告文档里吗?
答:
可以!
====================================================================
17.P883.(5)
请问什么叫满足下列条件的C表达式如果“条件”是一个函数?
一个函数是什么条件?
这道题到底该怎么写呢?
如P883.(5)(9)(10)
答:
P883.(5)(9)(10)按照所给的数学公式写出相应的C语言表达式即可。
====================================================================
18.为什么结果不正确
作业十一题如果使用如下程序为什么结果发生错误,好像并没有执行循环条件一样。
#include
#include
main()
{intn=2,k=999,m=2,flag=0,j=0,p;
doubleSUM=0.0,TUM=0.0,T;
printf("zhu