首页 > 其他分享 >C语言:结构体

C语言:结构体

时间:2024-11-21 21:49:57浏览次数:3  
标签:Student int struct C语言 student printf 结构

1. 结构体的定义

结构体是 C 语言中一种用户自定义的数据类型,它允许将不同类型的数据组合在一起。定义结构体的一般形式为:

struct 结构体名{
    数据类型 成员1;
    数据类型 成员2;
    //...
    数据类型 成员n;
};

例如,定义一个表示学生信息的结构体:

struct Student {
    char name[20];
    int age;
    float score;
};

这里定义了一个名为Student的结构体,它包含三个成员:name是一个字符数组,用于存储学生的姓名;age是一个整数,用于存储学生的年龄;score是一个浮点数,用于存储学生的成绩。

2. 结构体变量的声明和初始化

  • 声明:在结构体定义之后,可以声明结构体变量。有两种方式,一种是在定义结构体的同时声明变量,例如:
struct Student {
    char name[20];
    int age;
    float score;
} student1, student2;

这里声明了两个Student结构体类型的变量student1和student2。另一种是先定义结构体,再声明变量,例如:

struct Student student3;
  • 初始化:可以在声明结构体变量时进行初始化。例如:
struct Student student4 = {"Tom", 20, 85.5};

这样就将student4的name成员初始化为"Tom",age成员初始化为20,score成员初始化为85.5。

3. 结构体成员的访问

  • 可以使用点运算符(.)来访问结构体变量的成员。例如,对于上面的student4结构体变量:
printf("姓名:%s,年龄:%d,成绩:%f\n", student4.name, student4.age, student4.score);
  • 如果有指向结构体的指针,可以使用箭头运算符(->)来访问成员。例如:
struct Student *pStudent = &student4;
printf("姓名:%s,年龄:%d,成绩:%f\n", pStudent->name, pStudent->age, pStudent->score);

这里先定义了一个指向Student结构体的指针pStudent,并让它指向student4,然后通过pStudent->name等方式访问成员。

4. 结构体数组

  • 可以定义结构体数组,即数组中的每个元素都是一个结构体。例如:
struct Student class[3];

这定义了一个包含 3 个Student结构体元素的数组class。可以对结构体数组进行初始化,例如:

struct Student class[3] = {{"Alice", 19, 90.0}, {"Bob", 20, 88.0}, {"Cindy", 21, 92.0}};
  • 访问结构体数组元素的成员,例如:
for (int i = 0; i < 3; i++) {
    printf("姓名:%s,年龄:%d,成绩:%f\n", class[i].name, class[i].age, class[i].score);
}

5. 结构体的嵌套

  • 结构体可以嵌套定义,即一个结构体内部可以包含另一个结构体。例如,定义一个包含日期的结构体,再将其包含在学生信息结构体中:
struct Date {
    int year;
    int month;
    int day;
};
struct StudentWithDate {
    char name[20];
    int age;
    struct Date birthday;
};
  • 访问嵌套结构体的成员,例如:
struct StudentWithDate student5 = {"David", 22, {2001, 5, 10}};
printf("生日年份:%d\n", student5.birthday.year);

6. 结构体在函数中的使用

结构体可以作为函数的参数传递。有两种方式:

  • 值传递:将结构体变量的值复制一份传递给函数。例如:
void printStudent(struct Student s) {
    printf("姓名:%s,年龄:%d,成绩:%f\n", s.name, s.age, s.score);
}

调用这个函数时,会复制一份结构体变量的值,如printStudent(student4);。

  • 地址传递:将结构体变量的地址传递给函数,这样函数可以直接操作原始的结构体变量。例如:
void modifyStudent(struct Student *s) {
    s->age++;
}

调用这个函数时,传递结构体变量的指针,如modifyStudent(&student4);,这样就可以在函数中修改student4的成员。

7. 案例:学生管理系统

下面是一个基于 C 语言结构体的学生管理系统,用于记录学生信息并进行查询和统计。功能包括添加学生、查看学生信息、查找学生和计算平均分。

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

