【c++/c】C语言“小小计算器”扩展功能,文件的读取和写入【期末大作业】

简介: 学生成绩排序” 定义学生结构体数组,长度为10,依次输入这十个学生的学号、姓名、成绩,利用冒泡排序,对这10个学生排序,从小到大输出这10个学生的信息,然后输出10个学生的总成绩和平时成绩

实验1、“小小计算器”扩展功能实现(1)

扩充小小计算器功能:
<1> “22 学生成绩排序”
定义学生结构体数组,长度为10,依次输入这十个学生的学号、姓名、成绩,利用冒泡排序,对这10个学生排序,从小到大输出这10个学生的信息,然后输出10个学生的总成绩和平时成绩

代码整合:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;


int main() {
const int n=10;
struct student //定义结构体变量
{
    string name;
 
    int num;
 
    double score;
 
};
    struct student student1[n];
    struct student student2;
    int i,j;
 
    for(i=0;i<n;i++)
    {
        cout<<"请输入第"<<i+1<<"个学生的信息:";
        cin>>student1[i].num
           >>student1[i].name
           >>student1[i].score;
    }
 
    double sum=0;
    double average;
 
    //各学生的平均成绩
    for(i=0;i<n;i++)
    {
        
        sum=sum+student1[i].score;
        
        average=sum/3;

    }
    // 冒泡排序
    for(int j=0;j<n;j++){
        for(i=0;i<n-j-1;i++){
                if(student1[i].score>student1[i+1].score){
                        student2 = student1[i];
                        student1[i] = student1[i+1];
                        student1[i+1] = student2;
               }
        }
    
    } 
    //打印出各学生的信息
    cout<<"输出各学生信息:"<<endl;
 
    for(i=0;i<n;i++)
    {
        cout<<student1[i].num<<"  "
 
           <<student1[i].name<<"  "
 
           <<student1[i].score<<"  "
           
           <<endl;
    }

 
    cout<<"总成绩:"<<sum<<"  "
        <<"平均成绩"<<average
        <<endl;
 
 
 
    return 0;
}

结果

在这里插入图片描述

实验2、“小小计算器”扩展功能实现(2)

扩充小小计算器功能:
<1> “23 学生成绩普涨10分”
d盘根目录下存在一个文本文件my.txt,里面存放了10个学生的成绩,一行一个成绩,从文件中读取学生的成绩,每个成绩都加10分后,保存到原文件中。
提示:

 注意d:\my.txt在fopen中如何表示;—> “d:\my.txt”  文件打开方式 —> r+
 从文件中读取数据,直到文件结束,如何判断文件结束—> feof()
 将增加10后的数据保存到原文件时,要保证从文件头开始,如何使文件指针回到文件头—> rewind()
 在写数据时,一定要避免在最后一个数据写完后,再写一个回车,否则下次在操作时可能出错。

代码

#include <stdio.h>
#include <stdlib.h>
#define N 10
struct Student
{
int num;
char name[10];
double score;
};
int main()
{
FILE *fp;
struct Student stu[N];
int i;
fp=fopen("d:\\my.txt","r+");
if(fp==NULL)
{
    
printf ("文件打开失败!\n");
exit(1);
}
printf("打开读取文件,内容是:\n");
i=0;
while(1)
{
if(feof(fp)) break;
fscanf(fp,"%d\t%s\t%lf\n",&stu[i].num,stu[i].name,&stu[i].score);
printf("%d\t%s\t%.2f\n",stu[i].num,stu[i].name,stu[i].score);
i++;
}
rewind(fp);
for(i=0;i<N-1;i++)
{
fprintf(fp,"%d\t%s\t%.2f\n",stu[i].num,stu[i].name,stu[i].score+10);
}
fprintf(fp,"%d\t%s\t%.2f",stu[N-1].num,stu[N-1].name,stu[N-1].score+10);
fclose(fp);
return 0;
}

结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决问题:中文乱码

可以看到,虽然读取成功但是出现了中文乱码😫😫,根据以往经验,应该是编码方式问题!
在这里插入图片描述
可以看到编码为UTF-8
将其改为ANSI
在这里插入图片描述
在运行一下,看看结果
在这里插入图片描述
读取没问题,看看写入
在这里插入图片描述
完美解决🤗🤗!

目录
相关文章
|
8天前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
50 26
|
1月前
|
存储 编译器 程序员
c语言的文件操作与文件缓冲区
如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。磁盘(硬盘)上的文件是文件。但是在程序设计中,我们⼀般谈的⽂件有两种:程序文件、数据文件(从文件功能的角度来分类 的)。就比如说我们电脑中以.txt为后缀的就是文件的一种,他就是数据文件。.exe为后缀的就为程序文件。函数名功能适用范围fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets。
73 0
|
5月前
|
人工智能 C语言
|
9月前
|
存储 C++ UED
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
977 132
|
6月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
108 5
|
6月前
|
存储 小程序 C语言
【C语言程序设计——文件】文件操作(头歌实践教学平台习题)【合集】
本文介绍了C语言中的文件操作,分为两个关卡。第1关任务是将键盘输入的字符(以#结束)存入`file1.txt`并显示输出;第2关任务是从键盘输入若干行文本(每行不超过80个字符,用-1作为结束标志),写入`file2.txt`后再读取并显示。文中详细讲解了文件的打开、读取(使用`fgetc()`和`fgets()`)、写入(使用`fputc()`和`fputs()`)及关闭操作,并提供了示例代码和测试说明。
193 5
|
7月前
|
算法 网络协议 数据挖掘
C++是一种功能强大的编程语言,
C++是一种功能强大的编程语言,
129 14
|
8月前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
511 3
|
9月前
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
9月前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。