C程序设计实验指导

《C语言程序设计》实验指导

韶关学院计算机科学学院

庄景明

课程性质:非独立设置的实验课 

课程类别:专业基础课

学时学分:总学时72、总学分4、实验学时18、实验学分1

适用专业: 计算机科学与技术,信息管理与信息系统

专业层次:本科,专科

第一部分  上机实验的指导思想和要求

1.上机实验的目的

    学习C语言程序设计课程不能满足于“懂了”,满足于能看懂书上的程序,而应当熟练地掌握程序设计的全过程,即独立编写出源程序,独立上机调试程序,独立运行程序和分析结果。程序设计是一门实践性很强的课程,必须十分重视实践环节,必须保证有足够的上机实践时间。学习本课程应该至少有18小时的上机时间,最好能做到上机时间与授课时间之比为1﹕1。除了学校规定的上机实验以外,应当提倡学生自己课余抽时间多上机实践。

   上机实验的目的是:

    (1)加深对讲授内容的理解,尤其是一些语法规定。

(2)熟悉C语言程序开发的环境。

(3)学会上机调试程序。也就是善于发现程序中的错误,并且能很快地排除这些错误。要学会根据“出错提示”,分析并找出错误。调试程序的能力是每个程序设计人员应当掌握的一项基本功。因此,在做实验时千万不要在程序通过后就认为万事大吉、完成任务了,而应当在已通过的程序基础上作一些改动(例如修改一些参数、增加程序的一些功能、改变输入数据的方法等),再进行编译、连接和运行;甚至于“自设障碍”,即把正确的程序改为有错的(例如,用scanf函数输入变量时,漏写“&”符号;使数组下标出界;使整数溢出等),以观察和分析所出现的情况。  

2.上机实验前的准备工作

    (1)了解所用的计算机系统(包括C编译系统)的性能和使用方法。

    (2)复习和掌握与本实验有关的教学内容。

(3)准备好上机所需的程序。

(4)对运行中可能出现的问题应事先作出估计;对程序中自己有疑问的地方,应作上记号,以便在上机时给予注意。

    (5)准备好调试和运行时所需的数据。

3.上机实验的步骤

    (1)调出C编译系统,进人C工作环境(例如Turbo c集成环境)。

(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);

          }

    当输人的b为非零值时,运行无问题。当输入的b为零时,运行时出现“溢出(over

-flow)”的错误。如果在执行上面的scanf函数语句时输入:

       456.78,34.56

    则输出c的值为2,显然是不对的。这是由于输入的数据类型与输入格式符%d不匹

配而引起的。

2.程序的测试

    程序调试的任务是排除程序中的错误,使程序能顺利地运行并得到预期的效果。程序的调试阶段不仅要发现和消除语法上的错误,还要发现和消除逻辑错误和运行错误。除了可以利用编译时提示的“出错信息”来发现和改正语法错误外,还可以通过程序的测试来发现逻辑错误和运行错误。   

测试的目的是检查程序有无“漏洞”。对于一个简单的程序,要找出其运行时全部可能执行到的路径,并正确地准备数据并不困难。但是,如果需要测试一个复杂的大程序,要找到全部可能的路径,并准备出所需的测试数据并非易事。例如,有两个非嵌套的if语句,每个if语句有2个分支,它们所形成的路径数目为2×2=4;如果一个程序包含100个if语句,则可能的路径数目为2100=1.267651×1030。实际上进行测试的只是其中一部分(执行几率最高的部分)。因此,经过测试的程序一般还不能轻易宣布为“没有问题”,而只能说:“经过测试的部分无问题”。

第三部分   实验内容

实验一  Turbo C的使用与程序运行过程

(实验学时:2学时  )

(一)实验类别:设计

(二)每组人数:1人

(三)实验要求:必修

一、目的和要求

1、熟悉C语言运行环境。

2、掌握C语言程序的书写格式和C语言程序的结构。

3、掌握C语言上机步骤,了解运行一个C程序的方法。

二、实验内容

1、C语言上机步骤:

(1)、进入系统

在D盘或其他盘上找到TC或TURBOC2,然后双击其图标打开文件夹,在其中找到TC.EXE并双击即可。

然后进行编辑源程序->编译->连接->执行程序->显示结果

(2)、常用命令

