C语言编写学生成绩管理系统-要求有增删改查(C语言基础题-9道)

news2024/12/25 13:16:13

文章目录

  • 1-5题
  • 题目
    • 例题8(难度★ ★ ★ ★ ☆)
    • 例题9(难度★ ★ ☆ ☆ ☆)
  • 答案
    • 例题8
      • 答案1
        • 解析
      • 答案2
        • 解析
    • 例题9
      • 答案1
        • 解析
      • 答案2
        • 解析

1-5题

C语言基础例题1-3题-指针篇
C语言基础例题4-5题-二维数组篇
C语言基础例题6-7题-结构体篇

题目

例题8(难度★ ★ ★ ★ ☆)

编写一个学生成绩管理系统,实现以下功能:

  1. 添加学生信息:从键盘输入学生的姓名和成绩,将学生信息添加到系统中。
  2. 删除学生信息:从键盘输入要删除的学生姓名,若学生存在则将其从系统中删除。
  3. 查找学生信息:从键盘输入要查询的学生姓名,若学生存在则显示学生姓名和成绩,否则提示查无此人。
  4. 修改学生成绩:从键盘输入要修改成绩的学生姓名和新的成绩,若学生存在则将其成绩修改为新的成绩。
  5. 显示所有学生信息:显示系统中所有学生的姓名和成绩。
  6. 退出程序:结束学生成绩管理系统。

运行结果如下所示:
在这里插入图片描述

例题9(难度★ ★ ☆ ☆ ☆)

编写一个程序,要求用户输入一个字符串,然后计算该字符串的长度,并输出结果。

测试用例
输入:“Hello” 输出:长度为5
输入:“This is a test” 输出:长度为14
输入:“1234567890” 输出:长度为10
输入:" " 输出:长度为1
输入:“” 输出:长度为0
输入:“Special characters: *&^%$#@!” 输出:长度为28

答案

例题8

答案1

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

// 定义学生信息结构体
typedef struct
{
    char name[20];
    int score;
} Student;

// 定义链表节点结构体
typedef struct Node
{
    Student data;
    struct Node *next;
} Node;

// 在链表末尾添加新节点(学生信息)
void addStudent(Node *head)
{
    Node *p = head;
    while (p->next != NULL)
    {
        p = p->next;
    }

    Node *newNode = (Node *)malloc(sizeof(Node));
    printf("请输入学生姓名:");
    scanf("%s", newNode->data.name);
    printf("请输入成绩:");
    scanf("%d", &(newNode->data.score));
    newNode->next = NULL;

    p->next = newNode;

    printf("添加成功!\n");
}

// 根据学生姓名删除节点
void deleteStudent(Node *head)
{
    char name[20];
    printf("请输入要删除的学生姓名:");
    scanf("%s", name);

    Node *p = head->next;
    Node *prev = head;

    while (p != NULL)
    {
        if (strcmp(p->data.name, name) == 0)
        { // 学生姓名匹配,删除节点
            prev->next = p->next;
            free(p);
            printf("删除成功!\n");
            return;
        }

        prev = p;
        p = p->next;
    }

    printf("查无此人!\n");
}

// 根据学生姓名查找学生信息
void findStudent(Node *head)
{
    char name[20];
    printf("请输入要查询的学生姓名:");
    scanf("%s", name);

    Node *p = head->next;

    while (p != NULL)
    {
        if (strcmp(p->data.name, name) == 0)
        { // 学生姓名匹配,显示学生信息
            printf("姓名:%s\t成绩:%d\n", p->data.name, p->data.score);
            return;
        }

        p = p->next;
    }

    printf("查无此人!\n");
}

// 根据学生姓名修改学生成绩
void modifyScore(Node *head)
{
    char name[20];
    int newScore;
    printf("请输入要修改成绩的学生姓名:");
    scanf("%s", name);
    printf("请输入新的成绩:");
    scanf("%d", &newScore);

    Node *p = head->next;

    while (p != NULL)
    {
        if (strcmp(p->data.name, name) == 0)
        { // 学生姓名匹配,修改成绩
            p->data.score = newScore;
            printf("修改成功!\n");
            return;
        }

        p = p->next;
    }

    printf("查无此人!\n");
}

// 显示所有学生信息
void displayStudents(Node *head)
{
    Node *p = head->next;

    while (p != NULL)
    {
        printf("姓名:%s\t成绩:%d\n", p->data.name, p->data.score);
        p = p->next;
    }
}

