《C程序设计》课程学习(14)——第11章 结构体和共用体

11.1    结构体

11.2    共用体

11.3    枚举类型

11.4    自定义类型

11.1  结构体

1. 结构体类型的定义

struct   student
{ int   num;
  char  sex;
  char  name[20];
  float  score;
};

 2. 结构体类型变量的定义、引用和初始化

struct   student   st1,st2;
st1.num=2016;
st1.sex='M';
strcpy(st1.name,"LiMing");
st1.score=82.5;
scanf("%d",&st2.num);
st2.sex=getchar();
gets(st2.name);
scanf("%f",&st2.score);
printf("%d,%c,%s,%f\n",st1.num,
            st1.sex,st1.name,st1.score);
struct   student
{int   num;
 char  sex, name[20];
 float  score;
} st1,st2; 
struct 
{int   num;
 char  sex, name[20];
 float  score;
} st1,st2;
struct  date
{int  month;
 int  day;
 int  year;
};
struct  student
{char  name[20];
  struct  date  birthday;
  char  addr[30];
} student1, student2;
student1.birthday.month=5;

例1

             struct   student
             { int   num;
                char  sex, name[20];
                float  score;
             } st1={2016,'M', "LiMing",82.5};
             main
             { printf("%d,%c,%s,%f\n", st1.num,st1.sex,st1.name,st1.score);
             }

3.结构体数组

struct   student
{ int   num;
  char  sex;
  char  name[20];
  float  score;
} stu1[30];   

例2   对候选人得票的统计程序。设有三个候选人,十个投票人,  每次输入一个得票的候选人名字,要求最后输出各人得票结果。

#include  "string.h"
struct  per
{char  name[20];
  int   count;
} a[3]={"li",0,"zhang",0,"feng",0};
main( )
{int i,j;
 char  name[20];
 for(i=1;i<=10;i++)
   {gets(name);
     for(j=0;j<3;j++)
       if(strcmp(name,a[j].name)= =0)a[j].count++;
   }
 for(j=0;j<3;j++)
     printf("%5s:%d\n",a[j].name,a[j].count);
}

4.指向结构体类型数据的指针

(1) 指向结构体变量的指针

例3

      main( )
      {struct   student
          {int   num;
            char  sex, name[20];
            float  score;
          } st1,*p;   
       p=&st1;
       st1.num=2016;
       (*p).sex='M';
       strcpy(p->name,"LiMing");
       p->score=82.5;
       printf("%d,%c,%s,%f\n",p->num,p->sex,p->name,p->score);
      }

(2)指向结构体数组的指针

例4

struct  student
{int num;
  char name[20];
  char sex;
  int age;
};
struct student   stu[3]={{10101,"li lin",'M',18},
                         {10102,"zhangfan",'M',19},
                         {10105,"wangming",'F',20}};
main( )
{struct student  *p;
  for(p=stu;p<stu+3;p++)
     printf("%5d%-20s%2c%4d\n",p->num,p->name,
                               p->sex,p->age);
}

   (3)用指向结构体的指针作函数参数

例5  有一个结构体变量stu,内含学生学号、姓名和三门课的成绩,要求在main函数中赋以值,在另一函数print中将它们打印输出。

#include "string.h"
#define format  "%d\n%s\n%f\n%f\n%f\n"
struct  student
{int  num;
 char name[20];
 float score[3];
};
main( )
{ void  print(struct  student *p);
  struct  student  stu; 
  stu.num=12345;
  strcpy(stu.name,"li lin");
  stu.score[0]=67.5;
  stu.score[1]=89;
  stu.score[2]=78.6;
  print(&stu);
}
void  print(struct  student *p)
{printf (format, p->num, p->name, p->score[0], p->score[1], 
                            p->score[2]);
}  

例6  有30名学生,每个学生包括学号、姓名、成绩,要求找出成绩最高者的学号、姓名和成绩。

main( )
{struct  stu
 {int  n;
  char  na[20];
  int  s;
  };
 struct stu  t[30],*p;
 int i,k;
 for(i=0;i<30;i++)
       scanf("%d%s%d",&t[i].n,t[i].na,&t[i].s);
 k=0;
 for(i=1;i<30;i++)
       if(t[i].s>t[k].s)k=i;
 p=t+k;
 printf("%d  %s  %4d\n",p->n,p->na,p->s);
}

11.2  共用体

union    tt   
{ int  i;
   char  ch;
   float  f;
}; 
union  tt  a,b,c;
a.ch='x';
a.i=28;
a.f=6.6;
b=a;

11.3  枚举类型

enum  weekday{sun,mon,tue,wed,thu,fri,sat};
enum  weekday  day1,day2;
day1=sun;
day2=(enum  weekday)2;
scanf("%d",&n);
switch(n)
{case 1:day1=mon;break;
 case  2:day1=tue;break;
           ……    ……
}
printf("%d\n",day2);
switch(day1)
{case  mon: printf("mon\n");break;
           ……     ……
}

11.4  定义类型名

             typedef    已定义类型名   新类型名
             typedef   int   INTEGER;
             typedef   char  CH;
             INTEGER  i, j;
             CH  a,b;
             typedef   enum  weekday  WK;
             WK   day1,day2; 
             typedef   int   NUM[100];
             NUM   n;

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值