• C语言第5次实验报告


    C程序设计实验报告

    姓名:熊毅

    实验地点:家

    实验时间:2020.04.21

    实验项目:

    ①实验6.3.3-1已知三角形三条边,求三角形面积
    ②实验6.3.3-2求N的阶乘
    ③实验6.3.3-3求两个整数的最大公约数
    ④实验6.3.3-4打印输出指定的图形
    ⑤实验6.3.2-1求500以内的所有亲密数对
    ⑥实验6.3.3-1函数的递归调用
    ⑦实验6.3.3-2(选做)函数的递归调用

    一、实验目的与要求

    1、熟练地掌握函数的定义方法和调用规则。
    2、掌握在C语言程序中主调函数与被调函数之间进行数据传递的规则。
    3、了解函数的返回值及其类型,并正确使用它。
    4、了解局部变量和全局变量的作用域及它们与储存分类的关系,理解变量的存在性和可见性的概念。
    5、练习递归函数的使用。

    二、实验内容

    1、实验练习:实验6.3.3-1已知三角形三条边,求三角形面积
    1问题的简单描述:编写程序,从键盘输入三角形的3条边,调用三角形面积函数求出其面积,并输出结果。
    2实验代码:

    #include<math.h>
    #include<stdio.h>
    float area(float a,float b,float c)
    {
    	float s,p,area;
    	s=(a+b+c)/2;
    	p=s*(s-a)*(s-b)*(s-c);
    	area=sqrt(p);//根据海伦公式求面积// 
    	return(area); 
     } 
     void main()
     {
     	float a,b,c,ts;
     	printf("请输入三角形的三条边:
    ");
     	scanf("%f%f%f",&a,&b,&c);
     	ts=area(a,b,c);
     	if(a+b>c&&b+c>a&&a+c>b)
     	printf("area=%f
    ",ts);
     	else 
    	printf("data error!");
     }
    

    3问题分析:在判断三边是否能组成三角形的if语句中,刚开始用了或||以为满足三个其中一个就可以,发现不对,才知道要三个都满足后才改用与&&,其次在输出结果是一味地套用课本的输出方式3,4,5,导致无法得出正确结果,没有认真看自己的代码scanf("%f%f%f",&a,&b,&c);。所以,比较马虎,应该输入3 4 5,才能得出正确答案。

    2、实验练习:实验6.3.3-2求N的阶乘
    1问题的简单描述:编写函数,求从主调函数传来的数值i的阶乘值,然后将其传回主调函数并输出
    2实验代码:

    #include<stdio.h>
    #define N 5
    long function(int i)
    {
    	static long f=1;
    	f=f*i;
    	return f;
    }
    void main()
    {
    	long product;
    	int i;
    	for(i=1;i<=N;i++)
    	{
    		product=function(i);
    		printf("%d的阶乘为%d
    ",i,product);
    	}
    }
    

    3问题分析:这个问题不大,主要是懂得理解调用函数求阶乘值,以及定义符号常量N的值

    3、实验练习:实验6.3.3-3求两个整数的最大公约数
    1问题的简单描述:编写程序,从键盘输入两个整数,调用gcd()函数求它们的最大公约数,并输出结果。
    2实验代码:

    #include<stdio.h>
    int gcd(int a,int b)
    {
    	int temp;
    	int remainder;
    	if(a<b)
    	{
    		temp=b;
    		b=a;
    		a=temp;
    	}
    	remainder=a%b;
    	while(remainder!=0)
    	{
    		a=b;
    		b=remainder;
    		remainder=a%b;
    	}
    	return b;
    }
    void main()
    {
    	int x,y;
    	int fac;
    	printf("please input two integer:");
    	scanf("%d,%d",&x,&y);
    	fac=gcd(x,y);
    	printf("The great common divisor is:%d",fac);
    }
    

    3问题分析:这道题的关键是会辗转相除法,刚开始并不知道什么是辗转相除法,后来看了书上的例子:a>b,如果a能被b整除,则最大公约数是b。如果a除b的余数是c,则继续用b除c,如此反复,直到余数为0,则最后一个非0除数就是a,b的最大公约数。其次在输出时要用英文输入法。

    4、实验练习:实验6.3.3-4打印输出指定的图形
    1问题的简单描述:输入整数n,输出高度为n的等边三角形。
    2实验代码:

    #include<stdio.h>
    void trangle(int n)
    {
    	int i,j;
    	for(i=0;i<n;i++)
    	{
    		for(j=0;j<n-i;j++)
    		{
    			putchar(' ');
    		}
    		for(j=0;j<=2*i;j++)
    		{
    			putchar('*');
    		}
    		putchar('
    ');
    	}
    }
    int main()
    {
    	int n;
    	printf("please input a integer:");
    	scanf("%d",&n);
    	printf("
    ");
    	trangle(n);
    	return 0;
    }
    

    3问题的简单描述:输出三角形的之前做过练习,没什么问题,只不过比之前的更高级,所以要学会多种方法解决问题。

    5、实验练习:实验6.3.2-1求500以内的所有亲密数对
    1问题的简单描述:若正整数A的所有因子(包括1但不包括自身,下同)之和为B,而B的因子之和为A,则称A和B为一对亲密数。
    实验代码:

    #include<stdio.h>
    int facsum(int m)
    {
    	int sum=1,f=2;
    	while(f<=m/2)
    	{
    		if(m%f==0)
    			sum+=f;
    		f++;
    	}
    	return sum;
    }
    void main()
    {
    	int m=3,n,k;
    	while(m<=500)
    	{
    		n=facsum(m);
    		k=facsum(n);
    		if(m==k&&m<=n)
    		{
    			printf("%d,%d
    ",m,n);
    		}
    		m++;
    	}
    }
    

    3问题分析:刚开始对“值传递”有点不懂,后来通过流程图和代码后的注释明白了,不过还是没有完全理解。

    6、实验练习:实验6.3.3-1函数的递归调用,编写计算x的y次幂的递归函数getpower(int x, int y),并在主程序中实现输出和输入
    1问题的简单描述:编写程序,分别从键盘输入数据x和y,计算x的y次幂并输出。
    2实验代码:

    #include<stdio.h>
    long getpower(int x, int y)
    {
    	long s=0;
    	if(y==1)
    	s=x;
    	else
    	s=x*getpower(x,y-1);
    }
    int main()
    {
    	int num,power;
    	long answer;
    	printf("请输入num的值:");
    	scanf("%d",&num);
    	printf("请输入幂次方power的值:");
    	scanf("%d",&power);
    	answer=getpower(num,power);
    	printf("%d^%d=%ld
    ",num,power,answer);
    }
    

    3问题分析:无太大问题,就是要明白ld%是表示数据按照十进制有符号长型整数输入或输出,以及会调用递归函数。

    7、实验练习:编写计算学生年龄的递归函数
    1问题的简单描述:用递归方法计算学生的年龄。已知第1位学生年龄最小为10岁,其余学生一个比另一个大2岁,求第5位学生的年龄。
    2实验代码:

    #include<stdio.h>
    int age(int n)
    {
    	int c;
    	if(n==1)
    	c=10;
    	else
    	c=age(n-1)+2;
    	return c;
    }
    void main()
    {
    	int n=5,sage;
    	sage=age(n-1)+2;
    	printf("第%d位学生的年龄为%d
    ",n,sage);
    }
    

    3问题分析:无,同实验6.3.3-1。

    三、实验小结

    通过这次实验了解了C语言函数的定义方法和调用规则,和递归函数的使用。也学习了新知识,比如:辗转相除法、数据传递和什么是亲密数、怎么正确使用函数返回值及其类型。
    但是,写了这么多实验代码,我觉得问题还是有的,个人认为最严重的是:独立自主性差,过分依赖课本。比如上一次实验第一题课本出现一些问题,也一味的照搬课本,导致花了大量时间也无法得出正确答案。
    所以希望今后能够慢慢养成独立自主的学习习惯

  • 相关阅读:
    【转】 springBoot(5)---单元测试,全局异常
    【转】 springBoot(4)---热部署,配置文件使用
    【转】 springBoot(3)---目录结构,文件上传
    【转】 springBoot(2)---快速创建项目,初解jackson
    【转】 springBoot(1)---springboot初步理解
    【转】 SpringBoot+MyBatis+MySQL读写分离
    简单请求 vs 非简单请求
    H5新增的API
    图片
    vue更新dom的diff算法
  • 原文地址:https://www.cnblogs.com/Xiongyi1218/p/12781232.html
Copyright © 2020-2023  润新知