C语言练习(32)

(1)有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。

设5名学生的学号、姓名和3门课程成绩如下:

99101   Wang   89,98,67.5

99103   Li     60,80,90

99106   Fun    75.5,91.5,99

99110   Ling   100,50,62.5

99113   Yuan   58,68,71

在向文件stud写入数据后,应检查验证stud文件中的内容是否正确。

(2)将(1)题stud文件中的学生数据按平均分进行排序处理,将已排序的学生数据存入一个新文件stu_sort中。

在向文件stu_sort写人数据后,应检查验证stu_sort文件中的内容是否正确。

ps:第一题见31

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996)

// 学生结构体
typedef struct Student {
    char id[10];
    char name[20];
    double scores[3];
    double average;
} Student;

// 计算平均成绩
void calculateAverage(Student* s) {
    s->average = (s->scores[0] + s->scores[1] + s->scores[2]) / 3;
}

// 交换两个学生结构体
void swap(Student* a, Student* b) {
    Student temp = *a;
    *a = *b;
    *b = temp;
}

// 冒泡排序
void bubbleSort(Student* students, int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (students[j].average > students[j + 1].average) {
                swap(&students[j], &students[j + 1]);
            }
        }
    }
}

// 将学生数据写入文件
void writeToFile(Student* students, int n, char* filename) {
    FILE* fp = fopen(filename, "w");
    if (fp == NULL) {
        perror("Error opening file");
        exit(1);
    }
    for (int i = 0; i < n; i++) {
        fprintf(fp, "%s %s %.2lf %.2lf %.2lf %.2lf\n", students[i].id, students[i].name,
            students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].average);
    }
    fclose(fp);
}

// 从文件读取学生数据
int readStudentsFromFile(Student* students, char* filename) {
    FILE* fp = fopen(filename, "r");
    if (fp == NULL) {
        perror("Error opening file");
        exit(1);
    }
    int count = 0;
    while (fscanf(fp, "%s %s %lf %lf %lf", students[count].id, students[count].name,
        &students[count].scores[0], &students[count].scores[1], &students[count].scores[2]) == 5) {
        calculateAverage(&students[count]);
        count++;
    }
    fclose(fp);
    return count;
}

// 插入新学生数据并保持顺序
void insertStudent(Student* students, int* n, Student newStudent) {
    int i;
    for (i = 0; i < *n; i++) {
        if (newStudent.average > students[i].average) {
            break;
        }
    }
    for (int j = *n; j > i; j--) {
        students[j] = students[j - 1];
    }
    students[i] = newStudent;
    (*n)++;
}

