一 结构体变量做函数参数
#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;
}