C语言经典例题-结构体
创始人
2025-05-30 02:42:46

  (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)

目录

第1关:结构体变量的初始化和引用:

题目:

代码思路:

代码表示:

第2关:结构体排序 

题目:

代码思路:

这题和上一题的 http://t.csdn.cn/wRK6M代码表示:

第3关:结构体存储数据:

题目:

代码思路:

代码表示:

 第4关:结构体存储学生信息:

题目:

代码思路:

代码表示: 


第1关:结构体变量的初始化和引用:

题目:

本关任务:从键盘输入两个学生的学号,姓名和成绩(整数),分别存入结构体中,输出成绩较高的学生的学号,姓名和成绩。

测试输入:

14308100238 xiaowang 99

15408122584 xiaoli 78

预期输出:

14308100238 xiaowang 99

代码思路:

结构体的定义

定义格式为:

struct <结构体类型名>
{
<成员表>
}; //分号结束定义

例如,以下是一个描述学生信息的结构体类型定义:

struct student
{long number;char name[20];char sex;float score;
};

在这个结构体定义中,结构体类型名为student,该结构体由4个成员组成。第一个成员为number,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应该注意在花括号后的分号是不可少的

声明结构体变量

声明结构体变量有四种方式,他们在本质上没什么区别,可根据自己习惯和要求选择你喜欢的方式:

1.先定义结构体,再声明结构体变量

struct student{long number;char name[20];char sex;float score;
};    //先定义结构体
struct student s1,s2;//声明结构体变量

2. 在定义结构体类型的同时声明结题变量

struct student{long number;char name[20];char sex;float score;
}s1,s2;    //在定义结构体的同时定义结构体变量

3.直接声明结构体变量 

struct
{    //省去结构体名long number;char name[20];char sex;float score;
}s1,s2;    //直接给出结构体变量

4.typedef引用别名来定义 

typedef struct student STUDENT;     //给结构体student定义别名
struct student
{long number;char name[20];char sex;float score;
};
STUDENT s1,s2;    //使用别名STUDENT定义结构体

结构体变量初始化

在定义结构体变量的同时可以对其进行初始化,格式与数组变量初始化类似,用花括号吧每个成员的初始值括起来,每个初始值与相应的成员对应。

例如,对student结构体类型的变量s1进行初始化:

struct student s1={2010001,"lili",'F',97};

在定义结构体类型是不能对其成员进行初始化,因为类型不是程序运行时的实体,不会给他们分配内存空间,因此,对其初始化没有意义。

在了解完结构体的相关知识点后,本题就迎刃而解了,这里我采用的是结构体数组,在创建完结构体后在main函数中将数据输入其中即可

代码表示:

#include
struct Student
{long int num;char     name[20];int      score;
} student[2];
int main()
{for (int i = 0; i < 2; i++){scanf("%ld %s %d", &student[i].num, student[i].name, &student[i].score);}if (student[0].score > student[1].score){printf("%ld %s %d", student[0].num, student[0].name, student[0].score);}else if (student[0].score < student[1].score){printf("%ld %s %d", student[1].num, student[1].name, student[1].score);}return 0;}

第2关:结构体排序 

题目:

本关任务:有n个学生的信息(包括学号,姓名,成绩),要求按照成绩的高低顺序输出学生的信息。

测试输入:

5

10101 Zhang 78

10103 Wang 98

10106 Li 86

10108 Ling 73

10110 Sun 100

预期输出:

10110 Sun 100

10103 Wang 98

10106 Li 86

10101 Zhang 78

10108 Ling 73

代码思路:

