C 语言小白的第一课:手把手教你用指针实现学生成绩管理系统

对于刚接触 C 语言的初学者来说,指针常常被视为 “拦路虎”,因其抽象性和复杂性令人望而生畏。然而,指针作为 C 语言的核心特性之一,掌握它不仅能让我们深入理解 C 语言的底层运行机制,还能显著提升代码的灵活性和效率。本文将以学生成绩管理系统为例,手把手教你如何巧妙运用指针,从基础概念入手,逐步构建一个完整且实用的管理系统,帮助 C 语言小白快速入门指针的应用。

一、指针基础知识快速入门

在开始构建系统之前,我们先快速了解一下指针的基础知识。指针本质上是一个变量,它存储的是内存地址。在 C 语言中,通过*符号来声明指针变量。例如:

int num = 10;
int *ptr; // 声明一个指向int类型的指针变量ptr
ptr = # // 将变量num的地址赋值给指针ptr,&是取地址运算符

上述代码中,ptr就是一个指针变量,它存储了num变量在内存中的地址。通过指针,我们可以间接访问和操作它所指向的变量的值,方式是使用*运算符,也称为解引用运算符。比如:

printf("num的值是:%d\n", num);
printf("通过指针访问的值是:%d\n", *ptr); // 通过解引用指针ptr来访问num的值

此外,指针还可以进行算术运算,如ptr++,这会根据指针所指向的数据类型,移动到下一个同类型数据的内存地址。不过在使用指针时,一定要注意初始化和边界检查,避免出现野指针(指向未分配内存或已释放内存的指针)等问题,从而导致程序崩溃。

二、学生成绩管理系统功能规划

我们要实现的学生成绩管理系统具备以下核心功能:

  1. 学生信息录入:可以输入学生的学号、姓名和多门课程成绩。
  2. 成绩查询:根据学号查询指定学生的成绩信息。
  3. 成绩修改:能够修改学生已有的成绩。
  4. 成绩统计:计算并显示学生的总成绩和平均成绩。
  5. 系统退出:结束程序运行。

为了方便管理学生信息,我们定义一个结构体来存储学生的相关数据:

#define COURSE_NUM 3 // 课程数量

typedef struct {
    int id; // 学号
    char name[50]; // 姓名
    float scores[COURSE_NUM]; // 多门课程成绩
    float totalScore; // 总成绩
    float averageScore; // 平均成绩
} Student;

上述代码中,typedef用于给结构体类型定义一个别名Student,方便后续使用。COURSE_NUM定义了课程的数量,这里假设为 3 门课程。

三、用指针实现核心功能代码详解

1. 学生信息录入功能

void inputStudentInfo(Student *stu) {
    printf("请输入学号:");
    scanf("%d", &stu->id);
    printf("请输入姓名:");
    scanf("%s", stu->name);
    float sum = 0;
    for (int i = 0; i < COURSE_NUM; i++) {
        printf("请输入第 %d 门课程成绩:", i + 1);
        scanf("%f", &stu->scores[i]);
        sum += stu->scores[i];
    }
    stu->totalScore = sum;
    stu->averageScore = sum / COURSE_NUM;
}

inputStudentInfo函数中,参数stu是一个指向Student结构体的指针。通过指针,我们可以直接修改主函数中对应的Student结构体变量的值。使用->运算符来访问结构体指针所指向的结构体成员,这种方式比先解引用指针再用.运算符访问成员更加简洁直观。

2. 成绩查询功能

void queryStudentInfo(Student *stu, int id) {
    if (stu->id == id) {
        printf("学号:%d,姓名:%s\n", stu->id, stu->name);
        for (int i = 0; i < COURSE_NUM; i++) {
            printf("第 %d 门课程成绩:%.2f\n", i + 1, stu->scores[i]);
        }
        printf("总成绩:%.2f,平均成绩:%.2f\n", stu->totalScore, stu->averageScore);
    }
}

queryStudentInfo函数接收一个学生结构体指针stu和要查询的学号id。通过比较指针所指向的学生学号与查询学号是否一致,来判断是否找到目标学生,若找到则输出该学生的详细成绩信息。

3. 成绩修改功能

void modifyStudentScore(Student *stu) {
    int courseIndex;
    printf("请输入要修改成绩的课程序号(1 - %d):", COURSE_NUM);
    scanf("%d", &courseIndex);
    if (courseIndex < 1 || courseIndex > COURSE_NUM) {
        printf("课程序号输入错误!\n");
        return;
    }
    printf("请输入修改后的成绩:");
    scanf("%f", &stu->scores[courseIndex - 1]);
    float sum = 0;
    for (int i = 0; i < COURSE_NUM; i++) {
        sum += stu->scores[i];
    }
    stu->totalScore = sum;
    stu->averageScore = sum / COURSE_NUM;
}