#define MAX_STUDENTS 100

// Define the Student structure
typedef struct {
    char name[50];   // Name
    int age;         // Age
    int id;          // Student ID
    float scores[5]; // Scores for 5 courses
    float average;   // Average score
} Student;

// Global variables
Student students[MAX_STUDENTS]; // Array of students
int student_count = 0;          // Current number of students

// Function prototypes
void add_student();
void view_students();
void find_student();
void calculate_average(Student *student);

int main() {
    int choice;
    while (1) {
        printf("\n===== Student Management System =====\n");
        printf("1. Add Student\n");
        printf("2. View All Students\n");
        printf("3. Find Student\n");
        printf("4. Exit\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);

        switch (choice) {
        case 1:
            add_student();
            break;
        case 2:
            view_students();
            break;
        case 3:
            find_student();
            break;
        case 4:
            printf("Exiting the system.\n");
            return 0;
        default:
            printf("Invalid choice. Please try again.\n");
        }
    }
    return 0;
}

// Add a new student
void add_student() {
    if (student_count >= MAX_STUDENTS) {
        printf("Cannot add more students. Maximum limit reached.\n");
        return;
    }

    Student *s = &students[student_count];

    printf("Enter name: ");
    scanf("%s", s->name);

    printf("Enter age: ");
    scanf("%d", &s->age);

    printf("Enter student ID: ");
    scanf("%d", &s->id);

    printf("Enter scores for 5 courses:\n");
    for (int i = 0; i < 5; i++) {
        printf("Course %d score: ", i + 1);
        scanf("%f", &s->scores[i]);
    }

    // Calculate average score
    calculate_average(s);

    student_count++;
    printf("Student added successfully.\n");
}

// View all students
void view_students() {
    if (student_count == 0) {
        printf("No student records found.\n");
        return;
    }

    printf("\n===== Student List =====\n");
    for (int i = 0; i < student_count; i++) {
        Student *s = &students[i];
        printf("Student %d:\n", i + 1);
        printf("  Name: %s\n", s->name);
        printf("  Age: %d\n", s->age);
        printf("  ID: %d\n", s->id);
        printf("  Average Score: %.2f\n", s->average);
        printf("-------------------\n");
    }
}

// Find a student by ID
void find_student() {
    if (student_count == 0) {
        printf("No student records found.\n");
        return;
    }

    int id;
    printf("Enter student ID to find: ");
    scanf("%d", &id);

    for (int i = 0; i < student_count; i++) {
        if (students[i].id == id) {
            Student *s = &students[i];
            printf("Student found:\n");
            printf("  Name: %s\n", s->name);
            printf("  Age: %d\n", s->age);
            printf("  ID: %d\n", s->id);
            printf("  Average Score: %.2f\n", s->average);
            return;
        }
    }

    printf("No student found with ID %d.\n", id);
}

// Calculate the average score for a student
void calculate_average(Student *student) {
    float sum = 0;
    for (int i = 0; i < 5; i++) {
        sum += student->scores[i];
    }
    student->average = sum / 5;
}

  • 功能介绍
1. 添加学生
输入学生的姓名、年龄、学号和 5 门课程成绩后,系统会计算并存储学生的平均分。

2. 查看所有学生
以列表形式显示所有学生的信息,包括姓名、年龄、学号和平均分。

3. 查找学生
通过学号查找学生并显示详细信息。

4. 退出系统
退出学生管理系统。
  • 关键点解析

      1. 数组和结构体结合
        通过结构体数组实现批量管理学生信息。
      1. 指针与结构体结合
        传递结构体指针给函数,减少内存复制。
      1. 结构体成员的灵活性
        各种数据类型的成员使得结构体非常适合用于复杂数据管理。
  • 运行代码

    • 添加学生:
      在这里插入图片描述
    • 查看所有学生:
      在这里插入图片描述
    • 查找学生:在这里插入图片描述
    • 退出:在这里插入图片描述

标签:Student,int,struct,C语言,student,printf,结构
From: https://blog.csdn.net/u011732210/article/details/143954172

相关文章

  • 数据结构 【带环链表2】
        说到带环链表,有一道题目是这样说的,如果一个链表存在环,那么就返回进入环的第一个节点,如果链表没有环,那么就返回空。这里给出两种解题思路:    第一种解法:小结论解法    分析:这道题目可以拆分成两个部分,第一:检查链表是否带环。第二:返回带环链表的第......
  • 嵌入式开发之C语言学习笔记day2
    学习目标:流程控制语句顺序结构分支结构if语句switch语句循环结构for循环while循环for和while的区别循环语句(高级)跳转控制语句顺序结构1.顺序结构是程序默认的执行流程;2.顺序结构是从上而下依次运行的。分支结构if语句作用:如果满足条件,才可以运行指定的代码......
  • C语言 蓝桥杯某例题解决方案(查找完数)
    蓝桥杯原题: 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。这个题没有很大的难点,与我们上一个解决的问题“质因数分解”不同,它不需要判断因数是否是质数,因此我们的工作量会小很多。现在我们的想法还是类似,首先找到......
  • 计算机体系结构 国科大胡伟武 课后习题期末题库重点选集解析Ⅰ(2-3章)
    第2章计算机系统结构基础第一题1.在3台不同指令系统的计算机上运行同一程序P时,A机需要执行\(1.0×10^8\)条指令,B机需要执行\(2.0×10^8\)条指令,C机需要执行\(4.0×10^8\)条指令,但实际执行时间都是\(10s\)。请分别计算这3台机器在运行程序P时的实际速度,以MIPS为单位。这3台计算......
  • C语言,如何进行多次分割,获取的到多个字符串,组成一个数组
    如"A|B|C|D"根据|分割,得到数组["A","B","C","D"]char*propertyArr[4]={"-1","-1","-1","-1"};custom_string("A|B|C|D","|",propertyArr,4);voidc......
  • 排序算法(选择排序、直接插入排序、冒泡排序、二路归并排序)(C语言版)
    对数组进行排序,主要演示选择排序、直接排序、冒泡排序、二路归并排序算法,附上代码演示一、编写好各类排序方法的函数(1)s_sort(inte[],intn):选择排序。(2)si_sort(inte[],intn):直接插人排序。(3)sb_sort(inte[],intn):冒泡排序。(4)merge(inte[],intn);二路归并排序......
  • 字符串的基本操作(C语言版)
    字符串的判断、查找字符串并返回查找结果一、编写函数:采用顺序结构存储串,编写一个函数substring(strl,str2),用于判定str2是否为strl的子串;编写一个函数,实现在两个已知字符串中找出所有非空最长公共子串的长度和最长公共子串的个数;二、代码演示:1、字符串匹配的源代码:#......
  • C语言分支与循环
    引言C语言是结构化的程序设计语言。结构化的程序通常包括数据的描述和操作的描述两方面的内容,结构指的是顺序结构、选择结构、循环结构。算法广义上来讲,算法是解决某一问题的方法和步骤,狭义的算法是对特定问题求解步骤的一种描述。算法的特性和要素:算法的特性有穷性确定......
  • 数据结构与算法——二分查找(自学笔记)
    本文参考二分查找-LeetBook-力扣(LeetCode)全球极客挚爱的技术成长平台基本概念前提条件:数组必须是有序的(升序或降序均可)。核心思想:每次比较中间元素与目标元素的关系,将查找区间一分为二。根据目标元素与中间元素的大小关系,决定接下来查找的区间是左半部分还是右半......
  • 【python图解】Python 数据结构之列表和元组
    【python图解】Python数据结构之列表和元组顾名思义,数据结构是能够将数据组合在一起的一种结构。在数学中,很多情况下需要将数据进行有序排列。例如我们统计了某班50人的数据成绩,那么一共50个人。例如Alice=99,Bob=86....无疑是非常繁琐的。这时我们可以通过数......