C程序设计实验报告

实验项目

  • 6.3.1(练习3)
  • 6.3.1(练习4)
  • 6.3.2(练习1)
  • 6.3.2(练习2.1)(练习2.2)

姓名:王新媛 实验地点:一教524 实验时间:2021.05.21

一、实验目的与要求

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

二、实验内容

1、实验练习

实验6.3.1(练习3)

(1)问题的简单描述:输入两整数,调用gcd()函数求最大公约数。
(2)实验代码:

#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;
}
main()
{
	int x,y;
	int fac;
	printf("请输入两个整数x,y:");
	scanf("%d,%d",&x,&y);
	fac=gcd(x,y);
	printf("The great common divisor is:%d",fac);
}

(3)问题分析

要正确调用gcd()函数

2、实验练习

实验6.3.1(练习4)

(1)问题的简单描述:打印出指定图形。
(2)实验代码:

#include<stdio.h>
void trangle(int n)
{
	int i,j;
	for(i=0;i<n;i++)
	{
	for(j=0;j<n-i;j++)
	printf(" ");
	for(j=0;j<=2*i;j++)
	printf("*");
	putchar('\n');
	}
}
main()
{
	int n;
	printf("请输入一个整数n:");
	scanf("%d",&n);
	printf("\n");
	trangle(n);
}

(3)问题分析

3、实验练习

实验6.3.2(练习1)

(1)问题的简单描述:求500以内所以亲密对数。
(2)实验代码:

#include<stdio.h>
int facsum(int m)
{
	int sum=1,f=2;
	while(f<=m/2)
	{
		if(m%f==0)
		sum=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\n",m,k);
		m++;
	}
}

(3)问题分析

4、实验练习

实验6.3.2(练习2.1)(练习2.2)

(1)问题的简单描述:求500以内所以亲密对数。
(2)实验代码:

#include<stdio.h>
int facsum(int m)
{
	int sum=1,f=2;
	while(f<=m/2)
	{
		if(m%f==0)
		sum=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\n",m,k);
		m++;
	}
}
#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:\n");
	scanf("%lf,%lf,%d",&a,&b,&n);
	result=sab(a,b,n);
	printf("sab(%lf,%lf,%d)=%f",a,b,n,result);
}
#include<stdio.h>
double f(double x);
double sab(double a,double b,double 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;
}

(3)问题分析

不要忘记sab()文件,存储的时候要选.h文件,并命名为sab

三、什么是辗转相除法

含义:欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。欧几里得算法和扩展欧几里得算法可使用多种编程语言实现。


算法简介:欧几里得算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里得在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里得算法。

扩展欧几里得算法可用于RSA加密等领域。
假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
1997 / 615 = 3 (余 152)
615 / 152 = 4(余7)
152 / 7 = 21(余5)
7 / 5 = 1 (余2)
5 / 2 = 2 (余1)
2 / 1 = 2 (余0)
至此,最大公约数为1
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。

四、实验小结



递归函数的设计与调用不知道如何正确书写,并且对递归过程模糊不清;对函数的返回值还不是特别明白。

经过实验以及自己对代码的反复检验,对递归函数有了一定的了解,同时更深刻的了解的函数的定义与调用及宏定义的使用。

五、近期个人学习小结



开始学习C语言是因为兴趣一开始因为C语言与上学期所学的web前端有很多相似,所以学习起来十分容易,但最近随着学习更加深入后对一些函数及算法的掌握逐渐力不从心。

希望老师加强对一些函数应用方面的练习。
计划在网上看网课边学边练习

posted on 2021-06-03 17:48  WANGXINYUAN  阅读(82)  评论(0编辑  收藏  举报