zoukankan      html  css  js  c++  java
  • 第三次实验报告

    c语言实验报告

    实验项目:

       1、用for语句实现循环

       2、用while循环语句实现循环
       3、用do-while循环语句实现循环
       4、用while语句和for语句配合实现循环
       5、用for语句嵌套实现循环

    姓名:张顺利   实验地点:第一教学楼514教室    实验时间:4月17日

    一、实验目的与要求

    1.用for语句实现循环

    1.  掌握for语句实现循环的方法;
    2. 循环嵌套的使用;

    2.用while循环语句实现循环

    1.    掌握fwhile语句实现循环的方法;
    2.    进一步掌握fwhile语句实现循环的方法;

    3.用do-while循环语句实现循环

    1.  掌握do-fwhile语句实现循环的方法;

    4.用while语句和for语句配合实现循环

    1. 掌握fwhile语句和for语句配合实现循环的方法;

    5.用for语句嵌套实现循环

    1. 掌握for语句嵌套实现循环的方法;
    2. 掌握for语句嵌套(三层)实现循环的方法;
    3. 掌握continue语句的使用;

    二、实验内容

    1.实验练习:

    5.3.1 (1)

    1.编写一程序,求出1,1+2,1+2+3···数列中前n项的值。

    2.代码示例:

    #include <stdio.h>
    #include <conio.h>
    main()
    {
        int i,j=0,k,s=0;
        printf("Enter a number:");
        scanf("%d",&k);
        for(i=1;i<=k;i++)
        {
            s=s+i;
            printf("%d",s);
            j++;
            
        }
    }

    3.算法思考:i为项数,k为输入数,s为前n项和,在输入k的值之后进入for语句循环,首先给i赋值1,进入循环,判断条件i<=k,是,进入算式s=s+i,再进入i=i+1,再重新进入循环,直到i>k,不满足循环条件,跳出循环,输出之前所得的所有s的值。

    5.3.1 (2)

    1.编写一程序,求数列1,-3!,5!,-7!···(-1)^n-1(2n-1)前n项的和。n的值由键盘输入。

    2.代码示例:

    #include <stdio.h>
    main()
    {
        int n,i,j,sign=1;
        float fac,sum;
        printf("please input value of n:");
        scanf("%d",&n);
        sum=0.0;
        for(i=1;i<=n;i++)
        {
            fac=1.0;
            for(j=1;j<=2*i-1;j++)
            {
                fac=fac*j;
            }
            fac=fac*sign;
            sum=sum+fac;
            sign=-sign;
        }
        printf("sum=%.0f
    ",sum);
    }

    3.算法思考:刚开始的时候老师说for里的i的条件有问题,但是要我们用i的条件对下面的算法进行填空,害的我以为不能更改for中的条件,所以一直看不懂,写不懂,直到后老师给我了一点提示我才恍然大悟。下面是我对算法流程的思考。

    n为输入数,i为循环次数,j为每一项的数值,fac为每一项j相乘的数值,sign为数值之前的符号,sum为前n项的和,

    首先由键盘输入n的值,将i赋值为1,进入循环,判断条件i<=n,成立,进入循环1,又将fac,j赋值为1,再次进入判断条件j<=2*i-1,成立,进入循环2,则进入算式fac=fac*j,再进行j=j+1,再次进入判断条件,直到j>2*i-1时,条件不成立,跳出循环2,再进入fac=fac*sign(将fac添加符号,进行包装),sum=sum+fac(计算前n项和),sign=-sign(更改“+”“-”号,满足算式(-1)^n-1),之后继续进入判断条件i<=n,直到i>=n时,条件不满足,跳出循环1,输出前n项和sum。

    只是由两个for循环进行嵌套的循环先进入大循环i<=n,其中又有一个小循环j<=2*i-1。这是一道非常经循典的题目,对于for循环的嵌套很有帮助,以后在复习的时候可以拿出来进行for语句的循环嵌套训练。

    5.3.2 (1)

    1.在键盘上输入若干个学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。

    2.代码演示:

    #include <conio.h>
    #include <stdio.h>
    main()
    {
        float x,max,min;
        printf("please input scores:");
        scanf("%f",&x);
        max=min=x;
        while(x>0)    
        {
        if( x>max) max=x;
        if( x<min) min=x;
        scanf("%f",&x);
        }
        printf("
    max=%f
    min=%f
    ",max,min);
    }

    3.算法思考:经典的C语言排序算法,max为最大值,min为最小值,x为输入的数值,首先将max,min,赋值为x,这时的x为第一个数,当x>0时,进入循环,先与max比较,max=x,不满足判断条件x>max,跳出循环,接下来与min进行比较,min=x,不满足判断条件x<min,跳出循环,输入第二个数,重新进入循环,直到遇到负数,满足判断条件x<0,跳出循环,输出max,min的值。

    这是while语句和if语句进行嵌套的循环结构,首先要先满足非负数这个条件,才能进入while的大循环,才会有max,min,x的比大小,这个小循环,题目不难,算是一道中规中矩的题目吧。

    5.3.2 (2)

    1.求所有的水仙花数(水仙花数是一个3位数的自然数,该数各位数的立方和等于该数本身,如153为水仙花数1^3+5^3+3^3=153)。

    2.代码示例:

    #include <stdio.h>
    main()
    {
        int x,y,z;
        int k=100;
        while(k<=999)
        {
            x=k/100;
            y=(k/10)%10;
            z=k%10;
            if(k==x*x*x+y*y*y+z*z*z)
            printf("%d
    ",k);
            k++;
        }
    }

    算法思考:这道题需要注意的在之后的判断条件中包含if结构,同时k为==,不要打成=的赋值,

    首先进入循环的判断的条件,因为水仙花数是三位数,所以应该在100~999之间,由于输入的初始k值为100,所以我们条件为k<=999,再由x,y,z,分别提取k的百位,十位,个位。即用算式x=k/100,y=(k/10)%1,;z=k%10。再进入if的判断语句,判断是否符合水仙花数的条件,k=x*x*x+y*y*y+z*z*z,成立输出k的值,不成立,k=k+1后,重新进入循环,直到k=1000时,不满足判断条件k<=999,跳出循环,结束。

    5.3.3

    1.求满足下列不等式的n的最小值,其中,value是大于1的任何事。1+1/2+1/3+···+1/n>value

    2.代码示例:

    #include <stdio.h>
    main()
    {
        float sum,value;
        int n;
        printf("Input value:");
        scanf("%f",&value);
        sum=0.0;
        n=0;
        do
        {
            ++n;
            sum+=1.0/(float)n;
        } 
        while(sum<value);
        printf("n=%d",n);
    }

    3.算法思考:value为输入值,n为所求值,sum为前n项的和。首先输入value,再将sum,n赋值为0,直接进入算式n=n+1,再将sum加入上1/n的前n项和计算出来,即sum=sum+1/(float)n,再将sum与value进行比较,当sum满足判断条件sum<value时,重新进入循环,直到sum>value时,不满足判断条件,跳出循环,输出n。

    这道题不难,与之前的算法题目大同小异,但在这里可以明显看出while语句和do-while语句的不同,while语句是先进行判断,再进入算式运算;而do-while语句则是先进入算式运算,再进行运算。在运算上就比while语句多了一次。所以相同的题目while语句,和do-while语句的判断条件是不同的。

    5.3.4

    1.输入四个数字字符,并把其转换为四位十进制整数后显示出来。

    2.代码示例:

    #include <stdio.h>
    main()
    {
        char c;
        int k,data;
        data=0;
        for (k=0;k<4;k++)
        {
            while(1)
            {
                c=getchar();
                if (c>='0' &&c<'9')
                break;
            }
            if(k==0)
                data+=(c-'0')*1000;
            else if(k==1)
            data+=(c-'0')*100;
            else if(k==2)
            data+=(c-'0')*10;
            else
            data+=(c-'0');
        }
        printf("Data=%d",data);
     } 

    3.算法思考:这道题和前面求水仙花数的算法差不多,只不过使用的是for结构,while结构,if结构的连环嵌套,首先for语句把k限定在4个数字即k<4,再输入c的值,再判断c的值是否在0~9之间,如果是,就将0位上的数乘上1000,变为千位数,将1位上的数乘上100,变为百位数,将2位上的数乘上10,变为十位数,将3位上的数直接添加进去,再将所有位数上的数值进行相加,得出data的值,再将k自增,这时k的值已经为4,不满足循环条件,跳出循环,输出data的值。

    这道题,我认为是一道非常好的题目,算法上都不难,但考验的却是我们关于循环结构的嵌套,这里几乎把我们学过的循环语句都运用进去了,所以我认为是一道非常不错的题目。

    5.3.5(1)

    1.有100匹马,要驮100担货物,其中,1匹大马可以驮3担,一匹中马可以驮两担,两匹小马可以驮1担,请问,大马,中马和小马可以有多少种组合。

    2.代码示例:

    #include <stdio.h>
    main()
    {
        int m,n,k;
        int sum=0;
        printf("各种驮法如下:
    ");
        for(m=1;m<=100;m++)
        for(n=1;n<=100-m;n++)
        {
            k=100-n-m;
            if((k%2==0)&&(3*m+2*n+0.5*k==100))
            {        
            printf("大马%3d匹;中马%3d匹;小马%3d匹.
    ",m,n,k);
                sum++;
             }     
             else
             continue;
            
        }    
        
        printf("共有%d种驮法.
    ",sum);
    }

    3.算法思考:我刚看到这道题的时候,就觉得这道题挺有趣的,他是用两个for语句进行并列嵌套,首先因为所有马的数量为100,所以无论是什么马的数量都不会超过100,故m表示大马,n表示中马,k表示小马,先一个个来,先通过for语句,进入判断条件m<=100,因为已经有了大马的数量,所以第二个for语句所判断的条件就为n<=100-m,在这里要说明,为了防止中马,大马的数量变为负数这种不可能的现象,所以我们在之前就将m和n的值赋值为1,最后进入循环等式k=100-m-n,因为小马的数量就是剩下的数量,最后用if语句判断他是否满足条件,可以拖动100担,故用if((k%2==0)&&(3*m+2*n+0.5*k==100))来进行判断,如果成立就输出大马,中马,小马的数量,不成立的话,在m=m+1后,重新进入循环,直到m=101,不满足循环条件m<=100,跳出循环。并且在最后要输出总共有几种方法,所以在成立的后面加上sum=sum+1,来计算。

    5.3.5(2)

    1.编写程序,求一正整数等差数列的前6项的和,该数列前4项之和是26,前4项之积是880。

    2.代码示例:

    #include <stdio.h>
    main()
    {
        int a,b,c,d,i,sum=0;
        for(a=1;a<=26;a++)
        for(d=1;d<=26;d++)
        {
            b=4*a+6*d;
    
            if(b!=26)
            continue;
            else
            {        
            c=a*(a+d)*(a+2*d)*(a+3*d);
            if(c!=880)
                continue;
            else
                for(i=0;i<6;i++)
                {
                    printf("%d,",a+i*d);
                    sum=sum+(a+i*d);
                }
            }
        }
        printf("
    数列的前六项的和: %d
    ",sum);
    }

    3.算法思考:这同样是一道上for语句嵌套的结构,其中a表示首项,d表示每一项增加的值,b表示前四项之和,c表示前四项之积,sum表示前六项之和,首先因为前四项之和为26,所以无论是a还是d都不不会超过26,故进入循环的条件就是a(d)<=26,在进入判断条件,判断他的前四项之和,之积是不是等于26,880.所以用的是if语句,因为前面不对的话是没资格进入下面一个循环的,下面一个循环则是在前者正确的基础之上,来计算前六项之和的,所以只是一个简单的for循环。

    这道题其实可以分为两个部分来思考,前一个部分是通过循环来求出首项和增加值,后一部分则是一个简单的求前n项和。这样思考是的一道较难的题简单化了。

    5.3.5(3)

    1.有30个学生一起买小吃,共花钱50元,其中,每个大学生花3元,每个中学生花2元,每个小学生花1元,问大、中、小学生的人数共有多少种不同的解(去掉某类学生数为0的解)

    2.代码示例:

    #include <stdio.h>
    main()
    {
        int x,y,z,sum;
        sum;
        for(x=1;x<30;x++)
        {
            for(y=1;y<30;y++)
            {
                z=30-x-y;
                if((z!=0)&&(3*x+2*y+z==50))
                {printf("大学生%3d	中学生%3d	小学生%3d
    ",x,y,z);
                sum=sum+1;
                }
                else
                continue;
            }
        }
        printf("sum=sum=%d
    ",sum);
    }

    3.算法思考:这道题其实和百马百担问题差不多,我在这里就不在赘述了。但有一点要说的是,这是因为他们两的相似性,所以在他们两其中一道题出问题的话,把他们两进行比较,反而会有意想不到的结果。

    三、实验总结

    要说这一次得到的东西,那就不得不说说我失去的东西,怎么说呢,在这次实验中,我失去了不少的头发。这次的问题总结来说,就是大错没有,小错不断。所以说在自己明明感觉自己打代码没有错误的情况下,却还是无法显示相同答案,于是就开始揪头发;在代码实现后,自己发现原来就是这么一个小问题,打错了字母符号,就又会开始揪头发,懊悔自己为什么会这么不小心,搞得损失了那么多少时间。揪着揪着就掉发了。所以我感觉这次实验打代码打的让我十分憋屈,有的必有失,我希望通过这次实验,能不断改善我粗心的弱点,尽量少犯错误,不犯错误。

  • 相关阅读:
    UVa 1151 Buy or Build【最小生成树】
    UVa 216 Getting in Line【枚举排列】
    UVa 729 The Hamming Distance Problem【枚举排列】
    HDU 5214 Movie【贪心】
    HDU 5223 GCD
    POJ 1144 Network【割顶】
    UVa 11025 The broken pedometer【枚举子集】
    HDU 2515 Yanghee 的算术【找规律】
    Java基本语法
    Java环境变量,jdk和jre的区别,面向对象语言编程
  • 原文地址:https://www.cnblogs.com/1403262085zsl/p/10723529.html
Copyright © 2011-2022 走看看