int main() {
    // (1)
    Student students[5];
    students[0].scores[0] = 89;
    students[0].scores[1] = 98;
    students[0].scores[2] = 67.5;
    strcpy(students[0].id, "99101");
    strcpy(students[0].name, "Wang");

    students[1].scores[0] = 60;
    students[1].scores[1] = 80;
    students[1].scores[2] = 90;
    strcpy(students[1].id, "99103");
    strcpy(students[1].name, "Li");

    students[2].scores[0] = 75.5;
    students[2].scores[1] = 91.5;
    students[2].scores[2] = 99;
    strcpy(students[2].id, "99106");
    strcpy(students[2].name, "Fun");

    students[3].scores[0] = 100;
    students[3].scores[1] = 50;
    students[3].scores[2] = 62.5;
    strcpy(students[3].id, "99110");
    strcpy(students[3].name, "Ling");

    students[4].scores[0] = 58;
    students[4].scores[1] = 68;
    students[4].scores[2] = 71;
    strcpy(students[4].id, "99113");
    strcpy(students[4].name, "Yuan");

    for (int i = 0; i < 5; i++) {
        calculateAverage(&students[i]);
    }
    writeToFile(students, 5, "stud");

    // (2)
    Student sortedStudents[5];
    int count = readStudentsFromFile(sortedStudents, "stud");
    bubbleSort(sortedStudents, count);
    writeToFile(sortedStudents, count, "stu_sort");

    // (3)
    Student newStudent;
    newStudent.scores[0] = 90;
    newStudent.scores[1] = 95;
    newStudent.scores[2] = 60;
    strcpy(newStudent.id, "99108");
    strcpy(newStudent.name, "Xin");
    calculateAverage(&newStudent);
    Student stuNew[6];
    count = readStudentsFromFile(stuNew, "stu_sort");
    insertStudent(stuNew, &count, newStudent);
    writeToFile(stuNew, count, "stu_new");

    // (4)
    // 这里直接将stu_new中的数据复制到stu_sort(实际操作可优化)
    count = readStudentsFromFile(stuNew, "stu_new");
    writeToFile(stuNew, count, "stu_sort");

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 写一个简单的加减法计算器

************* C topic&#xff1a;结构 ************* Structure is a very intersting issue. I really dont like concepts as it is boring. I would like to cases instead. If I want to learn something, donot hesitate to make shits. Like building a house. Wh…

我的2024年博客总结(在工作、博客和生活中找到自己的生活节奏)

文章目录 ⭐前言⭐工作和博客的关联⭐找到自己的生活节奏⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文主要写2024年博客总结&#xff0c;关于在工作、博客和生活中找到自己的生活节奏。 node系列往期文章 node_windows环境变量配置 node_npm发布包 linux_配置…

【视频+图文详解】HTML基础1-html和css介绍、上网原理

图文详解 html介绍 概念&#xff1a;html是超文本标记语言的缩写&#xff0c;其英文全称为HyperText Markup Language&#xff0c;是用来搭建网站结构的语言&#xff0c;比如网页上的文字&#xff0c;按钮&#xff0c;图片&#xff0c;视频等。html的版本分为1.0、2.0、3.0、…

VT:优化LLM推理过程的记忆与探索

&#x1f4d6;标题&#xff1a;LLMs Can Plan Only If We Tell Them &#x1f310;来源&#xff1a;arXiv, 2501.13545 &#x1f31f;摘要 &#x1f538;大型语言模型&#xff08;LLM&#xff09;在自然语言处理和推理方面表现出了显著的能力&#xff0c;但它们在自主规划方面…

C++并发编程指南07

文章目录 [TOC]5.1 内存模型5.1.1 对象和内存位置图5.1 分解一个 struct&#xff0c;展示不同对象的内存位置 5.1.2 对象、内存位置和并发5.1.3 修改顺序示例代码 5.2 原子操作和原子类型5.2.1 标准原子类型标准库中的原子类型特殊的原子类型备选名称内存顺序参数 5.2.2 std::a…

日志收集Day007

1.配置ES集群TLS认证: (1)elk101节点生成证书文件 cd /usr/share/elasticsearch ./bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass "" --days 3650 (2)elk101节点为证书文件修改属主和属组 chown elasticsearch:elasticsearch con…

AJAX综合案例——图书管理

黑马程序员视频地址&#xff1a; AJAX-Day02-10.案例_图书管理AJAX-Day02-10.案例_图书管理_总结_V1.0是黑马程序员前端AJAX入门到实战全套教程&#xff0c;包含学前端框架必会的&#xff08;ajaxnode.jswebpackgit&#xff09;&#xff0c;一套全覆盖的第25集视频&#xff0c…

Linux_线程同步生产者消费者模型

同步的相关概念 同步&#xff1a;在保证数据安全的前提下&#xff0c;让线程能够按照某种特定的顺序访问临界资源&#xff0c;从而有效避免饥饿问题&#xff0c;叫做同步竞态条件&#xff1a;因为时序问题&#xff0c;而导致程序异常&#xff0c;我们称之为竞态条件。 同步的…

Qt u盘自动升级软件

Qt u盘自动升级软件 Chapter1 Qt u盘自动升级软件u盘自动升级软件思路&#xff1a;step1. 获取U盘 判断U盘名字是否正确&#xff0c; 升级文件是否存在。step2. 升级step3. 升级界面 Chapter2 Qt 嵌入式设备应用程序&#xff0c;通过U盘升级的一种思路Chapter3 在开发板上运行的…

拦截器快速入门及详解

拦截器Interceptor 快速入门 什么是拦截器&#xff1f; 是一种动态拦截方法调用的机制&#xff0c;类似于过滤器。 拦截器是Spring框架中提供的&#xff0c;用来动态拦截控制器方法的执行。 拦截器的作用&#xff1a;拦截请求&#xff0c;在指定方法调用前后&#xff0c;根…

信息安全专业优秀毕业设计选题汇总:热点选题

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…

Linux中使用unzip

安装命令 yum install unzip unzip常用选项和参数 选项 说明 -q 隐藏解压过程中的消息输出 -d /path/to/directory 指定解压文件的目标目录 -P password 如果.zip文件被密码保护&#xff0c;使用此选项可以指定打开文件所需的密码 解压命令 unzip 要解压的压缩包unz…

ThreadLocal源码解析

文章目录 一、概述二、get()方法三、set()方法四、可能导致的内存泄漏问题五、remove六、思考&#xff1a;为什么要将ThreadLocalMap的value设置为强引用&#xff1f; 一、概述 ThreadLocal是线程私有的&#xff0c;独立初始化的变量副本。存放在和线程进行绑定的ThreadLocalMa…

批量解密,再也没有任何限制了

有的时候我们在网上下载了PDF文档。发现没有办法进行任何的操作&#xff0c;就连打印权限都没有。今天给大家介绍的这个软件可以一键帮你进行PDF解密&#xff0c;非常方便&#xff0c;完全免费。 PDF智能助手 批量解密PDF文件 这个软件不是很大&#xff0c;只有10MB&#xff…

《LLM大语言模型+RAG实战+Langchain+ChatGLM-4+Transformer》

文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…

车载软件 --- 大一新生入门汽车零部件嵌入式开发

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…

【深度优先搜索篇】走迷宫的魔法:算法如何破解迷宫的神秘密码

当你在夜晚孤军奋战时&#xff0c;满天星光以为你而闪烁。 欢迎拜访&#xff1a;羑悻的小杀马特.-CSDN博客 本篇主题&#xff1a;轻轻松松拿捏洛谷走迷宫问题 制作日期&#xff1a;2024.12.31 隶属专栏&#xff1a;C/C题海汇总 首先我…

SQL进阶实战技巧:如何分析浏览到下单各步骤转化率及流失用户数?

目录 0 问题描述 1 数据准备 2 问题分析 3 问题拓展 3.1 跳出率计算 3.2 计算从浏览商品到支付订单的不同路径的用户数&#xff0c;并按照用户数降序排列。 往期精彩 0 问题描述 统计从浏览商品到最终下单的各个步骤的用户数和流失用户数,并计算转化率 用户表结构和…

Autosar-Os是怎么运行的?(内存保护)

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01; 1.功能概述 以TC397芯片为例&#xff0c;英飞凌芯片集成了MPU模块&#xff0c; MPU模块采用了硬件机…