int main()
{
    Node *head = (Node *)malloc(sizeof(Node));
    head->next = NULL;

    int option;

    do
    {
        printf("【菜单】\n");
        printf("1. 添加学生信息\n");
        printf("2. 删除学生信息\n");
        printf("3. 查找学生信息\n");
        printf("4. 修改学生成绩\n");
        printf("5. 显示所有学生信息\n");
        printf("6. 退出程序\n");
        printf("\n请选择菜单选项:");
        scanf("%d", &option);

        switch (option)
        {
        case 1:
            addStudent(head);
            break;
        case 2:
            deleteStudent(head);
            break;
        case 3:
            findStudent(head);
            break;
        case 4:
            modifyScore(head);
            break;
        case 5:
            displayStudents(head);
            break;
        case 6:
            printf("程序结束!\n");
            break;
        default:
            printf("错误!没有此选项!\n");
            break;
        }
    } while (option != 6);

    // 释放链表内存
    Node *p = head;
    while (p != NULL)
    {
        Node *temp = p->next;
        free(p);
        p = temp;
    }

    return 0;
}
解析

struct _StudentItem:定义了学生信息的结构体。它包含一个char数组name用于存储学生姓名,一个int变量score用于存储成绩。

struct Node:定义了链表节点的结构体。它包含了一个Student类型的数据成员data用于存储学生信息,以及一个指向下一个节点的指针next。

addStudent:在链表末尾添加新节点(学生信息)。该函数首先遍历链表,找到最后一个节点,然后创建一个新节点,要求用户输入学生的姓名和成绩,并将新节点添加到链表末尾。

deleteStudent:根据学生姓名删除节点。该函数要求用户输入要删除的学生姓名,然后从链表头开始遍历每个节点,寻找匹配的学生姓名。如果找到匹配的节点,则删除该节点,并释放内存。如果没有找到匹配的节点,输出"查无此人!"。

findStudent:根据学生姓名查找学生信息。该函数要求用户输入要查询的学生姓名,然后从链表头开始遍历每个节点,寻找匹配的学生姓名。如果找到匹配的节点,则输出该学生的姓名和成绩。如果没有找到匹配的节点,输出"查无此人!"。

modifyScore:根据学生姓名修改学生成绩。该函数要求用户输入要修改成绩的学生姓名和新的成绩,然后从链表头开始遍历每个节点,寻找匹配的学生姓名。如果找到匹配的节点,则修改该节点的成绩为新的成绩。如果没有找到匹配的节点,输出"查无此人!"。

displayStudents:显示所有学生信息。该函数从链表头开始遍历每个节点,并输出每个节点的学生姓名和成绩。

在主函数里,我们首先创建了一个链表头指针head,然后使用一个菜单循环,等待用户输入菜单选项。根据用户的选择,调用相应的函数执行相应的功能。直到用户选择退出程序为止。最后,释放了链表的内存。

答案2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生信息结构体
typedef struct _StudentItem
{
    char name[9];
    float grade;
} StudentItem;
// 定义链表节点结构体
typedef struct _StudentNode
{
    StudentItem item;
    struct _StudentNode *next;
} StudentNode;
// 在链表开头添加新节点(学生信息)
void AddStudent(StudentNode **student);
// 根据学生姓名删除节点
void DeleteStudent(StudentNode **student, char *name);
// 根据学生姓名修改学生成绩
void ModifyGrades(StudentNode *student, float grade);
// 显示所有学生信息
void displayStudents(StudentNode **student);
// 根据学生姓名查找学生信息
StudentNode *FindStudent(StudentNode **student, char *name);
// 释放链表内存
void FreeNode(StudentNode **student);

