C语言写入文本文件 小学数学练习

1.首先需要声明一个文件指针变量

FILE* fp;

 

2.接下来需要对这个指针变量进行初始化

fp = fopen("在这里填写你自己的路径", "这里填写读写方式");

现在介绍一下路径填写和C语言中的读写方式
路径示例:"C:/Users/临易/Desktop/record.txt"
读写方式:

r 以只读方式打开文件,但该文件必须存在。
r+ 以可读写方式打开文件,但该文件必须存在。
rb+ 读写打开一个二进制文件,允许读写数据。
rt+ 读写打开一个文本文件,允许读写数据。
w 打开只写文件,若文件存在则文件长度清为0,内容清空。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为0,内容清空。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。(原来的EOF符不保留)
wb 只写打开或新建一个二进制文件;只允许写数据。
wb+ 读写打开或建立一个二进制文件,允许读和写。
wt+ 读写打开或着建立一个文本文件;允许读写。
at+ 读写打开一个文本文件,允许读或在文本末追加数据。
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。

3.然后开始利用相应函数将数据写入文件
这里可以使用到很多函数,比如fwrite,fprintf
我这次使用的是fprintf函数,使用方式如下:

fprintf(fp,"%s","\n你以前的记录是:");

 


其中fp为打开的文件;"%s"表示需要写入的数据的类型,这里是字符串类型; \n为换行符

后面这些就是要写入的数据:"\n你以前的记录是:"

 

例:

    fprintf(fp,"\n %s %d %f %s",id,grade,s,"");

 


4.最后一步,也是关键的一步
写完之后,一定要使用fclose关闭文件,否则系统可能会崩溃!

  fclose(fp);

 

小学数学练习:

问题描述&基本要求

编写一个帮助小学生练习数学的程序,帮助小学生练习 100 以内的四种数学运算:加、减、乘、除。

【基本要求】

a) 程序应先询问用户的 ID 号(ID 号包括两个大写字母和 4 位数字),例如:

请输入用户 ID 号:AB1234

程序应对输入的 ID 号验证,符合 ID 号要求的格式,然后程序提示三种选择:

(1)开始测试

(2)检查分数

(3)退出

 

b) 测试:该程序将给出 10 道数学题,例如:

12 * 3 =36

48 + 32 =80

56 / 28 =2

注意:

i)学生将依次回答每一个问题(在等于号后面给出答案),然后给出下一道题。

ii)试题应包含四种数学运算:加、减、乘、除,它们是随机产生的。相邻的问题应该是不同的操作,每个操作必须至少出现一次。

iii)为每道题随机生成数字,但必须确保参与运算的数字和结果都小于 100 且大于零的整数。

iv)十道题做完后,记录学生完成这十道题所用的时间。

v)给每个学生一个分数。将该学生的 ID、成绩和使用时间保存到一个名为 record.txt 的文件中。

vi)在屏幕上输出以下信息:

问题 | 正确答案 | 你的答案

 

c) 成绩检查:从文件“record.txt”中列出该学生的所有历史成绩。例如:

你以前的记录是:

AB1234 80 150

AB1234 50 182

AB1234 90 98 秒

 

 

示例代码:

#include<stdio.h> //标准输入输出
#include<stdlib.h> //用于对程序进行退出操作
#include<time.h> //用于计时和随机数的产生

int ID_check(char id[]){
    int flag=1,i;
    //保证前两个是大写字母,否则返回0
    for(i=0;i<2&&id[i];i++){
        if(!(id[i]>='A'&&id[i]<='Z'))
           flag=0;
    }
    //保证后面的是数字,否则返回0
    for( ;id[i];i++){
        if(!(id[i]>='0'&&id[i]<='9'))
           flag=0;
    }
    //保证ID号有6位,否则返回0
    if(i!=6) flag=0;
    if(flag==1) return 1;
    printf("ID格式错误,正确格式为:AB1234...\n");
    return 0;
}

