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

    C程序设计实验报告

    实验项目:循环结构实验

    姓名:黄澄 实验地点:514教室 实验时间:4月3号

    一、实验目的与要求

    1、用for语句实现循环
    掌握for语句实现循环的方法
    2、用while循环语句实现循环
    掌握while语句实现循环的方法及掌握while语句实现循环的方法
    3、用do-while语句实现循环及掌握do/while语句实现循环
    4、用while语句和for语句配合实现循环和掌握while语句和for语句配合实现循环
    5、用for语句嵌套实现循环:掌握for语句多层嵌套实现循环的方法:掌握continue语句的用法

    二、实验内容

    5.3.1:用for语句实现循环

    实验练习1:求数列前n项
    问题的简单描述:编写一程序,求出1,1+2,1+2+3···数列中前n项的值。
    程序流程图:

    实验代码如下

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


    问题分析
    这个道题不难,其实质就是求前n项和,但是要求你每项都输出,所以就在for中加一个输出就行了。

    实验练习--2

    1.问题的简单描述:
    编写一程序,求数列1,-3!,5!,-7!···[(-1)^(n-1)]*(2n-1)!前n项的和。n的值由键盘输入。
    2.实验代码:

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


    3.问题的简单分析:
    因为老师说流程图有错误所以就自己设计一下。
    问题一:1、3、5、7这个数列每一个值都加加了2,这个好办,设变量i=i+2,
    问题二:3!、5!可以用for循环实现。
    问题三:奇数正,偶数负,怎么表示呢?(-1)^n+1吗,可以试试这样表示sign =-sign,什么意思呢?让他发生变化,不断将-1 赋值给sign达到不断变化的效果,这个是一个很好地点子,因为看过别人是视频这样想,可以说是扩宽了思路。
    问题四:得有一个变量计数吧,让这个变量为sum
    问题五:第n项的数值表示,例如第一项是1.第二项是3,第三项是5,这个规律好找2n-1嘛。
    好了所有的问题都解决了,怎么拼凑他呢?
    因为你首先要得到项数对应的值,所以把项数方最外面,

     	for(i=1;i<=(2*n-1);i=i+2)
    

    为什么把他放在最外面呢?因为他变化最慢,很慢理解我说什么吧,请继续看,你会知道我想表达什么。
    接下来就是算阶乘了

    		for(j=1;j<=i;)
    			{
    				fac=fac*j;
    				j++;
    			}
    

    可以思考一下为什么我上面的代码要写成这样,我遇到什么问题了,还是for在这里有什么讲究。
    OK接下来是换求和还是还是换号呢?当然是先换号再求和啦。原因是你得加上一个负数。

    	fac=fac*sign;
    	sum=sum+fac;
    	sign=-sign;
    

    最后输出结果就行了

    	for(i=1;i<=(2*n-1);i=i+2)
    	{ fac=1.0;
    		for(j=1;j<=i;)
    			{
    				fac=fac*j;
    				j++;
    			}
    	 
    	}
    

    这里有一个需要注意的问题?新手都爱做的。先构思功能实现然后在写程序。好方法是先画程序流程图,这样的话你就知道怎么组织了,其次 某些大神说过有流程图之后就不用了写注释了。上面的变化快慢的问题,可以了解我想表达什么吧。

    5.3.2用while循环语句实现循环

    实验练习1:统计学生的最高最低成绩

    1.问题的简单描述:从键盘输入若干学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。

    2.实验流程和代码

    #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.问题分析
    两个数比较大小可以引进“容器”来存放,
    多个数怎么弄?让最大数等于变量X等于最小数

    max=min=x;
    

    然后用while,大于零进入,小于零直接输出。当然也可以用if多分支结构。
    接着就是

      while(x>0)
        {
        	if(x>max) max=x;
        	if(x<min) min=x;
         	scanf("%f",&x);
    	}
    

    思路是这样的,你先输入一个数,让这个数等于最大值和最小值,再输入一个数,和他比较如果比原来的大就是令这个数是最大值,比原来的小就是最小值。因为原来的数存储到了最大值或者是最小值这种表不准确,是最大最小值总是存储了一个数,这个数不断地替换。

    实验练习2:

    1.问题的简单描述:求所有的水仙花数(水仙花数是一个3位数的自然数,该数各位数的立方和等于该数本身,如153为水仙花数11+55+3*3=153)

    2.实验流程和代码

    #include<stdio.h>//水仙花
    main()
    {
    	int x,y,z;
    	int k=100;
    	while(999>=k&&k>=100)
    	{
    		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++;
    	}
     } 
    

    问题分析
    我弄错了需求,以为是证明是水仙花数而不是挑出水仙花数。
    把这个三位数分解,然后常规常操作了。这里可以从100到999,也可以从999到100。判断加循环就是while

    3、实验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.问题分析:
    这里有一个小事情需要主要注意

    sum+=1.0/(float)n;	
    

    这里是1.0而不是1,很关键。其他还好,这个程序if语句也可以做,所以在某种情况下if和while、do while是可以互换的。

    4、实验5.3.4

    1.问题的简单描述:输入4个字符,并把其转换为4位十进制整数后显示出来。

    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 if(k==3)
    	   data+=(c-'0'); 
    	}
    	printf("data=%d",data);
    }
    


    3.问题分析

    这个题目其实考察了循环语句里嵌套while和条件语句的用法,
    5.实验5.3.5
    实验练习1:

    1.问题的简单描述:有100匹马。要驮100担货物,其中,1匹大马可以驮3担,1匹中马可以驮2担,两匹小马可以驮1担,请问,大马、中马和小马可以有多少种组合。

    2.实验流程和代码:

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




    3.问题分析:
    这里用了穷举的方法,举个例子用1毛,2毛,5毛凑5块钱,所以可以0张5毛,0张2毛,50张1毛的,然后0张5毛,1张2毛,48张1毛的,for的嵌套就是变化越多就是多的就在里面,变化少的就在外面,从上面例题看出,还有一个对齐的问题用
    实验练习2:

    1.问题描述:编写程序,求以正整数等差数列的前6项。

    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("
    数列的前6项的和:%d
    ",sum);
    }
    




    3.问题分析:
    这题类似。不会出现大问题。
    实验练习3:

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

    2.实验流程和代码:

    #include<stdio.h>
    main()
    {
        int x,y,z,sum;
        sum=0;
        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=%d
    ",sum);
    }
    


    3.问题分析:
    填空不难

    三、实验小结

    我们最主要的就是先理清楚什么是循环体,还有循环语句的嵌套,就必须知道哪部分是内循环,哪部分是外循环,如果在思绪比较混乱的情况下,可以试着先把流程图画出来,然后根据流程图来写代码,写代码的过程中注意符号的使用问题。

  • 相关阅读:
    在WCF中使用Flag Enumerations
    WCF开发教程资源收集
    [转]WCF 4 安全性和 WIF 简介
    Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]
    Asp.Net Web API 2第十八课——Working with Entity Relations in OData
    Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)
    Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)
    Asp.Net Web API 2第十五课——Model Validation(模型验证)
    函数 生成器 生成器表达式
    函数的进阶
  • 原文地址:https://www.cnblogs.com/gudaonihao/p/10780934.html
Copyright © 2011-2022 走看看