当前位置: 网站首页 实验教学 实验课程 正文

课程名称:C语言上机实验

作者:tarsier 发表时间:2007/07/10 11:48:42   浏览:

课程名称:C语言上机实验

第一部分 总则

1.         上机实验的教学目的和要求
C语言程序设计是一门实践性很强的课程,必须十分重视实践环节,必须保证有足够的上机实验时间,学习本课程应该至少有36小时的上机时间,最好能做到上机时间与授课时间之比为1:1。除了学校规定的上机时间以外,应当提倡学生自己课余抽时间多上机实践。
上机实验的目的,绝不仅是为了验证教材和讲课的内容,或者验证自己所编的程序正确与否。学习程序设计,上机实验的目的和要求是:
1)                        加深对讲授内容的理解,尤其是一些语法上的规定,光靠课堂讲授,即枯燥无味又难以记住,但它们都很重要。通过多次上机,就能自然地、熟练地掌握。通过上机来掌握语法规则是行之有效的方法。
2)                        熟练所用的计算机系统的操作方法,也就是了解和掌握C语言程序开发的环境。一个程序必须在一定的外部环境下才能运行,所谓“环境”,就是指所用的计算机系统的硬件和软件条件。使用者应该了解为了运行一个C程序,需要哪些必需的外部条件,可以利用哪些系统的功能来帮助自己开发程序。每一种计算机系统的功能和操作方法不完全相同,但只要熟练掌握一两种计算机系统的使用,再遇到其他的系统时便会触类旁通,很快学会。
3)                        学习上机调试程序。也就是善于发现程序中的错误,并且能很快排除这些错误,使程序能正确的运行。经验丰富的人,在编译连接过程中出现“出错信息”时,一般能很快判断出错误所在,并改正之。而缺乏经验的人即使在明确的“出错提示”下也往往找不出错误而求救于别人。要真正掌握计算机应用技术,就不仅应当了解和熟悉有关理论和方法,还要求自己动手实现。对程序设计来说,要求会编程序并上机调试通过。因此调试程序本身是程序设计课程的一个重要的内容和基本要求,应给于充分的重视。调试程序固然可以借鉴他人的现成经验,但更重要的是通过自己的直接实践来累积经验,而且有些经验是只能“意会”难以“言传”,别人的经验不能替代自己的经验。调试程序的能力是每个程序设计人员应当掌握的一项基本功。
因此,在做实验时应当在已通过的程序基础上有意作一些修改,以观察所出现的情况,这样的学习才会有真正的收获,才是灵活主动的学习而不是呆板被动的学习。
 
2.         上机实验前的准备工作
在上机实验前因事先做好准备工作,以提高上集实验的效率,准备工作至少应包括:
1)                        了解所用的计算机系统(包括C编译系统)的性能和使用方法。
2)                        复习和掌握与本实验有关的教学内容。
3)                        准备好上集所用的程序。手编程序应书写整齐,并经人工检查无误会才能上机,以提高上机效率。初学者切忌不编程序或抄别人程序上机,应从一开始就养成严谨的科学作风。
4)                        对运行中可能出现的问题应事先做出估计;对程序中自己有疑问的地方,因作上记号,以便在上机时给于注意。
5)                        准备好调试和运行时所需的数据。
 
3.         上机实验的步骤
上机实验时应该一人一组,独立上机。上机过程中出现的问题。除了是系统的问题以外,一般应自己独立处理,不要轻易举手问教师。尤其是对“出错信息”,应善于自己分析判断。这是学习调试程序的良好机会。
上机实验一般应包括以下几个步骤:
1)                        调出C编译系统,进入C工作环境。
2)                        输入自己编好的程序(在使用键盘输入时,最好采用正确的指法击键,为今后正确使用键盘打下基础)。
3)                        检查一编已输入的程序是否有错。
4)                        进行编译。如果在编译和连接中发现错误,屏幕上会出现“出错信息”,根据提示找到出错位置和原因,加以改正,在进行编译……如此反复,直到顺利通过编译和连接为止。
5)                        运行程序,并分析运行结果是否合理和正确。在运行时要注意当输入不同数据时所得到的结果是否正确。通过多次的运行,分别检查在不同情况下程序是否正确。
6)                        输出程序清单和运行结果。
 
4.         实验后,应整理出实验报告,实验报告应包括以下内容:
1)                        题目;
2)                        程序清单(必须是计算机打印出的程序清单);
3)                        运行结果(必须是上面程序清单所对应打印出的结果):
4)                        对运行情况所做出的分析,以及本次调试程序所取得的经验。如果程序未能通过,则因分析其原因。
 
