实验三

实验三 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.这次实验做的很爽,相比起机械性输入源代码验证,我更喜欢这样有挑战性的任务完成,给一个任务,去思考算法,这样让我去调用我学会的东西,然后运用,并发现我事实上没有掌握的东西。

posted @ 2020-11-11 19:34  张珂瑜  阅读(194)  评论(0编辑  收藏  举报