int main(void)
{
    StudentNode *student = NULL, *target;
    int selection;
    char name[9];
    float grade;
    printf("【菜单】\n1.添加学生信息\n2.删除学生信息\n3.查找学生信息\n4.修改学生成绩\n5.显示所有学生信息\n6.退出程序\n");
    while (scanf("%d", &selection) == 1 && selection != 6)
    {
        switch (selection)
        {
        case 1:
            AddStudent(&student);
            break;
        case 2:
            printf("请输入要删除的学生名:");
            scanf("%s", name);
            DeleteStudent(&student, name);
            break;
        case 3:
            printf("请输入要查询的学生名:");
            scanf("%s", name);
            target = FindStudent(&student, name);
            if (target == NULL)
                printf("查无此人!\n");
            else
                printf("姓名:%s\t成绩:%f\n", target->item.name, target->item.grade);
            break;
        case 4:
            printf("请输入要修改成绩的学生名:");
            scanf("%s", name);
            target = FindStudent(&student, name);
            if (target == NULL)
                printf("查无此人!\n");
            else
            {
                printf("请输入新的成绩:");
                scanf("%f", &grade);
                ModifyGrades(target, grade);
                puts("修改成功");
            }
            break;
        case 5:
            displayStudents(&student);
            break;
        default:
            printf("错误!没有此选项!\n");
            break;
        }
        printf("继续输入选项:\n");
    }
    FreeNode(&student);
    getchar();
    getchar();
    return 0;
}
void AddStudent(StudentNode **student)
{
    StudentNode *temp = (StudentNode *)malloc(sizeof(StudentNode));
    printf("请输入学生姓名:");
    scanf("%s", temp->item.name);
    printf("请输入成绩:");
    scanf("%f", &temp->item.grade);
    temp->next = *student;
    *student = temp;
}
void DeleteStudent(StudentNode **student, char *name)
{
    StudentNode *target = *student, *prev;
    // 学生姓名匹配,删除节点
    if (target != NULL && !strcmp(target->item.name, name))
    {
        *student = target->next;
    }
    else
    {
        prev = target;
        target = target->next;
        while (target != NULL)
        {
            // 学生姓名匹配,删除节点
            if (!strcmp(target->item.name, name))
            {
                prev->next = target->next;
                break;
            }
            prev = target;
            target = target->next;
        }
    }
    if (target != NULL)
    {

        free(target);
        printf("删除成功!\n");
    }
    else
    {
        printf("删除失败!\n");
    }
}
void ModifyGrades(StudentNode *student, float grade)
{
    student->item.grade = grade;
}
StudentNode *FindStudent(StudentNode **student, char *name)
{
    StudentNode *p = *student;
    while (p != NULL)
    {
        // 学生姓名匹配,返回学生节点
        if (!strcmp(p->item.name, name))
            break;
        p = p->next;
    }
    return p;
}
void displayStudents(StudentNode **student)
{
    const StudentNode *p = *student;
    if (*student == NULL)
    {
        printf("没有学生数据\n");
    }
    else
    {
        while (p != NULL)
        {
            printf("姓名:%s\t成绩%f\n", p->item.name, p->item.grade);
            p = p->next;
        }
    }
}
void FreeNode(StudentNode **student)
{
    StudentNode *target=*student,*next;
    while(target!=NULL)
    {
        next=target->next;
        free(target);
        target=next;
    }
}
解析

我们使用链表来存储学生的信息,也就是姓名和成绩。根据题目要求需要实现添加学生、删除学生、查找学生、修改学生的成绩、显示所有学生的信息,退出的功能。

首先,我们定义了两个结构体:StudentItem 和 StudentNode。StudentItem 用来存储学生的姓名和成绩,而 StudentNode 用来表示链表中的节点,它包含一个 StudentItem 类型的变量和一个指向下一个节点的指针。

然后,我们实现一些函数来完成不同的操作。AddStudent 函数用于在链表开头添加一个新的学生节点;DeleteStudent 函数用于根据学生的姓名来删除对应的节点;ModifyGrades 函数根据学生的姓名来修改他们的成绩;displayStudents 函数显示所有学生的信息;FindStudent 函数根据学生的姓名来查找他们的信息;最后,FreeNode 函数用来释放链表的内存。

在主函数中,我们通过一个循环来让用户选择要执行的操作。根据用户的输入,我们会调用相应的函数来处理操作。比如,如果用户选择添加学生,我们会创建一个新的节点,然后获取学生的姓名和成绩,最后将其添加到链表的开头。

如果要删除学生,我们先根据学生的姓名找到对应的节点,然后将其从链表中删除并释放其内存。修改学生的成绩,先根据学生的姓名找到对应的节点,然后更改他的成绩。显示所有学生的信息,就遍历链表并打印每个学生的姓名和成绩。

在程序结束时,记得释放链表的内存。

例题9

答案1

#include <stdio.h>
#include <string.h>
int main(void)
{
    char str[50];
    int i = 0;
    printf("请输入:");
    while ((str[i] = getchar()) != '\n')
        i++;
    str[i] = '\0'; // 添加字符串结束符
    printf("长度为%d\n", strlen(str));
    getchar();
    return 0;
}
解析

char str[50]; 声明一个字符数组 str,用于存储用户输入的字符串,最大长度为 50。

int i = 0; 声明一个整型变量 i,用于循环和计数。

while ((str[i] = getchar()) != ‘\n’)。这个循环的作用是逐个字符读取用户输入并存储到 str 中,直到遇到换行符 \n 为止。

i++; 每次循环结束后将变量 i 自增,用于确保存储下一个字符的位置。

printf(“长度为%d\n”, strlen(str)); 输出字符串的长度,使用了 strlen 函数来计算字符串的长度。

答案2

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

