程序设计语言实验安排数学104.docx
《程序设计语言实验安排数学104.docx》由会员分享,可在线阅读,更多相关《程序设计语言实验安排数学104.docx(32页珍藏版)》请在冰豆网上搜索。
![程序设计语言实验安排数学104.docx](https://file1.bdocx.com/fileroot1/2023-5/15/e558419b-413f-4942-b633-75d411f94424/e558419b-413f-4942-b633-75d411f944241.gif)
程序设计语言实验安排数学104
实验注意事项:
1、进入机房必须遵守学校实验室的管理规定。
2、实验期间不能进行与实验无关的工作,特别是不能玩游戏、不能网上聊天。
3、本课程共安排设置8个实验项目,对每个实验应独立完成,不得抄袭。
4、对每个实验均需填写一份实验报告并在下一个实验前上交本次的实验报告。
5、注意保存好每次实验所建立的源程序以备教师检查。
6、本实验课程为一个独立设课的考查课程,教师根据学生的实验态度、实验报告质量和教师检查情况进行成绩评定。
7、填写实验报告应使用学校统一规定使用的广州大学实验报告纸,按照其表格中的各项内容规范填写,具体如下:
开课学院及实验室:
数学与信息科学学院计算机实验楼307B
年月日:
填写各实验具体的实验日期
实验课程名称:
统一填写“程序设计语言实验”
实验项目名称:
参看下面各实验的具体安排
成绩栏和指导教师栏由教师填写。
实验报告内容填写3大项:
实验目的、实验原理、实验内容(包括源程序、测试数据及实验结果、问题解答等)。
实验一
实验项目名称:
C开发环境的熟悉与使用
实验时间:
2011-9-1
实验目的:
1、初步了解C程序的特点和构成。
2、熟悉TurboC2.0IDE环境的操作。
3、掌握C程序上机的4个步骤:
编辑、编译、连接和运行调试。
4、初步了解程序的调试方法。
实验原理:
1.启动TC:
方法1:
DOS状态下:
进入TC子目录→键入TC→回车
方法2:
Windows环境下:
双击安装目录下的TC.EXE文件或双击其启动的快捷方式。
2.C程序上机的4个步骤:
编辑、编译、连接和运行调试。
具体过程如下:
(1)编辑源程序,完成后将源程序以扩展名.c存盘。
(2)对源程序进行编译,即将源程序转换为扩展名为.obj的二进制代码。
若源程序有错,必须予以修改,然后重新编译。
(3)对编译通过的源程序连接,即加入库函数和其它二进制代码生成可执行程序。
连接过程中,可能出现未定义的函数等错误,为此,必须修改源程序,重新编译和连接。
(4)执行生成的可执行代码,若不能得到正确的结果,必须修改源程序,重新编译和连接。
若能得到正确结果,则整个编辑、编译、连接、运行过程顺利结束。
注:
在Tc2.0的IDE环境下,对源程序的编译、连接、运行可在一个命令下一气呵成。
3.常用命令:
存盘:
F2或File→Save从磁盘读入C程序:
F3或File→Load
运行程序:
ctrl+F9或Run→Run查看运行结果:
Alt+F5或Run→Userscreen
4.退出TC集成环境:
从File菜单选择Quit命令或按Alt+X。
实验内容:
1.在TC2.0IDE环境中输入教材P3的例1.1程序,进行编译、连接和运行,并且查看运行结果,对程序进行存盘。
执行File→New命令后再从磁盘读入该程序进行编辑和运行调试。
2.上机测试并回答下列问题:
1)程序中的错误有哪些类型?
其特点是什么?
一般应如何修改?
2)在TC2.0中,用户的工作目录如何设置?
(注:
用户的工作目录是指用户保存源程序文件和读入源程序文件时的默认目录)
3)若文件MyC1.C编译成功后会产生什么文件?
连接成功后会产生什么文件?
这两个文件的默认保存目录如何设置?
4)若TC2.0的工作环境(例如:
系统库文件目录)设置不正确,将会产生什么问题?
5)在TC2.0中,程序执行完毕就马上返回编辑状态,致使观察运行结果时要按Alt+F5或Run→Userscreen,为了使程序运行完毕后暂停,应在源程序中加上什么语句?
6)程序调试的手段有哪些?
(选做题,但必须了解)
实验1问题回答参考答案:
1)程序中的错误通常分为三类:
一是编译时的错误,主要是语法错误,在编译阶段可由编译系统发现;二是逻辑错误,主要是计算公式写错、程序逻辑控制错误等,造成程序运行不能得到正确结果,一般需使用单步执行、打开变量观察窗口等调试手段;三是运行时的错误,一般是用户输入的数据不合法,如:
除数为0,致使程序出错运行不下去。
解决的方法是完善程序,提高程序运行的可靠性。
2)File菜单的Changedir命令
3)文件MyC1.C编译成功后产生MyC1.obj文件,连接成功后会产生MyC1.exe文件。
这两个文件的默认保存目录在Options菜单->Directories命令->Outputdirectory项中设置。
4)在连接阶段将会产生如:
头文件、库文件找不到的错误,导致连接无法完成。
5)在main()函数内的最后一行加上getch();语句
实验二
实验项目名称:
顺序程序设计
实验时间:
2011-9-8
实验目的:
1、理解和掌握程序设计的顺序结构。
2、理解和掌握C语言的数据类型和表达式。
3、掌握C程序设计中的输入和输出方法。
实验原理:
1.顺序结构的程序是指程序的执行自上而下、自左至右,程序中的每一个语句都能被执行一次,而且只能被执行一次。
顺序结构的程序设计是最简单的。
2.C语言的基本数据类型有整型、字符型和实型。
计算机语言中的数据的表数范围与数学上的表数范围具有差异。
3.常量和变量的概念及其使用。
4.C语言的运算符丰富,运算符具有优先级和结合性。
5.C语言中表达式的书写很多时候跟数学上是不同的。
6.格式输入和输出函数scanf()、printf()的调用格式及其各参数的意义。
实验内容:
1.验证《实验教程》P12的验证性程序
(1),理解:
数据的键盘输入格式应与scanf()函数的格式控制写法一致;字符型数据与整型数据的转换规定(使用其ASCII码)。
2.验证《实验教程》P13的验证性程序
(2),理解:
整型数据在C语言的表数范围与数学上的差异及整型数据溢出时系统的处理方法;理解负整数在机器内的补码表示。
3.完成《实验教程》P17的程序分析
(2)。
4.完成课本P27练习11~13(上机运行时,需补充完整程序),理解“++”、“--”运算符的运算特点;理解格式输入输出函数的格式及其控制功能。
5.验证课本P27练习14,理解逻辑运算符“与”、“或”的短路运算特点。
(选做题)
6.完成课本P28练习15。
(选做题)
7.回答下列问题:
a)下列数学代数式子写成C语言表达式应如何书写:
(提示:
开根号运算可使用系统函数sqrt())
b)数学上表示范围的式子:
0≤a≤100,写成C语言的逻辑表达式应如何书写?
实验2参考答案:
第3题:
&a,&ba/ba%b
第4题:
(课本练习题13)
main()
{inta=2,b=6,c=8;
floatx=2.3,y=3.4,z=-4.8;
longu=52875,l=128765;
charc1='e',c2='f';
printf("a=%db=%dc=%d\n",a,b,c);
printf("x=%.6f,y=%.6f,z=%.6f\n",x,y,z);
printf("x+y=%.2fy+z=%.2fz+x=%.1f\n",x+y,y+z,z+x);
printf("u=%ldl=%ld\n",u,l);
printf("c1=\'%c\'or%d(ASCII)\n",c1,c1);
printf("c2=\'%c\'or%d(ASCII)\n",c2,c2);
}
第6题:
(课本练习题15)
main()
{floata,b,c,d,e,sum,ave;
scanf("%f%f%f%f%f",&a,&b,&c,&d,&e);
sum=a+b+c+d+e;
ave=sum/5;
printf("Sum=%f\nAve=%f\n",sum,ave);
}
第7题:
a)a*b/(c*d)或a*b/c/d(-b+sqrt(b*b-4*a*c))/(2*a)
b)a>=0&&a<=100
实验三
实验项目名称:
选择结构程序设计
实验时间:
2011-09-15、2011-09-22
实验目的:
1、理解C语言的语句、算法的概念、流程图的表示。
2、掌握程序流程控制选择(分支)结构。
3、熟练掌握if语句和switch语句的使用。
4、理解if语句和switch语句的嵌套。
实验原理:
1.if语句的一般形式:
if(<表达式>)<语句1>[else<语句2>]
2.缺省else的条件语句形式:
if(<表达式>)<语句1>
3.if语句嵌套的一般形式:
if()
if()语句1
else语句2
else
if()语句3
else语句4
4.switch语句的一般形式是:
switch(<表达式>)
{case<常量表达式1>:
<语句序列1>
case<常量表达式2>:
<语句序列2>
:
:
case<常量表达式n>:
<语句序列n>
default:
<语句序列n+1>
}
为了不再执行本case后面的其它case和default语句,可用break语句中断switch语句,使流程跳到switch语句后面。
实验内容:
1.完成教材P71习题5,程序中要输出max变量的值。
2.阅读教材P71习题6的程序,判断其输出的结果,最后上机验证你的判断。
3.完成教材P72习题9。
4.上机测试并回答下列问题:
1)下面程序的功能是什么?
对复合语句{t=a;a=b;b=t;},若去掉“{”和“}”程序会发生编译上的错误吗?
能实现程序原来的功能吗?
在复合语句{t=a;a=b;b=t;}后面添加一个“;”号,对程序有没有影响?
main()
{floata,b,c,t;
scanf("%f%f%f",&a,&b,&c);
if(a>b)
{t=a;a=b;b=t;}
if(a>c)
{t=a;a=c;c=t;}
if(b>c)
{t=b;b=c;c=t;}
printf("%f,%f,%f\n",a,b,c);
}
2)
②
if(a>b)/*第一个if*/
{if(a>c)/*第二个if*/
temp=a;}
else
temp=b;
在嵌套的if语句中,else如何与if配对?
对下面的两个程序段,else与哪个if配对?
①
if(a>b)/*第一个if*/
if(a>c)/*第二个if*/
temp=a;
else
temp=b;
3)阅读理解下列求一元二次方程ax2+bx+c=0解的程序,该程序全面考虑了系数a,b,c的各种可能取值。
(不用写入实验报告)
#include
main()
{
floata,b,c,d,x1,x2,p,q;
printf("Inputa,b,c:
");
scanf("%f,%f,%f",&a,&b,&c);
if(fabs(a)<1e-6)/*也可以直接写成(a==0)*/
if(fabs(b)<1e-6)/*也可以直接写成(b==0)*/
if(fabs(c)<1e-6)/*也可以直接写成(c==0)*/
printf("Istrivial.\n");
else
printf("Isimpossible.\n");
else
printf("Hasonlyoneroot:
%8.4f\n",-c/b);
else
{d=b*b-4*a*c;
if(fabs(d)<1e-6)/*也可以直接写成(d==0)*/
printf("Hastwoequalrealroots:
%8.4f\n",-b/(2*a));
elseif(d>1e-6)/*也可以直接写成(d>0)*/
{x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
printf("Hastwodiffentrealroots:
%8.4fand%8.4f\n",x1,x2);
}
else
{p=-b/(2*a);
q=sqrt(-d)/(2*a);
printf("Hastwocomplexroots:
");
printf("x1=%8.4f+%8.4fI\n",p,q);
printf("x2=%8.4f-%8.4fI\n",p,q);
}
}
}
实验3参考答案:
第1题:
(课本练习题5)
main()
{
inta,b,c,max;
printf("Inputa,b,c:
");
scanf("%d,%d,%d",&a,&b,&c);
if(a>b)
if(a>c)max=a;
elsemax=c;
else
if(b>c)max=b;
elsemax=c;
printf("Max(%d,%d,%d)=%d\n",a,b,c,max);
}
第2题:
(课本练习题6)
(1)输出结果:
0
(2)输出结果:
*#
第3题:
(课本练习题9)
#include
main()
{
charch;
printf("Inputachar:
");
ch=getchar();
if(ch>='A'&&ch<='Z')
printf("'%c'isaupperchar\n",ch);
elseif(ch>='a'&&ch<='z')
printf("'%c'isalowerchar\n",ch);
elseif(ch>='0'&&ch<='9')
printf("'%c'isanumber\n",ch);
elseprintf("'%c'isaotherchar\n",ch);
}
第4题:
1)程序的功能是对键盘输入的三个数按由小到大排序;对复合语句{t=a;a=b;b=t;},若去掉“{”和“}”程序不会发生编译上的错误,但不能实现程序原来的功能;在复合语句{t=a;a=b;b=t;}后面添加一个“;”号,对程序没有影响。
2)在嵌套的if语句中,else总是与前面最近的未配对过的if配对(但复合语句可改变配对关系)。
在①中,else与第二个if配对;在②中,else与第一个if配对(复合语句改变了配对关系)。
实验四
实验项目名称:
循环控制程序设计
实验时间:
2011-09-29、2011-10-08
实验目的:
1、理解并掌握程序结构控制的循环结构;
2、理解while、do-while、for语句的语义和break、continue、goto语句的使用;
3、理解三种循环结构的异同,能实现三种结构间的转换;
4、理解循环嵌套的执行过程;
5、熟练应用循环语句进行程序设计。
实验原理:
1.while循环的一般格式:
while(<表达式>)
<语句>
其语义是:
当<表达式>的值为非零时,则执行<语句>,然后再判断<表达式>的值,只要它不为零,继续执行<语句>,如此重复,直到<表达式>的值为零为止。
2.do-while语句的一般格式是:
do
<语句>
while(<表达式>);
其语义是:
先执行<语句>,再判别<表达式>,若<表达式>的值为非零,则重复执行<语句>,直到<表达式>的值为零为止。
3.for循环的格式如下:
for(<表达式1>;<表达式2>;<表达式3>)
<语句>
for语句的执行过程如下:
①首先计算<表达式1>。
②求<表达式2>的值,若其值为非零,执行<语句>,然后转③执行,若<表达式2>的值为零,则结束for语句。
③求解<表达式3>,转②执行。
实验内容:
1.阅读教材P98习题7的程序,判断其输出的结果,最后上机验证你的判断。
2.编程实现教材P99习题16。
3.编程实现教材P99习题18。
4.下列两个程序实现的功能相同,说出它们实现什么功能?
两个程序比较,哪个更优?
①
main()
{inti,j,n;
longs,sum;
scanf("%d",&n);
for(i=1,sum=0;i<=n;i++)
{for(j=1,s=0;j<=i;j++)
s+=j;
sum+=s;
}
printf("sum=%ld\n",sum);
}
②
main()
{inti,n;
longs,sum;
scanf("%d",&n);
for(i=1,s=0,sum=0;i<=n;i++)
{s+=i;
sum+=s;
}
printf("sum=%ld\n",sum);
}
5.阅读下面的程序,理解程序设计的方法。
(不用写入实验报告)
1)下面程序是教材P98习题6的解答:
用泰勒级数求e的近似值,直到最后一项小于1e-6为止。
main()
{
intn;
doublee,temp;
temp=1;e=1;n=1;
while(temp>1e-6)
{temp/=n;
e+=temp;
n++;
}
printf("e=%lf\n",e);
}
2)下面程序是教材P98习题8的解答:
计算数列n-n/2+n/3-n/4+……-n/100。
main()
{
inti;
floatn,sum,temp;
printf("Inputn:
");scanf("%f",&n);
sum=0;
for(i=1;i<=100;i++)
{temp=n/i;
sum+=temp;
n=-n;
}
printf("n-n/2+n/3-....-n/100=%f\n",sum);
}
实验4参考答案:
第1题:
(课本练习题7)输出结果:
8
第2题:
(课本练习题16)
main()
{floatn;
doublesum=0;
do{
scanf("%f",&n);
sum+=n;
}
while(n);
printf("sum=%lf\n",sum);
}
第3题:
(课本练习题18)
#include
#include
main()
{longn,a;
randomize();/*利用系统时间产生随机函数的种子数,这样可使程序每次运行时产生的随机数都不一样,使用此函数要包含time.h头文件*/
n=random(38765);/*产生0~38764间的一个随机整数,实参38765可任意设置,使用此函数要包含stdlib.h头文件*/
do
{printf("Pleaseinputanumber:
");
scanf("%ld",&a);
if(a>n)
printf("%ldistoolarge\n",a);
elseif(aprintf("%ldistoosmall\n",a);
else
printf("%ldiscorrect\n",a);
}
while(a!
=n);/*这里用do-while循环比较方便*/
getch();
}
第4题:
两个程序的功能均是实现计算:
sum=1+(1+2)+(1+2+3)+…..+(1+2+3+….+n)的值。
两个程序比较,程序2更优,显然程序2的循环次数大大减少,它并没有每次循环都从1开始累加到n,而是在前一次计算出1+2+…+(n-1)的基础上计算1+2+…+(n-1)+n
实验五
实验项目名称:
函数
实验时间:
2011-10-13、2011-10-20
实验目的:
1.掌握C语言中函数的定义和调用方法;理解实参和形参结合时的“单向值传递”方式。
2.理解函数的嵌套调用和递归调用。
3.掌握函数原型的概念和使用。
4.理解变量的作用域和生命期。
5.理解预处理命令。
实验原理:
1.函数定义的一般形式:
<类型标识符><函数名>([<参数说明部分>])
{<说明部分>
<语句部分>
}
2.函数调用形式:
<函数名>([<实参表列>])
C语言规定:
实参对形参的数据传递为“单向值传递”,只能由实参传递值给形参,形参不能传递值给实参。
3.函数说明的一般形式(函数原型):
<类型标识符><函数名>([<参数表列>]);
作用:
在程序的编译阶段,利用它对调用函数的合法性进行全面检查。
4.递归概念
一个函数直接或间接地调用自己叫递归。
采用递归方法求解问题需符合的条件:
(1)可以把一个问题转化为一个新的问题,而这个新问题的解决方法仍与原问题解法相同,只是新处理的对象有所不同。
(2)必定要有一个明确的结束递归的条件,否则递归将无止境地进行下去。
5.从变量的作用域范围的不同,变量可分为:
局部变量和全局变量。
局部变量:
在一个函数内部定义的变量(又叫内部变量)。
它可分为:
auto变量、static变量和register变量。
全局变量:
在函数之外定义的变量(又叫外部变量或全程变量)。
它可分为:
static外部变量和普通外部变量(带extern说明的为引用性说明,不带extern说明的为定义性说明)。
6.C语言中预处理命令有三种:
(1)宏定义、
(2)文件包含、(3)条件编译
实验内容:
1.编程实现教材P121习题4,其中Fibnacci数列fib(n)的定义为:
2.完成教材P121习题6。
3.阅读教材P122习题8,分析判断其输出结果并上机验证,理解递归调用的执行过程。
4.阅读教材P123习题12,分析判断其输出结果并上机验证,理解宏定义和宏展开的特点。
5.阅读理解下列程序,分析判断其输出结果,最后上机验证,并理解引用性说明外部变量、定义性说明外部变量、自动变量、静态局部变量和实参与形参结合时的单向值传递的工作方式。
#include
intx=1;
f(inta,intb)
{staticintx=3;
intc=4,z;
externy;
z=(++x)+(y++)+(a++)+b+(c++);
returnz;
}
externinty;
main()
{intx=3,w;
w=f(x,y);
printf("%d\n",w);
w=f(x,y);
printf("%d\n",w);
}
inty=2;
实验5参考答案:
第1题:
(课本练习题4)
longfib(intn)
{inti;
longf,f1=1,f2=1;
if(n<1)
{printf("Dataerror!
\n");
return-1;
}
if(n==1||n==2)return1;
for(i=3;i<=n;i++)
{f=f1+f2;
f1=f2;
f2=f;
}
ret