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

C语言试验大纲

作者:tarsier 发表时间:2007/07/10 10:15:34   浏览:

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.        实验内容的安排
课后习题和上机题统一。教师制定的课后习题就是上机题。本大纲给出15个实验内容。每个实验对应教材中相应章节的内容,学生应在实验前将教师指定的题目编好程序,然后上机输入和调试。
 
 
 
 
 
 
 
 
 
 
 
 

C语言试验大纲

第二部分 实验内容

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

1.       实验目的:
1)          了解所用的计算机系统的基本操作方法。
2)          掌握在该系统上如何编辑、编译、连接和运行一个C程序。
3)          通过运行简单的C程序,初步了解C程序的特点
2.       预习内容
见教材第一章
3.       实验内容(参考例题)
【例】
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.       实验内容(参考例题)
【例】符号常量的使用。
#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.       实验内容(参考例题)
【例】 输入任意三个整数,求它们的和及平均值
/*功能:设计一个顺序结构程序,求三个整数的和及平均值。*/
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.       实验内容(参考例题)
【例】 求一元二次方程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.       实验内容(参考例题)
【例】用∏/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.       实验内容(参考例题)
【例】选择法排序
思想:对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)        掌握函数的调用(变量的存储类别)
2.       预习内容
见教材第八章
3.       实验内容(参考例题)
【例】计算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)        掌握函数的调用(变量的存储类别)
2.       预习内容
见教材第八章
3.       实验内容(参考例题)
【例】用铉截法求一元三次方程的根
#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)      掌握“文件包含”
4)      掌握“条件编译”
2.       预习内容
见教材第九章
3.       实验内容(参考例题)
【例】
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.       实验内容(参考例题)
【例】从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.       实验内容(参考例题)
【例】将数组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.     实验内容(参考例题)
【例】建立同学通讯录
#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.     实验内容(参考例题)
【例】建立一个三个结点的链表,存放学生数据。为简单起见, 我们假定学生数据结构中只有学号和年龄两项。可编写一个建立链表的函数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   %d",p->num,p->age);
           p=p->next;
       }
       return ;
    }
struct stu *insert(struct stu *h)
    {
       struct stu *p,*q,*p1;
       int n,i;//插入 位置
       scanf("%d",&n);
       if(n<1 )printf("\n位置 非法");
       else
       {
           p=h;
           i=1;
           while(i
           {
              p=p->next;
              i++;
           }
           if(p==NULL)
              printf("\n位置 非法");
           else
           {
              q=(struct stu*)malloc(sizeof(LEN));
              printf("input Number and  Age\n");
                scanf("%d%d",&q->num,&q->age);
              if(n==1)
              {
                  q->next=h;
                  h=q;
              }
              else
              {
                  q->next=p->next;
                  p->next=q;
              }
           }
       }
       return h;
    }
struct stu *del(struct stu *head,int num)
{struct stu *p1,*p2;
if(head==NULL) {printf(“\n list null!\n”); return(head);}
p1=head;
while(num!=p1->num && p1->next!=NULL)
{P2=P1; P1=P1->next;}
if(num==p1->num)
{if(p1==head)head=p1->next;
else p2->next=p1->next;
printf(“delete:%d\n”,num);
n=n-1;
}
else printf(“%d not be found!\n”,num);
return head;
}
    void main()
    {
       struct stu *h;
       int n;
       scanf("%d",&n);
       h=creat(n);
       out(h);
       h=insert(h);
        out(h);
h=del(h);
       out(h);
    }
 

实验十四 位运算

1.     实验目的:
1)          掌握位运算
2)          掌握位段的概念和使用
2.     预习内容
见教材第十二章
3.     实验内容(参考例题)
【例】 从键盘上输入1个正整数给int变量num,按二进制位输出该数。
 
 
#include  "stdio.h"
main()
    { int num, mask, i;
       printf("Input a integer number: ");
       scanf("%d",&num);
       mask = 1
      printf("%d=" , num);
      for(i=1; i
         { putchar(num&mask ? ’1’ : ‘0’); /*输出最高位的值(1/0)*/
            num
            if( i%4==0 ) putchar(‘,’);      /*四位一组,用逗号分开*/
        }
      printf("\bB\n");
    }     
 
程序运行情况:
Input a integer number:1000 ←┘
1000=0000,0011,1110,1000B
 

实验十五 文件 

1.     实验目的:
1)          掌握文件的概念和文件的数据组织形式
2)          掌握文件的相关操作(打开、关闭、读写、定位)
2.     预习内容
见教材第十三章
3.     实验内容(参考例题)
【例】在学生文件stu_list中读出第二个学生的数据。
#include
struct stu
{
  char name[10];
  int num;
  int age;
  char addr[15];
}boy,*qq;
main()
{
  FILE *fp;
  char ch;
  int i=1;
  qq=&boy;
  if((fp=fopen("stu_list","rb"))==NULL)
  {
    printf("Cannot open file strike any key exit!");
    getch();
    exit(1);
  }
  rewind(fp);
  fseek(fp,i*sizeof(struct stu),0);
  fread(qq,sizeof(struct stu),1,fp);
  printf("\n\nname\tnumber      age      addr\n");
  printf("%s\t%5d  %7d      %s\n",qq->name,qq->num,qq->age,qq->addr);
}
 
分享到:
最新资讯