modifyStudentScore函数通过指针直接修改学生的成绩,并重新计算总成绩和平均成绩。用户输入要修改成绩的课程序号,程序进行有效性检查后,更新对应课程的成绩,并重新计算总成绩和平均成绩。

4. 主函数与菜单实现

int main() {
    Student stu;
    int choice, id;
    while (1) {
        printf("\n===== 学生成绩管理系统 =====\n");
        printf("1. 录入学生信息\n");
        printf("2. 查询学生成绩\n");
        printf("3. 修改学生成绩\n");
        printf("4. 退出系统\n");
        printf("请选择操作:");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                inputStudentInfo(&stu);
                break;
            case 2:
                printf("请输入要查询的学号:");
                scanf("%d", &id);
                queryStudentInfo(&stu, id);
                break;
            case 3:
                modifyStudentScore(&stu);
                break;
            case 4:
                printf("感谢使用,再见!\n");
                return 0;
            default:
                printf("无效的选择,请重新输入!\n");
        }
    }
    return 0;
}

main函数中,通过一个无限循环和switch语句实现菜单驱动的交互方式。用户输入不同的选项,程序调用相应的函数来完成对应的操作。在调用函数时,传递学生结构体变量的地址,使得函数能够通过指针操作主函数中的学生信息。

四、完整代码与运行演示

完整代码

#include <stdio.h>

#define COURSE_NUM 3

typedef struct {
    int id;
    char name[50];
    float scores[COURSE_NUM];
    float totalScore;
    float averageScore;
} Student;

void inputStudentInfo(Student *stu);
void queryStudentInfo(Student *stu, int id);
void modifyStudentScore(Student *stu);

int main() {
    Student stu;
    int choice, id;
    while (1) {
        printf("\n===== 学生成绩管理系统 =====\n");
        printf("1. 录入学生信息\n");
        printf("2. 查询学生成绩\n");
        printf("3. 修改学生成绩\n");
        printf("4. 退出系统\n");
        printf("请选择操作:");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                inputStudentInfo(&stu);
                break;
            case 2:
                printf("请输入要查询的学号:");
                scanf("%d", &id);
                queryStudentInfo(&stu, id);
                break;
            case 3:
                modifyStudentScore(&stu);
                break;
            case 4:
                printf("感谢使用,再见!\n");
                return 0;
            default:
                printf("无效的选择,请重新输入!\n");
        }
    }
    return 0;
}

void inputStudentInfo(Student *stu) {
    printf("请输入学号:");
    scanf("%d", &stu->id);
    printf("请输入姓名:");
    scanf("%s", stu->name);
    float sum = 0;
    for (int i = 0; i < COURSE_NUM; i++) {
        printf("请输入第 %d 门课程成绩:", i + 1);
        scanf("%f", &stu->scores[i]);
        sum += stu->scores[i];
    }
    stu->totalScore = sum;
    stu->averageScore = sum / COURSE_NUM;
}

void queryStudentInfo(Student *stu, int id) {
    if (stu->id == id) {
        printf("学号:%d,姓名:%s\n", stu->id, stu->name);
        for (int i = 0; i < COURSE_NUM; i++) {
            printf("第 %d 门课程成绩:%.2f\n", i + 1, stu->scores[i]);
        }
        printf("总成绩:%.2f,平均成绩:%.2f\n", stu->totalScore, stu->averageScore);
    }
}

void modifyStudentScore(Student *stu) {
    int courseIndex;
    printf("请输入要修改成绩的课程序号(1 - %d):", COURSE_NUM);
    scanf("%d", &courseIndex);
    if (courseIndex < 1 || courseIndex > COURSE_NUM) {
        printf("课程序号输入错误!\n");
        return;
    }
    printf("请输入修改后的成绩:");
    scanf("%f", &stu->scores[courseIndex - 1]);
    float sum = 0;
    for (int i = 0; i < COURSE_NUM; i++) {
        sum += stu->scores[i];
    }
    stu->totalScore = sum;
    stu->averageScore = sum / COURSE_NUM;
}

运行演示

通过这个简单的学生成绩管理系统示例,我们不仅掌握了指针的基本应用,还学会了如何运用指针来操作结构体,实现数据的高效管理和处理。希望本文能帮助 C 语言小白们跨过指针这道坎,在 C 语言的学习道路上更进一步,开启更复杂、更有趣的编程之旅。

  1. 编译并运行程序后,首先显示系统菜单:
    ===== 学生成绩管理系统 =====
    1. 录入学生信息
    2. 查询学生成绩
    3. 修改学生成绩
    4. 退出系统
    请选择操作:

  2. 选择1录入学生信息,依次输入学号、姓名和三门课程成绩后,系统会自动计算并显示总成绩和平均成绩。
  3. 选择2,输入学号查询学生成绩,若学号匹配,将显示该学生的详细成绩信息。
  4. 选择3可以修改学生成绩,按照提示输入课程序号和新成绩,系统会更新并重新计算总成绩和平均成绩。
  5. 选择4,程序退出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值