编辑切换(F6),编译(F9),运行(CTRL+F9),显示结果(ALT+F5)其它常用命令见“附录一”。

2、有下面的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;

}

三、分析与讨论

1、记下在调试过程中所发现的错误、系统给出的出错信息和对策。分析讨论对策成功或失败的原因。

2、总结C程序的结构和书写规则。


实验二 数据类型、运算符和表达式的应用

(实验学时:2学时  )

一、目的和要求

1、了解C语言中数据类型的意义。

2、掌握不同数据类型之间的赋值的规律。

3、学会有关C语言的有关运算符,以及包含这些运算符的表达式,特别是是++和—运算符的使用。

4、进一步熟悉C程序的编辑环境。

二、实验内容和步骤

1、下面的程序试图计算由键盘输入的任意两个整数的平均值:

#include <stdio.h>

main()

{

int x,y,a;

scanf(“%x,%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);

}

(1)、运行程序,观察结果。

(2)、分析++在变量之前和在变量之后的不同点?

三、分析与讨论

如何正确地选用数据类型、总结运算符的优先级?


实验三  最简单程序设计

(实验学时: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);

再用上述测试数据测试并分析结果。

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函数中可以使用的各转义字符及其功能。


实验四  选择结构程序设计

(实验学时:2学时  )

一、实验目的

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;

}

为了更容易明白程序的逻辑结构,我们用图4.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;

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()

{    

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 

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()

{

 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语句

分析:

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);

 }

}                       

输入测试数据,同方法一一样调试程序并写出结果。

4、

有一函数:

用scanf函数输入x的值(分别为x<1,1~10,>=10三种情况),求y值。

分析:y是一个分段表达式。要根据x的不同区间来计算y的值。所以应使用If语句。

main()

{

int x,y;

printf(“please input x :”);

scanf(“%d”,&x);

if (x<1)

{

y=x;

printf(“y=%d\n”,y);

}

else if (x<10)

       {

         y=2*x-1;

printf(“y=%d\n”,y);

}

else

{

y=3*x-11;

printf(“y=%d\n”,y);

}

三、程序设计

1、有一函数:

x             x<1

y=      2x-1        1=<x<10

3x-11      x>=10

写一程序,输入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个整数,要求按由小到大的顺序输出。


实验五   循环结构程序设计

(实验学时:2学时  )

(一)实验类别:设计

(二)每组人数:1人

(三)实验要求:必修

一、目的和要求

1、掌握在程序设计条件型循环结构时,如何正确地设定循环条件,以及如何控制循环的次数。

2、了解条件型循环结构的基本测试方法。

3、掌握如何正确地控制计数型循环结构的次数。

4、了解对计数型循环结构进行测试的基本方法。

5、了解在嵌套循环结构中,提高程序效率的方法。

二、实验内容与步骤

1、

(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);

}

2、实验步骤

(1)、阅读上面的程序,写出程序所依据的计算公式。

(2)、当输入的detax各是什么值时,能分别使程序按下面的要求运行:

.不进入循环;

.只循环一次;

.只循环两次;

.进入死循环(程序将永远循环下去)。

为了能知道程序循环了多少次,应该在程序中增加一条什么样的语句?

(3)、原程序中while语句中的y>=detax,分别换成y>detax,y=detax,y<detax,y<=detax,观察程序运行将会有什么变化。

(4)、把原程序中while语句之前的y=1/x语句去掉,观察程序的运行将会发生什么样的变化。

(5)、若把原程序中的++i换成i++,观察程序的运行发生了什么变化?

(6)、把原程序中的while结构改写成do—while结构,再分别按上述的(2)、(3)两步进行实验。

2、求5!

main()

{

int n,t;

n=1;

t=1;

while(t<=5)

{

n=n*t;

t=t+1;

}

printf(“%d”,n);

}

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);

}

4、求和s=1!+3!+5!

main()