5.         实验重点与难点
C语言的高级数据类型,如数组,指针,结构体;函数的概念和用法;C语言编译环境的使用方法;调试程序的经验和一些常用手段。
 
6.         实验内容的安排
课后习题和上机题统一。教师制定的课后习题就是上机题。本大纲给出15个实验内容。每个实验对应教材中相应章节的内容,学生应在实验前将教师指定的题目编好程序,然后上机输入和调试。
7.         实验时间分配
共15个实验,合计45课时,每个实验分配3个课时。
 

第二部分 实验内容及学时分配

实验一   C程序的运行环境和运行一个C程序的方法

1.         实验目的:
1)           了解所用的计算机系统的基本操作方法。
2)           掌握在该系统上如何编辑、编译、连接和运行一个C程序。
3)           通过运行简单的C程序,初步了解C程序的特点
2.         预习内容
见教材第一章
3.         实验重点:
熟悉C语言的编译环境,了解在该系统上如何编辑、编译、连接和运行一个C程序。
4.         实验难点:
熟悉C语言的编译环境
 
5.         实验内容
1)     检查自己所用的计算机系统。
2)     学习进入C的工作环境并熟悉Turbo C集成环境。
3)     练习输入并运行一个简单的C程序。
4)     运行一个自己编写的程序。
(参考例题)
【例】
main()
{
  printf("hello !\n");
}
         main是主函数的函数名,表示这是一个主函数。
         每一个C源程序都必须有,且只能有一个主函数(main函数)。
         函数调用语句,printf函数的功能是把要输出的内容送到显示器去显示。
         printf函数是一个由系统定义的标准函数,可在程序中直接调用。
【例】
#include
#include
main()
{
  double x,s;
  printf("input number:\n");
  scanf("%lf",&x);
  s=sin(x);
  printf("sine of %lf is %lf\n",x,s);
 }

实验二   数据类型,运算符和表达式  

1.         实验目的:
1)         掌握C语言的基本数据类型
2)         理解常量、变量的意义与区别
3)         理解不同类型的数据在内存中的存储形式 (注意区别字符常量与字符串常量)
4)         掌握运算符的规则
5)         掌握不同数值类型的混合运算规则
2.         预习内容
见教材第三章
3.         实验重点:
1)    输入有代表性的程序比较整型数据、字符型数据以及字符串型数据的区别与联系。
2)  程序体会C编译系统自动的数据类型转换。
4.         实验难点:
输入程序体会C编译系统自动的数据类型转换。
5.         实验内容
1)   输入有代表性的程序比较整型数据、字符型数据以及字符串型数据的区别与联系。
2)   输入程序体会C编译系统自动的数据类型转换。
3)   将习题编程并上机运行。
(参考例题)
【例】符号常量的使用。
#define PRICE 30
main()
{
  int num,total;
num=10;
total=num* PRICE;
printf(“total=%d”,total);
}
         用标识符代表一个常量,称为符号常量。
         符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。
         使用符号常量的好处是:
              含义清楚;
能做到“一改全改”。
 
【例】整型变量的定义与使用。
main()
{
int a,b,c,d;
unsigned u;
a=12;b=-24;u=10;
c=a+u;d=b+u;
printf(“a+u=%d,b+u=%d\n”,c,d);
}
【例】整型数据的溢出。
main()
{
  int a,b;
  a=32767;
  b=a+1;
  printf("%d,%d\n",a,b);
 }
32767:
      0111111111111111
 
-32768
      1000000000000000
 
【例】
main(){
  long x,y;
  int a,b,c,d;
  x=5;
  y=6;
  a=7;
  b=8;
  c=x+a;
  d=y+b;
  printf("c=x+a=%d,d=y+b=%d\n",c,d);
 }

实验三   顺序结构C程序设计