这题和上一题的相比,数组内元素的比较更难一点,我们这里采用冒泡排序(http://t.csdn.cn/0XtSa)的方法,将结构体中的成绩进行排序,最后将其打印 

这题和上一题的 http://t.csdn.cn/wRK6M代码表示:

#include
struct student
{int   num;char  name[20];int   score;};
void input(int n, struct student s[])
{int i;for (i = 0; i < n; i++){scanf("%d %s %d", &s[i].num, s[i].name, &s[i].score);}
}void swap(int n, struct student s[])
{int i, j, t;struct student temp;for (j = 0; j < n - 1; j++){for (i = 0; i < n - 1 - j; i++)if (s[i].score < s[i + 1].score){temp = s[i];s[i] = s[i + 1];s[i + 1] = temp;}}for (i = 0; i < n; i++){printf("%d %s %d", s[i].num, s[i].name, s[i].score);printf("\n");}
}int main()
{int n;scanf("%d", &n);struct student s[100];void input(int n, struct student s[]);void swap(int n, struct student s[]);input(n, s);swap(n, s);return 0;
}

第3关:结构体存储数据:

题目:

本关任务:有三个候选人,每个选民只能投一票,写一程序,用结构体存储数据,求出得票结果。

三个候选人为"Li", "Zhang","Sun"。

测试输入:

10

Li

Li

Sun

Zhang

Zhang

Sun

Li

Sun

Zhang

Li

预期输出:

Li:4

Zhang:2

Sun:3

代码思路:

这题的难点在于如何判断并打印出得票数,我们可以直接在结构体中创建一个得票数,将其初始化为0,再用for循环统计每个人的投票,然后用strcmp()函数判断投票的对象,并将其的number++,最后打印即可

代码表示:


#include
#include
struct voter
{char name[20];int number;
};
int main(void)
{struct voter v[3] = { {"Li",0},{"Zhang",0},{"Sun",0} };int i, j;char lover[20];int n;scanf("%d", &n);for (i = 0; i < n; i++){scanf("%s", lover);for (j = 0; j < 3; j++){if (strcmp(lover, v[j].name) == 0)v[j].number++;}}for (i = 0; i < 3; i++)printf("%s:%d\n", v[i].name, v[i].number);return 0;
}

 第4关:结构体存储学生信息:

题目:

本关任务:使用结构体储存学生信息(包括学号,姓名,3门课程成绩,总分),要求实现对学生信息修改和删除操作,最多50名学生。

测试输入:

10 3

1 Siyu 90 90 90

2 Amy 60 70 94

3 Jack 60 60 98

4 Jack 77 90 60

5 Banana 60 60 40

6 White 60 60 60

7 Pinkman 60 60 60

8 Fring 60 60 70

9 Ehrmantraut 80 63 61

10 Schrader 99 66 100

1 Jack

2 1 100 100 100

3 10

预期输出:

3 Jack 60 60 98 218

4 Jack 77 90 60 227

1 Siyu 100 100 100 300

2 Amy 60 70 94 224

3 Jack 60 60 98 218

4 Jack 77 90 60 227

5 Banana 60 60 40 160

6 White 60 60 60 180

7 Pinkman 60 60 60 180

8 Fring 60 60 70 190

9 Ehrmantraut 80 63 61 204

10 Schrader 99 66 100 265

1 Siyu 100 100 100 300

2 Amy 60 70 94 224

3 Jack 60 60 98 218

4 Jack 77 90 60 227

5 Banana 60 60 40 160

6 White 60 60 60 180

7 Pinkman 60 60 60 180

8 Fring 60 60 70 190

9 Ehrmantraut 80 63 61 204

代码思路:

我们先来分析一下题意吧,题目要求我们首先输入n和q,n表示学生的总数,q表示额外操作的数量,如上例题,n=10,表示要输入10个学生的信息,q=3,即有3个额外操作。

而额外操作又分为三种:

当输入1时,表示通过姓名查找学生信息

当输入2时,表示通过学号修改学生信息

当输入3时,表示通过学号删除学生信息

这题的主函数代码题目已经给出,我们只需要补全结构体代码即可

查找学生信息:只需要在遍历时用strcmp判断学生姓名与结构体中的name是否相同,然后打印出相同情况(我们这里暂时不考虑找不到name的情况)

删除学生信息:只需要通过for循环用strcmp找到对应的学号,然后break跳出循环,并将该学号后面的学号依次前移,覆盖前面一个学号,达到删除的目的(也暂时不考虑找不到的情况)

修改学生信息:和上面一样,通过遍历和strcmp找到对应的学号,将其内容修改即可。

如果大家向更加深入探讨有关储存信息类的问题(考虑找不到信息的情况),可以看我之前的博客通讯录(http://t.csdn.cn/I0kVV)

代码表示: 

#include
#include
int Count;struct student
{char sno[20], name[20];int math, english, chinese, sum;
};void print(struct student stu)
{printf("%s %s %d %d %d %d\n", stu.sno, stu.name, stu.math, stu.english, stu.chinese, stu.sum);
}void query_stu(struct student s[], char* name)
{for (int i = 0; i < Count; i++){if (strcmp(s[i].name, name) == 0)print(s[i]);}
}void delete_stu(struct student s[], char* sno) 
{int i = 0;for (; i < Count; i++){if (strcmp(s[i].sno, sno) == 0)break;}for (; i < Count - 1; i++){s[i] = s[i + 1];}}void update_stu(struct student s[], char* sno, int math, int english, int chinese) 
{for (int i = 0; i < Count; i++){if (strcmp(s[i].sno, sno) == 0){s[i].math = math;s[i].english = english;s[i].chinese = chinese;s[i].sum = s[i].math + s[i].english + s[i].chinese;}}
}int main(void)
{int n, q;struct student students[50];scanf("%d%d", &n, &q);Count = n;for (int i = 0; i < n; i++) {scanf("%s%s%d%d%d", students[i].sno, students[i].name, &students[i].math, &students[i].english, &students[i].chinese);students[i].sum = students[i].math + students[i].english + students[i].chinese;//求总成绩}while (q--) {int op;scanf("%d", &op);char sno[20], name[20];if (op == 1) {scanf("%s", name);query_stu(students, name);}else if (op == 2) {int a, b, c;scanf("%s%d%d%d", sno, &a, &b, &c);update_stu(students, sno, a, b, c);for (int i = 0; i < Count; i++)print(students[i]);}else {scanf("%s", sno);delete_stu(students, sno);for (int i = 0; i < Count - 1; i++)print(students[i]);}}return 0;
}

相关内容

热门资讯

2025北京旅游避坑指南:北京... 作为一名在文旅圈摸爬滚打十年的运营老兵,我见过太多满怀期待来北京,最后却败兴而归的案例。 “想去故宫...
行业内正规的青海导游培训品牌哪... 行业内正规的青海导游培训品牌哪家靠谱? 在旅游业蓬勃发展的今天,青海以其壮丽的自然风光和深厚的文化...
如何办理赴美旅游签证?——线上... 赴美旅游是许多人心中的梦想,而成功获得B1/B2旅游签证则是实现这一梦想的第一步。近年来,随着数字化...
狮子乘花轿巡游?动物园:在排练... (来源:新安晚报) 转自:新安晚报 动物园彩排狮王巡游表演节目(截自视频)。 本报讯 12月28...