C语言程序设计实验报告五

C程序设计实验报告五

实验项目:6-3-1练习1求三角形的面积;6-3-1练习2求n的阶乘;6-3-1练习3求最大公约数;6-3-1练习4输出三角形;6-3-2练习1求五百以内的亲密对数;6-3-2练习2利用复化梯式公式计算定积分;;6-3-2练习3计算Ackerman函数;6-3-3练习1计算x的y次幂6-3-3练习2计算学生的年龄6-3-3练习3编写递归函数实现Ack函数.

姓名:赖玮

实验地点:家

实验时间:2020.04.23

一、实验目的与要求

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

二、实验内容

1、实验练习:example_6_3_1练习1求三角形的面积

①、问题的简单描述:编写程序,从键盘输人三角形的3条边,调用三角形面积函数求出其面积,并输出结果。
②、实验代码:
/*已知三角形三边,求三角形面积*/ 
#include<math.h>
#include<stdio.h>
float area(float a,float b,float c)
{
float s,p,area;//s表示周长的一半,p表示面积
s=(a+b+c)/2;
p=s*(s-a)*(s-b)*(s-c);
area=sqrt(p);
return(area);	}
main()
{
float a,b,c,ts;//ts表示三角形的面积 
printf("请输入三角形的三条边长a,b,c
");
scanf("%f%f%f",&a,&b,&c);
ts=area(a,b,c);
if(a+b>c&&a+c>b&&b+c>a)
printf("area=%f
",ts);
else
printf("Data error!");
}

③、问题分析:分析问题时容易漏掉三角形成立的条件,需要更谨慎地阅读题目.

2、实验练习:6-3-1练习2求n的阶乘

①、问题的简单描述:编写函数,求出从主调函数传来的数值i的阶乘值,然后将其传回主调函数并输出。。
②、实验代码:
/*求n的阶乘*/
#include<stdio.h>
int function(int i)
{
    static long f=1;//static为局部静态变量,局部静态变量具有继承性 
    f=f*i;
    return f;
}
main()
{
long product;
int i,n;
printf("请输入n的值:
");//由于product位数有限,因此n的值不能取过大 
scanf("%d",&n);
for(i=1;i<=n;i++)
{
	product=function(i);
	printf("%d的阶乘是%d
",i,product);
	}
	} 
③、问题分析:static为局部静态变量,局部静态变量具有继承性,当n的值输入过大时,程序结果会出现负数,最后会出现0,这是因为定义的product为long int的数据类型,它占了8个字节,64位,当结果位数超过64位时,得到的结果会出现错误.

3、实验练习:6-3-1练习3求最大公约数

①、问题的简单描述:编写程序,从键盘输人两个整数,调用gcd()函数求它们的最大公约数,并输出结果.
②、实验代码:
/*求两个正整数的最大公约数*/
#include<stdio.h>
int gcd(int a,int b)
{
int temp;
int remainder;
if(a<b)
{
	temp=a;
	a=b;
	b=temp;
}
remainder=a%b;
while(remainder!=0)
{
	a=b;
	b=remainder;
	remainder=a%b;
}
return b;}
int main()
 {
int x,y;
int fac;//fac表示最大公约数 
printf("Please input two integers:
");
scanf("%d,%d",&x,&y);
fac=gcd(x,y);
printf("The great common divisor is:%d",fac);} 

③、问题分析:最大公约数的算法比较难设计,需要去百度了解设计最大公约数的思路。

4、实验练习<:example_6_3_1练习4输出三角形

①、问题的简单描述:输入整数n,输出高度为n的等边三角形.
②、实验代码:
/*输入整数n,输出高度为n的三角形*/
#include<stdio.h>
int trangle(int n)
{
int i,j;
for(i=0;i<n;i++)
{
	for(j=1;j<=40-i;j++)
	printf(" ");
	for(j=1;j<=2*i+1;j++)
	printf("*");	
	putchar('
');
}	
} 
int main()
{
int n;
printf("Please input value of n:
");
scanf("%d",&n);
printf("
");
trangle(n);
}

③、问题分析:无.

5、实验练习:example_6_3_2练习1求五百以内的亲密对数

①、问题的简单描述:若正整数A的所有因子( 包括1但不包括自身,下同)之和为B,而B的因子之和为A,则称A和B为一对亲密数。求出500以内的所有亲密数对.
②、实验代码:
/*五百以内的所有亲密数对*/
#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;
} 
int main()
{
int m=3,n,k;
while(m<=500)
{
	k=facsum(m);
	n=facsum(k);
	if(m==n&&m<=k)
	printf("%d,%d
",m,k);
	m++;
 }
}

③、问题分析:无.

6、实验练习:example_6_3_2练习2利用复化梯式公式计算定积分

①、问题的简单描述:编制一个sab(a,b,n)函数用于计算定积分,再编制两个主函数及计算被积函数f(x),最后调用sab(a,b,n)求出积分值.
②、实验代码:
/*利用复化梯形公式计算定积分*/ 
#include<stdio.h>
double f(double x);
double sab(double a,double b,int n)
{
	double h,result,x1,x2,x3=0,t;
	int k; 
	h=(b-a)/n;
	x1=f(a);
	x2=f(b);
	for(k=1;k<=n-1;k++)
	{
		t=a+k*h;
		x3+=f(t);
	}
	result=h*(x1+x2)/2+h*x3;
	return result;
 } 
/*计算pow(x,2)*exp(x)的定积分*/
#include<stdio.h>
#include<math.h>
#include"sab.h"
double f(double x)
{
	double result;
	result=pow(x,2)*exp(x);
	return result;
 } 
 main()
 {
 	double a,b,result;
 	int n;
 	printf("Please input double a,b and integer n:
");
 	scanf("%lf%lf%d",&a,&b,&n);
 	result=sab(a,b,n);
 	printf("sab(%lf,%lf,%d)=%f",a,b,n,result);
 }
/*计算1/(25+x*x)的定积分*/
#include<stdio.h>
#include<math.h>
#include"sab.h"
double f(double x)
{
	double result;
	result=1/(25+x*x);
	return result;
 } 
 main()
 {
 	double a,b,result;
 	int n;
 	printf("Please input double a,b and integer n:
");
 	scanf("%lf%lf%d",&a,&b,&n);
 	result=sab(a,b,n);
 	printf("sab(%lf,%lf,%d)=%f",a,b,n,result);
 }
③、问题分析:Ⅰ、首先需要设计一个sab.h的文件,一定要命名sab.h,因为后面需要引用这个文件.
            Ⅱ、准确理解#include<>和#include“”的区别,当include后是<>时,优先引用库函数,当include后为“”时,优先引用自己的文件.
            Ⅲ、double对应的格式字符是%lf.

7、实验练习:example_6_3_3练习2计算Ackerman函数

①、问题的简单描述:
②、实验代码:
/*计算Ackerman函数*/
#include<stdio.h>
int Ack(int n,int x,int y)
{
	int a;
	if(n==0)
	a=x+1;
	else if(n==1&&y==0)
	a=x;
	else if(n==2&&y==0)
	a=0;
	else if(n==3&&y==0)
	a=1;
	else if(n>=4&&y==0)
	a=2;
	else if(n!=0&&y!=0)
	a=Ack(n-1,Ack(n,x,y-1),x);
	return a;
}
int main()
{
	int n,x,y,result;
loop:
	printf("Please input n,x,y:
");
	scanf("%d%d%d",&n,&x,&y);
	if(n<0||y<0)
	{
	printf("输入不合法,请重新输入:
");
	goto loop;
	}
	result=Ack(n,x,y);
	printf("Ack(%d,%d,%d)=%d
",n,x,y,result);
		
}
③、问题分析:递归函数的实现需要用到X^n=X*X^(n-1)的计算思想,使用goto函数时,在跳转的函数前需要先加一个标签loop等.

8、实验练习:6-3-3练习1计算x的y次幂

①、问题的简单描述:
②、实验代码:
/*x的y次幂*/ 
#include<stdio.h>
long getpower(int x,int y)
{
	if(y==1)
	return x;
	else
	return(x*getpower(x,y-1));
 } 
 int main()
 {
 	int num,power;
 	long answer;
 	printf("输入一个数:");
	scanf("%d",&num);
	printf("输入幂次方:");
	scanf("%d",&power);
	answer=getpower(num,power);
	printf("%d^%d=%d
",num,power,answer); 
 }
③、问题分析:无.

9、实验练习:example_6_3_3练习2计算学生的年龄

①、问题的简单描述:
②、实验代码:
/*计算学生的年龄*/ 
#include<stdio.h>
int age(int n)
{
	int c;
	if(n==1)
	c=10;
	else if(n>1)
	c=age(n-1)+2;
	return c;
}
int main()
{
	int n=5,sage;
	sage=age(n);
	printf("第%d位学生的年龄为%d:
",n,sage);
}
③、问题分析:无

10、实验练习:example_6_3_3练习3编写递归函数实现Ack函数

①、问题的简单描述:
②、实验代码:
/*编写递归函数实现Ack函数*/ 
#include<stdio.h>
Acm(int m,int n)
{
	unsigned a;
	if(m==0)
	a=n+1;
	else if(n==0)
	a=Acm(m-1,1);
	else if(m>0&&n>0)
	a=Acm(m-1,Acm(m,n-1));
	return a; 
 }
 int main()
 {
 	unsigned int s1,s2,value,i=0;
 	printf("请输入s1和s2的值:
");
 	do
 	{
 		i++;
 		scanf("%d%d",&s1,&s2);
 		value=Acm(s1,s2);
		 printf("Acm(%d,%d)=%d
",s1,s2,value);	
	 }while(i!=2);
 }
③、问题分析:要深刻理解到题目的意思才能清晰地进行需要调用函数地定义,由于输出结果执行了两次,还需要再加入一个do……while循坏结构.

三、实验小结

得与失 第六章主要学习了函数的定义,函数的调用以及函数的声明,在实验过程中,我已经能够准确地定义并且调用所需要的函数,在学习新知识的过程中,有一些比较简单的知识点却已经忘记了,例如double的格式字符%lf被我习惯性地写成了%f,这是很不应该的。在平时的练习过程中,目前没有学习到的知识但实验代码又有时候需要的情况下一定要主动地去向老师或者同学请教,也可以去百度,但百度的东西要在自己学会的情况下再使用。只能说知识是无限的,想要成为一名出色的C语言爱好者,我还是需要多多向大神学习,多看一些C语言教程视频,丰富自己的知识,拓宽眼界。

原文地址:https://www.cnblogs.com/l-w-8-5-7/p/12758799.html