int main()
{
    char str[100];
    printf("请输入一个字符串: ");
    fgets(str, 100, stdin);

    // 去掉输入字符串的换行符
    str[strcspn(str, "\n")] = 0;

    int length = strlen(str);
    printf("输入字符串的长度为: %d\n", length);
    
    return 0;
}
解析

char str[100]; 声明一个字符数组 str,用于存储用户输入的字符串,最大长度为 100。

fgets(str, 100, stdin); 使用 fgets 函数从标准输入流 stdin 中获取用户输入的字符串,最多读取 99 个字符(包括空字符),并存储到 str 中。

str[strcspn(str, “\n”)] = 0; 使用 strcspn 函数找到 str 中换行符 \n 的位置,并将其替换为字符串结束符 \0,从而去掉字符串结尾的换行符。

int length = strlen(str); 使用 strlen 函数计算字符串 str 的长度,并将结果存储在 length 变量中。

printf(“输入字符串的长度为: %d\n”, length); 输出字符串的长度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1181440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go语言开发环境安装,hello world!

1. Go开发包SDK https://golang.google.cn/dl/&#xff08;国内也可以安装&#xff09; 根据自己电脑下载对应的安装包&#xff0c;我懒下载了msi安装 然后一路点确定安装Go 2.安装GoLand https://www.jetbrains.com/go/download/#sectionwindows 下载安装包 一路确定安装完…

成集云 | 英克对接零售O2O+线上商城 | 解决方案

方案介绍 零售O2O线上商城是一种新型的商业模式&#xff0c;它通过线上和线下的融合&#xff0c;提供更加便捷的购物体验。其中&#xff0c;O2O指的是线上与线下的结合&#xff0c;通过互联网平台与实体店面的结合&#xff0c;实现线上线下的互动和协同。线上商城则是指通过互…

04【保姆级】-GO语言指针

之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&#xff0c;然后know why。先做出来&#xff0c;然后再去一点点研究&#xff0c;才会事半功倍。适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。对于GO语言&a…

sed续与awk(粗糙版)

s:sed d 替换功能&#xff0c;改 s:替换字符串 格式是&#xff1a;sed -n s/需要替换的原内容/替换后的内容/(ps&#xff1a;数字是替换每行中的第几个&#xff0c;g代表是全内容替换)p 替换的文件地址 例如&#xff1a; c:整行替换 y:字符替换&#xff0c;替换前后的字符串…

富士康推进印度制造的计划倍速,中国制造iPhone占比下滑较快

日前知名苹果分析师郭明錤指出今年印度制造的iPhone占比达到12%&#xff0c;比预期的7%增加四成以上&#xff0c;比去年的占比更是增加2倍&#xff0c;这主要是因为富士康快速扩张了印度工厂的产能。 郭明錤指出印度制造的iPhone主要是由富士康贡献的&#xff0c;今年印度制造的…

信创背景下,IAM统一身份管理联合国产身份域管,助力央国企构建数字身份新底座

数字身份底座是企业数字化的基石。数字时代&#xff0c;IAM 统一身份管理系统结合微软 AD 是央国企、金融机构数字身份建设的通用架构。国产化改造浪潮中&#xff0c;国外身份管理系统&#xff08;如微软 AD&#xff09;无法适配国产化异构 IT 环境。从业务和安全角度考虑&…

【微服务 Spring Cloud 6】服务如何拆分?使用微服务的注意事项?

目录 一、前言二、单体服务的弊端三、微服务化四、服务如何拆分&#xff1f;1、拆分原则2、拆分时机和拆分方法3、拆分实践 五、使用微服务的注意事项1、确保相关业务和利益相关者的支持2、确定微服务的拆分粒度3、遵循微服务架构的原则4、确保接口的稳定性5、关注数据一致性6、…

ros1 自定义订阅者Subscriber的编程实现

话题模型 图中&#xff0c;我们使用ROS Master管理节点。 有两个主要节点&#xff1a; Publisher&#xff0c;名为Turtle Velocity&#xff08;即海龟的速度&#xff09;Subscriber&#xff0c;即海龟仿真器节点 /turtlesim Publisher(Turtle Velocity)&#xff0c;发布Messa…

【JAVA】:万字长篇带你了解JAVA并发编程-并发设计模式【五】

目录 【JAVA】&#xff1a;万字长篇带你了解JAVA并发编程-并发设计模式【五】模式分类Immutability模式【不可变模式】Copy-on-Write 模式Thread Local Storage 模式线程池中使用 Guarded Suspension模式扩展 Guarded Suspension 模式 Balking模式Thread-Per-MessageWorker Thr…

Chatgpt人工智能对话源码系统分享 带完整搭建教程