1.         实验目的:
1)       掌握C语言的语句
2)       掌握输入输出函数的格式
3)       掌握顺序结构的程序设计方法
2.         预习内容
见教材第四章
3.         实验重点:
掌握各种格式转换符的正确使用方法。
4.         实验难点:
掌握各种格式转换符的正确使用方法。
5.         实验内容
1)     掌握各种格式转换符的正确使用方法。
2)     编写程序,练习小数的输出用法。
3)    编程序,用getchar函数读入两个字符给c1、c2,然后分别用putchar函数和scanf函数输出这两个字符。
(参考例题)
【例】 输入任意三个整数,求它们的和及平均值
/*功能:设计一个顺序结构程序,求三个整数的和及平均值。*/
main()
{
int num1,num2,num3,sum;
float aver;
printf("Please input three numbers:");
scanf("%d,%d,%d",&num1,&num2,&num3);     /*输入三个整数*/
sum=num1+num2+num3;                         /*求累计和*/
aver=sum/3.0;                            /*求平均值*/ printf("num1=%d,num2=%d,num3=%d\n",num1,num2,num3);
printf("sum=%d,aver=%7.2f\n",sum,aver);
}                  
 
 
【例】 求方程ax2+bx+c=0的实数根。a,b,c由键盘输入,a≠0且b2-4ac>0。
/*功能:设计一个顺序结构程序,求方程的根。*/
#include "math.h"       /*为使用求平方根函数sqrt(),包含math.h头文件 */
main()
{float a,b,c,disc,x1,x2;
  printf("Input  a, b, c: ");
  scanf("%f,%f,%f",&a,&b,&c);   /*输入方程的三个系数的值*/
  disc=b*b-4*a*c;           /*求判别式的值赋给disc*/
  x1=(-b+sqrt(disc))/(2*a);
  x2=(-b-sqrt(disc))/(2*a);
  printf("\nx1=%6.2f\nx2=%6.2f\n",x1,x2);
}              

实验四   逻辑运算和判断选取控制

1.         实验目的:
1)           掌握关系运算符和逻辑运算符
2)           掌握 if 语句
3)           掌握 switch 语句
4)            掌握选择结构程序设计
2.         预习内容
见教材第五章
3.         实验重点:
1)     学会正确使用逻辑运算符和逻辑表达式。
2)     熟练掌握if语句和switch语句。
4.         实验难点:
1)     熟练掌握if语句和switch语句。
2)     学习调试程序。
5.         实验内容
编写并运行3个有代表性的程序:
1)    求一分段函数的输出值,在程序运行当中动态输入x的值,根据x的之所在范围决定输出值。
2)    输入一个百分制成绩,要求输出成绩等级A、B、C、D、E,联系使用switch语句。
3)     输入4个整数,按由小到大顺序输出。
(参考例题)
【例】 求一元二次方程ax*x+b*x+c=0的解(a≠0)。
/*功能:求一元二次方程的解。*/
#include  "math.h"
main()
{float a,b,c,disc,x1,x2,p,q;
  scanf(“%f,%f,%f”, &a, &b, &c);
 if (fabs(a)   printf(“is not a quadratic”);
else
{
disc=b*b-4*a*c;
   if (fabs(disc)       printf(“x1=x2=%7.2f\n”, -b/(2*a)); /*输出两个相等的实根*/
  else
if (disc>1e-6)
           {x1=(-b+sqrt(disc))/(2*a);       /*求出两个不相等的实根*/
             x2=(-b-sqrt(disc))/(2*a);
             printf("x1=%7.2f,x2=%7.2f\n", x1, x2);
           }
else
     {p=-b/(2*a);               /*求出两个共轭复根*/
      q=sqrt(fabs(disc))/(2*a);
      printf(“x1=%7.2f + %7.2f i\n“, p, q);   /*输出两个共轭复根*/
       printf(”x2=%7.2f - %7.2f i\n“, p, q);
      }
   }   
}
 
【例】 写程序,判断某一年是否为闰年。
  
main()
{
 int year,leap;
 scanf(“%d”,&year);
 if(year%4==0)
    {
if(year%100==0)
  {
if(year%400==0)
  leap=1;
else  leap=0;
}
else  leap=1;
        }
         else  leap=0;
if(leap)
   printf(“%d is ”,year);
else
   printf(“%d is not ”,year);
printf(“a leap year.\n”);
 
}
 
 【例】  运输公司对用户计算运费。
  
  main()
  {
int c,s;
float p,w,d,f;
scanf(“%f,%f,%d”,&p,&w,&s);
if(s>=3000)  c=12;
else  c=s/250;
switch(c)
{
case  0:d=0; break;
case  1:d=2; break;
case  2:
case  3:d=5; break;
case  4:
case  5:
case  6:
case  7:d=8; break;
case  8:
case  9:
case  10:
case  11:d=10;  break;
case  12:d=15;  break;
}
f=p*w*s*(1-d/100.0);
printf(“freight=%15.4f”,f);
}
 
 

实验五   循环控制

1.         实验目的:
1)        掌握“当型”和“直到型”循环结构
2)        掌握while语句和 do-while 语句并区分二者的异同
3)        掌握 for 语句
4)        掌握循环结构程序设计
2.         预习内容
见教材第六章
3.         实验重点:
熟悉掌握用while语句,do-while语句和for语句实现循环的方法。
4.         实验难点:
1)     熟悉掌握用while语句,do-while语句和for语句实现循环的方法。
2)     进一步学习调试程序。
5.         实验内容
编程序并上机运行:
1)     输入两个整数m和n,求它们的最大公约数和最小公倍数。
2)    输入一行字符,分别统计出其中的英文字母、空格、数字和其它字符的个数。
3)     用牛顿迭代法求方程的根。
4)     解决猴子吃桃问题。
(参考例题)
【例】用∏/4≈1-1/3+1/5-1/7+………公式求∏的近似值,直到最后一项的绝对值小于0.000001为止。
 
