C语言——结构体和结构体数组的定义和使用

简介: 问题描述: 1编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num,name,score[3],用主函数输入这些记录,用print函数输出这些记录。

为了更好的看懂,我们可以从一个简单的问题循序渐进(代码里都有很多必要的注释)

问题描述:
    1编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num,name,score[3],用主函数输入这些记录,用print函数输出这些记录。

第一题代码实现


#include<stdio.h>

struct Stu                    //创建一个结构体类型
{
   int num;
   char name[20];
   float score[3];
};
void print(struct Stu stu[], int size);//函数声明
int main()
{
   struct Stu stu[5];                //定义一个结构体数组
   int i;
   for (i = 0; i < 5; i++)            //接收用户输入的信息
   {
       printf("请按学号,姓名,三门成绩得分顺序输入第%d个学生的信息:\n", i + 1);
       scanf("%d%s%f%f%f", &stu[i].num, &stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
   }
   print(stu, 5);            //调用函数
   return 0;
}
void print(struct Stu stu[], int size)//函数实现
{
   int i;
   for (i = 0; i < size; i++)
   {
       printf("第%d个学生的信息:", i + 1);
       printf("学号:%d 姓名:%s 成绩得分:%f %f %f\n", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
   }
}
运行结果 image.png
2.在第1题的基础上,编写一个函数input,用来输入5个学生的数据记录。

#include<stdio.h>
 
struct Stu            //创建一个结构体类型
{
    int num;
    char name[20];
    float score[3];
};
void print(struct Stu stu[], int size);//函数声明
void input(struct Stu stu[], int size);//函数声明
int main()
{
    struct Stu stu[5];//定义一个结构体数组
    input(stu, 5);//调用函数
    print(stu, 5);//调用函数
    return 0;
}
void print(struct Stu stu[], int size)//打印函数实现
{
    int i;
    for (i = 0; i < size; i++)
    {
        printf("第%d个学生的信息:", i + 1);
        printf("学号:%d 姓名:%s 成绩得分:%f %f %f\n", stu[i].num, stu[i].name, stu[i].score[0],stu[i].score[1],stu[i].score[2]);
    }
}
void input(struct Stu stu[], int size)//输入函数实现
{
    int i;
    for (i = 0; i < size; i++)
    {
        printf("请按学号,姓名,三门成绩得分顺序输入第%d个学生的信息:\n", i + 1);
        scanf("%d%s%f%f%f",&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
    }
}
运行结果 image.png
3.有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程成绩、平均分数)

第三就要用到上面两个的结合知识,如果上面两个没问题,那这一个问题也就变得简单


#include<stdio.h>
#define N 10                //宏定义
 
struct Stu            //创建一个结构体类型
{
    int num;
    char name[20];
    float score[3];
};
 
float   Aversc1, Aversc2, Aversc3,Aversc4;//定义全局用来存储平均分
int n;//用来记录最大的学号
 
 
void input(struct Stu stu[], int size);//函数声明
void PutMax(struct Stu stu[], int size);//函数声明
void print(struct Stu stu[]);//函数声明
int main()
{
    
    struct Stu stu[N];//定义一个结构体数组
    input(stu, N);//调用函数
     PutMax(stu, N);
     print(stu);
 
    return 0;
}
 
void PutMax(struct Stu stu[], int size)//实现求值的主要函数
{
    float Max = stu[0].score[0] + stu[0].score[1] + stu[0].score[2];//先把第一个学生的成绩总和赋值给Max
        float tem;//借助tem为中间变量找到最大值
    int i;
    for (i = 0; i < size; i++)
    {
        Aversc1 += (stu[i].score[0]) / size;            //求第一科平均值
        Aversc2 += ( stu[i].score[1]) / size;            //求第二科平均值
        Aversc3 += (stu[i].score[2]) / size;            //求第三科平均值
        tem = stu[i].score[0] + stu[i].score[1] + stu[i].score[2];//把一个一个学生的总成绩赋值给tem
        if (Max < tem)    //Max与tem比较,找到总分最大值
        {
            Max = tem;
            n = i;//找到最大值序数然后赋值给n
        }
        Aversc4 = (stu[n].score[0] + stu[n].score[1] + stu[n].score[2]) / 3;//求总分最大的学生的的平均成绩
    }
 
}
void input(struct Stu stu[], int size)//输入函数实现
{
    int i;
    for (i = 0; i < size; i++)
    {
        printf("请按学号,姓名,三门成绩得分顺序输入第%d个学生的信息:\n", i + 1);
        scanf("%d%s%f%f%f", &stu[i].num, &stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
    }
 
}
 
void print(struct Stu stu[])    //输出函数实现
{
    printf("第一门成绩的平均分为%f\n", Aversc1);
    printf("第二门成绩的平均分为%f\n", Aversc2);
    printf("第三门成绩的平均分为%f\n", Aversc3);
    printf("最高分的学生的信息为\n学号:%d \n姓名:%s\n三门成绩分别是:%f  %f  %f\n", stu[n].num, stu[n].name,stu[n].score[0], stu[n].score[1], stu[n].score[2]);
    printf("三门成绩平均分为:%f\n", Aversc4);
}
相关文章
|
5天前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
57 14
|
10天前
|
存储 编译器 C语言
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
55 10
|
9天前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
26 5
|
10天前
|
编译器 C语言
【C语言】宏定义在 a.c 中定义,如何在 b.c 中使用?
通过将宏定义放在头文件 `macros.h` 中,并在多个源文件中包含该头文件,我们能够在多个文件中共享宏定义。这种方法不仅提高了代码的重用性和一致性,还简化了维护和管理工作。本文通过具体示例展示了如何定义和使用宏定义,帮助读者更好地理解和应用宏定义的机制。
33 2
|
14天前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
13天前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
49 4
|
20天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
81 12
|
20天前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
45 11
|
20天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
43 4
|
2月前
|
存储 C语言
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
62 10