一些结构体的运用实例

最近快要期末考试了,也没什么特别多时间去学习新的知识,只能好好复习一些学过的知识并加以运用。
下面是一些实例(根据从易到难的顺序排列):

1.定义5个学生结构体类型(姓名、学号、三门课的成绩(高数、英语、C语言)、平均分);输入该生的上述信息并输出。

#include <stdio.h>
typedef struct student
{
	char name[20];
	int id;
	int score[3];
	float aver;
}STUDENT;
void Input(STUDENT *p)
{
	scanf("%s%d%d%d%d",&p->name,&p->id,&p->score[0],&p->score[1],&p->score[2]);
	p->aver=(p->score[0]+p->score[1]+p->score[2])/3.0;
}
int main()
{
	STUDENT st;
	printf("请输入姓名,学号,三门课成绩:\n");
	Input(&st);
	printf("该学生的信息为:\n");
	printf("%s\t%d\t%d\t%d\t%d\t%5.2f\n",st.name,st.id,st.score[0],st.score[1],st.score[2],st.aver);
	return 0;
}

2.用结构体数组存储学生信息,每个学生有姓名、学号、性别和成绩。输入5名学生信息,按成绩从高到低的顺序输出各学生的全部信息,并将学生信息存入磁盘文件student.txt。


#include <stdio.h>
#include <stdlib.h>
#define N 5
struct student
{
	char name[20];
	int id;
	char sex[8];
	int s;
};
void Input(struct student st[])
{
	int i;
	for(i=0;i<5;i++)
		scanf("%s%d%s%d",st[i].name,&st[i].id,st[i].sex,&st[i].s);
}
void change(struct student st[])
{
	int i,j,k;
	struct student t;
	for(i=0;i<5-1;i++)
	{
		k=i;
		for(j=i+1;j<5;j++)
			if(st[k].s<st[j].s)
				k=j;
			if(k!=i)
			{
				t=st[k];
				st[k]=st[i];
				st[i]=t;
				k=1;
			}
	}
}

int main()
{
	FILE *fp;
	int i;
	struct student st[N];
	printf("请输入学生的姓名,学号,性别,成绩:\n");
	fp=fopen("student.txt","wt");
	Input(st);
	change(st);
	printf("五人的信息为:\n");
	for(i=0;i<5;i++)
		printf("%s\t%d\t%s\t%d\n",st[i].name,st[i].id,st[i].sex,st[i].s);
	for(i=0;i<5;i++)
		fprintf(fp,"%s\t%d\t%s\t%d\n",st[i].name,st[i].id,st[i].sex,st[i].s);
	fclose(fp);
	fp=fopen("student.txt","rt");
	fclose(fp);
	return 0;
}

注意:在交换数据时,我在第一次打代码时遇到了一个很常见的问题。就是在通过成绩比较时,只交换了成绩而其余信息并未被交换,导致数据错乱。所以在交换时应交换整个结构体数组,而不是只交换数组中的某一项。

3.建立班级通讯录,每个人的信息形式如下:
姓名 性别 手机 QQ 班级 宿舍
zhangsan 男 13300001111 23784987223 网络1803 1-101
lisi 男 17711110000 43223445344 计科1801 1-203
liqingzhao 女 18991902100 98234523121 计科1802 2-305
wangwu 男 13305782314 52390823349 网络1804 1-603
要求从键盘读入学生信息,并按姓名排序,再将学生信息存入磁盘文件student_list.txt。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 20
struct student
{
	char name[20];
	char sex[5];
	char qq[15];
	char number[15];
	char clas[20];
	char sushe[20];
};
int main()
{
	FILE *fp;
	struct student t;
	struct student txl[N];
	int i,n,j;
	printf("请输入学生人数:\n");
	scanf("%d",&n);
	printf("请输入这几个学生的通讯信息并将这几个学生的通讯信息录入文件'student_list.txt'中\n");
	printf("(请按照 姓名、性别、手机、qq、班级、宿舍号的顺序写~)\n");
	for(i=0;i<n;i++)
	{
	scanf("%s%s%s%s%s%s",&txl[i].name,&txl[i].sex,&txl[i].number,&txl[i].qq,&txl[i].clas,&txl[i].sushe);
	} 
	for(i=0;i<n-1;i++)
	{
		for(j=0;j<n-i-1;j++)
		{
			if (strcmp(txl[j].name,txl[j+1].name)>0)
			{
				t=txl[j];
				txl[j]=txl[j+1];
				txl[j+1]=t;
			}
		}
	}
	fp=fopen("student_list.txt","w");
	for(i=0;i<n;i++)
	{
	fprintf(fp,"%s %s %s %s %s %s\n",txl[i].name,txl[i].sex,txl[i].number,txl[i].qq,txl[i].clas,txl[i].sushe);
	}
	fclose(fp);
	printf("文件数据已经保存在相关文件夹中!请前往查看!\n");
	return 0;
}

注意:在根据姓名排序时,不能直接用“<、>、=”进行比较,而应该运用strcmp()函数进行比较。

谢谢阅读 ~~如有不妥,请多指正!

猜你喜欢

转载自blog.csdn.net/weixin_44109905/article/details/85848065