{

int s=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()

{

int s=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()

{

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);

}

7、打印500以内的“水仙花数”。“水仙花数”是一个三位数,其各位数立方和等于该数本身。 main()

{

int i,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()

{

int n,s,j;

for(n=1;n<=100;n++)

{

s=0;

for(j=1;j<n;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()

{

int m,n,k,result;

printf("Enter two numbers:");

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("The greatest common divistor is:%d\n",result);

}

else printf("Nonpositive values not allowed\n");

}

10、用牛顿迭代求方程2x3-4x2+3x-6=0在1.0附近的根。

#include “math.h”

main()

{

float x,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()

{ int i,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 <math.h>

main()

{

int m,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(“%d is a prime number\n”,m);

else

printf(“%d is not a prime number\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、打印下列图案

     *

***

*****

 ***

  *


实验六   数组及应用

(实验学时:2学时  )

(一)实验类别:设计

(二)每组人数:1人

(三)实验要求:必修

一、目的和要求

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");

for(i=0;i<N;i++)

printf("%5d",a[i]);

}

方法二:选择排序

首先找出值最小的数,然后把这个数与第一个数交换,这样值最小的数就放到了第一个位置;然后,在从剩下的数中找值最小的,把它和第二个数互换,使得第二小的数放在第二个位置上。以此类推,直到所有的值从小到大的顺序排列为止。

#include"stdio.h"

#define N 10

main()

{

int a[N],i,j,r,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++)

{ r=i;

for(j=i+1;j<N;j++)

if(a[j]<a[r])

r=j;

if(r!=i)

{

temp=a[r];

a[r]=a[i];

a[i]=temp;

}

}

printf("the array after sort:\n");

for(i=0;i<N;i++)

printf("%5d",a[i]);

printf("\n");

}

2、青年歌手参加歌曲大奖赛,有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");

}

3、输入一串字符,计算其中空格的个数。

#include <stdio.h>

main( )

{char c[30];

int i,sum=0;

gets(c);

for(i=0;i<strlen(c);i++)

if(c[i]==' ')

sum=sum+1;

printf("空格数为:%d \ n",sum);

}

4、有一个3×4的矩阵,要求输出其中值最大的元素的值,以及它的行号和列号。

#define M 3

#define N 4

main( )

{int max,i,j,r,c;

static int a[M][N]={{123,94,-10,218},{3,9,10,-83},{45,16,44,-99}};

max=a[0][0];

for(i=0;i<M;i++)

for(j=0;j<N;i++)

if ( a[i][j]>max)

{max= a[i][j];

r=i;

c=j;

}

printf(“max=%d , row =%d , colum=%d \n”,max , r, c);

}

5、打印以下图案:

* * * * *

* * * * *

* * * * *

* * * * *

* * * * *

main()

{char a[5]={' * ' , ' * ' , ' * ' , ' * ' , ' * '};

int i,j,k;

char space=' ';

for(i=0;i<5;i++) /*输出5行*/

{printf("\n"); /* 输出每行前先换行* /

printf(" "); /* 每行前面留5个空格 */

for (j=1;j<=i;j++)

printf("%c",space); /* 每行再留1个空格*/

for ( k=0;k<5;k++)

printf("%c",a[k]); /*每行输入5个*号*/

}

}

6、求矩阵下三角形元素之和。

#define N 6

main()

{int i,j,sum=0;

int a[N][N]={0};

printf("input 5×5 data:\n");

for(i=1;i<N;i++)

{ printf("Input the %d line data:\n",i);

for(j=1;j<N;j++)

scanf("%d",&a[i][j]);

}

for(i=1;i<N;i++)

{for(j=1;j<N;j++)

printf("%5d",a[i][j]);

printf("\n");

}

for(i=1;i<N;i++)

for(j=1;j<=i;j++)

sum=sum+a[i][j];

printf("sum=%d\n",sum);

}

三、程序设计

1、已有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。

2、将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。

3、有15个数按由小到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印出“无此数”。

4、编一程序,将两个字符串连接起来,不要用strcat函数。

5、打印出以下的杨辉三角形(要求打印出10行)。

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1


实验七   函数的定义及调用

(实验学时:2学时  )

(一)实验类别:设计

(二)每组人数:1人

(三)实验要求:必修

一、目的与要求

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);

}

}

2、写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。

源程序如下:

mian()

{

int number;

printf(“请输入一个正整数:\n”);

scanf(“%d”,&number);

if (prime(number))

printf(“\n %d是素数.”,number);

else

printf(“\n %d不是素数.”,number);

}

int prime(number) /*此函数用于判别素数*/

int number;

{

int flag=1,n;

for(n=2;n<number/2&&flag==1;n++)

if (number%n==0)

flag=0;

return(flag);

}

判断素数的算法,我们在以前学习循环的时候已经学过了,在这里只是把这个算法用函数的形式表示出来。这里我们要注意函数的定义、声明的方法和格式。

3、写一函数,是给定的一个二位数组(4×4)转置,即行列互换。

源程序如下:

/*矩阵的转置*/

#define N 4

int array[N][N];

convert(array)

int array[4][4];

{

int i,j,t;

for (i=0;i<N;i++)

for (j=i+1;j<N;j++)

{

t=array[i][j]; array[i][j]=array[j][i]; array[j][i]=t;

}

}

main()

{

int i,j;

printf(“输入数组元素:\n”);

for (i=0;i<N;i++)

for (j=0;j<N;j++)

scanf(“%d”,&array[i][j]);

printf(“\n数组是:\n”);

for (i=0;i<N;i++)

{

for (j=0;j<N;j++)

printf(“%5d”,array[i][j]);

printf(“\n”);

}

conver(array);

printf(“转置数组是:\n”);

for (i=0;i<N;i++)

{

for (j=0;j<N;j++)

printf(“%5d”,array[i][j]);

printf(“\n”);

}

}

本例题用数组作为函数参数,大家要注意数组作为函数参数时的用法。

4、写两个函数,分别求两个正数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。两个正数由键盘输入。

源程序如下:

#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;

}

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);

}

