技术讲解:
结构体数组是C语言中一种复合数据类型,它结合了结构体的灵活性和数组的有序集合特性,允许你定义一组具有相同结构的数据项。结构体定义了一组不同数据类型的变量集合,而结构体数组则是这种结构的连续内存块,每个元素都是该结构类型的实例。这种方式特别适合管理具有相似属性的对象集合,如学生信息、员工记录等。
定义结构体数组
首先,你需要定义一个结构体类型,然后声明一个该结构体类型的数组。以下是一个简单的例子,定义了一个存储学生信息的结构体数组:
C
1#include <stdio.h> 2 3// 定义一个结构体类型 Student 4typedef struct { 5 int id; // 学生ID 6 char name[50]; // 姓名 7 float score; // 成绩 8} Student; 9 10int main() { 11 // 声明一个包含3个元素的Student结构体数组 12 Student students[3]; 13 14 // 初始化数组元素 15 students[0] = {1, "Alice", 89.5}; 16 students[1] = {2, "Bob", 92.0}; 17 students[2] = {3, "Charlie", 78.8}; 18 19 // 访问和打印结构体数组的元素 20 for(int i = 0; i < 3; i++) { 21 printf("Student ID: %d, Name: %s, Score: %.2f\n", 22 students[i].id, students[i].name, students[i].score); 23 } 24 25 return 0; 26}
特点与应用
- 数据组织:结构体数组使得同类数据的组织和访问变得直观和高效,特别适合处理固定大小的同构数据集。
- 内存布局:结构体数组在内存中是连续存储的,每个结构体成员在数组的每个元素中按照定义顺序依次排列。
- 操作便捷:可以使用数组索引来访问和修改结构体数组中的任何一个元素,便于循环遍历和批量处理。
- 动态分配:除了静态声明,也可以使用
malloc()
或calloc()
动态分配结构体数组的内存,根据需要增减数组大小。
代码思路:
首先应该是开始界面的制作,大家可以自行发挥~
其次开始让用户输入指令,进入不同的函数。
逻辑比较简单,相信各位小伙伴们仔细观看可以看懂,可能在代码整体逻辑上有些小伙伴们会一下子想不出来,不妨可以看看下图捋顺一下整体思路。
编辑
这个程序里我用的结构体数组去存储学生的信息,实话说是比较不友好的,如果大家以后学习了链表可以接入此程序进行使用,这样学生信息便不怕溢出或者封顶了。
源码如下:
#include <stdio.h> #include <strings.h> #include <string.h> #include <stdlib.h> int count; struct student { int id; float math; float els; float lauge; float avg_score; } stu[1000]; void home_page() { printf("******************************************************\n"); printf("* 学生成绩管理系统---帮助菜单 *\n"); printf("******************************************************\n"); printf("* H = 显示帮助菜单 *\n"); printf("* T = 成绩录入 *\n"); printf("* A = 计算学生平均分 *\n"); printf("* L = 列出成绩表 *\n"); printf("* P = 按平时成绩由高到低 *\n"); printf("* S = 按学号查询成绩 *\n"); printf("* C = 清屏 *\n"); printf("* Q = 退出系统 *\n"); printf("******************************************************\n"); printf("* Copyright <C> 2023.6.17 by Liu *\n"); printf("******************************************************\n"); } void Help() { printf("* H = 显示帮助菜单 *\n"); printf("* T = 成绩录入 *\n"); printf("* A = 计算学生平均分 *\n"); printf("* L = 列出成绩表 *\n"); printf("* P = 按平时成绩由高到低 *\n"); printf("* S = 按学号查询成绩 *\n"); printf("* C = 清屏 *\n"); printf("* Q = 退出系统 *\n"); } void Insert() { printf("请输入同学个数:"); scanf("%d", &count); int i, k = 0; printf("学号 英语 语文 数学\n"); for (i = 0; i < count; i++) { stu[i].id = k; k++; } for (i = 0; i < count; i++) { ++stu[i].id; printf("%d", stu[i].id); scanf("%f %f %f", &stu[i].els, &stu[i].lauge, &stu[i].math); } } void Averge() { if (strlen(stu) == 0) { printf("成绩表为空!请先使用命令 T 录入学生成绩。\n"); } if (strlen(stu) != 0) { for (int i = 0; i < count; i++) { stu[i].avg_score = (stu[i].els + stu[i].lauge + stu[i].math) / 3; } printf("平均值已经打印完成,请用列表L进行查看.\n"); } } void List_Score() { if (strlen(stu) == 0) { printf("成绩表为空!请先使用命令 T 录入学生成绩。\n"); } if (strlen(stu) != 0) { printf("学生成绩如下:\n"); printf("学号 英语 语文 数学 平均分\n"); for (int i = 0; i < count; i++) { printf("%d %.1f %.1f %.1f %.1f\n", stu[i].id, stu[i].els, stu[i].lauge, stu[i].math, stu[i].avg_score); } } } void Sort_Score() { if (strlen(stu) == 0) { printf("成绩表为空!请先使用命令 T 录入学生成绩。\n"); } if (strlen(stu) != 0) { int i, j; for (i = 0; i < 999; i++) { for (j = 0; j < 998 - i; j++) { if (stu[j].avg_score < stu[j + 1].avg_score) { mun = stu[j]; stu[j] = stu[j + 1]; stu[j + 1] = mun; } } } printf("完成排序。请使用命令L查看。\n"); } } void Reserch_Score() { if (strlen(stu) == 0) { printf("成绩表为空!请先使用命令 T 录入学生成绩。\n"); } while (1) { printf("请输入你想查询的学号:"); int a; scanf("%d", &a); getchar(); for (int i = 0; i < count; i++) { if (a == stu[i].id) { printf("%.1f %.1f %.1f %.1f\n", stu[i].els, stu[i].lauge, stu[i].math, stu[i].avg_score); break; } } break; } } int main(int argc, char const *argv[]) { home_page(); char cmd[32]; while (1) { printf("请输入你的指令:"); scanf(" %c", cmd); // getchar(); if (strcmp(cmd, "H") == 0) { Help(); } else if (strcmp(cmd, "T") == 0) { Insert(); } else if (strcmp(cmd, "A") == 0) { Averge(); } else if (strcmp(cmd, "L") == 0) { List_Score(); } else if (strcmp(cmd, "P") == 0) { Sort_Score(); } else if (strcmp(cmd, "S") == 0) { Reserch_Score(); } else if (strcmp(cmd, "C") == 0) { system("cls"); } else if (strcmp(cmd, "Q") == 0) { return 0; } } }