Day27 结构体深入扩展学习

一 结构体变量做函数参数

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


typedef struct stu
{
	int id;
	char name[20];
	int age;
	float score;
}STU;

void scanf_struct(STU students[],int length);//函数声明必须放在结构体后面 
void print_struct(STU students[],int length);

int main()
{
	STU students[5];
	scanf_struct(students,5); 
	print_struct(students,5); 
}


void scanf_struct(STU students[],int length)
{
	int i;
	for(i=0;i<length;i++)
	{
		scanf("%d%s%d%f",&students[i].id,students[i].name,&students[i].age,&students[i].score);
	}
}

void print_struct(STU students[],int length)
{
	int i;
	for(i=0;i<length;i++)
	{
		printf("%d%s%d%f",students[i].id,students[i].name,students[i].age,students[i].score);
	}
}


STU max_struct(STU *pstudents,int length)
{
	int i;
	STU temp;
	float max_score = pstudents[0].score;
	for(i=0;i<length;i++)
	{
		if(max_score<pstudents[i].score)
		{
			max_score = pstudents[i].score;
			temp = pstudents[i];
		}
	}
	return temp;
}


STU min_struct(STU *pstudents,int length)
{
	int i;
	STU temp;
	float min_score = pstudents[0].score;
	for(i=0;i<length;i++)
	{
		if(min_score>pstudents[i].score)
		{
			min_score = pstudents[i].score;
			temp = pstudents[i];
		}
	}
	return temp;
}


STU find_id(STU *pstudents,int length,int id)
{
	int i;
	
	for(i=0;i<length;i++)
	{
		if(id == pstudents[i].id)
		{
			return pstudents[i];
		}
		else
		{
			printf("404 not found");
		}
	}
}

STU find_score(STU *pstudents,int length,float score)
{
	int i;
	STU temp = {0,NULL,0,0};
	for(i=0;i<length;i++)
	{
		if(score == pstudents[i].score)
		{
			return pstudents[i];
		}
		else
		{
			printf("404 not found score\n");
			return temp;
		}
	}
}


STU find_name(STU *pstudents,int length,char *pname)
{
	int flag = 0;
	STU temp = {0,NULL,0,0};
	int i;
	for(i=0;i<length;i++)
	{
		if(strcmp(pstudents[i].name,*pname)==0)
		{
			flag = 1;
			return pstudents[i];
		}
	}
		if(flag == 0)
	{	
		return temp;
	}	
}

按照名字排序(冒泡排序)

#include<stdio.h>
#include<string.h>

 typedef struct stu
{
 int id;
 char name[20];
}STU;

void scanf_student(STU student[],int length);
void print_student(STU student[],int length);
void name_student(STU student[],int length);

int main()
{
 STU student[5];
 printf("请输入学生的信息:");
 scanf_student(student,5);
 print_student(student,5);
 name_student(student,5);
 print_student(student,5);
 return 0;
 } 
 void scanf_student(STU student[],int length)
{
 int i;
 for(i=0;i<length;i++)
 {
  scanf("%d%s",&student[i].id,student[i].name);
 }
 
}
void print_student(STU student[],int length)
{
 int i;
 for(i=0;i<length;i++)
 {
  printf("%d,%s\n",student[i].id,student[i].name);
 } 
}
void name_student(STU student[],int length)
{
 int i,j;
 STU temp;    
 for (i = 0; i < length - 1; i++) {
        for (j = 0; j < length - 1 -i; j++) 
  {
            if (strcmp(student[j].name, student[j + 1].name)< 0) 
   {                
                temp = student[j];
    student[j] = student[j+1];
    student[j+1] = temp;
            }
        }
    }
}

结构体嵌套指针

C语言中结构体是一种构造类型,和数组、基本数据类型一样,可以定义指向该种类型的指针。结构体指针的定义类似其他基本数据类型的定义

当定义结构体时,如果结构体中的成员又是一个结构体,那么就称为结构体的嵌套。

嵌套结构体的初始化参照基本结构体的初始化方式,对结构体的元素分别进行初始化。

结构体中不可以嵌套自身的结构体,但是可以嵌套指向自身的指针。

例如;

typedef struct home
{
	int id;
	char name[20];
	char addr[20];
}HOME;

typedef struct per
{
	char name[20];
	int age;
	HOME *home;
}PER;
void scanf_struct(PER person[],int length);


int main()
{
	HOME home = {020,"xyh","西安"}; 
	PER person1 = {
	.name = "xyh",
	.age = 23;
	.home = &home
	},person2;
	printf("%s %d %d %s %s\n",person1.name,person2.age,person1.home->id,person1.home->name,person1.home->addr);
	return 0;
}

void scanf_struct(PER person[],int length)
{
	int i;
	for(i=0;i<length;i++)
	{
		scanf("%s%d%d%s%s",person[i].name,&person[i].age,&person[i].home->id,person[i].home->name,person[i].home->addr);
	}
}

void print_struct(PER person[],int length)
{
	int i;
	for(i=0;i<length;i++)
	{
		printf("%s %d %d %s %s\n",person[i].name,person[i].age,person[i].home->id,person[i].home->name,person[i].home->addr);	
	}
}

赋值方法:

void scanf_struct(PER person[],int length)
{
	int i;
	HOME home = {0,NULL,NULL};
	for(i=0;i<length;i++)
	{
		person[i].home = &home;	
//方法一: 
//		scanf("%s%d",person[i].name,&person[i].age);
//		scanf("%d%s%s",&home.id,home.name,home.addr);
//		person[i].home->id = home.id;
//		strcpy(person[i].home->name,home.name);
//		strcpy(person[i].home->addr,home.addr);	
//方法二: 
//		scanf("%s%d%d%s%s",person[i].name,&person[i].age,&home.id,home.name,home.addr);
//		person[i].home->id = home.id;
//		strcpy(person[i].home->name,home.name);
//		strcpy(person[i].home->addr,home.addr);		
		
//方法三: 	
		scanf("%s%d%d%s%s",person[i].name,&person[i].age,&person[i].home->id,person[i].home->name,person[i].home->addr);

	}
}

习题练习

//2. 编写一个程序,完成根据学员姓名查询成绩的功能(要求查询通过函数实现),
//定义一个学员结构体,包含姓名,成绩,定义一个结构体数组,保存所有学员的信息(假定有3个学生),
//首先录入学员信息,然后调用查询函数获得要查询学员成绩



typedef struct
{
	char name[20];
	float score;
}Stu;
 
void scan(Stu stu[],int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("请输入第%d个学生的姓名、成绩:\n",i+1);
		scanf("%s",&stu[i].name);
		scanf("%f",&stu[i].score);
	}
}
 
void find (Stu stu[],int length)
{
	int i,j=1;
	char name[20];
	printf("请输入要查找的学生名字:");
	getchar();
	gets(name);
	for(i=0;i<length;i++)
	{
		j=strcmp(name,stu[i].name);
		if(j==0)
		{
			printf("该同学的成绩为%.2f\n",stu[i].score);
			break;
		}
	}
	if(i==length)
		printf("哒咩~"); 
}
 
int main()
{
	int num;
	printf("请输入学生人数:");
	scanf("%d",&num);
	Stu stu[num];
	scan(stu,num);
	find(stu,num);
	
	return 0;
} 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值