实验3 C语言分支语句和循环语句编程应用
//一元二次方程求解 //重复执行,直到按ctrl+z结束 // #include <math.h> #include <stdio.h> int main(){ float a,b,c,x1,x2; float delta,real,imag; printf("Enter a,b,c:"); while(scanf("%f%f%f",&a,&b,&c)!=EOF){ if(a==0) printf("not quadratic equation.\n\n"); else{ delta=b*b-4*a*c; if(delta>=0){ x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a); printf("x1=%.2f,x2=%.2f\n\n",x1,x2); } else{ real=(-b)/(2*a); imag=sqrt(-delta)/(2*a); printf("x1=%.2f+%.2fi,x2=%.2f-%.2fi\n\n",real,imag,real,imag); } } printf("Enter a,b,c:"); } return 0; }
//生成N个0~9之间的随机整数,并打印输出 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5 int main(){ int x,n; srand(time(0)); n=0; do{ n++; x=rand()%10; printf("%3d",x); }while(n<N); printf("\n"); return 0; }
//ex3 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i,m,x,cnd; cnd=0; for(i=101;i<=200;i++) //给定i的范围 { m=sqrt(1.0*i); //定下最大除数 for(x=2;x<=m;x++) //实现除数从2到根号被除数 { if(i%x==0) //x不是素数 break; //结束循环 } if(x>m) //除数过半,还未找到可整除的数 { printf("%d\t",i); //打印输出i,每隔九列 cnd++; //计数,统计素数个数 if(cnd%5==0) //每打印五个,换行 { printf("\n"); } } } printf("\n101~200之间有%d个素数\n",cnd); return 0; }
任务四
算法思路:
①取出奇数:从末位开始,先对10取余,判断余数的奇偶,若是奇数则记录,偶数则不记录;将原数对10进行整除运算,重复上述步骤,且将第一次得到的数字乘以10在加上本次数字;继续重复上述步骤,直至对10整除得到结果为0;
②保持高位仍在高位:利用反位输出的原理,先对10取余,记录,再对10进行整除,第一次得到的数字乘以10加上第二次的数字,重复上述步骤,直至对10整除得到结果为0;
本题注意点是输入数字为长整型;
关于这部分的反位输出我写了两种,都尚存小瑕疵:
第一种输出是以整体数字输出,但从第二次开始,会将前一次的数字累加输出;
第二种输出是以单个数字输出,视觉效果是与题意相符的,但实际可能不是题目想得到的结果;
//ex4 //依次取出奇数,按序排列 #include <stdio.h> #include <math.h> #include <stdlib.h> int main (){ long x,t,p; t=0,p=0; printf("请输入一个数字:\n"); while(scanf("%ld",&x)!=EOF) { while(x!=0) { long m,n; m=x%10; n=m%2; if(n!=0) { t=t*10+m; x=x/10; } else x=x/10; } while (t!=0) { int m,n; n=t%10; p=p*10+n; t=t/10; } printf("%d",p); } return 0;
//ex4 //依次取出奇数,按序排列 #include <stdio.h> #include <math.h> #include <stdlib.h> int main (){ long x,t; t=0; printf("请输入一个数字:\n"); while(scanf("%ld",&x)!=EOF) { while(x!=0) { long m,n; m=x%10; n=m%2; if(n!=0) { t=t*10+m; x=x/10; } else x=x/10; } while (t!=0) { int m,n,p; n=t%10; printf("%d",n); t=t/10; } } return 0; }
任务五
尚存问题:s值第一次是正确的,第二次起,会将前一次的结果加上后输出;
//ex5 #include <stdio.h> #include <math.h> int main(){ int n,i,p; p=1; double s=0.0,t=-1.0,q; printf("Enter n(1~10):"); while(scanf("%d",&n)!=EOF) { if(n<=0||n>10) printf("something wrong,please enter again!\n"); for(i=1;i<=n;i++) { p=p*i; q=pow(t,i-1.0); s=s+1/(p*q); } printf("n=%d,s=%f\n\n",n,s); printf("Enter n(1~10):"); } return 0; }
//ex6 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h> int main(){ int m,n,x; n=1; srand(time(0)); x=rand()%31+1; printf("猜猜2020年12月哪一天会是你的luck day\n"); printf("开始喽,你有三次机会,猜吧(1~31):"); scanf("%d",&m); while(n<3) { if(x==m) {printf("你猜对啦!恭喜你!\n"); break;} else if(x>m) printf("你猜的日期早了,luck day还没到呢!\n"); else printf("你猜的日期晚了,luck day悄悄溜到前面啦!\n"); printf("再猜(1~31):"); scanf("%d",&m); n++; } { if(n=3&&x==m) printf("你猜对啦!恭喜你!\n"); else printf("次数用完了,悄悄告诉你:12月,你的luck day 是:%d",x); } return 0; }