实验三
实验三 C语言分支语句和循环语句编程应用
(一)实验任务一
1.程序源代码
#include <stdio.h> #include <math.h> int main(int argc, const char * argv[]) { 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; }
2.程序测试运行结果截图
(二)实验任务二
1.程序源代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5 int main(int argc, const char * argv[]) { int x,n; srand(time(0));//以当前时间作为随机种子 n = 0; do{ n++; x = rand()%10;//生成一个0~9之间的随机数字 printf("%3d",x); }while(n<N); printf("\n"); return 0; }
2.程序运行结果截图
(三)实验任务三
1.程序源代码
(方法一)
//编程输出101-200之间的所有素数,并输出这一区间的素数个数 #include <stdio.h> #include <math.h> int main(int argc, const char * argv[]) { int i; int m,x; int cnd; for(i=101;i<200;i++){ //给定区间为101~200 m=sqrt(1.0*i); for(x=2;x<=m;x++){ //判别数字i是否为素数 if(i%x==0)break;//如果能够找到一个数可以整除i,则跳出循环 } if(x>m){ printf("%d\t",i); cnd++; if(cnd%5==0){ printf("\n"); } } } printf("\n101~200之间共有%d个素数。\n",cnd); return 0; }
(方法二)
#include <stdio.h> #include <stdlib.h> #include <math.h> int isPrime(int number){ int i; int ret=1; if (number<1) { ret=-1; }else if (number==2) { ret=1; }else if(number==1||(number%2==0&&number!=2)){ ret=0; }else{ for (i=3;i<=sqrt(number); i+=2) { if(number%i==0){ ret=0; break; } } } return ret; } int main(int argc, const char * argv[]) { //int number; int x; int i; int count=0; //printf("输入一个数:"); //while(scanf("%d",&number)!=EOF){ //x=isPrime(number); for (i=101; i<=200; i++) { x=isPrime(i); if(x==1){ printf("%d\t",i); count++; if (count%5==0) { printf("\n"); } } } printf("\n101~200之间共有%d个素数。\n",count); //switch (x) { // case 0: // printf("不是素数。\n"); // break; // case 1: // printf("是素数。\n"); // break; // default: // printf("false!\n"); // break; // } //printf("输入一个数:"); //} return 0; }
(p.s.注释掉的部分是我之前写过的一个isPrime判断素数的函数,我稍微修改的了输入一个数判断素数的程序,使数字范围在101~200之间就可以了)
2.程序运行测试结果截图
(四)实验任务四
1.简要说明算法思路
(1)如何取出数位上为奇数的数字:将整个数字通过取余的方式一位一位取出,判断取出的数字对2取余的结果如果!=0,则可以说明是奇数,那么将这个数字取出,否则就不要,这样就取出了数位上为奇数的数字。
(2)如何确保构成的新数中,原先的高位仍在高位,原先的低位仍在低位:我在设计算法的时候有两条思路。其一是先判断数字位数,然后顺序取数判断,这样取出的奇数列可以保证直接得到顺序;其二是不判断位数,上来就直接一位一位判断,这样是逆序取出奇数,然后再对整个奇数列做逆序操作,这样也可以保证最终取出的数列是正序的。但是由于我认为正序更顺,所以我采取了第一种算法。
2.程序源代码
// 将一个长整型数s的每一数位上的奇数依此取出来,构成一个新的数,顺序不变。 #include <stdio.h> #include <math.h> int main(int argc, const char * argv[]) { long s,s1,s2;//准备工作 int i; int cnd; long num=0,ans=0; printf("Enter a number: "); while(scanf("%ld",&s)!=EOF){ //不停循环 s1=s; for(cnd=0;s>0;cnd++){ //统计数字位数 s=s/10; } s2=s1; for(i=cnd;i>0;i--){ //顺序取出奇数 num=s1/pow(10.0, 1.0*(i-1)); if(num%2!=0){ ans=10*ans+num; } s1=s2%(int)pow(10.0, 1.0*(i-1)); } printf("new number is:%ld\n",ans);
ans=0; printf("\nEnter a number:"); } return 0; }
3.程序运行测试结果截图
(五)实验任务五
1.程序源代码
#include <stdio.h> #include <math.h> int main(int argc, const char * argv[]) { int n; double s=0,num; int x=0,a=1; int i; double sign=1.0; loop:printf("Enter n(1~10):"); while(scanf("%d",&n)!=EOF){ for(i=1;i<=n;i++){ a=a*i; do{ num=sign/a; s=s+num; sign=-sign; x++; continue; }while(x<=n); } printf("n = %d,s = %f\n",n,s); s=0;x=0;a=1;sign=1.0; goto loop; } return 0; }
2.程序运行测试结果截图
(六)实验任务六
(1)c程序源代码
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(int argc, const char * argv[]) { int date,guess; int cnd; srand(time(NULL)); date = rand()%31 + 1; printf("猜猜2020年12月哪一天会是你的lucky day:)\n开始喽,你有3次机会,猜吧(1~31):"); scanf("%d",&guess); for(cnd=1;cnd<3;cnd++){ if(date==guess){ break; }else if(date>guess){ printf("你猜的日期早了,lucky day还没到呢!\n再猜:):"); scanf("%d",&guess); }else{ printf("你猜的日期晚了,lucky day已经悄悄跑到前面去了!\n再猜:):"); scanf("%d",&guess); } }if (guess!=date){ printf("次数已经用完啦,偷偷告诉你:12月,你的lucky day是%d!\n",date); }else{ printf("恭喜你,猜对了你的lucky day!\n"); } return 0; }
(2)程序运行测试结果截图
(七)实验总结
1.这次实验让我深深明白了,事实上一个程序最重要的是算法,编程的过程是把已经想清楚的东西实现的过程,编程的过程并不难,难在思考算法的过程。其实后几个程序有的是一次就写成功了,还有的是经历了很多次debug,很多次运算,很多次修改才成功的,但在我看来,这些修改的过程反而是最有价值的,这强迫我一遍又一遍去看我的代码,然后带入数据发现自己在某一处有漏洞。这些漏洞往往是在思考算法的过程中忽略的一些细小的点导致的。
2.这次实验做的很爽,相比起机械性输入源代码验证,我更喜欢这样有挑战性的任务完成,给一个任务,去思考算法,这样让我去调用我学会的东西,然后运用,并发现我事实上没有掌握的东西。