#include<stdio.h> //C语言标准输入输出头文件
#include<string.h> //字符串操作需要用到的头文件
#include<stdlib.h> //文件操作需要用到的头文件
#include<time.h> //产生随机数需要用到的头文件
int hour1=0,min1=0,hour2=0,min2=0,c=0;
float A=0;
struct Student
{
char name[21]; //姓名
char num[10]; //学号
float avscore;
}student[30000];//结构体数组,存储学生的信息,在此初定为30000,可改
/********************************************************/
void Savemessage() //保存学生输入信息的函数
{
FILE *fp,*fp1,*fp2; //定义文件指针,//以下判断文件打开与否 ,"a"方式打开则可向文件尾写数据
if((fp=fopen("studentmessage.txt","a"))==NULL)//打开文件studentmessage.txt
{ printf("打开文件失败\n");
exit(0);
}
if((fp1=fopen("TestResult.txt","a"))==NULL) //打开文件TestResult.txt
{ printf("打开文件失败\n");
exit(0);
}
if((fp2=fopen("failedResult.txt","a"))==NULL)//打开文件failedResult.txt
{ printf("打开文件失败\n");
exit(0);
}
fclose(fp2);
printf("输入姓名:"); //以下要学生输入个人信息
scanf("%s",student[0].name);
printf("输入学号:");
scanf("%s",&student[0].num);
fwrite(&student[0],sizeof(struct Student),1,fp); //向文件studentmessage.txt中写入一条记录,即刚刚输入的学生信息
fprintf(fp,"\n");//向文件studentmessage.txt中写入换行符号,换行符不可见
fprintf(fp1,"姓名:%s\n",student[0].name);
fclose(fp); //关闭文件studentmessage.txt//以下为向文件TestResult.txt中写入刚刚输入的学生信息
fprintf(fp1,"学号:%s\n",student[0].num);
fclose(fp1); //关闭文件TestResult.txt
system("cls"); //清屏
}
/******************************************************/
void sortbychengji()
{
FILE *fp5;
int i,j,m,n,N=1;
student[0].avscore=A/c;
fp5=fopen("nrecord.txt","a+");
fprintf(fp5,"%s %s %f\n",student[0].name,student[0].num,student[0].avscore);//将数据写入文件nrecord.txt中
fclose(fp5);
fp5=fopen("nrecord.txt","rb");
for(i=0;!feof(fp5);i++)
{
fscanf(fp5,"%s %s %f\n",student[i].name,student[i].num,&student[i].avscore);
}
fclose(fp5);
m=i;
struct Student temp;
for(i=0;i<m;i++)
{n=0;
for(j=0;j<m-1;j++)
if(student[j].avscore<student[j+1].avscore)
{n=1;
strcpy(temp.name,student[j].name); //利用结构变量temp实现数组元素的交换
strcpy(temp.num,student[j].num);
temp.avscore=student[j].avscore;
strcpy(student[j].name,student[j+1].name);
strcpy(student[j].num,student[j+1].num);
student[j].avscore=student[j+1].avscore;
strcpy(student[j+1].name,temp.name);
strcpy(student[j+1].num,temp.num);
student[j+1].avscore=temp.avscore;
}
if(n=0) break; //若n=0,意味着没有交换了,排序已经完成
}
printf("排序结果由高到低:\n");
printf(" sort name number avscore\n");
for(i=0;i<m;i++)
{
printf("第%d名:%s %s %.1f\n",N++,student[i].name,student[i].num,student[i].avscore);
} }
/*******************************************************/
void Judge() //判断函数
{
FILE *fp;//文件指针//以下判断文件打开与否 ,"r"为只读打开方式
if((fp=fopen("studentmessage.txt","r"))==NULL) //以下判断文件打开与否 //打开文件studentmessage.txt
{
fp=fopen("studentmessage.txt","w+"); //如果没有studentmessage.txt文件,则新建此文件,"w+"打开方式为新建一个文件
printf("无文件记录,已新建.\n");
}
int i=0;
char num1[10]; //变量,注册的学号
while(!feof(fp)) //判断是否到了文件尾
{ fread(&student[i],sizeof(struct Student),1,fp); //一行一行从文件中读出学生信息,保存在结构体数组student[]中
fscanf(fp,"\n"); //读取换行符
i++; //i变量保存学生记录个数
}
system("cls"); //清屏
fclose(fp);
}
/********************************************************/
void Addition(int number) //加法运算函数,number为题目数形参
{
FILE *fp,*fp2,*fp3;
if((fp=fopen("TestResult.txt","a"))==NULL)
{ printf("打开文件失败\n");
exit(0); }
if((fp2=fopen("failedResult.txt","a"))==NULL)
{ printf("打开文件失败\n");
exit(0);
}
if((fp3=fopen("rightResult.txt","a"))==NULL)
{ printf("打开文件失败\n");
exit(0);
}
int num1,num2,num3,num4,m,n,count1=0,count2=0;
float average; //正确率变量,注意是float类型
srand(time(0)); //初始化随机数,如果没有此语句,则每次运行程序时的随机数是一样的
fprintf(fp,"加法测试:\n"); //向文件写入
fprintf(fp,"被加数 + 加数 = 你的结果 是否正确\n");//向文件写入
printf("---------------------------------------\n");
printf("------------- 选择难度----------------\n");
printf("---------------- 1.简单-----------------\n");
printf("----------------- 2一般-----------------\n");
printf("---------------- 3.困难-----------------\n");
printf("---------------------------------------\n");
printf("请选择难度(1/2/3): "); scanf("%d",&m);
while(m<1||m>3) //不在以上所列的功能以内时循环
{
printf("超出功能范围,请重新选择(1/2/3):");
scanf("%d",&m);
}
system("cls"); //清屏
{ if(m==1) n=10; //将m的值转化为对应的n值,从而使随机函数出现1位,2位,3位。
if(m==2) n=100 ;
else if(m==3) n=1000 ;
}
for(int i=0;i<number;i++) //小于测试题目数时,循环
{
if(m==1)
{num1=rand()%n; //产生随机数,赋值给num1,作为被加数
num2=rand()%n;} //产生随机数,赋值给num2,作为加数
if(m==2)
{num1=10+rand()%(n-10);
num2=10+rand()%(n-10);}
if(m==3)
{num1=100+rand()%(n-100);
num2=100+rand()%(n-100);}
num3=num1+num2; //num3保存正确结果
printf("%d + %d = ",num1,num2);//在终端屏幕上输出题目
scanf("%d",&num4); //你要输入的计算结果
if(num3==num4) //正确结果与你计算的结果比较,正确的话
{
fprintf(fp,"%d + %d = %d √\n",num1,num2,num4); //向文件中写入
count1++; //变量count1记录正确题目的个数
}
else //错误的话,即num1!=num2时
{
fprintf(fp,"%d + %d = %d ×\n",num1,num2,num4);
count2++; //变量count2记录错误题目的个数
fprintf(fp3," %d + %d = %d\n",num1,num2,num3);
fprintf(fp2,"%d + %d =\n",num1,num2);
}
}
fclose(fp2);
fclose(fp3);
average=float(count1)/float(number); //计算正确率,注意int整型要转换为float类型
fprintf(fp,"正确 %d 道,错误 %d 道,正确率为:%f\n\n",count1,count2,average);
A=A+average*100;
c=c+1;
fclose(fp);
}
/*************************************************************/
void Subtracter(int number) //减法运算函数,注释与加法一样
{
FILE *fp,*fp2,*fp3;
if((fp=fopen("TestResult.txt","a"))==NULL)
{
printf("打开文件失败\n");
exit(0);
}
if((fp2=fopen("failedResult.txt","a"))==NULL)
{
printf("打开文件失败\n");
exit(0);
}
if((fp3=fopen("rightResult.txt","a"))==NULL)
{
printf("打开文件失败\n");
exit(0);
}
int num1,num2,num3,num4,count1=0,n,m,count2=0;
float average;
srand(time(0));
fprintf(fp,"减法测试:\n");
fprintf(fp,"被减数 - 减数 = 你的结果 是否正确\n");
printf("---------------------------------------------\n");
printf("---------- 选择难度----------------------\n");
printf("----------- 1.简单-----------------------\n");
printf("---------- 2.一般------------------------\n");
printf("---------