c语言实验指导书.docx
《c语言实验指导书.docx》由会员分享,可在线阅读,更多相关《c语言实验指导书.docx(43页珍藏版)》请在冰豆网上搜索。
c语言实验指导书
实验一C语言程序的编辑和运行
一、实验目的
1.熟悉C语言的系统环境,学习编辑运行C语言程序的基本方法。
2.进一步认识程序的两种错误类型对程序结果的影响,加深对程序测试重要性的认识。
3.认识C语言程序的结构特点,学习程序的基本编写方法
二、实验内容
1. TurboC2.0集成环境的使用。
使用TurboC2.0集成环境,编辑运行实现乘法运算的程序。
乘法运算的源程序如下:
#include"stdio.h"
main()
{
inta,b;
a=251; /*使a具有值251*/
b=8; /*使b具有值8*/
printf("%d\n",a*b);/*计算并输出表达式a*b*/
}
2.标识符和程序的逻辑错误。
修改上面的程序,观察运行结果。
⑴将程序中的表达式“a*b”的“a”改为“A”,然后运行程序。
⑵将程序中的表达式“a*b”修改为“a-b”,然后运行程序。
3.编辑并运行能够对任意两个整数进行乘法运算的程序。
下面是源程序清单:
#include"stdio.h"
main()
{
inta,b;
printf("Inputa,b:
");/*在屏幕显示提示信息Inputa,b:
*/
scanf("%d,%d",&a,&b);/*该语句的作用是实现数据的键盘输入*/
printf("a*b=%d\n",a*b);/*输出乘法运算的结果*/
}
三、实验指导
1.TurboC2.0集成环境的使用。
在主教材的第1单元,我们介绍了使用TC2.0上机实现一个C语言程序的一般步骤。
按照所述步骤,操作如下:
⑴启动TC2.0。
⑵使用“File→New”命令或直接使用“Edit”命令,使TC2.0进入编辑状态,录入编辑上面的源程序。
⑶源程序录入完毕后,使用“Comple→CompiletoOBJ”对源程序进行编译,如果源程序存在语法错误,这时编译系统会把程序中的错误指示出来。
发现错误后,需要立即修改源程序,然后重新编译。
⑷编译无误后,使用“Comple→LinkEXEfile”连接目标代码,生成可执行文件,这个文件将由运行命令“Run”运行。
上面的⑶、⑷两个步骤,也可以使用“Comple→Buildall”或“F9”功能键一步完成。
⑸连接完成后,使用“Run”命令,或者使用“Ctrl+F9”组合键运行程序。
程序运行过程瞬间结束,要察看程序运行结果,需要切换到运行屏幕,用组合健“Alt+F5”实现。
按Alt+F5后,将看到屏幕显示如下结果:
2008
按任意键,屏幕返回程序状态。
对一个未经编译和连接的源程序,TC2.0也可以直接运行它,因此,运行一个C语言程序时,编译和连接的操作步骤可以省略,即编辑好一个源程序后,直接使用Run命令运行它。
此时,并非编译、连接过程不存在了,而是“Run”命令运行程序时,因找不到当前程序的可执行文件,而自动启动编译命令和连接命令。
只有当编译、连接正常进行后,程序才会被运行。
因此,上面的过程可以简化为两个操作步骤:
⑴启动TC2.0,录入编辑源程序。
⑵按“Ctrl+F9”组合键运行程序。
特别提示:
⑴保存源程序是一个重要的操作环节。
在编辑源程序的过程中或源程序编辑完成后,及时保存源程序是十分必要的,但初学者往往忽视这一环节。
操作步骤如下:
①按“F2”功能键,出现图1-1所示屏幕。
白色背景窗口显示了系统为当前程序设定的默认存储位置(D:
\TC,该存储位置因系统而异,可以改变)和默认文件名NONAME.C。
图1-1修改文件名窗口
②输入新的文件名。
为了操作方便,可以使用默认存储位置,指定文件名为mult.c。
操作时只需将NONAME.C改写为mult.c后回车确认即可。
⑵使用Windows的记事本程序提高源程序编辑效率。
尤其是编辑较大的程序时,这种方法更有效。
下面是Windows的记事本程序和TC2.0相结合,编辑运行以上乘法程序的步骤。
①启动Windows的记事本程序,录入编辑乘法源程序。
②保存程序,如图1-2所示。
选择合适的存储位置,如上面使用的TC2.0的默认程序目录D:
\TC;输入指定的文件名,如mult.c;选择保存类型为“所有文件”。
图1-2记事本程序文件存盘窗口
③激活TC2.0,按“F3”功能键,屏幕窗口如图1-3所示。
在“LoadFileName”框中键入步骤②使用的文件名mult.c,回车确认后将源程序调入TC2.0系统,然后按组合键“Ctrl+F9”运行程序。
图1-3文件装载窗口
2.标识符和程序的逻辑错误。
第一项内容用于验证C语言中标识符的特性,当用“A”取代“a”后,程序将不能运行,说明作为标识符“A”和“a”是不等价的。
请读者自己进行类似的替换,然后察看程序的运行结果。
如,将程序中的“printf”改为“PRINTF”,然后运行程序看结果。
第二项实验内容说明了程序的逻辑错误情况。
若把“a*b”误写为“a-b”,程序会顺利编译运行,但显然不是乘法运算的结果。
3.编辑并运行能够对任意两个整数进行乘法运算的程序。
编辑该程序前,首先使用“File→New”命令使TC2.0进入新程序编辑状态,然后编辑运行该程序。
程序运行后,屏幕将显示下面的提示信息:
Inputa,b:
此时,应从键盘输入两个整数数据,然后回车确认。
下面是一个输入实例:
20,35
下面是程序的输出结果:
a*b=700
特别提示:
程序的输入数据往往有格式规定,只有按照正确的格式输入数据,一个正确的程序才会得到正确的结果。
运行上面的程序时,输入的两个数据必须以“,”分隔,否则将得不到正确的结果。
这是程序要求的数据输入格式。
请读者再次运行程序,对输入的两个数据以空格分隔,察看执行结果。
例如:
Inputa,b:
2035
再次运行程序,然后输入两个很大的整数,察看运行结果。
例如:
Inputa,b:
20000,35000
显然,上面两次运行的结果都是不正确的。
这说明,既没有语法错误,也没有逻辑错误的程序,运行后也会得不到正确的结果。
第一种情况出错,是因为输入数据时数据之间的分隔形式不符合程序的要求。
第二种情况,输入数据的格式没有问题,但输入的数据超出了程序能够允许的整数范围。
这项实验内容提醒读者,在上机实现一个C语言程序时,各种错误的情况都可能出现。
即便是一个看上去很好的程序,仍然会有许多需要改进之处。
从算法的角度理解,就是任何算法,都可能存在进一步完善的空间。
四、思考题
1.选择一种较熟悉的C语言环境,编辑运行主教材1.3节的自然数累加程序。
2.进一步熟悉TC2.0集成环境的功能。
实验二顺序结构程序设计
一、实验目的
1.掌握printf()、scanf()、putchar()、getchar()等基本输出、输
入函数的格式及其主要用法。
2.熟练掌握顺序结构的程序设计。
二、实验内容
1.基本输入输出函数的用法。
编辑运行下面的程序,并根据执行结
果分析程序中各个语句的作用。
#include
main()
{
inta,b;
floatd,e;
charc1,c2;
doublef,g;
longm,n;
unsignedintp,q;
a=61;b=62;
c1='a';c2='b';
d=5.67;e=-6.78;
f=1234.56789;g=0.123456789;
m=50000;n=-60000;
p=32768;q=40000;
printf("a=%d,b=%d\nc1=%c,c2=%c\n",a,b,c1,c2);
printf("d=%6.2f,e=%6.2f\n",d,e);
printf("f=%15.6f,g=%15.10f\n",f,g);
printf("m=%ld,n=%ld\np=%u,q=%u\n",m,n,p,q);
}
2.顺序结构程序设计。
⑴已知圆柱体横截面圆半径r,圆柱高h。
编写程序,计算圆周长
l、圆面积s和圆柱体体积v,并输出计算结果。
⑵编写一个程序,根据本金a、存款年数n和年利率p计算到
期利息。
计算公式如下:
到期利息公式为a*(1+p)n–a
ab的计算公式为exp(b*ln(a))
三、实验指导
1.基本输入输出函数的用法。
⑴运行所给出的源程序,对照结果分析各语句的作用。
⑵将程序中的第二、第三个printf语句修改为如下形式,然后运
行程序,察看结果。
printf("d=%-6.2f,e=%-6.2f\n",d,e);
printf("f=%-15.6f,g=%-15.10f\n",f,g);
⑶将上述两个printf语句进一步修改为如下形式,然后运行程序,
察看结果。
printf("d=%-6.2f\te=%-6.2f\n",d,e);
printf("f=%-15.6f\tg=%-15.10f\n",f,g);
⑷将程序的第10-15行修改为如下语句:
a=61;b=62;
c1='a';c2='b';
f=1234.56789;g=0.123456789;
d=f;e=g;
p=a=m=50000;q=b=n=-60000;
运行程序,并分析结果。
⑸修改⑴中的程序,不使用赋值语句,而用下面的scanf语句为a、
b、c1、c2、d、e输入数据:
scanf("%d%d%c%c%f%f",&a,&b,&c1,&c2,&d,&e);
①请按照程序原来中的数据,选用正确的数据输入格式,为上述
变量提供数据。
②使用如下数据输入格式,为什么得不到正确的结果?
输入数据:
6162ab5.67-6.78
⑹进一步修改⑸中使用的程序,使f和g的值用scanf()函数输入。
⑺进一步修改上面的程序,使其他所有变量的值都改用scanf()
函数输入。
①参考程序
#include
voidmain()
{
inta,b;
floatd,e;
charc1,c2;
doublef,g;
longm,n;
unsignedintp,q;
printf("Input(a,b,c1,c2,d):
");
scanf("%d%d%c%c%f%f",&a,&b,&c1,&c2,&d,&e);
printf("Input(f,g):
");
scanf("%lf%lf",&f,&g);
printf("Input(m,n,p,q):
");
scanf("%ld%ld%u%u",&m,&n,&p,&q);
printf("a=%d,b=%d\nc1=%c,c2=%c\n",a,b,c1,c2);
printf("d=%-6.2f,e=%-6.2f\n",d,e);
printf("f=%-15.6f,g=%-15.10f\n",f,g);
printf("m=%ld,n=%ld\np=%u,q=%u\n",m,n,p,q);
}
②数据输入格式
Input(a,b,c1,c2,d):
6162ab5.67-6.78
Input(f,g):
1234.5678900.1234567890
Input(m,n,p,q):
50000-600003267840000
⑻修改⑺中的程序,使c1、c2的数据用getchar()函数输入,用
putchar()函数输出。
①可按照如下方法修改程序:
将程序中的“scanf("%d%d%c%c%f%f",&a,&b,&c1,&c2,&d,&e);”语
句用以下四个语句替换:
scanf("%d%d%",&a,&b);
c1=getchar();
c2=getchar();
scanf("%f%f",&d,&e);
②使用与⑺相同的数据输入格式输入数据。
③请分析:
使用如下格式为a、b、c1、c2输入数据时会出现什么
结果?
运行程序验证
所分析的结论。
输入数据格式:
6162
a
b
2.顺序结构程序设计。
⑴参考程序
/*计算圆周长、面积及圆柱体体积的程序*/
#include
#definePI3.14159
main()
{
floatr,h,l,s,v;
printf("r,h=");
scanf("%f,%f",&r,&h);
l=2*PI*r;
s=PI*r*r;
v=s*h;
printf("L=%f\tS=%f\tV=%f\n",l,s,v);
}
程序调试时要注意如下几点:
①输入数据的格式要与程序中要求的格式一致。
如上述程序要用
“,”分隔数据。
②根据程序运行情况,调整输入、输出数据的格式,使数据的输
入输出格式更符合使用习惯。
③运行程序,输入负数数据,察看程序的执行结果。
⑵参考程序
/*计算存款利息的程序*/
#include
#include
main()
{
intn;
floata,p,acc;
printf("a,n,p=");
scanf("%f,%d,%f",&a,&n,&p);
acc=a*exp(n*log(1.0+p))-a;
printf("Accrual=%-10.2f\n",acc);
}
四、思考题:
1.在“基本输入输出函数的用法”内容⑶中,e和g都是用“\t”
进行格式控制,但为什么没有显示在同一列的位置上?
2.改进实验内容2的参考程序,使得输入负数时不进行计算,并
且显示相应的提示信息。
实验三、选择结构程序设计
一、实验目的
1.学会使用逻辑表达式表示条件的方法。
2.掌握if语句三种形式的用法。
3.掌握switch语句的用法。
4.学会设计有实际价值的分支结构程序。
二、实验内容
1.简单if语句的用法。
编写调试程序:
从键盘输入一个任意大小的实
数x,如果x满足如下条件,则输出x及其绝对值。
输出x的条件:
-29.5≤x≤29.5
2.if-else语句的用法。
修改上面的程序,使得x满足-29.5≤x≤29.5
时输出x及其
绝对值,否则只输出x。
3.if-elseif语句的用法。
编写一个能够进行加减法运算的程序,要
求:
从键盘任意输入两个实数,然后输入一个运算符,当运算符为“+”
时对两个数进行加法运算,为“-”时对两个数进行减法运算,其他符
号时,只显示输入的符号不进行运算。
4.switch语句的应用。
编写计算器程序。
要求从键盘任意输入两个数
值,然后输入一个四则运算符,自动完成运算后输出结果。
三、实验指导
1.简单if语句的用法。
⑴编程分析
正确表示条件,将数学不等式-29.5≤x≤29.5表示为如下逻辑表达式:
x>=-29.5&&x<=29.5或(x>=-29.5)&&(x<=29.5)
也可以使用x的绝对值形式表示,如下:
fabs(x)<=29.5
⑵参考程序
#include"math.h"
voidmain()
{
floatx;
printf("x=");
scanf("%f",&x);
if(x>=-29.5&&x<=29.5)
printf("x=%f\t|x|=%f\n",x,fabs(x));
}
⑶程序调试
输入数据时,至少应考虑的几种情况
①输入满足输出条件的数,包括正数、负数、零。
②输入不满足输出条件的数,包括正数、负数。
③输入数据为整数。
2.if-else语句的用法。
⑴编程分析
只需修改上面程序中的if语句即可。
将if语句修改为如下形式:
if(x>=-29.5&&x<=29.5)
printf("x=%f\t|x|=%f\n",x,fabs(x));
else
printf("x=%f\n",x);
⑵程序调试
输入数据时,除考虑上面指出的三种情况的数据外,输入一个字符数据,
观察会是什么结果。
3.if-elseif语句的用法。
⑴参考程序
#include"math.h"
#include"stdio.h"
voidmain()
{
floatx,y;
charop;
printf("x,y:
");
scanf("%f,%f",&x,&y);
getchar();
printf("operator:
");
scanf("%c",&op);
if(op=='+')
printf("%f+%f=%f\n",x,y,x+y);
elseif(op=='-')
printf("%f-%f=%f\n",x,y,x-y);
else
printf("operator:
%c\n",op);
}
⑵程序调试
运行程序时,应考虑如下问题:
①参考程序中的“getchar();”语句的作用是什么?
去掉该语句后,
再运行程序,观察并分析运行的结果。
②输入数据时必须要考虑到题目要求的三种情况。
4.switch语句的应用。
⑴编程分析
①四则运算共有加(+)、减(-)、乘(*)、除(/)四种运算,要
做出判断需使用switch语句。
对上面的程序进行适当修改可得到本程序。
②当输入符号为四则运算符之外的符号时,不进行任何运算,但应给出
相应的提示信息。
当使用提示信息是,switch语句应含有default子句。
⑵参考程序
#include"stdio.h"
voidmain()
{
floatx,y;
charop;
printf("请输入运算数(两个运算数之间以“,”分隔):
");
scanf("%f,%f",&x,&y);
printf("请输入运算符:
");
getchar();
op=getchar();
switch(op)
{
case'+':
printf("%f+%f=%f\n",x,y,x+y);
break;
case'-':
printf("%f-%f=%f\n",x,y,x-y);
break;
case'*':
printf("%f*%f=%f\n",x,y,x*y);
break;
case'/':
printf("%f/%f=%f\n",x,y,x/y);
break;
default:
printf("运算符输入不正确!
\n");
}
}
⑶程序调试
①参考程序中使用了中文提示信息,如果使用的C语言系统不支持汉
字,应将这些提示信息换用英文信息。
②调试程序时,+、-、*、/及非四则运算符的情况都应予以调试。
四、思考题
1.在输入数值数据时,有时错误地输入了字符,导致程序运行后出现
不正常的结果。
请读者考虑,如何改进程序,使得发生这种错误输入时能检查出来?
2.改进学生成绩分等程序,使得输入成绩数据时能正确处理如下情况:
⑴实验考核成绩输入了小写字母。
⑵实验考核成绩输入了等级以外的字符。
实验三、分支循环结构程序设计
一、实验目的
1.通过本实验,加深对循环控制结构有关概念的理解。
2.熟练掌握while、do-while和for三种循环控制语句的特点,掌握循环
结构程序设计和调试方法。
3.掌握二重循环结构程序的设计方法。
二、实验内容
1.用while循环实现数据统计问题。
数据统计问题:
从键盘输入一批任意数量的整数,统计其中不大于100的
非负数数值的个数。
2.编写并调试程序,使用do-while循环控制语句实现上面的数据统计问
题。
调试数据仍参照上面给出的几种情况设计使用。
3.编写并调试程序,使用for循环控制语句实现上面的数据统计问题。
4.阶乘累加问题。
编写程序,求1+2!
+3!
+…+n!
的值(习题5.9)。
三、实验指导
1.用while循环实现数据统计问题。
⑴编程分析
由于输入数据个数是不确定的,因此每次执行程序时,循环次数都是不
确定的。
在进行程序设计时,确定循环控制的方法是本实验的一个关键
问题。
循环控制条件可以有多种确定方法:
①使用一个负数作为数据输入结束标志。
②输入一个数据后通过进行询问的方式决定是否继续输入下一个数据。
⑵参考程序
l参考程序一
/*使用负数作为数据输入结束标志的程序*/
#include"stdio.h"
voidmain()
{
intm,counter=0;
while
(1)
{
printf("请输入一个整数:
");
scanf("%d",&m);
if(m<0)break;
if(m<=100)counter++;
printf("\n");
}
printf("符合要求的整数个数为:
%d\n",counter);
}
l参考程序二
/*通过进行询问的方式决定是否继续输入下一个数据的程序*/
#include"stdio.h"
voidmain()
{
intm,counter=0;
charask;
while
(1)
{
printf("请输入一个整数:
");
scanf("%d",&m);
getchar();
if(m>=0&&m<=100)counter++;
printf("继续输入下一个数据?
(Y/N)");
ask=getchar();
getchar();
if(ask!
='y'&&ask!
='Y')break;
printf("\n");
}
printf("符合要求的整数个数为:
%d\n",counter);
}
⑶程序调试
这里只对“参考程序一”的调试数据进行设计。
该程序输入数据时,应
考虑多种数据组合,对每一组数据察看并分析结果。
例如:
①输入的一组数据之间全部以空格分隔,只有最后一个数为负数,以回
车键结束。
如:
16357–10
②输入的一组数据之间全部以空格分隔,在负数之后又有正数数据,最
后一个数不为负数,以回车键结束。
如:
16357–109617
③输入的一组数据之间全部以空格分隔,输入数据中有多个负数,以回
车键结束。
如:
16357–109617–877
④输入的数据中有大于100的整数。
如:
16357–1096117–8726766
⑤数据之间既用空格分隔,也用回车键分隔。
如:
763537622717
9667
9617–8771966982-1631
⑥每输入一个数据后均按回车键。
⑦输入的第一个数据即为负数。
⑧在输入的数据中使用数值很大的整数。
如:
17667789876517899-10987
⑷在上面的“参考程序一”中,使用了常数“1”作为循环控制的条件,
这是常用的循环控制方式。
请修改上面的程序,不使用常数循环条件,
仍然使用while语句实现数据统计问题