#include
main()
{
int s;
float n,t,pi;
t=1;pi=0;n=1.0;s=1;
while((fabs(t))>1e-6)
{
pi=pi+t;
n=n+2;
s=-s;
t=s/n;
}
pi=pi*4;
printf(“pi=%10.6f\n”,pi);
}
          
【例】求Fibonacci数列40个数。
 
  main()
  {
long int f1,f2;
int i;
f1=1;f2=1;
for(i=1;i
 {
  printf(“%12ld %12ld”,f1,f2);
  if(i%2==0)  printf(“\n”);
  f1=f1+f2;
  f2=f1+f2;
}
}
 
 
 
          【例】判断m是否为素数。
            
#include
main()
{
int m,i,k;
scanf(“%d”,&m);
k=sqrt(m+1);
for(i=2;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);
}    
           
【例】 求100~200间的全部素数。
 
#include
main()
{
int m,i,k,n=0;
for(m=101;m
{
k=sqrt(m);
for(i=2;i
if(m%i==0)  break;
if(i>=k+1) 
{printf(“%d  ”,m); n=n+1;}
if(n%10==0)  printf(“\n”);
}    
   printf(“\n”);
}
 
【例】 译密码。见教材P-119页
 
#include
main()
{
   char c;
   while((c=getchar())!=’\n’)
     {
if((c>=’a’&&c=’A’&&c
if(c>’Z’&&c’z’)  c=c-26;
}
        printf(“%c”,c);
     }
}
 

实验六   数组

1.         实验目的:
1)        掌握一维数组和多维数组的定义
2)        掌握对数组的引用规则
3)        理解多维数组的特殊性
4)        掌握字符数组和字符串
2.         预习内容
见教材第七章
3.         实验重点:
1)     掌握一维数组和二维数组的定义、赋值和输入输出的方法。
2)     数组和字符串函数的使用。
4.         实验难点:
掌握与数组有关的算法,特别是排序算法。
5.         实验内容
编程序并上机调试运行:
1)     用冒泡法对10个整数排序。10个整数用scanf函数输入。
2)     将两个字符串连接起来,不要用strcat函数。
(参考例题)
【例】选择法排序
思想:对n个数据对象排序
1.  i置为0,表示当前操作对象的范围是[i,n-1]
2.  数据范围[i,n-1]中确定最大值所在下标p
3.使最大值与当前操作范围的第一个数据交换
4.i++,使i自增1,从而操作数据范围缩小1
5.如果i小于n-1,则转入第二步
main()
{
  int i,j,p,s,a[10];
  printf("\n input 10 numbers:\n");
  for(i=0;i<10 ;i++)
      scanf("%d",&a[i]);
  for(i=0;i<10 ;i++)
{
      p=i;
      for(j=i+1;j<10 ;j++)
  if(a[p]
      if(i!=p)
        {s=a[i];
         a[i]=a[p];
         a[p]=s; }
      printf("%d",a[i]);
  }
}
【例】起泡法排序
起泡法的基本思想:通过相邻两个数之间的比较和交换,使排序码(数值)较小的数逐渐从底部移向顶部,排序码较大的数逐渐从顶部移向底部。就像水底的气泡一样逐渐向上冒,故而得名。
由A[n]~A[1]组成的n个数据,进行冒泡排序的过程可以描述为:
(1)首先将相邻的A[n]与A[n-1]进行比较,如果A[n]的值小于A[n-1]的值,则交换两者的位置,使较小的上浮,较大的下沉;接着比较A[n-1]与A[n-2],同样使小的上浮,大的下沉。依此类推,直到比较完A[2]和A[1]后,A[1]为具有最小排序码(数值)的元素,称第一趟排序结束。
(2)然后在A[n]~A[2]区间内,进行第二趟排序,使剩余元素中排序码最小的元素上浮到A[2];重复进行n-1趟后,整个排序过程结束。
/*功能:从键盘上任意输入n个整数,用起泡法按从小到大地排序,并在屏幕上显示出来。*/
 
#include "stdio.h"
#define NUM 10      /*定义符号常量(数据个数N)*/
main()
{ int data[NUM];        /*定义1个1维整型数组data*/
    int i,j,temp;       /*定义循环变量和临时变量*/
    clrscr();       /*库函数clrscr():清屏*/
    printf("Please input 10 numbers:\n");
    for(i=0; i
        scanf("%d", &data[i]);
    /*起泡法排序*/
    for(i=0; i
        for(j=NUM-1; j>i; j--)  /*内循环:进行每趟比较*/
            if(data[j]
               {temp=data[j];
                 data[j]=data[j-1];
                 data[j-1]=temp;
               };
    /*输出排序后的数据*/
    printf("\nthe  result of sort:\n");
    for(i=0; i
        printf("%d ",data[i]);
    getchar();      /*等待键盘输入任一字符,目的使程序暂停*/
}
【例】输入一行字符,统计其中有多少个单词,单词之间用空格隔开。
        #include
        main()
        {
         char string[81];
         int i,num=0,word=0;
         char c;
         gets (string);
         for(i=0;(c=string[i])!=’\0’;i++)
        if(c= =’  ‘)  word=0;
        else  if (word= =0)
{
word=1;
num++;
}   
printf(“there are %d words in the line.\n”,num);
}
 
 

实验七   函数(一)

1.         实验目的:
1)        掌握定义函数的方法。
2)        掌握函数实参与形参的对应关系以及“值传递”的方式。
3)        掌握函数的嵌套调用和递归调用的方法。
4)        掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。
5)        学习对多文件程序的编译和运行。
2.         预习内容
见教材第八章
3.         实验重点:
1)     掌握定义函数的方法。
2)     掌握函数实参与形参的对应关系以及“值传递”的方式。
4.         实验难点:
1)   掌握函数实参与形参的对应关系以及“值传递”的方式。
2)   掌握函数的嵌套调用和递归调用的方法。
5.         实验内容
1)     写一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。
2)    用一个函数来实现将一行字符串中最长的单词输出。此行字符串从主函数传递给该函数。
3)    用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串“483”。n的位数不确定。
(参考例题)
【例】计算s=22!+32!
本题可编写两个函数,一个是用来计算平方值的函数f1,另一个是用来计算阶乘值的函数f2。主函数先调f1计算出平方值,再在f1中以平方值为实参,调用 f2计算其阶乘值,然后返回f1,再返回主函数,在循环程序中计算累加和。
long f1(int p)
{
    int k;
    long r;
    long f2(int);
    k=p*p;
    r=f2(k);
    return r;
}
long f2(int q)
{
    long c=1;
    int i;
    for(i=1;i
      c=c*i;
    return c;
}
main()
{
    int i;
    long s=0;
    for (i=2;i
      s=s+f1(i);
    printf("\ns=%ld\n",s);
}
我们还可以将以上程序进行修改,修改为通过主函数来调用f1和f2函数。
long f1(int p)
{
    int k;
    k=p*p;
    return k;
}
long f2(int q)
{
    long c=1;
    int i;
    for(i=1;i
      c=c*i;
    return c;
}
main()
{
    int i;
    long s=0;
    for (i=2;i
      s=s+f2(f1(i));
    printf("\ns=%ld\n",s);
}
 

实验八   函数(二)

1.         实验目的:
1)        掌握定义函数的方法。
2)        掌握函数实参与形参的对应关系以及“值传递”的方式。
3)        掌握函数的嵌套调用和递归调用的方法。
4)        掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。
5)        学习对多文件程序的编译和运行。
2.         预习内容
见教材第八章
3.         实验重点:
1)     掌握定义函数的方法。
2)     掌握函数实参与形参的对应关系以及“值传递”的方式。
4.         实验难点:
1)   掌握函数实参与形参的对应关系以及“值传递”的方式。
2)   掌握函数的嵌套调用和递归调用的方法。
5.         实验内容
1)  求两个整数的最大公约数和最小公倍数。用一个函数求最大公约数,用另一函数根据求出的最大公约数求最小公倍数。
A)     不用全局变量,分别用两个函数求最大公约数和最小公倍数。两个整数在主函数中输入,并传送给函数1,求出的最大公约数返回主函数,然后在与两个整数一起作为实参传递给函数2,以求出最小公倍数,再返回到主函数输出最大公约数和最小公倍数。
B)    用全局变量的方法,分别用两个函数求最大公约数和最小公倍数,但其值不由函数带回。将最大公约数和最小公倍数都设为全局变量,在主函数输出它们的值。
2)   写一函数,输入一个十六进制数,输出相应的十进制数。
(参考例题)
【例】用铉截法求一元三次方程的根
#include
(
float y;
y=((x-5.0)*x+16.0)*x-80.0;
return(y);(
}
fioat xpoint(float x1,float x2) 
{
float y;
y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return(y);
}
float  root(float x1,float x2) /
{
float x,y,y1;
y1=f(x1);
do
{
 
x=xpoint(x1,x2);
y=f(x);
if(y*y1>0)
{y1=y;
x1=x;}
else
  x2=x;
}while(fabs(y)>=0.0001);
retunt(x);
}
main()
{
float x1,x2,f1,f2,x;
do
{
printf(“input x1,x2:\n”);}f
scanf(“%f,%f”,&x1,&x2);
f1=f(x1);
f2=f(x2);
}while(f1*f2>=0);
x=root(x1,x2);
printf(“A root of equation is%8.4f’’,x);
}
【例】用递归法计算n!
用递归法计算n!可用下述公式表示:
    n!=1         (n=0,1)
    n×(n-1)!    (n>1)
