知ing

大学C/C++语言程序设计实验教程

阳小华 罗晨晖 编 / 电子工业出版社

王大胆 上传

查看本书


实验11  指针综合实验

任务  使用指针编写综合应用程序

1.某班有M个学生,开设三门课程(高数、英语、计算机)的成绩,编程输入学生的学号及三门课程的成绩,求各人的平均分,并显示。

参考程序如下:

#include "stdio.h"

#define M 5

struct student

{

    int num;

    int score[3];  

    float average;

}stu[M];

main( )

{

   struct student *p;

   for(p=stu;p<stu+M;p++)

   {

  scanf("%d %d %d %d",&(p->num),&(p->score[0]),&(p->score[1]),&(p->score[2]));

      p->average=(p->score[0]+p->score[1]+p->score[2])/3.0;

   }

   printf("平均分为\n\n");

   for(p=stu;p<stu+M;p++)

   {   printf("%5d%5d%5d%5d%7.2f\n",p->num,p->score[0],p->score[1],p->score[2],p->average);

   }

}

2.编写一函数,求一个字符串的长度。在main( )函数中输入字符串,并输出其长度。

参考程序如下:

#include <stdio.h>

#include <string.h>

int len(char *s)

{

    int k=0;

    for(;*s!='\0';s++)

      k++;

    return k;

}

main( )

{

    char str1[80],*p=str1;

    scanf("%s",str1);

    printf("\nlength of the string is:%d",len(str1));

}

3.从键盘输入一行文字,找出其中大写字母、小字字母、数字及其他字符各有多少?

参考程序如下:

#include <stdio.h>

main( )

{

    int i,j,k,m;

    char *p,a[100];

    p=a;

    i=j=k=m=0;

    scanf("%s",p);

    for(;*p!='\0';p++)

    {

      if(*p>=97&&*p<=122 )  i++;

      else if(*p>=65&&*p<=90)  j++;

      else if(*p>=48&&*p<57)  k++;

      else  m++;

    }

    printf("Lower case char:%d,Up case cahr:%d,number char:%d,other char:%d",i,j,k,m);

}

4.利用指针编写程序,实现对数组进行从小到大的排序(冒泡法)。

参考程序如下:

#include<stdio.h>

main( )

{

    int a[10];

    int *p,t,k,i,j;

    p=a;

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

    { scanf("%d",p);p++; }

p=a;

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

{   k=i;

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

if(p[k]>p[j])k=j;

        if(k!=i)

{ t=p[k];p[k]=p[i];p[i]=t;}

}

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

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

}

5100人围成一圈,从第1个人开始,每数到3的人出圈,问最后一个出圈的人是哪个?

参考程序如下:

#include  <stdio.h>

void main( )

{

    int a[100],i,n,k,*p;

    p=a;

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

      *(p+i)=i+1;

    n=100;

    i=k=0;

    while(n>1)

    {

        if(*(p+i)!=0)  k++;

        if(k==3)  {*(p+i)=0;k=0;n--;}

        i++;

        if(i==100)  i=0;

    }

    while(*p==0)  p++;

    printf("the last is %d\n",*p);

}

实验12  结构体、共用体与枚举

任务1  结构体、共用体与枚举构造数据类型的定义与使用

1.运行下面程序,熟悉结构体变量及指向结构体变量指针的使用。

#include<stdio.h>

void main( )

{

    struct xs

    { int num;

        char name[20];

        float score;

    }stu1={001,"Zhang san",90.5};

    struct xs stu2,*p;

    stu2=stu1;

    printf("%d %s %f\n",stu2.num,stu2.name,stu2.score);

    p=&stu2;

    printf("%d %s %f\n",p->num,p->name,p->score);

}

运行结果为:

1 Zhang san 90.500000

1 Zhang san 90.500000

2.运行下面程序,并分析指向结构体数组的指针变量的使用,理解指针与结构体数组的关系及结构体成员的引用方式。

#include<stdio.h>

struct xs

{  int num;

   char name[20];

   char sex;

   int age;

}stu[3]={{10101,"Li Lin",'M',18},

         {10102,"Zhang Fun",'M',19},

         {10104,"Wang Min",'F',20}};

main( )

{

   struct xs *p;

   for(p=stu;p<stu+3;p++)

   printf("%d %s %c %d\n",p->num,p->name,p->sex,p->age);

}

运行结果为:

10101 Li Lin M 18

10102 Zhang Fun M 19

10104 Wang Min F 20

思考:printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);如用结构体数组元素的方式表示,该引用方式如何表示?

代码修改如下:

#include<stdio.h>

struct xs

{  int num;

   char name[20];

   char sex;

   int age;

}stu[3]={{10101,"Li Lin",'M',18},

         {10102,"Zhang Fun",'M',19},

         {10104,"Wang Min",'F',20}};

main( )