这是一个十分典型的算法,同学们一定要认真分析、学习。

5、写一函数,用“起泡法”对输入的10个字符按由小到大顺序排序。

源程序如下:

/*起泡法排序*/

#define N 10

char str[N];

main()

{

int i,flag;

for (flag=1; flag = =1;)

{

printf(“\n输入字符串,长度为10:\n”);

scanf(“%s”,&str);

if (strlen(str)>N)

printf(“超过长度,请重输!”);

else

flag = 0;

}

sort(str);

printf(“\n排序结果:”):

for (i=0;i<N;i++)

printf(“%c”,str[i]);

}

sort(str)

char str[N];

{

int i,j;

char t;

for (j=1;j<N;j++)

for (i=0;(i<N-j)&&(str[i]!=’\0’);i++)

if (str[i]>str[i+1])

{

t=str[i]; str[i]=str[i+1]; str[i+1]=t;

}

}

6、用牛顿迭代法求根。方程为ax3+bx2+cx+d=0,系数a、b、c、d由主函数输入。求x在1附近的一个实根。求出根后,由主函数输出。

源程序如下:

/*牛顿迭代法解方程*/

#include “math.h”

float solut(a,b,c,d)

float a,b,c,d;

{

float x=1,x0,f,f1;

do

{

x0=x;

f=((a*x0+b)*x0+c)*x0+d;

f1=(3*a*x0+2*b)*x0+c;

x=x0-f/f1;

}while(fabs(x-x0)>=1e-5);

return(x);

}

main()

{

float a,b,c,d;

printf(“\n输入方程的系数a,b,c,d\n”);

scanf(“%f,%f,%f,%f”,&a,&b,&c,&d);

printf(“\n方程是:%5.2fx^3+%5.2fx^2+%5.2fx+%5.2f=0”,a,b,c,d);

printf(“\nX=%10.7f\n”,solut(a,b,c,d));

}

在此题目中,方程的系数是未知的,这是与以前我们用牛顿迭代法的时候不同的地方。但原理、算法是相同的,这里我们用函数来求方程的根。也就是把牛顿迭代法用函数的形式表现出来。

三、程序设计

1定义一个函数,功能是计算n个学生的成绩中,高于平均成绩的人数,并作为函数值。用主函数来调用它,统计50个学生成绩中,高于平均成绩的有多少人?

2、编写一个对n个数据从大到小的排序C函数,再编写一个计算最后得分的C函数,计算方法是:去除一个最高分,去除一个最低分,其余的平均分为参赛选手的最后得分。并在主函数中调用它们对有n个评委评分,m个选手参赛的最后得分,从大到小排序输出。

3、编写一个程序,包括主函数和如下子函数。

(1) 输入10个无序的整数;

(2) 用起泡方法从大到小排序;

(3) 要求输入一个整数,用折半查找法找出该数,若存在,在主函数中输出其所处的位置,否则,插入适当位置。

