C语言程序报告五
C程序设计实验报告
姓 名:赖瑾
实验地点:家
实验时间: 2020年4月21日
实验项目:6.3.1练习1 编写由三角形三边求面积的函数
6.3.1练习2 编写求N阶乘的函数
6.3.1练习3 求两个整数的最大公约数
6.3.1练习4 打印输出指定图形
6.3.2练习1 求500以内的所有亲密数对
6.3.2练习2 利用复化梯形公式计算定积分
6.3.3练习1 编写x的y次幂的递归函数
汉诺塔的实现
一、实验目的与要求
1.熟练地掌握函数的定义方法和调用规则。
2.掌握在C语言程序中主调函数和被调用函数之间进行数据传递的规则。
3.了解函数的返回值及其类型,并正确使用它。
4.了解局部变量和全局变量的作用域及它们与存储分类的关系,理解变量的存在性和可见性的概念
5.练习递归函数的使用
二、实验内容
(1)6.3.1练习1 编写由三角形三边求面积的函数 |
1、问题的简单描述:编写程序,从键盘输入三角形的3条边,调用三角形面积函数求出其面积,并输出结果。
2、流程图:
3、实验代码:
#include<stdio.h>
#include<math.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);
}
main()
{
float a,b,c,ts;
printf("输入三角形的三条边,中间用一个空格间隔开:\n");
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\n",ts);
else printf("Data error!");
}
4、问题:整个问题结构比较简单易写,关键在于对三边能否构成三角形的判断条件的写法。
5、分析:三边构成三角形只需满足两边之和大于第三边即可而不需再加上两边之差小于第三边这一附加条件。
6、最终运行效果:
(2)6.3.1练习2 编写求N阶乘的函数 |
1、问题的简单描述:编写函数,求出从主函数传来的数值i阶乘值,然后将其传回主调函数并输出。
2、流程图:
3、实验代码:
#include<stdio.h>
#define N 5
long function(int i)
{
static long f=1;
f=f*i; //实现阶乘
return f;
}
main()
{
long product;
int i;
for(i=1;i<=N;i++)
{
product=function(i); //调用函数
printf("%d的阶乘是%d\n",i,product);
}
}
4、问题:之前写过阶乘的代码所以做起来还是比较轻松的,这里的不同在于前面用了宏定义,之前做给小学生出计算题的那个代码也出现过,我在这里出的问题是不小心在for语句后面加了个;
然后出现了下面这样的结果
5、分析:原因是这个;
等于这个语句结束,然后循环体等于没有任何执行,只是i在变化。
6、最终运行效果:
(3)6.3.1练习3 求两个整数的最大公约数 |
1、问题的简单描述:编写程序,从键盘输入两个整数,调用gcd()函数求他们的最大公约数,并输出结果。
2、流程图:
3、实验代码:
#include<stdio.h>
int gcd(int a,int b)
{
int temp;
int remainder;
if(a<b)
{
int t;
t=a;a=b;b=t; //交换a和b的值
}
remainder=a%b;
while(remainder!=0) //辗转相除求最大公约数
{
a=b;
b=remainder;
remainder=a%b;
}
return b;
}
main()
{
int x,y;
int fac;
printf("Please input two integers(两数字间用一个空格隔开):");
scanf("%d %d",&x,&y);
fac=gcd(x,y); //调用函数
printf("The great common divsor is %d",fac);
}
4、问题:这个程序的重点在于要用到辗转相除法
,这个我刚开始不知道是什么,然后看了一下书的问题解释,明白了之后代码其实是好写的。
5、分析:辗转相除法
用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
6、最终运行结果:
(4)6.3.1练习4 打印输出指定图形 |
1、问题的简单描述:输入整数n,输出高度为n的等边三角形,当n的值为5,等边三角形为:
2、流程图:
3、实验代码:
#include<stdio.h>
trangle(int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
printf(" "); //打印空格
for(j=0;j<=2*i;j++)
printf("*"); //打印*
putchar('\n');
}
}
main()
{
int n;
printf("请输入三角形的高度n:");
scanf("%d",&n);
printf("\n");
trangle(n);
}
4、问题:关于这种打印三角形的问题之前也做过,但是有点忘记了,这次跟之前的循环条件有一点点不同,更灵活了。
5、分析:其实这种打印图形的问题万变不离其宗,都是通过对空格和*的循环调控来控制,关键就在于循环的条件的写法,写法也很多最好自己先思考一下不要过于依赖课本。
6、最终运行效果:
(5)求500以内的所有亲密数对 |
1、问题的简单描述:若正整数A的所有因子(包括1但不包括自身,下同)之和为B,而B的因子之和为A,则称A和B为一对亲密数。
2、流程图:
3、实验代码:
#include<stdio.h>
int facsum(int m)
{
int sum=1,f=2;
while(f<=m/2)
{
if (m%f==0)
{
sum=sum+f;
} //循环求m的因子之和并存放在sum变量中
f++;
}
return sum;
}
main()
{
int m=3,n,k;
while(m<=500) //500以内
{
n=facsum(m);
k=facsum(n);
if(m==k&&m<=n) //判断是否是亲密对的if语句
{
printf("%d,%d\n",m,n);
}
m++;
}
}
4、问题:问题主要还是对亲密数对的不理解,有点懵
5、分析:跟书写了下来就理解了,感觉经常遇到问题自己都还是不能解决还需要借助书本不是很好,还是要自己独立思考比较好一点。
6、最终运行结果:
(6)利用复化梯形公式计算定积分 |
1、问题的简单描述:(1)编制一个函数sab(a,b,n),其功能为利用复化梯形公式计算定积分
其中n为对区间[a,b]的等分数。要求该函数在一个独立的文件中。
(2)编制一个主函数以及计算被积函数值的函数f(x),在主函数中调用(1)中的函数sab(a,b,n)计算并输出下列积分值
要求主函数与函数f(x)在同一文件中。
(3)编制另一个主函数以及计算被积函数值的函数f(x),在主函数中调用(1)中的函数sab(a,b,n)计算并输出下列积分值。
同样要求主函数与函数f(x)在同一文件夹中,
(4)要求画出模块sab()的流程图。
方法说明:
设定积分为:
则复化梯形求积公式为:
其中h=(b-a)/n,Xk=a+kh。
2、流程图:
3、实验代码:
#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=x3+f(t);
}
return h*(x1+x2)/2+h*x3;
}
#include<stdio.h>
#include<math.h>
#include"sab.h"
double f(double x)
{
double result;
result=x*x*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);
return 0;
}
#include<stdio.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(%f,%f,%d)=%f",a,b,n,result);
return 0;
}
4、问题:没有分多个文件,不是很理解这种模块化设计
5、分析:其实这里是先写好了一个头文件再在其他程序里调用这个文件要记得调用自己写的文件用"
而不是<>
,然后用.c文件总是报错而用.cpp却不会。感觉是新的知识点吧,记忆一下。
6、最终运行结果:
(7)编写x的y次幂的递归函数 |
1、问题的简单描述:编写程序,分别从键盘输入数据x和y,计算x的y次幂并输出。
2、流程图:
3、实验代码:
#include<stdio.h>
long getpower(int x,int y)
{
if(y==1) //判断递归条件的if语句
return x;
else if(y>=2)
return x*getpower(x,y-1);
}
main()
{
int num,power;
long answer;
printf("输入一个数:");
scanf("%d",&num);
printf("输入幂次方:");
scanf("%d",&power);
answer=getpower(num,power);
printf("%d^%d=%ld\n",num,power,answer);
}
4、问题:这个程序总体来说比较简单,写着去就是了,要注意一下answer是长型的。
5、分析:长型的用%ld
而不是%d
。
6、最终运行结果:
汉诺塔的实现 |
1.设计思路:我觉得这个得先知道这个游戏怎么玩,不能让代码毫无规律的去试那样要试的次数太多了既不符合次数最少的游戏规则,盘子数目过多电脑可能运行不了,这个游戏的规律就是每次都是先将其他圆盘移动到辅助柱子上,并将最底下的圆盘移到c柱子上,然后再把原先的柱子作为辅助柱子,并重复此过程
所以现在要做的就是把这个过程变成函数
2.流程图:
3.代码:
#include<stdio.h>
void HanoTower (unsigned n,char tower_A,char tower_B, char tower_C) ;
void move (char tower1,char tower2) ;
int steps=0;
void main()
{
unsigned n;
printf ("Please enter the number of disk: \n") ;
scanf ("%d", &n) ;
printf ("The steps of move:\n") ;
HanoTower(n, 'A', 'B', 'C');
printf ("The Total steps are: %d",steps) ;
}
void HanoTower (unsigned n,char a,char b, char c)
{
steps++;
if(n==1)
move (a,c) ;
else
{
HanoTower (n-1,a,c,b) ;
move(a,c) ;
HanoTower (n-1,b,a,c) ;
}
}
void move (char tower1, char tower2)
{
printf("form \t%c --> \t%c\n",tower1, tower2);
}
4.最终运行结果:
5.设计中遇到的问题及解决办法:主要还是理解上的问题刚开始理解题目就出了问题,首先每次只能动一个盘子,没读清题目的时候我就觉得可以用移动n-1个盘子的方法步骤更少,然后发现有问题。还有就是在对递归的理解运用还是不太熟,简单的反应的过来一复杂就很难想到。
四、实验小结
这次实验总的来说遇到自己不能解决的问题不多,但是发现自己比较依赖书本,感觉这样非常不好,因为算法是C语言中非常重要的一环,这个最好还是自己想。还有就是学到了一些数学的东西,比如辗转相除法,亲密数对,这些看概念要转换成代码,不太可能一下子就想清楚,所以还是要画出流程图来,把问题逐步分解。然后这次实验出现了一些之前实验出现过的东西,可能稍微有点变动或者说是升级,可以复习前面知识的同时学习新的知识还挺不错的。
回到顶部
C语言程序报告五的更多相关文章
- 20145205 《Java程序设计》实验报告五:Java网络编程及安全
20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...
- Java实验报告五:Java网络编程及安全
Java实验报告五:Java网络编程及安全 ...
- 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】02-第一个C语言程序
前言 前面已经唠叨了这么多理论知识,从这讲开始,就要通过接触代码来学习C语言的语法.学习任何一门语言,首先要掌握的肯定是语法.学习C语言语法的目的:就是能够利用C语言编写程序,然后运行程序跟硬件(计算 ...
- C语言--C语言程序
一.代码的编写 1.程序结构 1> C语言程序的结构:由函数构成 *任何一个c语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,我 ...
- C语言程序设计第五次作业——循环结构
(一)改错题 1.题目:输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5 ...
- Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序
Android For JNI(一)--JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framew ...
- 创建第一次C语言程序
在这里我以VS2015为例,做演示.为什么要去演示怎样创建项目尼,因为我写第一个程序时,不知道该怎样用VS创建我的第一个应用程序. 第一步:打开VS环境如下 第二步:在开始出点击“新建项目”或在右上角 ...
- C语言入门:02.第一个C语言程序
一.开发工具的选择(1)可以用来写代码的工具:记事本.UltraEdit.Vim.Xcode等(2)选择Xcode的原因:苹果官方提供的开发利器.简化开发过程.有高亮显示功能 (3)使用Xcode新建 ...
- 20145221 《Java程序设计》实验报告五:网络编程及安全
20145221 <Java程序设计>实验报告五:网络编程及安全 实验要求 掌握Socket程序的编写 运行TCP代码包,结对进行,一人服务器,一人客户端 掌握密码技术的使用 利用加解密代 ...
随机推荐
- 基于mui的H5套壳APP开发web框架分享
前言 创建一个main主页面,只有主页面有头部.尾部,中间内容嵌入iframe内容子页面,如果在当前页面进行跳转操作,也是在iframe中进行跳转,而如果点击尾部按钮切换模块.页面,那就切换ifram ...
- 11-JS变量
一. JavaScript 是什么 JavaScript是一种运行在客户端(浏览器)的脚本语言 客户端:客户端是相对于服务器而言的,在这里先简单理解为浏览器 浏览器就是一个客户端软件,浏览器从服务器上 ...
- Nikto使用方法
Introduction Nikto是一款开源的(GPL)网站服务器扫描器,使用Perl基于LibWhisker开发.它可以对网站服务器进行全面的多种扫描,包括6400多个潜在危险的文件/CGI,检查 ...
- 用Python画的,5 种非传统的可视化技术,超炫酷的动态图
数据可以帮助我们描述这个世界.阐释自己的想法和展示自己的成果,但如果只有单调乏味的文本和数字,我们却往往能难抓住观众的眼球.而很多时候,一张漂亮的可视化图表就足以胜过千言万语.本文将介绍 5 种基于 ...
- Python中有许多HTTP客户端,但使用最广泛且最容易的是requests
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:北京尚脑软件测试 PS:如有需要Python学习资料的小伙伴可以加点击 ...
- Gun N' Rose Team Review
一看到这个项目就被他的功能给吸引了.回忆起以前看到一个东西很新奇想去网上查询它是什么,但是又不知道应该怎样去描述它,于是在搜索引擎的输入框中键入.删除.键入.删除的可笑经历的时候,我就越发感觉到这个a ...
- G - Greg and Array CodeForces - 296C 差分+线段树
题目大意:输入n,m,k.n个数,m个区间更新标记为1~m.n次操作,每次操作有两个数x,y表示执行第x~y个区间更新. 题解:通过差分来表示某个区间更新操作执行的次数.然后用线段树来更新区间. #i ...
- Windows安装Tesseract-OCR 4.00并配置环境变量
一.前言 Tesseract-OCR 是一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎.与Microsoft O ...
- Category、load、initialize 源码讲解
今天深圳天气有暴风雨,没有事情干,趁着周末和平常晚上写一篇关于Category知识的梳理!可能针对平常只会知道些category基本结论知道的人有些帮助,写这篇博客会按照下面的目录结合实例以及Cate ...
- C# WCF 之优势及特性
Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. 整合了原有的windows通讯的 . ...