{

   struct xs *p;

   int i;

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

   printf("%d %s %c %d\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age);

}

3.以下程序通过定义学生结构体数组,存储了若干名学生的学号、姓名和3门课的成绩。函数fun( )的功能是将存放学生数据的结构体数组,按照姓名的字典序(从小到大)排序。

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

#include  <stdio.h>

#include  <string.h>

struct student {

    long  sno;

    char  name[10];

    float  score[3];

};

void fun(struct student  a[], int  n)

{

    /**********found**********/

    struct student  t;

    int  i, j;

    /**********found**********/

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

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

    /**********found**********/

       if (strcmp(a[i].name,a[j].name) > 0)

       {  t = a[i];   a[i] = a[j];  a[j] = t;  }

}

void main( )

{  struct student  s[4]={{10001,"ZhangSan", 95, 80, 88},{10002,"LiSi", 85, 70, 78},{10003,"CaoKai", 75, 60, 88}, {10004,"FangFang", 90, 82, 87}};

   int  i, j;

   printf("\n\nThe original data :\n\n");

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

   {  printf("\nNo: %ld  Name: %-8s      Scores:  ",s[j].sno, s[j].name);

      for (i=0; i<3; i++)  printf("%6.2f ", s[j].score[i]);

      printf("\n");

   }

   fun(s, 4);

   printf("\n\nThe data after sorting :\n\n");

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

   {  printf("\nNo: %ld  Name: %-8s      Scores:  ",s[j].sno, s[j].name);

      for (i=0; i<3; i++)  printf("%6.2f ", s[j].score[i]);

      printf("\n");

   }

}

 

4.下面程序通过对学生学号、姓名、出生年月信息的输入与输出,分析并理解指向结构体类型变量的正确使用方法,以及结构体嵌套定义。

#include <stdio.h>

#include <stdlib.h> /*使用malloc( )需要包括该头文件*/

struct data/*定义结构体*/

{

    int day,month,year;

};

struct stu/*定义结构体*/

{

    char name[20];

    long num;

    struct data birth; /*嵌套的结构体类型成员*/

} ;

void main( ) /*定义main( ) 函数*/

{

    struct stu *xs;                        /*定义结构体类型指针*/

    xs=(struct stu *)malloc(sizeof(struct stu)); /*为指针变量分配安全的地址*/

    printf("Input name,number,year,month,day:\n");

    scanf("%s",xs->name);                /*输入学生姓名、学号、出生年月日*/

    scanf("%ld", &xs->num);

    scanf("%d %d %d", &xs->birth.year,&xs->birth.month,&xs->birth.day);

    printf("\nOutput name,number,year,month,day\n" );/*打印输出各成员项的值*/

    printf("%s%ld %5d// %d// %d\n",xs->name,xs->num,xs->birth.year,

    xs->birth.month,xs->birth.day);

}

运行结果如下:

Input name,number,year,month,day:

HanTingyu 22 1985 11 1

HanTingyu22 1985//11//1(书上多空了很多的空格)

5.验证下面程序,熟悉共用体变量的使用。

#include  <stdio.h>

union ab{

      int a;

      char b[2];

};

void main( )

{

      union ab t;

      t.a=0x1234;

      printf("t.a=%x\nt.b[1]=%x\nt.b[0]=%x\n",t.a,t.b[1],t.b[0]);

}

程序输出结果如下:

t.a=1234

t.b[1]=12

t.b[0]=34

任务2  链表的定义与使用

给定程序中,函数fun( )的功能是将带头节点的单向链表结点数据域中的数据从小到大排序。即若原链表结点数据域从头至尾的数据为104286,排序后链表结点数据域从头至尾的数据为246810

请在程序的下划线处填入正确的内容并将下划线删除, 使程序得出正确的结果。

#include  <stdio.h>

#include  <stdlib.h>

#define    N    6

typedef struct node {

    int  data;

    struct node  *next;

} NODE;

void fun(NODE  *h)

{  NODE  *p, *q;    int  t;

   /**********found**********/

   p =  h->next  ;

   while (p) {

   /**********found**********/

       q =  p->next  ;

       while (q) {

   /**********found**********/

           if (p->data  >  q->data)

           {  t = p->data;  p->data = q->data;  q->data = t;  }

           q = q->next;

   }

   p = p->next;

  }

}

NODE *creatlist(int  a[])

{  NODE  *h,*p,*q;        int  i;

   h = (NODE *)malloc(sizeof(NODE));

   h->next = NULL;

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

   {  q=(NODE *)malloc(sizeof(NODE));

      q->data=a[i];

      q->next = NULL;

      if (h->next == NULL)  h->next = p = q;

      else    {  p->next = q;  p = q;   }

   }

      return  h;

}

void outlist(NODE  *h)

{  NODE  *p;

   p = h->next;

   if (p==NULL)  printf("The list is NULL!\n");

   else

   {  printf("\nHead  ");

      do

      {  printf("->%d", p->data); p=p->next;  }

      while(p!=NULL);

      printf("->End\n");

   }

}

main( )

{  NODE  *head;

   int  a[N]= {0, 10, 4, 2, 8, 6 };

   head=creatlist(a);

   printf("\nThe original list:\n");

   outlist(head);

   fun(head);

   printf("\nThe list after sorting :\n");

   outlist(head);

}

 


查看更多