分析:input函数完成10个整数的录入。sort函数完成起泡法排序,search函数完成输入数的查找。

4、 编写并调试一个求(n为整数)的递归函数,希望能在程序运行过程中动态地显示递归函数被调用的轨迹。


实验八   指 针

(实验学时:2学时  )

(一)实验类别:设计

(二)每组人数:1人

(三)实验要求:必做

一、目的和要求

1、熟悉指针的正确用法。

2、本实验可在学习了教材第10.3节之后运行。

3、了解指针参数的特殊性。

4、 掌握函数、指针、数组的用法。

5、实验可在学习了教材第六章后进行。

二、实验内容和步骤

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);

}

上机调试此程序。如果不能实现题目要求,指出原因,并修改之。

三、程序设计

1、  输入3个字符,按由小到了大的顺序输出。

2、  有n个整数,使其右循环移m个位置,写函数实现以下功能,n,m在main函数中输入,并输出循环可移之后的n个数。

3、  输入一行文字,统计大写字母、小写字母、空格、数字字符及其他字符各多少个?

4、  入3个整数,按由小到大的顺序输出。

5、  利用指针作函数参数,设计一函数实现将n个元素进行排序。

6、  写一函数,求一个字符串的长度。


实验九   结构体数据的使用

(实验学时:2学时  )

(一)实验类别:设计

(二)每组人数:1人

(三)实验要求:必修

一、目的和要求

1、掌握结构体类型方法以及结构体变量的定义和引用。

2、掌握指向结构体变量的指针变量的应用,特别是链表的应用。

3、掌握运算符”.”和”->”的应用。

4、共用体的概念和应用。

二、实验内容和步骤

1、要求编写程序:有4名学生,每个学生的数据包括学号、姓名、成绩,要求找出成绩最高者的姓名和成绩,上机运行程序。

2、建立一个链表每个结点包括的成员为:职工号、工资。用malloc打印出来。用一个creat 来建立链表,用list来输出数据。5个职工号为101,103,105,107,109。

3、在上题基础上,新增加一个职工的数据,按职工号的顺序插入链表,新插入的职工号为106。写一函数insert来插入新结点。

4、在上面的基础上,写一函数delete,用来删除一个结点。要求删除职工号为103的结点。打印出删除后的链表.

5、你有无办法测试构造链表时,内存空间的动态分配情形?


实验十   位运算

(实验学时:2学时  )

(一)实验类别:设计

(二)每组人数:1人

(三)实验要求:选做

一、目的和要求

  1. 掌握位运算的概念和方法。
  2. 掌握位运算(&,|,^,~)的使用方法。
  3. 掌握有关位运算的用法。

二、实验内容和步骤

  1. 编一个程序,将一个整数的高字节和低字节分别输出(用位运算方法)。上机运行。
  2. 编一个程序,使一个整数的低4位翻转。上机运行,用十六进制数输入和输出。
  3. 将一个整数i的各位循环左移4位,设i的值为十六进制数fe13。
  4. 设计一个函数,当给定一个整数后,能得到该数的补码(应考虑该整数是正数或负数)。

实验十一   文件

(实验学时:2学时  )

(一)实验类别:设计

(二)每组人数:1人

(三)实验要求:选做

一、目的和要求

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;

}

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”中。


实验十二   综合应用(一)

(实验学时:2学时  )

(一)实验类别:综合

(二)每组人数:1人

(三)实验要求:选做

一、目的与要求

1、熟悉C语言的端口及硬件控制的方法与原理。

2、了解用C语言实现发声程序所要访问的端口。

二、实验内容和步骤

1、调试课本中例10.8程序,注意调出不同的效果。

2、调试并总结程序中所用的知识点,写出乐谱文件播放的是什么乐谱?

乐谱实例:

6000 h5 1 h3 2 h2 0.5 h3 0.5 h1 4 h2 1 m7 2 m6 0.5 h1 0.5 m5 4 m3 2 m5 1.5

m6 0.5 h1 1.5 h2 0.5 m6 0.5 h1 0.5 m5 1 h5 1.5 h1 0.5 h6 0.5 h5 0.5 h3 0.5

h5 0.5 h2 4 h2 1.5 h3 0.5 m7 1 m6 1 m5 1.5 m6 0.5 h1 1 h2 1 m3 1 h1 1 m6 0

