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
感悟:
年轻真好