C语言第九课:结构体

一、定义结构体

例如:

struct student
{
    int xuehao;
    char name[30];
    char xingbie;
    float chengji;
}
struct student a={001,"Houge",'M',99};

当我们在程序的开头定义好这样一个结构体以后,在执行程序的时候,就可以定义这个结构体所对应的变量了。比如定义一个结构体变量a。当定义某一个变量是属于这个结构体变量的时候,其实就是代表变量a中包含了xuehao,name,xingbie,chengji这四个要素了。当我们给一个结构体变量赋上值以后,我们要表示这个结构体变量的要素的时候,就是这样表示:a.xuehao=001;a.name="Houge";a.xingbie='M';a.chengji=99;

当然,上面的形式还可以简化一下,写成这样:

struct student
{
    int xuehao;
    char name[30];
    char xingbie;
    float chengji;
}a={001,"Houge",'M',99};

明白结构体的基本知识以后,我们来看一道题:

例:输入两个学生的学号、姓名和成绩,输出成绩较高者的学号、姓名和成绩。若二者相等,则输出两个学生的全部信息。

#include<stdio.h>

struct student
{
	int xuehao;
	char name[30];
	float chengji;
}a,b;

int main()
{
	printf("请输入第一个学生的学号、姓名和成绩:\n");
	scanf("%d,%s,%f",&a.xuehao,a.name,&a.chengji);
	printf("请输入第二个学生的学号、姓名和成绩:\n");
	scanf("%d,%s,%f",&b.xuehao,b.name,&b.chengji);
	printf("成绩较高者的信息如下:\n");
	if(a.chengji>b.chengji)
	{
		printf("%d\t%s\t%f\n",a.xuehao,a.name,a.chengji);	
	}
	else if(a.chengji<b.chengji)
	{
		printf("%d\t%s\t%f\n",b.xuehao,b.name,b.chengji);
	}
	else
	{
		printf("%d\t%s\t%f\n",a.xuehao,a.name,a.chengji);
		printf("%d\t%s\t%f\n",b.xuehao,b.name,b.chengji);
	}
	
	return 0;
} 

注意:如果是把某一个字符串输入到某个数组里,是没有“&”符号的。

二、结构体数组

例如:

struct student
{
	int xuehao;
	char name[30];
	float chengji;
}xuesheng[3]={{001,"HouBoShi",99},{002,"ShaPaoZi",20},{003,"ShaLeBaJi",90}};

上面我们定义的xuesheng[3]这个数组是结构体型。意思就是以下三个变量都是结构体型的:

  1. xuesheng[0].xuehao=001; xuesheng[0].name="HouBoShi"; xuesheng[0].chengji=99;
  2. xuesheng[1].xuehao=002; xuesheng[1].name="ShaPaoZi"; xuesheng[1].chengji=20;
  3. xuesheng[2].xuehao=003; xuesheng[2].name="ShaLeBaJi"; xuesheng[2].chengji=90;

明白这些以后,我们来看一到练习:

例:有三名学生的3项信息:学号、姓名和成绩。请编程按成绩由高到低输出各学生的信息。信息为:001,HouBouShi,99; 002,ShaPaoZi,20; 003,ShaLaBaJi,90。

这题我们可以用选择排序的方法来做。需要注意的是,必须定义一个临时的结构体变量。

#include<stdio.h>

struct student
{
	int xuehao;
	char name[30];
	float chengji;
}xuesheng[3]={{001,"HouBoShi",99},{002,"ShaPaoZi",20},{003,"ShaLeBaJi",90}};

int main()
{
	struct student linshi;
	int i,j;
	for(i=0;i<2;i++)
	{
		for(j=i+1;j<3;j++)
		{
			if(xuesheng[j].chengji>xuesheng[i].chengji)
			{
				linshi=xuesheng[i];
				xuesheng[i]=xuesheng[j];
				xuesheng[j]=linshi;
			}
		}
	}
	printf("排序后的各学生信息如下:\n");
	for(i=0;i<3;i++)
	{
		printf("%d\t%s\t%f\n",xuesheng[i].xuehao,xuesheng[i].name,xuesheng[i].chengji);
	}
	
	return 0;
}