m5 0.5 m6 0.5 h1 0.5 m5 4 h3 1.5 h5 0.5 m7 1 h2 1 m6 0.5 h1 0.5 m5 3 m3 0.

m5 0.5 m3 0.5 m5 0.5 m5 0.5 m6 0.5 m7 0.5 h2 0.5 m6 3 m5 0.5 m6 0.5 h1 1.5

h2 0.5 h5 1 h3 1 h2 1 h3 0.5 h2 0.5 h1 1 m6 0.5 m5 0.5 m3 2 h1 2 m6 0.5 h1

0.5 m6 0.5 m5 0.5 m3 0.5 m5 0.5 m6 0.5 h1 0.5 m5 3 h3 0.5 h5 0.5 h2 0.5 h3

0.5 h2 0.5 h1 0.5 m7 1 m6 1 h5 4##

void play_music(char *filename) /*filename为音乐文件名格式见上*/

{

FILE *fp;

int rate;

char sound_high[3];

float sound_long;

register int i=0,j;

int sign=0;

float str[1000][2];

if ((fp=fopen(filename,"r"))==NULL)

{

printf("Open file music.doc Errors!\n");

exit(1);

}

fscanf(fp,"%d",&rate);

while(!feof(fp)&&!sign)

{

fscanf(fp,"%s%f",&sound_high,&sound_long);

str[i][1]=rate*sound_long;

switch(sound_high[0])

{

case 'h':

switch(sound_high[1])

{

case '1':

str[i++][0]=1046.5;

break;

case '2':

str[i++][0]=1174.7;

break;

case '3':

str[i++][0]=1318.5;

break;

case '4':

str[i++][0]=1396.9;

break;

case '5':

str[i++][0]=1568;

break;

case '6':

str[i++][0]=1760;

break;

case '7':

str[i++][0]=1975.5;

break;

default: printf("\n Error Music.doc\n");

break;

}

break;

case 'm':

switch(sound_high[1])

{

case '1':

str[i++][0]=523.3;

break;

case '2':

str[i++][0]=587.3;

break;

case '3':

str[i++][0]=659.3;

break;

case '4':

str[i++][0]=698.5;

break;

case '5':

str[i++][0]=784.0;

break;

case '6':

str[i++][0]=880;

break;

case '7':

str[i++][0]=987.8;

break;

default: printf("\n Error music.doc.\n");

break;

}

break;

case 'l':

switch(sound_high[1])

{

case '1':

str[i++][0]=262;

break;

case '2':

str[i++][0]=296;

break;

case '3':

str[i++][0]=329.6;

break;

case '4':

str[i++][0]=349.2;

break;

case '5':

str[i++][0]=392;

break;

case '6':

str[i++][0]=440;

break;

case '7':

str[i++][0]=493.9;

break;

default: printf("\n Error music.doc.\n");

break;

}

break;

case '*':

switch(sound_high[1])

{

case '1':

str[i++][0]=131;

break;

case '2':

str[i++][0]=147;

break;

case '3':

str[i++][0]=165;

break;

case '4':

str[i++][0]=176;

break;

case '5':

str[i++][0]=196;

break;

case '6':

str[i++][0]=220;

break;

case '7':

str[i++][0]=247;

break;

default: printf("\n Error music.doc\n");

break;

}

break;

case '#':

if (sound_high[1]=='#') sign=1;

break;

case 'x':

if (sound_high[1]=='0') str[i++][0]=20;

break;

default:printf("\n ERRor music.doc\n");

exit(1);

}

}

for(j=0;j<=i-1;j++)

{

sound(str[j][0]);

delay(str[j][1]);

}

nosound();

}

2、文件复制

/*拷贝一个文件*/

#include<stdio.h>

main(argc,argv)

int argc;

char *argv[];

{

FILE *in,*out;

if (argc!=3)

       {

       printf("Wrong file structure!\n");

       exit(0);

       }

if ((in=fopen(argv[1],"rb"))==NULL)    /*注意是"rb"*/

       {

       printf("Can't open infile.\n");

       exit(0);

       }

if ((out=fopen(argv[2],"wb"))==NULL)  /*注意是"wb"*/

       {

       printf("Can't open outfile.\n");

       exit(0);

       }

while (!feof(in)) fputc(fgetc(in),out);

fclose(in);

fclose(out);

}