按公式可编程如下:
long fac(int n)
{
    long f;
    if(n<0 ) printf("n<0,input error");
    else if(n==0||n==1) f=1;
    else f=fac(n-1)*n;
    return(f);
}
main()
{
    int n;
    long y;
    printf("\ninput a inteager number:\n");
    scanf("%d",&n);
    y=fac(n);
    printf("%d!=%ld",n,y);
}
【例】Hanoi塔问题
    一块板上有三根针,A,B,C。A针上套有64个大小不等的圆盘,大的在下,小的在上。要把这64个圆盘从A针移动C针上,每次只能移动一个圆盘,移动可以借助B针进行。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。求移动的步骤。
本题算法分析如下,设A上有n个盘子。
如果n=1,则将圆盘从A直接移动到C。
当n大于等于2时,移动的过程可分解为三个步骤:
第一步  把A上的n-1个圆盘移到B上;
第二步  把A上的一个圆盘移到C上;
第三步  把B上的n-1个圆盘移到C上;其中第一步和第三步是类同的。
显然这是一个递归过程,据此算法可编程如下:
void move(char x,char y)
{
printf("%c-->%c\n",x,y);
}
void  hanoi(int n,char one,char two,char three)
{
    if(n==1)
      move(one,three);
    else
    {
      hanoi(n-1,one,three,two);
      move(one,three);
      hanoi(n-1,two,one,three);
    }
}
main()
{
    int m;
    printf("\ninput number:\n");
    scanf("%d",&m);
    printf("the step to moving %2d diskes:\n",m);
    hanoi(m,'a','b','c');
}
 
