第七.docx
《第七.docx》由会员分享,可在线阅读,更多相关《第七.docx(16页珍藏版)》请在冰点文库上搜索。
第七
深圳大学实验报告
课程名称:
高级语言程序设计
实验项目名称:
函数调用
学院:
信息工程学院
专业:
电子信息技术
指导教师:
蔡平
报告人:
韩朝相学号:
2009130197班级:
4
实验时间:
2010年5月18日-6月1日
实验报告提交时间:
2010年6月15日前
教务处制
一、实验目的与要求:
实验目的:
①熟练掌握C语言中函数的定义方法、函数“值传递“的方式。
②掌握函数的调用、嵌套调用和递归调用。
③掌握变量的作用域和生命期,了解数据的存储结构。
④学习对多文件的程序的编译和运行。
实验要求:
1.输出界面格式:
(可以自己设计包含下列信息的输出界面)
实验名称:
实验人:
按要求完成的输入/输出信息
完成日期自我评价
2.键盘输入的数据应提示输入内容与输入方式(交互性)。
3.输出数据要加以说明。
4.程序应注意使用注释语句。
5.对各种可能的输入情况都要考虑处理方案,不要有死循环和除0现象(健壮性)。
6.尽量少用GOTO语句,养成好的编程风格。
7.在Webcc上提交C源程序、输出界面拷屏文件。
8.完成实验报告(按要求设计)。
9.实验完成日期:
程序编写与调试:
2010年5月18日—2010年6月1日。
交实验报告打印稿:
2010年6月15日前。
实验环境:
地点:
教学楼D506
硬件环境:
机器编号:
软件环境:
操作系统WINDOSXP
C语言环境VC6.0
project类型:
WIN32ConsoleApplication
二、实验内容:
综合应用学到的循环、分支、数组等编程基础知识,进行函数的应用编程。
必做部分:
最大公约数、最小公倍数、闰年判断、素数筛选、矩阵相加、数据排序、杨辉三角。
选做部分:
水仙花数、汉诺塔、八皇后、约瑟夫问题。
1.自己设计输入数据方式及输出数据格式。
2.自行选择程序设计实现算法。
3.自行设计函数调用这一综合实验的主界面(菜单设计)。
三、实验步骤与过程:
(程序分析和算法描述、程序源代码。
要求:
设计思路合理,程序运行正确。
)
答:
首先进行函数声明,利用printf输出函数调用的主界面,再在main函数中对声明好的函数进行调用,最后对各个函数进行定义.声明及main函数源代码如下:
#include
#include
#include
voidmaxyueshu();
voidmaxb();
voidjudgerunnian();
voidchoosesushu();
voidjuzhenxiangjia();
voiddatearray();
voidPascaltriangle();
voidnarcissistic_number();
voidmove_hannuota();
voidmove(charx,chary);
voidhanoi(intn,charone,chartwo,charthree);
voidmain()
{
inta,i;
printf("实验名称:
函数调用实验人:
韩朝相\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("程序列表\n");
printf("1.求最大公约数.\n");
printf("2.求最小公倍数.\n");
printf("3.进行平闰年的判断.\n");
printf("4.进行素数的筛选.\n");
printf("5.查看矩阵相加的运算.\n");
printf("6.进行数据的排序.\n");
printf("7.查看杨辉三角.\n");
printf("8.输出水仙花数.\n");
printf("9.汉诺塔问题.\n");
printf("0.退出.\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
for(i=1;i>=1;i++)
{
printf("请选择你要执行的程序:
\n");
scanf("%d",&a);
if(a==1)
maxyueshu();
elseif(a==2)
maxb();
elseif(a==3)
judgerunnian();
elseif(a==4)
choosesushu();
elseif(a==5)
juzhenxiangjia();
elseif(a==6)
datearray();
elseif(a==7)
Pascaltriangle();
elseif(a==8)
narcissistic_number();
elseif(a==9)
move_hannuota();
elseif(a==0)
exit(0);
}
printf("完成日期:
2010/6/1评价:
优\n");
}
下面是各个函数的定义.程序分析.算法描述程.设计思路和程序源代码.
一.,最大公约数与最小公倍数:
根据辗转相除法,输入两个变量:
a,b.令余数c=a/b,如果c=0那么最大公约数就是b.如果c!
=0那么再用原来的除数除以余数即:
d=b,e=c,c=d/e;如此循环下去,直到余数为零即c=0.此时e就是a,b的最大公约数.而a,b的最小公倍数就为a*b/e.实现程序如下:
最大公约数:
#include
voidmain()
{
intm,n;
intm_cup,n_cup,res;
printf("请输入两个整数:
\n");
scanf("%d%d",&m,&n);
if(m>0&&n>0)
{
m_cup=m;
n_cup=n;
res=m_cup%n_cup;
while(res!
=0)
{
m_cup=n_cup;
n_cup=res;
res=m_cup%n_cup;
}
printf("最大公约数是:
%d\n",n_cup);
}
elseprintf("Error!
\n");
}
最小公倍数:
#include
voidmain()
{
intm,n;
intm_cup,n_cup,res;
printf("请输入两个整数:
\n");
scanf("%d%d",&m,&n);
if(m>0&&n>0)
{
m_cup=m;
n_cup=n;
res=m_cup%n_cup;
while(res!
=0)
{
m_cup=n_cup;
n_cup=res;
res=m_cup%n_cup;
}
printf("最小公倍数是:
%d\n",m*n/n_cup);
}
elseprintf("Error!
\n");
}
二.闰年的判断:
输入年份记为a,首先判断a是否能被400整除若能则a年是闰年.若不能则计算a是否能被4整除,若不能则a年不是闰年,若能就再计算a是否能被100整除若不能则a年是闰年,若能则a不是闰年.共三个判断语句就可以完成.实现程序源代码如下:
#include
voidmain()
{
inta,b;
printf("请输入您要判断的年份:
\n");
scanf("%d",&a);
if(a%400==0)
b=1;
elseif(a%4!
=0)
b=0;
elseif(a%100!
=0)
b=1;
if(b==1)
printf("您输入是的闰年");
else
printf("您输入的是平年");
printf("\n");
}
三.素数的筛选:
要筛选出0到a(a>0)内的所有素数,for(m=1;m<=a,m++)判断m(0k(也就是i=k+1)那么m就不是素数了.如此两层循环即可得到所有的素数.实现程序如下:
#include
voidmain()
{
inti,k,m,n=0,num;
printf("请输入一个整数以确定筛选的范围:
\n");
scanf("%d",&num);
printf("筛选的是小于%d的素数.\n",num);
for(m=1;m<=num;m++)
{
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)
break;
if(i>k)
{
printf("%5d",m);
n=n+1;
if(n%6==0)
printf("\n");
}
}
printf("\n");
}
四.矩阵相加:
首先利用二维数组定义两个矩阵.如a[5][6],b[5][6]令和矩阵为c[5][6].对a,b赋初值后,利用两重循环:
for(i=0;i<5;i++),
for(j=0;j<6;j++)
c[i][j]=a[i][j]+b[i][j]
这样就可以计算出和矩阵c所有元素的值.最后进行输出即可
实现程序如下:
#include
voidmain()
{
inti,j,a[5][6],b[5][6],c[5][6];
for(i=0;i<5;i++)
for(j=0;j<6;j++)
{
a[i][j]=i+j-4;
b[i][j]=i*j-10;
}
for(i=0;i<5;i++)
for(j=0;j<6;j++)
c[i][j]=a[i][j]+b[i][j];
printf("矩阵A为:
\n");
for(i=0;i<5;i++)
{
for(j=0;j<6;j++)
printf("%3d",a[i][j]);
printf("\n");
}
printf("矩阵B为:
\n");
for(i=0;i<5;i++)
{
for(j=0;j<6;j++)
printf("%3d",b[i][j]);
printf("\n");
}
printf("和矩阵C为:
\n");
for(i=0;i<5;i++)
{
for(j=0;j<6;j++)
printf("%3d",c[i][j]);
printf("\n");
}
}
五,冒泡排序法.
将一串无序的数据赋值给一个数组,对尚未排序的各元素从下标为0的元素到下标为n-1的元素依次比较相邻的两个元素是否逆序(与欲排顺序相反),若逆序就交换这两元素,经过第一轮比较排序后便可把最大的元素排在第一个位置上,然后从下标为0的元素到下标为n-2的元素再用同样的方法对于这n-1个事故重复上述过程,就可以把第二大的数排在第二个位置上。
以此类推,重复上述过程n-1次,分别将n个数中最大的数到第n-1打的数排到相应的位置上,则n个数排序完毕.
实现程序源代码如下:
#include
voidmain()
{
inta[10],i,j,t,sum=0;
floatm;
printf("请输入10个整数:
");
for(i=0;i<=9;i++)
scanf("%d",&a[i]);
for(i=1;i<10;i++)
for(j=0;j<10-i;j++)
if(a[j]{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
printf("整理好的顺序为:
\n");
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("\n");
}
六.杨辉三角.
利用二维数组对杨辉三角进行输出,首先确定要输出的行数,以10行为例.就要定义数组:
a[10][10],先不管杨辉三角左右的空格根据杨辉三角的结构,以i,j分别表示数组的行列,
j=0orj=i时,a[i][j]=1,否则该数就等于它上一行左右两数之和:
a[i][j]==a[i-1][j-1]+a[i-1][j],这样就确定了数组里面与杨辉三角对应得数.输出杨辉三角图形时,对于杨辉三角左右的空格,在第i左侧就有10-i个空格这样的话就可以利用for(i=0;i<10;i++){for(k=1;k<=(10-i);++k)printf("");for(j=0;j<=i;j++){printf("%6d",a[i][j]);}printf("\n");}
对杨辉三角图形进行输出,实现程序源代码如下:
#include
voidmain()
{
inta[10][10],i,j,k;
for(i=0;i<10;i++)
{
for(j=0;j<=i;j++)
{
if(j==0||j==i)
a[i][j]=1;
else
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
for(i=0;i<10;i++)
{
for(k=1;k<=(10-i);++k)
printf("");
for(j=0;j<=i;j++)
{
printf("%6d",a[i][j]);
}
printf("\n");
}
getchar();
}
四、实验结果与数据分析:
(有运行结果的界面截图,实验结果与实验结果分析,说明实验结果是否达到要求?
并提出对程序的改进想法)。
有运行结果地界面截图如下:
、
实验的结果,
1.
6448的
最大公约数是:
16
2.
3648
最小公倍数是:
144
3.
2010不能被4整除是平年
4.
小于197的素数:
1235711
131719232931
374143475359
616771737983
8997101103107109
113127131137139149
151157163167173179
181191193197
5.如上输出界面图所示
6.
10个整数:
2358964120
整理好的顺序为:
9865432210
7.
如上输出界面图所示
8.
小于99999的水仙花数有:
153,370,371,407,1634,8208,9474,4150,4151,54748,92727,93084
9.
4个盘子的汉诺塔问题,移动盘子的步骤如下:
A-->B
A-->C
B-->C
A-->B
C-->A
C-->B
A-->B
A-->C
B-->C
B-->A
C-->A
B-->C
A-->B
A-->C
B-->C
实验结果达到要求,
改进的想法:
1.在输出杨辉三角时,用户不能决定自己输出杨辉三角的行数,对这点改进使用户可以自己键入要输出杨辉三角的行数.
2.水仙花数函数能查找的范围是1000000以内,能改进使得其可以查找任意范围内的水仙花数就很好了.
3.矩阵相加函数只是简单的演示矩阵相加,如果改变程序,使用户可以选择自己键入要进行运算的矩阵还是自动生成矩阵进行相加演示就好了,
五、实验体会:
(自己在编程或程序编译运行中遇到的难点和问题及解决的办法,自我能力评价)
答:
大部分程序都是以前编写过的,在各个函数的编写上倒没有出现太大的问题.只是各个函数调试可用后在把它们在main函数下调用时就出了问题.不断出现localfunctiondefinitionsareillegal的错误警告!
改了1个多小时也没弄好.经过无数次的尝试与查找.最后才发现在main函数结束时少了个}!
当时发现错误的心情是复杂的…
自我评价:
基本在程序编写上面没有太大的问题了,实验报告能独立的完成,达到老师对实验报告的要求,如果百分制的话我给自己打95.谢谢>_
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。