三、使用结构体变量做函数参数

例:键盘输入五名学生的信息(包括学号、姓名和2门课程的成绩),并输出平均分最高的学生的信息。

#include<stdio.h>

struct student
{
	int xuehao;
	char name[30];
	float fen1;
	float fen2;
}sheng[5];

int main()
{
	//因为max()函数返回的结果是结构体信息,并且赋值给了一个结构体,所以它是结构体型。 
	struct student max(struct student a[]); 
	struct student xueba;//定义一个新的结构体变量 xueba 
	int i;
	for(i=0;i<=4;i++)
	{
		printf("请输入第%d名学生的学号、姓名和2门成绩:\n",i+1);
		scanf("%d,%s,%f,%f",&sheng[i].xuehao,sheng[i].name,&sheng[i].fen1,&sheng[i].fen2);
	}
	//只需在括号里输入结构体数组的名字,就能自动判断这个数组里所有变量的平均分,
	//并且选出平均分最大的那个变量 。然后将这个变量的所有信息都赋值到xueba这个新的结构体变量。 
	xueba=max(sheng);
	printf("平均分最高的学生的信息如下:\n");
	printf("学号:%d\n姓名:%s\n2门成绩:%f,%f\n",xueba.xuehao,xueba.name,xueba.fen1,xueba.fen2);
	
	return 0;
} 

struct student max(struct student a[])
{
	float pingjunfen[5];
	int i,zuigao;
	for(i=0;i<=4;i++)
	{
		pingjunfen[i]=(a[i].fen1+a[i].fen2)/2;
	}
	for(zuigao=0,i=1;i<=4;i++)
	{
		if(pingjunfen[zuigao]<pingjunfen[i])
		{
			zuigao=i;
		}
	}
	
	return(a[zuigao]);
}

四、结构体变量与指针变量

例1:把一个学生的信息(包括学号、姓名、性别3项信息)放在一个结构体变量中,然后输出这个学生的信息。

#include<stdio.h>

struct student
{
	int xuehao;
	char name[30];
	char xingbie;
}a={001,"Houge",'M'};

int main()
{
	struct student *p;//定义一个结构体的指针
	p=&a;//让指针与定义号的结构体变量相关联 
	printf("学号:%d\n姓名:%s\n性别:%c\n",(*p).xuehao,(*p).name,(*p).xingbie);
	//还可以写成这个形式:printf("学号:%d\n姓名:%s\n性别:%c\n",p->xuehao,p->name,p->xingbie);	
	return 0;
}

例2:有三名学生的3项信息:学号、姓名和成绩。请编程按成绩由高到低输出各学生的信息。

#include<stdio.h>

struct student
{
	int xuehao;
	char name[30];
	float chengji;
}xuesheng[3]={{001,"HouBoShi",99},{002,"ShaPaoZi",20},{003,"ShaLeBaJi",90}};

int main()
{
	struct student linshi,*p;//定义结构体指针
	p=&xuesheng[0];//让指针与结构体变量的第一个元素相关联 
	//所以 p+1=&xuesheng[1],p+2=&xuesheng[2],p+i=&xuesheng[i],p+j=&xuesheng[j] 
	int i,j;
	for(i=0;i<2;i++)
	{
		for(j=i+1;j<3;j++)
		{
			if((*(p+j)).chengji>(*(p+i)).chengji)
			{
				linshi=*(p+i);
				*(p+i)=*(p+j);
				*(p+j)=linshi;
			}
		}
	}
	printf("排序后的各学生信息如下:\n");
	for(i=0;i<3;i++)
	{
		printf("%d\t%s\t%f\n",(*(p+i)).xuehao,(*(p+i)).name,(*(p+i)).chengji);
	}
	
	return 0;
}
发布了13 篇原创文章 · 获赞 15 · 访问量 2161

猜你喜欢

转载自blog.csdn.net/weixin_44337241/article/details/104377743
今日推荐