《C语言程序设计》实验指导
韶关学院计算机科学学院
庄景明
课程类别:专业基础课
学时学分:总学时72、总学分4、实验学时18、实验学分1 适用专业: 计算机科学与技术,信息管理与信息系统 专业层次:本科
第一部分 上机实验的指导思想和要求
1.上机实验的目的
学习C语言程序设计课程不能满足于“懂了”,满足于能看懂书上的程序,而应当熟练地掌握程序设计的全过程,即独立编写出源程序,独立上机调试程序,独立运行程序和分析结果。程序设计是一门实践性很强的课程,必须十分重视实践环节,必须保证有足够的上机实践时间。学习本课程应该至少有18小时的上机时间,最好能做到上机时间与授课时间之比为1﹕1。除了学校规定的上机实验以外,应当提倡学生自己课余抽时间多上机实践。 上机实验的目的是:
(1)加深对讲授内容的理解,尤其是一些语法规定。
(2)熟悉C语言程序开发的环境。
(3)学会上机调试程序。也就是善于发现程序中的错误,并且能很快地排除这些错误。要学会根据“出错提示”,分析并找出错误。调试程序的能力是每个程序设计人员应当掌握的一项基本功。因此,在做实验时千万不要在程序通过后就认为万事大吉、完成任务了,而应当在已通过的程序基础上作一些改动(例如修改一些参数、增加程序的一些功能、改变输入数据的方法等),再进行编译、连接和运行;甚至于“自设障碍”,即把正确的程序改为有错的(例如,用scanf函数输入变量时,漏写“&”符号;使数组下标出界;使整数溢出等),以观察和分析所出现的情况。
2.上机实验前的准备工作
(1)了解所用的计算机系统(包括C编译系统)的性能和使用方法。
(2)复习和掌握与本实验有关的教学内容。
(3)准备好上机所需的程序。
(4)对运行中可能出现的问题应事先作出估计;对程序中自己有疑问的地方,应作上记号,以便在上机时给予注意。
(5)准备好调试和运行时所需的数据。
3.上机实验的步骤
1
(1)调出C编译系统,进人C工作环境(例如Turbo c,VC6.0)。
(2)输人自己编好的程序
(3)检查一遍已输人的程序是否有错(包括输入时打错的和编程中的错误),如发现有错,则及对改正。
(4)进行编译。如果在编译和连接过程中发现错误,输出窗口会出现“出错信息”,根据提示找到出错位置和原因,加以改正,再进行编译??如此反复,直到顺利通过编译和连接为止。
(5)运行程序,并分析运行结果是否合理和正确。在运行时要注意当输入不同数据时所得到的结果是否正确(例如解方程ax2+bx+c=0时,不同的a、b、c组合应得到相应的不同结果)。此时应运行几次,分别检查在不同情况下程序是否正确。
(6)输出程序清单和运行结果。
4.写实验报告,实验报告应包括以下内容:
(1)预习报告(题目,实验目的,实验设备,程序清单,疑难问题等)
(2)实验数据
(3)实验过程报告
(4)实验小结。
5.实验内容的安排
结合所学内容布置上机练习题。应要求学生在实验前将教师指定的题目编好程序,然后上机输人和调试。
第二部分 关于程序的调试和测试
l.程序错误的类型
主要有以下几种:
(1)语法错误:不符合C语言的语法规定。例如将printf错写为pintf,括弧不匹配,语句最后漏了分号等,这些都会在编译时被发现并指出。这些都属于“致命错误”,不改正是不能通过编译的。对一些在语法上有轻微毛病但不影响程序运行的问题(如定义了变量但始终未使用),编译时会发出“警告”。虽然程序能通过编译,但不应当使程序“带病工作”,应该将程序中所有“导致错误(error)”和“警告(warning)”的因素都排除.再使程序投人运行。
(2)逻辑错误:
程序无语法错误,也能正常运行,但是结果不对。例如求s=1+2+3+?+100,有人写出以下语句:
for(s=0,i=1;i<100;i++)
s=s+i;
语法没有错,但求出的结果是1+2+3+?+99之和,而不是1+2+3+??100之和,原 因是少执行了一次循环。这类错误可能是设计算法时的错误,也可能是算法正确而在编 写程序时出现疏忽所致。这种错误计算机是无法检查出来的。如果是算法有错,则应先 修改算法,再改程序。如果是算法正确而程序写得不对,则直接修改程序。
(3)运行错误:有时程序既无语法错误,又无逻辑错误,但程序不能正常运行或结果 不对。多数情况是数据不对,包括数据本身不合适以及数据类型不匹配。如有以下程序: main()
{int a,b,c;
scanf(“%d,%d”,&a,&b);
c=a/b;
printf(“%d\n”,c);
2
}
当输人的b为非零值时,运行无问题。当输入的b为零时,运行时出现“溢出(over -flow)”的错误。如果在执行上面的scanf函数语句时输入:
则输出c的值为2,显然是不对的。这是由于输入的数据类型与输入格式符%d不匹 配而引起的。
2.程序的测试
程序调试的任务是排除程序中的错误,使程序能顺利地运行并得到预期的效果。程序的调试阶段不仅要发现和消除语法上的错误,还要发现和消除逻辑错误和运行错误。除了可以利用编译时提示的“出错信息”来发现和改正语法错误外,还可以通过程序的测试来发现逻辑错误和运行错误。
测试的目的是检查程序有无“漏洞”。对于一个简单的程序,要找出其运行时全部可能执行到的路径,并正确地准备数据并不困难。但是,如果需要测试一个复杂的大程序,要找到全部可能的路径,并准备出所需的测试数据并非易事。例如,有两个非嵌套的if语句,每个if语句有2个分支,它们所形成的路径数目为2×2=4;如果一个程序包含100个if语句,则可能的路径数目为2100=1.267651×1030。实际上进行测试的只是其中一部分(执行几率最高的部分)。因此,经过测试的程序一般还不能轻易宣布为“没有问题”,而只能说:“经过测试的部分无问题”。
第三部分 实验内容
实验一 Turbo C的使用与C程序运行方法
(实验学时:2学时 )
一、目的和要求
1、熟悉使用C语言运行环境(Turbo c )。
2、掌握C语言程序的书写格式和C语言程序的结构。
3、掌握C语言上机步骤,了解运行一个C程序的方法。
二、实验内容
1、C语言上机步骤:
(1)、进入系统
在D盘或其他盘上找到TC或TURBOC2.0,然后双击其图标打开文件夹,在其中找到TC.EXE并双击即可。
然后进行编辑源程序->编译->连接->执行程序->显示结果
(2)、常用命令
编辑切换(F6),编译(F9),运行(CTRL+F9),显示结果(ALT+F5)其它常用命令见“附录一”。
2、调试运行以下程序(调试时找出程序错误并修改,再编译、运行)
3
(1)下面的C程序,目的是想计算由键盘输入的任意两个整数的积。
#include “stdio.h”
main()
{ int x,y,p;
scanf(“%d,%”,&x,&y) ;
p=prodct(x,t) ;
printf(“The product is %d”,p);
}
int prodct(int a ,int b )
{int c ;
c=a*b;
return c;
}
(2)求1+2+3+…+100的和
min()
{ int i , sum=0;
for(i=1;i<=100;i++) sum=sum+i;
printf("sum=%d\n",sum);
}
(3) 输出一个数字三角形
# include <stdio.h>
main ( )
{ int i , j ;
for ( i=1 ; i<= 5; i++)
{ for ( j=0 ; j<= 10-2*i ; j++)
printf (“ “ ) ; /*输出一个空格*/
for ( j=1 ; j<= i ; j++)
printf (“%4d “ , i ) ;
printf (“ \n“ ) ;
}
}
三、分析与讨论
1、记下在调试过程中所发现的错误、系统给出的出错信息和对策。分析讨论对策成功或失败的原因。
2、总结C程序的结构和书写规则。
4
实验二 数据类型、运算符和表达式的应用
及简单程序设计
(实验学时:2学时 )
一、目的和要求
1、了解C语言中数据类型的意义。
2、掌握不同数据类型之间的赋值的规律。
3、学会有关C语言的有关运算符,以及包含这些运算符的表达式,特别是是++和—运算符的使用,编写一个简单C程序。
4、进一步熟悉C程序的运行环境。
二、实验内容和步骤
1、下面的程序试图计算由键盘输入的任意两个整数的平均值:
#include <stdio.h>
main()
{
int x,y;
float a;
scanf (“%d,%y”,&x,&y);
a=(x+y)/2;
printf(“The average is%d\n”a);
}
调试无语法错误后,分别使用下列测试用例对上述程序进行测试:
(1)2,6
(1)1,3
(3)-2,-6
(9)32800,33000
(10)-32800,33000
2、输入以下程序
main()
{int j,k,m,n;
k=8;
j=10;
m=k++;
n=++j;
printf(“%d,%d,%d,%d”,k,j,m,n);
5
}
(1)、运行程序,观察结果。
(2)、分析++在变量之前和在变量之后的不同点?
3、输入一个三角形的三条边长,求出三角形的面积。 已知三角形的三边长a,b,c,则该三角形的面积公式为: area?s(s?a)(s?b)(s?c),
其中s = (a+b+c)/2
三、分析与讨论
如何正确地选用数据类型、总结运算符的优先级? 6
实验三 顺序结构程序设计
(实验学时:2学时 )
一、目的和要求
1、掌握C语言程序输入、输出的方法和格式。
2、学会编写顺序结构的C程序。
二、实验内容与步骤
程序1、输入并编辑下面的程序
main()
{
int a,b;
float c,d;
long e,f;
unsigned int u,v;
char c1,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);
再用上述测试数据测试并分析结果。
7
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的意义有何不同。
程序2:设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆柱表面积入圆柱体积,用scanf输入数据,输出计算结果,取小数点后2位数字
三、分析与讨论
1、总结在scanf 、printf函数中可以使用的各种格式指定符,并给出样例。
2、总结在printf函数中可以使用的各转义字符及其功能。
8
实验四 选择结构程序设计
(实验学时:2学时 )
一、实验目的
1、了解条件与程序流程的关系.
2、了解用不同的数据使程序的流程覆盖不同的语句、分支和路径。
3、了解C语句表示逻辑量的方法(以0代表“假”以1代表“真”);
4、学会正确使用逻辑运算符和逻辑表达式;
5、熟练掌握if语句和switch语句。
二、实验内容和步骤
1、调试运行以下程序
(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()
{
int a,b,c,max; /*定义四个整型变量*/
scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);
if (a>=b)
max=a; /*a>=b*/
else
max=b; /*a<b*/
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
(2)、题目
输入某学生的成绩,经处理后给出学生的等级,等级分类如下:
9
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()
{
int score;
char grade;
printf("\nplease input a student score:");
scanf("%f",&score);
if(score>100||score<0)
printf("\ninput error!");
else
{ if(score>=90)
grade='A';
else
{ if(score>=80)
grade='B';
else
{if(score>=70)
grade='C';
else
{ if(score>=60)
grade='D';
else grade='E';
}
}
}
printf("\nthe student grade:%c",grade);
}
}
输入测试数据,调试程序。测试数据要覆盖所有路径,注意临界值,例如此题中得100分,60分,0分以及小于0和大于100的数据。
方法二:用switch语句
分析:
10
switch 语句是用于处理多分支的语句。注意,case后的表达式必须是一个常量表达式,所以在以用switch语句之前,必须把0~100之间的成绩分别化成相关的常量。所有A(除100以外),B,C,D类的成绩的共同特点是十位数相同,此外都是E类。则由此可得把score除十取整,化为相应的常数。
#include"stdio.h"
main()
{
int g,s;
char ch;
printf("\ninput a student grade:");
scanf("%d",&g);
s=g/10;
if(s<0||s>10)
printf("\ninput error!");
else
{ switch (s)
{ case 10:
case 9: ch='A'; break;
case 8: ch='B'; break;
case 7: ch='C'; break;
case 6: ch='D'; break;
default: ch='E';
}
printf("\nthe student scort:%c",ch);
}
}
输入测试数据,同方法一一样调试程序并写出结果。
3 程序设计(任选2题)
1、有一函数: x
y= 2x-1
3x-11
写一程序,输入x, 输出y。
2、给出一百分制成绩,要求输出成绩等级A、B、C、D、E。90分以上为A,80~89为B, 70~79分为C,60~69分为D,60分以下为E。
3、给一个不多于5位的正整数,要求:
(1)求出它是几位数;
(2)、分别打出每一位数字;
(3)、按逆序打出各位数字,例如原数为321,应输出123。
4、输入4个整数,要求按由小到大的顺序输出。 x<1 1=<x<10 x>=10
11
实验五 循环结构程序设计
(实验学时:2学时 )
一、目的和要求
1、掌握在程序设计条件型循环结构时,如何正确地设定循环条件,以及如何控制循环的次数。
2、了解条件型循环结构的基本测试方法。
3、掌握如何正确地控制计数型循环结构的次数。
4、了解对计数型循环结构进行测试的基本方法。
5、了解在嵌套循环结构中,提高程序效率的方法。
二、实验内容与步骤
1、调试运行以下程序
程序一:下面是一个计算e的近似值(使误差小于给定的δ)的程序。 main()
{double e=1.0,x=1.0,y,detax;
int i=1;
printf(“\n please input enter a error:”);
scanf(“%lf”,&detax);
y=1/x;
while(y>=detax)
{
x=x*i;
y=1/x;
e=e+y;
++i;
}
printf(“%12.10lf”,e);
}
实验步骤
(1)、阅读上面的程序,写出程序所依据的计算公式。
(2)、当输入的detax各是什么值时,能分别使程序按下面的要求运行:
.不进入循环;
.只循环一次;
.只循环两次;
.进入死循环(程序将永远循环下去)。
为了能知道程序循环了多少次,应该在程序中增加一条什么样的语句?
(3)、原程序中while语句中的y>=detax,分别换成y>detax,y=detax,y<detax,y<=detax,观察程序运行将会有什么变化。
12
(4)、把原程序中while语句之前的y=1/x语句去掉,观察程序的运行将会发生什么样的变化。
(5)、若把原程序中的++i换成i++,观察程序的运行发生了什么变化?
(6)、把原程序中的while结构改写成do—while结构,再分别按上述的(2)、(3)两步进行实验。
程序二、求和s=1!+2!+3!
main()
{
int n,s=0,t=1;
for(n=1;n<=3;n++)
{
t=t*n;
s=s+t;
}
printf(“%d”,s);
}
程序三、有一数列:2/1,3/2,5/3,8/5,…求出这个数列的前10项之和。 main()
{
int n,t,;
float a=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);
}
2、程序设计(任选2题)
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项之和。
8、打印下列图案
*
***
*****
13
*** * 14
实验六 数组及应用
(实验学时:2学时 )
一、目的和要求
1、掌握C语言数组的基本用法。
2、掌握一维数组的定义、赋值和输入输出的方法;
3、掌握字符数组的使用;
4、掌握二维数组的定义、赋值和输入输出的方法;
5、掌握与数组有关的算法(例如排序算法)。
二、实验内容与步骤
1、调试运行以下程序
程序一、在键盘上输入N个整数,试编制程序使该数组中的数按照从大到小的次序排列。 分析:C中数组长度必须是确定大小,即指定N的值。排序的方法有多种,我们取出其中两种作为参考。
方法一:起泡排序
从第一个数开始依次对相邻两数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍的(N-1)次比较后,最大的数已放在最后,第二遍只需考虑(N-1)个数,以此类推直到第(N-1)遍比较后就可以完成排序。
源程序如下:
#define N 10
#include"stdio.h"
main()
{
int a[N],i,j,temp;
printf("please input %d numbers\n",N);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)
for(j=0;j<N-1-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
printf("the array after sort:\n");
15
for(i=0;i<N;i++)
printf("%5d",a[i]);
}
程序二、青年歌手参加歌曲大奖赛,有10个评委对她的进行打分,试编程求这位选手的平均得分(去掉一个最高分和一个最低分)。
分析:这道题的核心是排序。将评委所打的10个分数利用数组按增序(或降序)排列,计算数组中除第一个和最后一个分数以外的数的平均分,其中排序部分这里用选择法实现。 main()
{int i,j,min;
float temp,ave=0;
float a[11];
printf("\n输入评委所打的分数:\n");
for(i=1;i<=10;i++)
scanf("%f",&a[i]);
for(i=1;i<=9;i++)
{min=i;
for(j=i+1;j<=10;j++)
if(a[min]>a[j])
min=j;
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
for(i=2;i<=9;i++) /*注意i值的变化范围*/
ave=ave+a[i];
printf("选手所得最后分数:%6.1f",ave/8);
printf("\n");
}
2、程序设计
1、有15个数按由小到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印出“无此数”。
2、编一程序,将两个字符串连接起来,不要用strcat函数。
3、打印出以下的杨辉三角形(要求打印出10行)。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
16
实验七 函数的定义及调用
(实验学时:2学时 )
一、目的与要求
1、 掌握C语言函数定义及调用的规则。
2、 理解参数传递的过程。
3、掌握C语言函数的声明及函数的递归调用。
二、 实验内容与步骤
1、调试运行以下程序
程序一:
上机调试下面的程序,记录系统给出的出错信息,并指出出错原因。 main()
{
int,y;
printf(“%d\n”,sum(x+y));
int sum(a,b)
{
int a,b;
return(a+b);
}
}
程序二、写两个函数,分别求两个正数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。两个正数由键盘输入。
源程序如下:
#include "stdio.h"
hcf(u,v)
int u,v;
{
int a,b,t,r;
if(u>v)
{
t=u; u=v; v=t;
}
a=u; b=v;
while((r=b%a)!=0)
{
b=a; a=r;
}
17
return(a);
}
lcd(u,v,h)
int u,v,h;
{
return(u*v/h);
}
main()
{
int u,v,h,l;
scanf("%d,%d",&u,&v);
h=hcf(u,v);
printf("H.C.F=%d\n",h);
l=lcd(u,v,h);
printf("L.C.D=%d\n",l);
}
这是一个十分典型的算法,同学们一定要认真分析、学习。
2、程序设计(任选2题)
1定义一个函数,功能是计算n个学生的成绩中,高于平均成绩的人数,并作为函数值。用主函数来调用它,统计50个学生成绩中,高于平均成绩的有多少人?
2、编写一个对n个数据从大到小的排序C函数,再编写一个计算最后得分的C函数,计算方法是:去除一个最高分,去除一个最低分,其余的平均分为参赛选手的最后得分。并在主函数中调用它们对有n个评委评分,m个选手参赛的最后得分,从大到小排序输出。
3、编写一个程序,包括主函数和如下子函数。
(1) 输入10个无序的整数;
(2) 用起泡方法从大到小排序;
(3) 要求输入一个整数,用折半查找法找出该数,若存在,在主函数中输出其所处的位置,否则,插入适当位置。
分析:input函数完成10个整数的录入。sort函数完成起泡法排序,search函数完成输入数的查找。
4、 编写并调试一个求(n为整数)的递归函数,希望能在程序运行过程中动态地显示递归函数被调用的轨迹。
18
实验八 指针的使用
(实验学时:2学时 )
一、目的和要求
1、熟悉指针的正确用法。
2、本实验可在学习了教材第10.3节之后运行。
3、了解指针参数的特殊性。
4、 掌握函数、指针、数组的用法。
二、实验内容和步骤
1、调试运行以下程序
程序一 :想使指针变量pt1指向a 和b 中的大者,pt2指向小者,以下程序能否实现此目的?
swap(int *p1,int *p2)
{
int *p;
p=p1;p1=p2;p2=p;
}
main()
{
int a,b;
scanf(“%d,%d”,&a,&b);
pt1=&a;pt2=&b;
if(a<b)swap(pt1.pt2);
printf(“%d,%d\n”,*pt1,*pt2);
}
上机调试此程序。如果不能实现题目要求,指出原因,并修改之。
三、程序设计(2题)
1、 输入3个字符,按由小到了大的顺序输出。
2、 有n个整数,使其右循环移m个位置,写函数实现以下功能,n,m在main函数中输入,并输出循环可移之后的n个数。
3、 输入一行文字,统计大写字母、小写字母、空格、数字字符及其他字符各多少个?
4、 入3个整数,按由小到大的顺序输出。
5、 利用指针作函数参数,设计一函数实现将n个元素进行排序。
6、 写一函数,求一个字符串的长度。
19
实验九 结构体数据的使用
(实验学时:2学时 )
一、目的和要求
1、掌握结构体类型方法以及结构体变量的定义和引用。
2、掌握指向结构体变量的指针变量的应用,特别是链表的应用。
3、掌握运算符”.”和”->”的应用。
4、共用体的概念和应用。
二、实验内容 (编程)
1、要求编写程序:有10名学生,每个学生的数据包括学号、姓名、成绩,要求找出成绩最高者的姓名和成绩,上机运行程序。
2、建立一个链表每个结点包括的成员为:职工号、工资。用malloc打印出来。用一个creat 来建立链表,用list来输出数据。5个职工号为101,103,105,107,109。
3、在上题基础上,新增加一个职工的数据,按职工号的顺序插入链表,新插入的职工号为106。写一函数insert来插入新结点。
4、在上面的基础上,写一函数delete,用来删除一个结点。要求删除职工号为103的结点。打印出删除后的链表.
20
*实验十 位运算
(实验学时:2学时 )
一、目的和要求
1. 掌握位运算的概念和方法。
2. 掌握位运算(&,|,^,~)的使用方法。
3. 掌握有关位运算的用法。
二、实验内容和步骤
1.
2.
3.
4. 编一个程序,将一个整数的高字节和低字节分别输出(用位运算方法)。上机运行。 编一个程序,使一个整数的低4位翻转。上机运行,用十六进制数输入和输出。 将一个整数i的各位循环左移4位,设i的值为十六进制数fe13。 设计一个函数,当给定一个整数后,能得到该数的补码(应考虑该整数是正数或负
数)。
21
*实验十一 文件
(实验学时:2学时 )
一、 目的和要求
1、 文件和文件指针的概念以及文件的定义方法。
2、了解文件打开和关闭的概念及方法。
3、掌握有关文件的函数。
二、 实验内容和步骤
1、对data.dat文件写入100条记录。
#include <stdio.h>
main()
{FILE *fp;
int i;
float x;
fp=fopen("date.dat","w");
for(i=1;i<=100;i++)
{scanf("%f",&x);
fprintf(fp,"%f\n",x);
}
fclose(fp);
}
2、设有一文件cj.dat存放了50个人的成绩(英语、计算机、数学),存放格式为:每人一行,成绩间由逗号分隔。计算三门课平均成绩,统计个人平均成绩大于或等于90分的学生人数。
#include <stdio.h>
main()
{FILE *fp;
int num;
float x , y , z , s1 , s2 , s3 ;
fp=fopen ("cj.dat","r");
{fscanf (fp,"%f,%f,%f",&x,&y,&z);
s1=s1+x;
s2=s2+y;
s3=s3+z;
if((x+y+z)/3>=90)
num=num+1;
}
22
printf("分数高于90的人数为:%.2d",num);
fclose(fp);
}
3、统计上题cj.dat文件中每个学生的总成绩,并将原有数据和计算出的总分数存放在磁盘文件“stud”中。
#include "stdio.h"
main()
{
FILE *fp1,*fp2;
float x,y,z;
fp1=fopen("cj.dat","r");
fp2=fopen("stud","w");
while(!feof(fp1))
{
fscanf (fp1,"%f,%f,%f",&x,&y,&z);
printf("%f,%f,%f,%f\n",x,y,z,x+y+z);
fprintf(fp2,"%f,%f,%f,%f\n",x,y,z,x+y+z);
}
fclose(fp1);
fclose(fp2);
}
三、程序设计
1. 有 5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中。
2. 将上题“stud”文件中的学生数据,按平均分进行排序处理,将已排序的学生数据存入一个新文件“stu_sort”中。
23