成批拷贝文件

int CopyFile(char *sfile,char *dfile,int f2d,int barlong,int height,int x,int y)

{

int Copyfile(char *sf,char *df);

int MakeNdir(char *Dir);

char filename[200][13],d[40],s[40],s1[40];

struct ffblk ffblk;

int done,i,j,l,len;

i=0;

done=findfirst(sfile,&ffblk,0);

if (!done) strcpy(filename[i],ffblk.ff_name);

while(!done)

{

done=findnext(&ffblk);

if (!done)

{

i++;

strcpy(filename[i],ffblk.ff_name);

}

}

if (f2d)

{

Copyfile(sfile,dfile);

return 1;

}

strcpy(s,sfile);

l=strlen(sfile);

for(j=l-1;j>=0;j--)

if (s[j]=='\\')

{

s[j+1]=0;

break;

}


实验十三   综合应用(二)

(实验学时:2学时  )

(一)实验类别:综合

(二)每组人数:1人

(三)实验要求:选做

一、目的与要求

1、掌握用C语言进行简单的数据库管理。

2、了解C程序菜单设计的一般方法。

3、理解链表的概念及应用。

二、实验内容和步骤

建立一个链表,每个结点包括学号、姓名、及三科成绩、平均成绩。除平均成绩

外,各项均由键盘输入。

要求:

    (A).计算平均成绩。

    (B).要实现插入功能。

    (C).要有排序功能。

(D).要有存取功能。

参考程序:

#include <stdio.h>

struct SStudent

{

  unsigned number;

  char name[11];

  int score1, score2, score3;

  struct SStudent * link;

};

struct SStudent * CreateTable();

void AppendToTable(struct SStudent * stu);

void InsertToTable(struct SStudent * stu);

void QueryTable(struct SStudent * stu, unsigned age);

void SortTable(struct SStudent * stu);

void PrintTable(struct SStudent * stu);

void Save(struct SStudent * stu);

void Load(struct SStudent * stu);

void Help();

void main()

{

  struct SStudent * student;

  unsigned number;

  char keyValue;

  student = CreateTable();

  clrscr();

  Help();

  printf("\n= ");

  while((keyValue = getche()) != 'q' && keyValue != 'Q' && keyValue != 27)

  {

    puts("");

    switch(keyValue)

    {

      case 'l': case 'L':

     PrintTable(student); break;

      case 'd': case 'D':

     printf("Please input the number you want delete: ");

     scanf("%d", &number);

     QueryTable(student, number);

     break;

      case 'a': case 'A':

     AppendToTable(student); break;

      case 'i': case 'I':

     InsertToTable(student); break;

      case 's': case 'S':

     SortTable(student);

     puts("Sort complished! Please use command L to list.");

      break;

      case 'v': case 'V':

     Save(student); break;

      case 'o': case 'O':

     Load(student); break;

      case 'c': case 'C':

     clrscr(); break;

      case 'h': case 'H':

     Help(); break;

      default: puts("Error command!");

    }

    printf("\n= ");

  }

}

struct SStudent * CreateTable()

{

  struct SStudent * stu;

  stu = (struct SStudent *) malloc(sizeof(struct SStudent));

  stu->number = 0;

  stu->score1 = stu->score2 = stu->score3 = 0;

  stu->name[0] = '\0';

  stu->link = NULL;

  return(stu);

}

void AppendToTable(struct SStudent * stu)

{

  struct SStudent * next, * last;

  int number;

  last = stu;

  while(last->link) last = last->link;

  printf("Please input the number (0 to quit): ");

  scanf("%d", &number);

  while(number)

  {

    next = (struct SStudent *) malloc(sizeof(struct SStudent));

    next->number = number;

    printf("Please input name: ");

    scanf("%10s", next->name);

    printf("Please input the first score: ");

    scanf("%d", &next->score1);

    printf("Please input the second score: ");

    scanf("%d", &next->score2);

    printf("Please input the third score: ");

    scanf("%d", &next->score3);

    last->link = next;

    last = last->link;

    printf("\nPlease input the number (0 to quit): ");

    scanf("%d", &number);

  }

  last->link = NULL;

}

void InsertToTable(struct SStudent * stu)

{

  struct SStudent * next, * last;

  int number;

  printf("Please input the number (0 to quit): ");

  scanf("%d", &number);

  while(number)

  {

    next = (struct SStudent *) malloc(sizeof(struct SStudent));

    next->number = number;

    printf("Please input name: ");

    scanf("%10s", next->name);

    printf("Please input the first score: ");

    scanf("%d", &next->score1);

    printf("Please input the second score: ");

    scanf("%d", &next->score2);

    printf("Please input the third score: ");

    scanf("%d", &next->score3);

    last = stu;

    while(last->link)

    {

      if(last->link->number > next->number)

      {

     next->link = last->link;

     last->link = next;

     break;

      }

      else last = last->link;

    }

    printf("\nPlease input the number (0 to quit): ");

    scanf("%d", &number);

  }

}

void QueryTable(struct SStudent * stu, unsigned number)

{

  struct SStudent * temp, * next;

  next = stu;

  while(next->link)

  {

    if(next->link->number == number)

    {

      temp = next->link;

      next->link = next->link->link;

      free(temp);

    }

    else next = next->link;

  }

}

void PrintTable(struct SStudent * stu)

{

  stu = stu->link;

  if(!stu)

  {

    puts("The table is EMPTY!");

    return;

  }

  printf("number\tname\t\tscore1\tscore2\tscore3\n");

  while(stu)

  {

    printf("%3d\t", stu->number);

    printf("%-10s\t", stu->name);

    printf("%4d\t", stu->score1);

    printf("%4d\t", stu->score2);

    printf("%4d\t\n", stu->score3);

    stu = stu->link;

  }

}

void SortTable(struct SStudent * stu)

{

  struct SStudent * next, * last, * temp;

  int flag;

  last = stu;

  while(last->link)

  {

     next = stu; flag = 1;

     while(next->link != last->link)

     {

       if(next->link->number > last->link->number)

       {

      temp = last->link;

      last->link = last->link->link;

      temp->link = next->link;

      next->link = temp;

      flag = 0;

      break;

       }

       else next = next->link;

     }

     if(flag) last = last->link;

  }

}

void Save(struct SStudent * stu)

{

  unsigned char filename[13];

  FILE * fileSave;

  printf("Please input the filename you want save in: ");

  scanf("%s", filename);

  if((fileSave = fopen(filename, "wb")) == 0)

  {

    printf("Cannot open file %s !\n", filename);

    return;

  }

  puts("Saveing ...");

  stu = stu->link;

  while(stu)

  {

    fwrite(stu, sizeof(struct SStudent), 1, fileSave);

    stu = stu->link;

  }

  puts("Saveing is finished!");

}

void Load(struct SStudent * stu)

{

  unsigned char filename[13];

  FILE * fileLoad;

  struct SStudent * temp;

  while(stu->link)

  {

    temp = stu->link;

    stu->link = stu->link->link;

    free(temp);

  }

  temp = (struct SStudent *) malloc(sizeof(struct SStudent));

  printf("Please input the filename you want load from: ");

  scanf("%s", filename);

  if((fileLoad = fopen(filename, "rb")) == 0)

  {

    printf("Cannot open file %s !\n", filename);

    return;

  }

  puts("Loading ...");

  while(fread(temp, sizeof(struct SStudent), 1, fileLoad))

  {

    stu->link = temp;

    stu = stu->link;

    temp = (struct SStudent *) malloc(sizeof(struct SStudent));

  }

  stu->link = NULL;

  puts("loading is finished!");

}

void Help()

{ puts("               *********************************************");

  puts("               *        Student System Command Help        *");

  puts("               *********************************************");

  puts("               *    L = List all records                   *");

  puts("               *    D = Delete a record seleced by number  *");

  puts("               *    A = Append records                     *");

  puts("               *    I = Insert records                     *");

  puts("               *    S = Sort records                       *");

  puts("               *    H = Show this help message             *");

  puts("               *    V = Save records to a file             *");

  puts("               *    O = Load records from a file           *");

  puts("               *    C = Clear screen                       *");

  puts("               *    Q = Quit System                        *");

  puts("               *********************************************");

  puts("               *     Copyright (C) 1999.09.09 By Kcliu     *");

  puts("               *********************************************");

}

相关推荐