我们还可以将程序略作修改,如下:
 
move(int n,int x,int y,int z)
{
    if(n==1)
      printf("%c-->%c\n",x,z);
    else
    {
      move(n-1,x,z,y);
      printf("%c-->%c\n",x,z);
      move(n-1,y,x,z);
    }
}
main()
{
    int h;
    printf("\ninput number:\n");
    scanf("%d",&h);
    printf("the step to moving %2d diskes:\n",h);
    move(h,'a','b','c');
}
    从程序中可以看出,move函数是一个递归函数,它有四个形参n,x,y,z。n表示圆盘数,x,y,z分别表示三根针。move 函数的功能是把x上的n个圆盘移动到z上。当n==1时,直接把x上的圆盘移至z上,输出x→z。如n!=1则分为三步:递归调用move函数,把n-1个圆盘从x移到y;输出x→z;递归调用move函数,把n-1个圆盘从y移到z。在递归调用过程中n=n-1,故n的值逐次递减,最后n=1时,终止递归,逐层返回。当n=3 时程序运行的结果为:
    input number:
    3
    the step to moving 3 diskes:
    a→c
    a→b
    c→b
    a→c
    b→a
    b→c
    a→c
 

实验九   编译预处理

1.         实验目的:
1)      掌握“宏定义”
2)      掌握“文件包含”
3)      掌握“条件编译”
2.         预习内容
见教材第九章
3.         实验重点:
掌握宏定义的方法。
4.         实验难点:
掌握宏定义的方法。
5.         实验内容
编程序并上机调试运行:
1)   定义一个带参数的宏,使两个参数的值互换。
2)   设计输出实数的格式,包括:
A) 一行输出一个实数;
B) 一行内输出两个实数;
C) 一行内输出三个实数;
(参考例题)
【例】
main(){
  int i=1;
  while(i
    printf("%d\n",SQ(i++));
}
SQ(int y)
{
  return((y)*(y));
}
【例】
#define SQ(y) ((y)*(y))
main(){
  int i=1;
  while(i
    printf("%d\n",SQ(i++));
}
 

实验十   指针(一)

1.         实验目的:
1)        通过实验进一步掌握指针的概念,会定义和使用指针变量。
2)        能正确使用数组的指针和指向数组的指针变量。
3)        能正确使用字符串的指针和指向字符串的指针变量。
4)        能正确使用指向函数的指针变量。
5)        了解指向指针的指针的概念及其使用方法。
2.         预习内容
见教材第十章
3.         实验重点:
1)   通过实验进一步掌握指针的概念,会定义和使用指针变量。
2)   能正确使用数组的指针和指向数组的指针变量。
3)   能正确使用字符串的指针和指向字符串的指针变量。
4) 能正确使用指向函数的指针变量。
4.         实验难点:
1)   能正确使用数组的指针和指向数组的指针变量。
2)   能正确使用字符串的指针和指向字符串的指针变量。
5.         实验内容
编程序并上机调试运行程序,要求都用指针实现:
1)  输入三个整数,按由小到大的顺序输出,然后将程序改为:输入三个字符串,按由小到大顺序输出。
2)   将一个3×3的矩阵转置,用一函数实现之。
3)  有n个人围成一圈,顺序排号。从第1个人开始1—3报数,凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
(参考例题)
【例】从10个数中找出其中最大值和最小值。
调用一个函数只能得到一个返回值,今用全局变量在函数之间“传递”数据。程序如下:
int max,min;      /*全局变量*/
void max_min_value(int array[],int n)
{int *p,*array_end;
 array_end=array+n;
 max=min=*array;
 for(p=array+1;p
   if(*p>max)max=*p;
   else if (*p
 return;
}
main()
{int i,number[10];
 printf("enter 10 integer umbers:\n");
 for(i=0;i<10 ;i++)
   scanf("%d",&number[i]);
 max_min_value(number,10);
 printf("\nmax=%d,min=%d\n",max,min);
 }
【例】以上程序可改为:
int max,min;      /*全局变量*/
void max_min_value(int *array,int n)
{int *p,*array_end;
 array_end=array+n;
 max=min=*array;
 for(p=array+1;p
   if(*p>max)max=*p;
   else if (*p
 return;
}
main()
{int i,number[10],*p;
 p=number;             /*使p指向number数组*/
 printf("enter 10 integer umbers:\n");
 for(i=0;i<10 ;i++,p++)
   scanf("%d",p);
 p=number;
 max_min_value(p,10);
 printf("\nmax=%d,min=%d\n",max,min);
 }
 

实验十一 指针(二)

1.         实验目的:
1)        通过实验进一步掌握指针的概念,会定义和使用指针变量。
2)        能正确使用数组的指针和指向数组的指针变量。
3)        能正确使用字符串的指针和指向字符串的指针变量。
4)        能正确使用指向函数的指针变量。
5)        了解指向指针的指针的概念及其使用方法。
2.         预习内容
见教材第十章
3.         实验重点:
1)   通过实验进一步掌握指针的概念,会定义和使用指针变量。
2)   能正确使用数组的指针和指向数组的指针变量。
3)   能正确使用字符串的指针和指向字符串的指针变量。
4) 能正确使用指向函数的指针变量。
4.         实验难点:
1)   能正确使用数组的指针和指向数组的指针变量。
2)   能正确使用字符串的指针和指向字符串的指针变量。
5.         实验内容
编程序并上机调试运行程序,要求都用指针实现:
1)   用一个函数实现两个字符串的比较,即自己写一个strcmp函数。
2)  用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。
(参考例题)
【例】将数组a中的n个整数按相反顺序存放。
算法为:将a[0]与a[n-1]对换,再a[1]与a[n-2] 对换……,直到将a[(n-1/2)]与a[n-int((n-1)/2)]对换。今用循环处理此问题,设两个“位置指示变量”i和j,i的初值为0,j的初值为n-1。将a[i]与a[j]交换,然后使i的值加1,j的值减1,再将a[i]与a[j]交换,直到i=(n-1)/2为止,如图所示。
程序如下:
void inv(int x[],int n)   /*形参x是数组名*/
{
 int temp,i,j,m=(n-1)/2;
 for(i=0;i
{j=n-1-i;
   temp=x[i];x[i]=x[j];x[j]=temp;}
 return;
}
main()
{int i,a[10]={3,7,9,11,0,6,7,5,4,2};
 printf("The original array:\n");
 for(i=0;i<10 ;i++)
   printf("%d,",a[i]);
 printf("\n");
 inv(a,10);
 printf("The array has benn inverted:\n");
 for(i=0;i<10 ;i++)
  printf("%d,",a[i]);
 printf("\n");
}
对此程序可以作一些改动。将函数inv中的形参x改成指针变量。
【例】对上例可以作一些改动。将函数inv中的形参x改成指针变量。
程序如下:
void inv(int *x,int n)   /*形参x为指针变量*/
{
 int *p,temp,*i,*j,m=(n-1)/2;
 i=x;j=x+n-1;p=x+m;
 for(;i
{temp=*i;*i=*j;*j=temp;}
 return;
}
main()
{int i,a[10]={3,7,9,11,0,6,7,5,4,2};
 printf("The original array:\n");
 for(i=0;i<10 ;i++)
   printf("%d,",a[i]);
 printf("\n");
 inv(a,10);
 printf("The array has benn inverted:\n");
 for(i=0;i<10 ;i++)
  printf("%d,",a[i]);
 printf("\n");
}
运行情况与前一程序相同。

实验十二 结构体和共用体

1.       实验目的:
1)         掌握结构体类型和结构体变量的概念
2)         掌握结构体变量的使用
3)         掌握结构体数据的指针
4)         掌握共用体和枚举类型
2.       预习内容
见教材第十一章
3.       实验重点:
1)   掌握结构体类型变量的定义和使用。
2)   掌握结构体类型数组的概念和使用。
4.       实验难点:
1)     掌握结构体数据的指针
2)     掌握结构体类型数组的定义和使用。
5.       实验内容
编程序并上机调试运行:
1)  由10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生数据,要求打印出3门课总平均成绩,以及最高分的学生的数据。
2)  13个人围成一圈,从第1个人开始顺序报号1、2、3。凡报到3者退出圈子,找出最后留在圈子中的人原来的序号。
(参考例题)
【例】建立同学通讯录
#include"stdio.h"
#define NUM 3
struct mem
{
    char name[20];
    char phone[10];
};
main()
{
    struct mem man[NUM];
    int i;
    for(i=0;i
     {
      printf("input name:\n");
      gets(man[i].name);
      printf("input phone:\n");
      gets(man[i].phone);
     }
    printf("name\t\t\tphone\n\n");
    for(i=0;i
      printf("%s\t\t\t%s\n",man[i].name,man[i].phone);
}

实验十三 链表的处理

1.       实验目的:
1)           掌握链表的数据组织形式
2)           掌握链表的相关操作(建立、排序、插入、删除)
2.       预习内容
见教材第十一章
3.       实验重点:
1)           掌握链表的数据组织形式
2)           掌握链表的相关操作
4.       实验难点:
掌握链表的概念,初步学会对链表进行常见操作。
5.       实验内容
编程序并上机调试运行:(本题要求用链表实现。)
1)  建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
(参考例题)
【例】建立一个三个结点的链表,存放学生数据。为简单起见,我们假定学生数据结构中只有学号和年龄两项。可编写一个建立链表的函数creat。程序如下:
  #include "stdio.h"
#include "stdlib.h"
#define NULL 0
#define TYPE struct stu
#define LEN sizeof (struct stu)
    struct stu
        {
          int num;
          int age;
          struct stu *next;
        };
    TYPE *creat(int n)
    {
        struct stu *head,*pf,*pb;
        int i;
        for(i=0;i
        {   
          pb=(TYPE*) malloc(LEN);
          printf("input Number and  Age\n");
          scanf("%d%d",&pb->num,&pb->age);
          if(i==0)
          pf=head=pb;
          else pf->next=pb;
          pb->next=NULL;
          pf=pb;
        }
        return(head);
    }
 
    void out(struct stu *h)
    {
        struct stu *p;
        p=h;
        printf("\nNow output:");
        while(p!=NULL)
        {
            printf("\n%d  
分享到:
最新资讯