C语言结构体

1.定义和使用结构体变量

1.1 建立结构体类型

声明一个结构体类型的一般形式为:

struct 结构体名
{
成员列表
}

花括号内是该结构体所包括的子项,成为结构体的成员,下例中的num、name、score等都是成员。对各成员都应进行声明,即

类型名 成员名;

1.2 定义结构体类型变量

建立了结构体类型以后,它只相当于一个模型,并没有定义变量,其中并无具体的数据,系统对之也不分配存储单元。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。共有三种方法:

  1. 先声明结构体类型,再定义该类型的变量
struct Student student1, student2
  1. 在声明类型的同时定义变量

声明类型个定义变量放在一起进行,能够直接看到结构体中的结构,在写小程序时用此方式比较方便。

struct Student
{
	int num;
	char name[20];
	int score;
}student1,student2;
  1. 不指定类型名而直接定义结构体类型变量

指定一个无名结构体类型,它没有名字,显然不能再以此结构体类型去定义其他变量。

struct 
{
	int num;
	char name[20];
	int score;
}student1,student2;
1.3 结构体变量的初始化和引用

在定义结构体变量时可以对它的成员初始化。初始化列表是用花括号括起来的一些常量,这些常量依次赋给结构体变量中的成员。注意:是对结构体变量初始化,而不是对结构体类型初始化。

struct Student
{
  int num;
  char name[20];
  char sex;
  float score;
}a={10532,"pual",'M',100};

此外,也可以引用结构体变量中成员的值,引用方式为:

结构体变量名 . 成员名

注意:不能企图输出结构体变量名达到输出结构体变量所有成员的值。只能对结构体变量中的各个成员分别进行输入输出。

printf("%s\n",student1); //错误

如果成员本身又属于一个结构体类型,则要用若干成员运算符,一级一级地找到最低一级的成员。只能对最低级的成员进行赋值或存取以及运算。

1.4 结构体应用举例

输入两个学生的学号、姓名和成绩,输出成绩较高的学生的学号、姓名和成绩。

#include<stdio.h>
struct Date  //时间,练习用
{
  int year;
  int month;
  int day;
};
struct Student
{
  int num;
  char name[20];
  float score;
  struct Date in;
};
int main()
{
    struct Student student1;
    struct Student student2;
    student1.in.year=student2.in.year=2019;
	student1.in.month=student2.in.month=3;
	student1.in.day=student2.in.day=10;
    //在student1.name前面没有&号,因为name是数组名,本身就代表地址,不能画蛇添足再加一个& 
    printf("请输入学生1信息:");
    scanf("%d%s%f",&student1.num,student1.name,&student1.score);
    printf("请输入学生2信息:");
    scanf("%d%s%f",&student2.num,student2.name,&student2.score);
    if(student1.score > student2.score)
        printf("num:%d  name:%s  score:%.1f\n",student1.num,student1.name,student1.score);
    else if(student1.score < student2.score) 
        printf("num:%d  name:%s  score:%.1f\n",student2.num,student2.name,student2.score);
    else
    {
    	printf("num:%d  name:%s  score:%.1f\n",student1.num,student1.name,student1.score);
    	printf("num:%d  name:%s  score:%.1f\n",student2.num,student2.name,student2.score);
	}
	printf("入学时间:\n");
	printf("student1:\n year:%d,month:%d,day:%d \n",student1.in.year,student1.in.month,student1.in.day);
	printf("student2:\n year:%d,month:%d,day:%d \n",student2.in.year,student2.in.month,student2.in.day);
    return 0;
}


2.使用结构体数组

2.1 定义结构体数组
  1. 定义结构体数组的一般形式是两种形式:

struct 结构体名
{
成员列表
} 数组名[数组长度]

struct Person
{
	char name[20];
	int count
}leader[3];

也可以先声明一个结构体类型(如struct Person),然后再用此类型定义结构体数组

结构体类型 数组名[数组长度]

struct Person leader[3];
  1. 对结构体数组初始化的形式是在定义数组的后面加上:

= { 初值列表 }

struct Person leader[3]={"Li",3,"zhang",4,"Bi",100};
2.2 结构体数组应用举例
  1. 有n个学生信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。
#include<stdio.h>
struct Info
{
	int num;
	char name[20];
	int score;
};
int main()
{
	struct Info stu[5]={{1,"li",78},{2,"bi",100},{3,"sun",44},{4,"qi",90},{5,"zhou",88}};
	struct Info temp;
	const int n=5;
	int i,j,k;
	int flag=0;
	for(i=0;i<n-1;i++)
	{
		flag=0;  //表示本趟冒泡是否发生了交换 
		for(j=i;j<n;j++)   //一趟冒泡过程 
		{
			if(stu[j].score < stu[j+1].score) //若为逆序 
			{
				temp=stu[j];
				stu[j]=stu[j+1];
				stu[j+1]=temp;
				flag=1;
			}
		}
		if(flag==0)   //本趟遍历未发生交换 
			break;
	}
	for(k=0;k<n;k++)
		printf("%d %s %d \n",stu[k].num,stu[k].name,stu[k].score);
	return 0;
}
  1. 从键盘输入一组学生信息(学号、姓名、高考英语成绩、高考数学成绩、高考语文成绩),计算每个学生3门课程的平均成绩,并按照平均成绩由高到低排序。(输入以三门课的成绩都为0结束)
#include<stdio.h>
#define n 100
struct Info
{
	int num;
	char name[20];
	int english;
	int math;
	int chinese;
	int average;
};
int main()
{
	struct Info stu[n];
	struct Info temp;
	int i,j;
	int count=0; 
	int flag=0;
	for(i=0;i<n;i++)
	{
		scanf("%d%s%d%d%d",&stu[i].num,stu[i].name,&stu[i].chinese,&stu[i].math,&stu[i].english);
		if(stu[i].chinese==0&&stu[i].math==0&&stu[i].english==0)
			break;
		else
			count+=1; 
	}
	for(i=0;i<count;i++)
		stu[i].average=(stu[i].chinese+stu[i].math+stu[i].english)/3;
	for(i=0;i<count-1;i++)
	{
		flag=0;
		for(j=i;j<count;j++)
		{
			if(stu[j].average<stu[j+1].average)
			{
				temp=stu[j];
				stu[j]=stu[j+1];
				stu[j+1]=temp;
				flag=1;
			}
		}
		if(flag==0)
			break;
	}
	for(i=0;i<count;i++)
		printf("%d %s\n",stu[i].num,stu[i].name);
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值