结构体的学习

实际运用情况:有许多信息是由多个不同类型的数据组合在一起的,这些不同类型的数据是相互联系组成一个有机的整体,我们引出了一种新的构造类型数据——结构体;
结构体的作用:结构体和数组一样,也是一种构造型数据类型;是用户自己定义的新数据类型。
在结构体中可以包含若干个不同数据类型和不同意义的数据项,从而使这些数据组合起来反应某一信息。(在某些层面上和JAVA中的类有几分相像)结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储
情形一:
struct 结构体名
{
变量类型 成员变量名;
变量类型 成员变量名;
—— —— ——
}变量名

情形二: (结构体名为空)
struct
{
变量类型 成员变量名;
变量类型 成员变量名;
—— —— ——
}变量名
省略结构体名,称为无名结构体,这种情况一般出现在函数内部;
情形一二区别是情形二结构体名为空,后面就没法用该结构体定义新的变量;

#include <stdio.h>
#include <stdlib.h>
#define N 20
int main(int argc, char *argv[]) {
//声明结构体 
 struct a
{
	 int age;
	 char name[N];
}e1,e2;
	 struct a e3;
	 printf("请输入学员1年龄:");
	 scanf("%d",&e1.age);
	 printf("请输入学员1姓名:");
	 scanf("%s",&e1.name);
	 printf("请输入学员2年龄:");
	 scanf("%d",&e2.age);
	 printf("请输入学员2姓名:");
	 scanf("%s",&e2.name);
	 printf("请输入学员3年龄:");
	 scanf("%d",&e3.age);
	 return 0;
}


情形三:
struct 结构体名
{
变量类型 成员变量名;
变量类型 成员变量名;
—— —— ——
}
main函数中: struct 结构体名 声明变量名;

#include <stdio.h>
#include <stdlib.h>
#define N 20
struct a
{
 int age;
 char name[N];
};
int main(int argc, char *argv[]) {
 struct a e1, e2; 
 printf("请输入学员1年龄:");
 scanf("%d",&e1.age);
 printf("请输入学员1姓名:");
 scanf("%s",&e1.name);
 printf("请输入学员2年龄:");
 scanf("%d",&e2.age);
 printf("请输入学员2姓名:");
 scanf("%s",&e2.name);
 return 0;
}

情形四:结构体的套接;
无论结构体嵌套了多少个结构体,都是从最外层依次通过 “.” 来调用最内层的结构体。
成员本身又属于一个结构体类型,则要用若干个成员运算符一级一级的找到最低一级,只能对最低一级成员进行赋值或存取以及运算。
嵌套最内层的结构体声明变量需要在其母结构体中声明

#include <stdio.h>
#include <stdlib.h>
#define N 20
//声明结构体
struct a
{
	 int age;
	 char name[N];
	 struct b
	 {
	  	char h_1[N];
	 }q;
	 struct b q_1;
};
int main(int argc, char *argv[]) {
 struct a e1, e2; 
 printf("请输入学员1所在的班级:");
 scanf("%s",e1.q.h_1);
 printf("请输入学员1所在的小组:");
 scanf("%s",e1.q_1.h_1);
 printf("请输入学员1年龄:");
 scanf("%d",&e1.age);
 printf("请输入学员1姓名:");
 scanf("%s",&e1.name);
 printf("请输入学员2所在的班级:");
 scanf("%s",e2.q.h_1);
 printf("请输入学员2所在的小组:");
 scanf("%s",e2.q_1.h_1);
 printf("请输入学员2年龄:");
 scanf("%d",&e2.age);
 printf("请输入学员2姓名:");
 scanf("%s",&e2.name);
 return 0;
}

情形五:结构体数组结合结构体嵌套;
数组,顾名思义就是存储多个相同数据类型的变量,结构体中的数组一般运用也是存储多个变量名,方便多组数据对结构体的套用;
详解见代码:

#include <stdio.h>
#include <stdlib.h>
#define N 20

//结构体数组问题
//实现求两个小组的平均成绩,以及及格人数; 
 struct a
{
 int age;
 char name[N];
 struct b
 {
  int h_1[3];
 }q[2]; 
};
int main(int argc, char *argv[]) {
 struct a e1; 
 printf("请输入学员1年龄:");
 scanf("%d",&e1.age);
 printf("请输入学员1姓名:");
 scanf("%s",&e1.name);
 printf("请输入学员1班级两个组的成绩:\n"); 
 int i,j;
 for(i=0;i<2;i++){
  printf("第%d组:",i+1);
  for(j=0;j<3;j++){
  scanf("%d",&e1.q[i].h_1[j]); 
  }
 }
 int m,n,s;
 float avg[2]={0,0};
 int sum[2]={0,0};
  for(m=0;m<2;m++){
   for(n=0;n<3;n++){
   avg[m]+=e1.q[m].h_1[n];
   if(e1.q[m].h_1[n]>=60){
    sum[m]++;
   } 
  }
  avg[m]/=3;
  printf("第%d组的平均成绩: %.2lf",m+1,avg[m]);
  printf("   及格人数:%d \n",sum[m]);
 }
 return 0;
}


情形六:结构体指针
个人理解:当定义一个较大的结构体数组时,用结构体指针对变量名操作较方便,基本用法与我们平时用的指针相同。
指针类型:struct 结构体名 *p;
然后通过指针调用结构体中某一量;
代码如下:

#include <stdio.h>
#include <stdlib.h>
#define N 20
struct a{
    char *name;   
    int age;  
    char *group;  
    float score;  
}q[] = {
    {"刘虎",20,"三组",90},
    {"李洋", 18, "五组", 85.5},
};
void avg(struct a *p, int l);
int main(int argc, char *argv[]){
    int l = sizeof(q) / sizeof(struct a);
    avg(q, l);
    return 0;
}
void avg(struct a *p, int l){
    int i, num = 0;
    float sum = 0;
    for(i=0; i<l; i++){
        sum+=(p+i)->score; 
        if((p+i)->score>=90){
         num++;
         printf("优秀学生:%s\n",(*(p+i)).name);
  }
    }
    sum/=2;
    printf("两人的平均成绩:%.2lf\n",sum);
 printf("优秀人数:%d",num);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值