int main(){    
    FILE* fp;
    fp=fopen("C:/Users/临易/Desktop/record.txt","a");
    fprintf(fp,"%s","\n你以前的记录是:");
    int a[10],b[10],c[10],d[10],e[10],f,g,h,i,j,array[4],grade=0;//a,b表示运算数,d表示正确答案,e表示学生输入的答案
    double s=0;
    char id[6];
    clock_t start,end;
    
    do{
        printf("请输入用户ID号(如:AB1234):");
        gets(id);
    }while(!ID_check(id));//不正确的话再回去运行一遍
    
    printf("ID输入正确\n");
    sss:printf("\n(1)开始测试\n(2)检查分数\n(3)退出\n");
    printf("请输入需要执行的数字编号:");
    scanf("%d",&g);
    switch(g){
        case 1: //随机种子
            srand((unsigned)time(NULL));
            //开始答题,计时开始
            printf("\n请开始答题:\n");
            start=clock();
                
            for(i=0;i<10;i++){
                printf("%d.",i+1);
                do{
                    //%后写"要随机的个数"+ 随机开始数
                    a[i]=rand()%99+1;
                    b[i]=rand()%99+1;
                    c[i]=rand()%4;
                    //保证相邻两个算式是不同的运算
                    while(i>0){
                        for(int j;c[i]==c[i-1];j++){
                            c[i]=rand()%4;
                        }
                        break;
                    }
                    //保证-和\时大的数在前面
                    if(a[i]<b[i]&&(c[i]==1||c[i]==3)){
                        f=a[i];
                        a[i]=b[i];
                        b[i]=f;
                    }
                    //保证能被整除,不会出现小数
                    if(c[i]==3){
                        a[i]=a[i]+(b[i]-(a[i]%b[i]));
                    }
                }while((a[i]+b[i])>=100||(a[i]*b[i])>=100||(a[i]-b[i])==0);
//保证参与运算的结果都小于100且大于0      
                    
                switch(c[i]){
                 case 0: d[i]=a[i]+b[i]; printf("%d+ %d=",a[i],b[i]); break;
                    case 1: d[i]=a[i]-b[i]; printf("%d- %d=",a[i],b[i]); break;
                    case 2: d[i]=a[i]*b[i]; printf("%d×%d=",a[i],b[i]); break;
                    case 3: d[i]=a[i]/b[i]; printf("%d÷%d=",a[i],b[i]); break;
                    }
                     scanf("%d",&e[i]);
                     //记录分数,答对一题得10分
                     if(d[i]==e[i]){
                    grade+=10;
                }
               }
                
            //完成答题,计时结束
            end=clock();
            s=(end-start)/CLK_TCK;        
            fprintf(fp,"\n %s %d %f %s",id,grade,s,"秒");
 
               printf("  问题  |正确答案|你的答案\n");  
               for(i=0;i<10;i++){
               if(c[i]==0)
                   printf(" %d+ %d= |   %d   |   %d   \n",a[i],b[i],d[i],e[i]);
               else if(c[i]==1)
                   printf(" %d- %d= |   %d   |   %d   \n",a[i],b[i],d[i],e[i]);
               else if(c[i]==2)
                     printf(" %d×%d= |   %d   |   %d   \n",a[i],b[i],d[i],e[i]);
               else if(c[i]==3)
                     printf(" %d÷%d= |   %d   |   %d   \n",a[i],b[i],d[i],e[i]);
            }

            printf("您的用时为:%.0f秒\t",s);
            printf("您的得分为:%d分\n",grade);
            goto sss;
                
        case 2: printf("\n您以前的记录是:\n");
             printf("%s %d %.0f秒\n",id,grade,s);
             goto sss;
                
        case 3: printf("\n欢迎下次使用!\n");
            fclose(fp);
    }
}

 

实现:

 

 

 

 

 

 

 鸣谢:舍友 @小杨同学  完成了90%代码工作

参考资料:https://blog.csdn.net/absll/article/details/124186981 

 

 

感悟:

年轻真好

 
 
 
posted @ 2022-06-04 16:01  临易  阅读(272)  评论(0编辑  收藏  举报