C语言公共课实 验 指 导 书.docx
- 文档编号:8474656
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:57
- 大小:46.60KB
C语言公共课实 验 指 导 书.docx
《C语言公共课实 验 指 导 书.docx》由会员分享,可在线阅读,更多相关《C语言公共课实 验 指 导 书.docx(57页珍藏版)》请在冰豆网上搜索。
C语言公共课实验指导书
云南农业大学C语言公共课
实验指导书
目录
实验一C语言的运行环境和运行过程2
实验二数据类型、运算符和表达式4
实验三最简单程序设计6
实验四选择结构程序设计8
实验五循环控制13
实验六数组19
实验七函数的定义及调用26
实验八指针32
实验九综合应用
(一)40
实验十综合应用
(二)46
实验一C语言的运行环境及简单的程序调试
一、目的和要求
1、熟悉C语言运行环境。
2、掌握C语言程序的书写格式和C语言程序的结构。
3、掌握C语言上机步骤,了解运行一个C程序的方法。
4、本实验可在学习完教材第一章后进行。
二、实验内容
1、了解vc++6.0编程环境,掌握调试程序过程和常用命令。
2、有下面的C程序,目的是想计算由键盘输入的任意两个整数的积。
/********exl.c********/
#include(stdio.h);
main()
scanf(“%x,%y”,&x,%y)
p=prodct(x,t)
printf(“Theproductis:
”,p)
intprodct(inta,intb)
intc
c=a*b
returnc
请调试上述程序。
三、实验步骤
1、静态地检查上述程序,改正程序中的错误。
2、在编辑状态下照原样键入上述程序。
3、编译并运行上述程序,记下所给出的出错信息。
4、按照事先静态检查后所改正的情况,进行纠错。
5、再编译执行纠错后的程序。
如还有错误,再编辑改正,直到不出现语法错误为止。
6、下面给出6组测试用例,你认为哪几组较好?
为什么?
(1)0,0
(2)0,99
(3)20,50
(4)33000,20
(5)-5,-2
(6)-5,2
要测试出上述程序中所有错误,你认为应当用几组测试用例?
四、分析与讨论
1、记下在调试过程中所发现的错误、系统给出的出错信息和对策。
分析讨论对策成功或失败的原因。
实验二数据类型、运算符和表达式
一、目的和要求
1、了解C语言中数据类型的意义。
2、掌握不同数据类型之间的赋值的规律。
3、学会有关C语言的有关运算符,以及包含这些运算符的表达式,特别是是++和--运算符的使用。
4、进一步熟悉C程序的编辑环境。
二、实验内容和步骤
1、下面的程序试图计算由键盘输入的任意两个整数的平均值:
#include
main()
{
intx,y,a;
scanf(“%x,%y,&x,&y);
a=(x+y)/2;
printf(“Theaverageis:
”a);
}
调试无语法错误后,分别使用下列测试用例对上述程序进行测试:
(1)2,6
(1)1,3
(3)-2,-6
(4)-1,-3
(5)-2,6
(6)-1,3
(7)1,0
(8)1,6
(9)32800,33000
(10)-32800,33000
(1)、分析上述哪几组测试用例较好?
通过测试,你发现程序有什么错误了吗?
若有错误,请指出错误原因。
(2)、函数sizeof用以测试一个数据或类型所占用的存储空间的字节数。
请编写一个程序,测试各基本数据类型所占用的存储空间大小。
2、输入以下程序
main()
{intj,k,m,n;
k=8;
j=10;
m=k++;
n=++j;
printf(“%d,%d,%d,%d”,k,j,m,n);
}
(1)、分析程序的运行结果。
(2)、运行程序,观察结果与分析是否一致。
4、编写一个C语言程序,测试下列各表达式
i,j
i+1,j+1
i++,j++
++i,++j
i+++++j
++i+++++j++
要求在各表达式中i和j都分别有相同的初值。
在实验中注意下列问题:
(1)哪些表达式是错误的?
为什么?
(2)理解+,++,++i,i++的意义和优先级别。
三、分析与讨论
如何正确地选用数据类型、总结运算符的优先级?
实验三最简单程序设计
一、目的和要求
1、掌握C语言程序输入、输出的方法和格式。
2、本实验可在学习教材第四章后进行。
二、实验内容与步骤
1、输入并编辑下面的程序
main()
{
inta,b;
floatc,d;
longe,f;
unsignedintu,v;
charc1,c2;
scanf(“%d,%d”,a,b);
scanf(“%f,%f”,c,d);
scanf(“%ld,%ld”,e,f);
scanf(“%o,%o”,u,v);
scanf(“%c,%c”,c1,c2);
printf(“\n”);
printf(“a=%7d,b=%7d\n”,&a,&b);
printf(“c=%10.2f,d=%10.2f\n”,&c,&d);
printf(“e=17ld,f=%17ld\n”,&e,&f);
printf(“u=%o,d=%o\n”,&u,&v);
printf(“c1=%c,d=%c\n”,&c1,&c2);
这个程序有语法错误吗?
为什么?
2、调试上述程序无语法错误后,用下面的测试数据,对程序进行测试:
a=123,b=456,c=17.6,d=71837.65,e=70000,f=2174506,u=62000,v=58765,c1=’a’,c2=’b’
分析运行结果。
特别注意输入c1,c2的值是什么?
什么原因?
3、将输入e和f的语句改为:
scanf(“%d,%d”,&e,&f);
再用上述测试数据测试并分析结果。
4、将输入u、v的语句改为:
scanf(“%d,%d”,&u,&v);
再用上述测试数据测试并分析结果。
5、将输出e ,f 的语句改为:
printf(“e=%17d,f=%17d\n”,e,f);
再用上述测试数据测试并分析结果。
6、将输出u、v的语句改为:
printf(“u=%u,v=%u\n”,u,v);
或
printf(“u=%d,v=%d\n”,u,v);
再用上述测试数据测试并分析结果。
7、请读者自己修改程序和改变数据输入的形式,分析各种情况下的输入与输出。
8、在scanf(“%c,%c”,&c1,&c2);语句之前加一个语句:
getchar();
9、验证转义字符\n与\r的意义有何不同。
三、分析与讨论
1、总结在printf函数中可以使用的各种格式指定符,并给出样例。
2、总结在printf函数中可以使用的各转义字符及其功能。
实验四选择结构程序设计
一、实验目的
1、了解条件与程序流程的关系.
2、了解用不同的数据使程序的流程覆盖不同的语句、分支和路径。
3、了解C语句表示逻辑量的方法(以0代表“假”以1代表“真”);
4、学会正确使用逻辑运算符和逻辑表达式;
5、熟练掌握if语句和switch语句。
二、实验内容和步骤
1、
(1)、题目
有如下程序段:
{……
if(a>1&&b==0)x=x/a;
if(a==2||x>1)x=x+1;
}
为了更容易明白程序的逻辑结构,我们用图5.1所示流程图来加以描述。
y
n
y
n
要求增加一些输入语句和输出语句,以便使上述程序能在不同的a,b和x值下运行,并且能观察程序流程经过(覆盖)了哪些语句、哪些分支及哪些路径。
(2)、实验步骤
记下分别使用下列各组数据运行时的操作流程。
(1)a=1,b=1,x=1;
(2)a=1,b=1,x=2;
(3)a=3,b=0,x=1;
(4)a=2,b=1,x=4;
(5)a=2,b=1,x=1;
(6)a=1,b=0,x=2;
(7)a=2,b=1,x=1;
(8)a=3,b=0,x=2。
2、
(1)、题目
已知三个数a,b,c,找出最大值放于max中。
分析:
由已知可得在变量定义时定义四个变量a,b,c和max,a,b,c是任意输入的三个数,max是用来存放结果最大值的。
第一次比较a和b,把大数存入max中,因a,b都可能是大值,所以用if语句中if——else形式。
第二次比较max和c,把最大数存入max中,用if语句的第一种形式if形式。
Max即为a,b,c中的最大值。
#include"stdio.h"
main()
{
inta,b,c,max;/*定义四个整型变量*/
scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);
if(a>=b)
max=a;/*a>=b*/
else
max=b;/*a
if(c>max)
max=c;/*c是最大值*/
printf("max=%d",max);
}
(2)、实验步骤
若输入下列数据,分析程序的执行顺序并写出运行结果
(1)a=1,b=2,c=3
(2)a=2,b=1,c=3
(3)a=3,b=2,c=1
(4)a=3,b=1,c=2
(5)a=3,b=3,c=2
(6)a=2,b=1,c=2
3、
(1)、题目
输入某学生的成绩,经处理后给出学生的等级,等级分类如下:
90分以上(包括90):
A
80至90分(包括80):
B
70至80分(包括70):
C
60至70分(包括60):
D
60分以下:
E
方法一:
(用if嵌套`)
分析:
由题意知如果某学生成绩在90分以上,等级为A;否则,如果成绩大于80分,等级为B;否则,如果成绩大于70分,等级为C;否则,如果成绩大于60分为D;否则,如果成绩小于60分,等级为E;但当我们输入成绩时也可能输错,出现小于0或大于100,这时也要做处理,输出出错信息。
因此,再用if嵌套前,应先判断输入的成绩是否在0~100之间。
#include"stdio.h"
main()
{
intscore;
chargrade;
printf("\npleaseinputastudentscore:
");
scanf("%f",&score);
if(score>100||score<0)
printf("\ninputerror!
");
else
{if(score>=90)
grade='A';
else
{if(score>=80)
grade='B';
else
{if(score>=70)
grade='C';
else
{if(score>=60)
grade='D';
elsegrade='E';
}
}
}
printf("\nthestudentgrade:
%c",grade);
}
}
输入测试数据,调试程序。
测试数据要覆盖所有路径,注意临界值,例如此题中得100分,60分,0分以及小于0和大于100的数据。
方法二:
用switch语句
分析:
switch语句是用于处理多分支的语句。
注意,case后的表达式必须是一个常量表达式,所以在以用switch语句之前,必须把0~100之间的成绩分别化成相关的常量。
所有A(除100以外),B,C,D类的成绩的共同特点是十位数相同,此外都是E类。
则由此可得把score除十取整,化为相应的常数。
#include"stdio.h"
main()
{
intg,s;
charch;
printf("\ninputastudentgrade:
");
scanf("%d",&g);
s=g/10;
if(s<0||s>10)
printf("\ninputerror!
");
else
{switch(s)
{case10:
case9:
ch='A';break;
case8:
ch='B';break;
case7:
ch='C';break;
case6:
ch='D';break;
default:
ch='E';
}
printf("\nthestudentscort:
%c",ch);
}
}
输入测试数据,同方法一一样调试程序并写出结果。
4、
有一函数:
y=
x
x<1
2x-1
1= 3x-11 x>=10 用scanf函数输入x的值(分别为x<1,1~10,>=10三种情况),求y值。 分析: y是一个分段表达式。 要根据x的不同区间来计算y的值。 所以应使用If语句。 main() { intx,y; printf(“pleaseinputx: ”); scanf(“%d”,&x); if(x<1) { y=x; printf(“y=%d\n”,y); } elseif(x<10) { y=2*x-1; printf(“y=%d\n”,y); } else { y=3*x-11; printf(“y=%d\n”,y); } 三、作业 1、c语言如何表示“真”与“假”? 系统如何判断一个量的“真”与“假”? 2、写出下面各逻辑表达式的值。 设a=3,b=4,c=5 (1)、a+b>c&&b==c (2)、a||b+c&&b-c (3)、! (a>b)&&! c||1 (4)、! (x=a)&&(y=b)&&0 (5)、! (a+b)+c-1&&b+c/2 3、有3个整数a、b、c,由键盘输入,输出其中最大的数。 4、有一函数: xx<1 y=2x-11= 3x-11x>=10 写一程序,输入x,输出y。 5、给出一百分制成绩,要求输出成绩等级A、B、C、D、E。 90分以上为A,80~89为B,70~79分为C,60~69分为D,60分以下为E。 6、给一个不多于5位的正整数,要求: (1)求出它是几位数; (2)、分别打出每一位数字; (3)、按逆序打出各位数字,例如原数为321,应输出123。 7、输入4个整数,要求按由小到大的顺序输出。 四、分析讨论 (1)用哪一组数据就可使程序中的每个处理语句都执行一次? 为了找出程序中各条处理语句中的错误,应该使用什么样的数据对程序进行测试? 请上机验证自己的结论。 (2)用哪两组数据就可以使程序段中的每个分支都运行一次? 这种情形与上面的讨论有何不同? 如果为了找出程序中积压分支中的错误,应该使用什么样的数据对程序进行测试? 请上机验证自己的结论。 (3)用哪两组数据就可以把判定框中的每个条件运算都进行一次? 如果为了测试出判定条件中的错误,应使用哪些数据对程序进行测试? 请上机验证自己的结论。 (4)用哪四组数据才可以把各种条件的组合都检测一遍? 如果为了测试各种条件的组合的情形,应该使用什么样的测试数据? 请上机验证自己的结论。 (5)用哪四组数据才可以把起始到终止的各条路径都覆盖一次? 如果为了测试出程序在不同路径下的错误,应该使用什么样的测试数据? 请上机验证自己的结论。 实验五循环控制 一、目的和要求 1、掌握在程序设计条件型循环结构时,如何正确地设定循环条件,以及如何控制循环的次数。 2、了解条件型循环结构的基本测试方法。 3、掌握如何正确地控制计数型循环结构的次数。 4、了解对计数型循环结构进行测试的基本方法。 5、了解在嵌套循环结构中,提高程序效率的方法。 二、实验内容与步骤 1、 (1)、下面是一个计算e的近似值(使误差小于给定的δ)的程序。 main() {doublee=1.0,x=1.0,y,detax; inti=1; printf(“\npleaseinputenteraerror: ”); scanf(“%lf”,&detax); y=1/x; while(y>=detax) { x=x*I; y=1/x; e=e+y; ++i; } printf(“%12.10lf”,e); } (2)、实验步骤 (1)、阅读上面的程序,写出程序所依据的计算公式。 (2)、当输入的detax各是什么值时,能分别使程序按下面的要求运行: .不进入循环; .只循环一次; .只循环两次; .进入死循环(程序将永远循环下去)。 为了能知道程序循环了多少次,应该在程序中增加一条什么样的语句? (3)、原程序中while语句中的y>=detax,分别换成y>detax,y=detax,y 假如不知道机器内的程序中的各语句实际上是什么,分别输入什么样的detax来测试出while语句的循环条件写错了。 (4)、把原程序中while语句之前的y=1/x语句去掉,观察程序的运行将会发生什么样的变化。 假如不知道机器内的程序实际上是怎么写的,输入什么样的detax就能测试出少了上述这条语句。 (5)、若把原程序中的++i换成i++,观察程序的运行发生了什么变化? 假如不知道这条语句到底是怎么写的,输入什么样的detax就能测试出这条语句写错了. (6)、把原程序中的while结构改写成do—while结构,再分别按上述的 (2)、(3)两步进行实验。 2、求5! main() { intn,t; n=1; t=1; while(t<=5) { n=n*t; t=t+1; } printf(“%d”,n); } 3、求和s=1! +2! +3! main() { intn,s=0,t=1; for(n=1;n<=3;n++) { t=t*n; s=s+t; } printf(“%d”,s); } 4、求和s=1! +3! +5! main() { ints=0,t,i,j; for(i=1;i<=3;i++) { t=1; for(j=1;j<=2*i-1;j++) t=t*j; s=s+t; } printf(“%d”,s); } 5、求和s=3+33+333 main() { ints=0,t=3,i; for(i=1;i<=3;i++) { s=s+t; t=10*t+3; } printf(“%d”,s); } 6、有一数列: 2/1,3/2,5/3,8/5,…求出这个数列的前10项之和。 main() { intn,t,; floata=2,b=1,s=0; for(n=1;n<=10;n++) { s=s+a/b; t=a; a=a+b; b=t; } printf(“%f”,s); } 7、打印500以内的“水仙花数”。 “水仙花数”是一个三位数,其各位数立方和等于该数本身。 main() { inti,j,k,n; for(n=100;n<=500;n++) { i=n/100; j=n/10-i*10; k=n%10; if(n==i*i*i+j*j*j+k*k*k) printf(“%d”,n); } } 8、一个数如果恰好等于它的因子之和,这个数就称为完数。 求100之内的所有完数。 main() { intn,s,j; for(n=1;n<=100;n++) { s=0; for(j=1;j if(n%j==0) s=s+j; if(s==n) printf(“%d”,s); } } 9、计算两个数的最大公约数;分析: 首先,随机输入两个数m,n(默认m>n);其次,算法: 使k为m除以n的余数,如果m能被n整除,则k值为0,n为这两个数的最大公约数,否则,使k代替n,n代替m,重复以上过程,直到k值为0。 #include"stdio.h" main() { intm,n,k,result; printf("Entertwonumbers: "); scanf("%d,%d",&m,&n); if(m>0&&n>0)/*限定两个正整数*/ { do { k=n%m; if(k==0) result=m; else { n=m; m=k; } }while(k>0);/*循环取余求出最大公因子*/ printf("Thegreatestcommondivistoris: %d\n",result); } elseprintf("Nonpositivevaluesnotallowed\n"); } 10、用牛顿迭代求方程2x3-4x2+3x-6=0在1.0附近的根。 #include“math.h” main() { floatx,x0,f,f1; x=1.0; do {x0=x; f=((2*x0-4)*x0+3)*x0-6; f1=(6*x0-8)*x0+3; x=x0-f/f1; } while(fabs(x-x0)>=1e-5); printf(“%6.2f”,x); } 11、打印下列图案 * *** ***** ******** main() {inti,j; for(i=1;i<=4;i++) {for(j=1;j<=4-i;j++) printf(“”); for(j=1;j<=2*i-1;j++) printf(“*”); printf(“\n”); } } 12、判断m是否是素数。 程序: #include main() { intm,i,k; scanf(“%d”,&m); k=sqrt(m+1); for(i=2;i<=k;i++) if(m%i==0) break; if(i>=k+1) printf(“%disaprimenumber\n”,m); else printf(“%disnotaprimenumber\n”,m); } 三、作业 1、输入两个正整数m和n,求其最大公约数和最小公倍数。 2、求Sn=a+aa+aaa+…+aa…a之值,其中a是一个数字。 例如: 2+22+222+2222+22222(此时n=5),n由键盘输入。 3、求和1! +2! +3! +4! +…20! 4、打印100-999之间所有的“水仙花数”。 “水仙花数”是一个三位数,其各位数立方和等于该数本身。 5、一个数如果恰好等于它的因子之和,这个数就称为完数。 求1000之内的所有完数。 6、有一数列: 2/1,3/2,5/3,8/5,…求出这个数列的前20项之和。 7、用迭代法求x=√a。 求平方根的迭公式为 xn+1=1/2(xn+a/xn) 要求前后两次求出的x的差的绝对值小于10-5 8、用牛顿迭代求方程2x3-4x2+3x-6=0在1.5附近的根。 9、打印下列图案 * *** ***** *** * 四、分析讨论 总结一下测试条件循环结构的一般方法。 实验六数组 一、目的和要求 1、掌握数组定义的规则。 2、掌握C语言数组的基本用法。 3、掌握一维数组的定义、赋值和输入输出的方法; 4、掌握
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言公共课实 语言 公共课