ChatGPT的开发基于大规模预训练模型技术。预训练模型是一种在大量文本数据上进行训练的模型&#xff0c;可以学习到各种语言模式和知识。在ChatGPT中&#xff0c;预训练模型被用于学习如何生成文本&#xff0c;并且可以用于各种不同的任务&#xff0c;如对话生成、问答、摘要等…

开发直播带货系统源码的技术要点

直播带货系统是一个复杂的技术项目&#xff0c;通常包括前端应用、后端服务器、数据库、支付集成、实时通信以及直播流处理等多个关键组件。以下是开发直播带货系统源码的技术要点&#xff1a; 实时视频流处理 一个成功的直播带货系统需要支持实时视频流的传输和处理。可以使…

uniapp原生插件之安卓虹软人脸识别原生插件

插件介绍 虹软人脸识别支持图片人脸识别&#xff08;可识别网络图片&#xff09;&#xff0c;活体检测&#xff0c;离线识别&#xff0c;相机预览旋转&#xff0c;相机人脸识别&#xff0c;批量注册&#xff08;支持网络图片&#xff09;等&#xff0c;支持保存用户的id和名称…

双通道 H 桥电机驱动芯片AT8833,软硬件兼容替代DRV8833,应用玩具、打印机等应用

上期小编给大家分享了单通道 H 桥电机驱动芯片&#xff0c;现在来讲一讲双通道的驱动芯片。 双通道 H 桥电机驱动芯片能通过控制电机的正反转、速度和停止等功能&#xff0c;实现对电机的精确控制。下面介绍双通道H桥电机驱动芯片的工作原理和特点。 一、工作原理 双通道 H 桥电…

RuoYi-Vue 在Swagger和Postman中 上传文件测试方案

RequestPart是Spring框架中用于处理multipart/form-data请求中单个部分的注解。在Spring MVC中&#xff0c;当处理文件上传或其他类型的多部分请求时&#xff0c;可以使用RequestPart注解将请求的特定部分绑定到方法参数上。 使用RequestPart注解时&#xff0c;需要指定要绑定…

动捕设备VDSuit Full便携式动作捕捉设备,帮你轻松打破次元壁

动捕设备可以将真人的动作转化为计算机可识别的数据&#xff0c;并将这些数据用于电影、游戏、体育科学等多个专业领域&#xff0c;将真人的动作真实呈现于虚拟世界中。 目前&#xff0c;市面上主要分为光学动捕设备和惯性动作捕捉两种技术&#xff0c;光学动捕设备具有识别精度…

黄金走势分析:美元反弹,金价已失守1980关口

昨晚美元和美债收益率反弹回升&#xff0c;现货黄金震荡下行&#xff0c;美市尾盘金价失守1980美元关口&#xff0c;最低至1977.22美元/盎司&#xff0c;最终收跌0.72%&#xff0c;报收1977.69美元/盎司。在汉声集团分析师张新才发稿前&#xff0c;今日&#xff08;周二&#x…

摄影师的必备神器:这三款炙手可热的人像修图工具了解一下!

不会吧&#xff0c;现在还有人不修图就直接上传照片吧&#xff1f;作为新时代的精致男孩女孩&#xff0c;修复工具是一定必不可少的&#xff0c;随着手机拍照的流行&#xff0c;许多后期的图片修复工具也是很强大的&#xff0c;有的甚至可以帮助我们一键搞定修图&#xff0c;无…

Web逆向-某网络学院学习的”偷懒“思路分析

接到求助&#xff0c;帮朋友完成20课时的网络学习。 我想都没想就接下了&#xff0c;寻思找个接口直接把学习时间提交上去&#xff0c;易如反掌。 最不济最不济&#xff0c;咱还能16x播放&#xff0c;也简单的很 然鹅&#xff0c;当我登陆的时候&#xff0c;发现自己还是太天真…

浅谈指针函数、函数指针、指针数组、数组指针 简单明了!!!!

指针函数 形如&#xff1a;int* fun(int a, int b) 类比于&#xff1a;int fun(int x, int y)、char fun(int x, int y) 本质上是函数&#xff0c;只是返回值为int类型的指针&#xff0c;以此类推可以有void*、char*、unsigned char*类型等指针&#xff0c;类比于返回值是int …

HCIA_数据链路层

如果数据进行封装时&#xff0c;基于E2或者802.3标准&#xff0c;此时我们称之为是一个以太网帧 1、EthernetII 采用EthernetII协议会在数据基础之上多出18Byte&#xff0c;EthernetII的数据长度是46-1500B FCS&#xff08;Frame check Sequence&#xff09;帧校验序列&#…