📄 main.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <string.h>
#include <math.h>
#include "student.h"
class RANGE//值域
{
public:
RANGE()
{num=0;}
char str[10];//值域的字符串值
int num;//若值为整数,保存该值的位数
int thenum()//若值为整数,则返回值为将字符串转化为整数的值
{
int i,result=0;
for(i=0;i<num;i++)
result=result+(str[num-i-1]-'0')*(int(pow(10,i)));
return result;
}
};
main()
{
/////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////将文件内容写入缓冲区并按成绩高低进行排序//////////////////////////////
FILE* fp;
int record_num=0;//记录的个数
char r_order,enter;//接收键盘命令,和回车符
/////////////////////////
if((fp=fopen("data.txt","a+"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
else printf("打开文件成功\n");
student stud[1000],studtemp;
int i=0;
int num,gra;
char stuno[10],names[20],stusex[10],studept[10];
while(!feof(fp)) //读入数据
{
fscanf(fp,"%d%s%s%s%s%d\n",&num,stuno,names,stusex,studept,&gra);
{
record_num++;
stud[i].SetNo(num);
stud[i].SetStuNo(stuno);
stud[i].SetName(names);
stud[i].SetSex(stusex);
stud[i].SetDept(studept);
stud[i].SetGrade(gra);
i++;
}
}
printf("文件载入成功!\n请选择操作:\n(A).全部显示 (S).输入查询语句 (I)插入记录 (X).退出\n");
scanf("%c",&r_order);//获得键盘命令;
enter=getchar();//接收回车符
//////////////////////////////////////////处理输入的命令/////////////////////////////
while(1)
{
if(r_order=='A'||r_order=='a')
{
for(i=0;i<record_num;i++)
stud[i].print();
printf("请选择操作:\n(A).全部显示 (S).输入查询语句 (I)插入记录 (X).退出\n");
scanf("%c",&r_order);
enter=getchar();//接收回车符
}
else
if(r_order=='X'||r_order=='x')
{
fclose(fp);
exit(0);
}
else
if(r_order=='S'||r_order=='s')
{
printf("请输入命令:\n");
/////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////将简单的查询语句存入缓冲区///////////////////////////////////////////
char order[10][100];
int ii=0,space=0;
char c;
scanf("%s",&order[ii]);
ii++;
c=getchar();
while(c!='\n')
{
if(c==' ')
{
space++;
scanf("%s",&order[ii]);
ii++;
}
c=getchar();
}
////////////////////////处理查询语句将语句分解成字段域,条件域和值域////////////////////////////////////////////////////////
char field[10],oper[10];//字段域,条件域
int num_order=0,j=0;//用于记录命令的长度和field,oper和值域的下标
RANGE range;
///////分解字段域
for(i=0;i<sizeof(order[1]);i++)
if(order[1][i]=='>'||order[1][i]=='='||order[1][i]=='<')
break;
else
{
field[j]=order[1][i];
j++;
num_order++;
}
field[j]='\0';
//////分解条件域
j=0;
for(i=num_order;i<sizeof(order[1]);i++)
if(order[1][i]!='>'&&order[1][i]!='='&&order[1][i]!='<')
break;
else
{
oper[j]=order[1][i];
j++;
num_order++;
}
oper[j]='\0';
//////分解得到值域
j=0;
for(i=num_order;i<sizeof(order[1]);i++)
if(order[1][i]=='\0')
break;
else
{
range.str[j]=order[1][i];
range.num++;
j++;
num_order++;
}
range.str[j]='\0';
////////////////////////////////////根据字段域和值域分别进行处理//////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////值域为字符串/////////////////////////////////////
if(strcmp("sex",field)==0)
{
for(i=0;i<record_num;i++)
if(strcmp(stud[i].GetSex(),range.str)==0)
stud[i].print();
}
else
if(strcmp("stuno",field)==0)
{
for(i=0;i<record_num;i++)
if(strcmp(stud[i].GetStuNo(),range.str)==0)
stud[i].print();
}
else
if(strcmp("dept",field)==0)
{
for(i=0;i<record_num;i++)
if(strcmp(stud[i].GetDept(),range.str)==0)
stud[i].print();
}
else
if(strcmp("name",field)==0)
{
for(i=0;i<record_num;i++)
if(strcmp(stud[i].GetName(),range.str)==0)
stud[i].print();
}
//////////////////////////////////////////////值域为整数时//////////////////////////////
else
if(strcmp("grade",field)==0)
{
if(strcmp(">",oper)==0)
{
for(i=0;i<record_num;i++)
if(stud[i].GetGrade()>range.thenum())
stud[i].print();
}
if(strcmp("<",oper)==0)
{
for(i=0;i<record_num;i++)
if(stud[i].GetGrade()<range.thenum())
stud[i].print();
}
if(strcmp(">=",oper)==0)
{
for(i=0;i<record_num;i++)
if(stud[i].GetGrade()>=range.thenum())
stud[i].print();
}
if(strcmp("<=",oper)==0)
{
for(i=0;i<record_num;i++)
if(stud[i].GetGrade()<=range.thenum())
stud[i].print();
}
if(strcmp("=",oper)==0)
{
for(i=0;i<record_num;i++)
if(stud[i].GetGrade()==range.thenum())
stud[i].print();
}
}
else
if(strcmp("no",field)==0)
{
int k;
if(strcmp(">",oper)==0)
{
for(i=0;i<record_num;i++)
if(stud[i].GetNo()==range.thenum())
{
k=i;
break;
}
for(i=k+1;i<record_num;i++)
stud[i].print();
}
if(strcmp("<",oper)==0)
{
for(i=0;i<record_num;i++)
if(stud[i].GetNo()==range.thenum())
{
k=i;
break;
}
for(i=0;i<k-1;i++)
stud[i].print();
}
if(strcmp(">=",oper)==0)
{
for(i=0;i<record_num;i++)
if(stud[i].GetNo()==range.thenum())
{
k=i;
break;
}
for(i=k;i<record_num;i++)
stud[i].print();
}
if(strcmp("<=",oper)==0)
{
for(i=0;i<record_num;i++)
if(stud[i].GetNo()==range.thenum())
{
k=i;
break;
}
for(i=0;i<k;i++)
stud[i].print();
}
if(strcmp("=",oper)==0)
{
for(i=0;i<record_num;i++)
if(stud[i].GetNo()==range.thenum())
{
stud[i].print();
}
}
}
printf("请选择操作:\n(A).全部显示 (S).输入查询语句 (I)插入记录 (X).退出\n");
scanf("%c",&r_order);
enter=getchar();//接收回车符
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
else
if(r_order=='i'||r_order=='I')
{
record_num++;
stud[record_num-1].SetNo(record_num);
printf("学号:\n");
scanf("%s",stuno);
stud[record_num-1].SetStuNo(stuno);
printf("姓名:\n");
scanf("%s",names);
stud[record_num-1].SetName(names);
printf("性别:\n");
scanf("%s",stusex);
stud[record_num-1].SetSex(stusex);
printf("班级:\n");
scanf("%s",studept);
stud[record_num-1].SetDept(studept);
printf("成绩:\n");
scanf("%d",&gra);
stud[record_num-1].SetGrade(gra);
printf("请选择操作:\n(A).全部显示 (S).输入查询语句 (I).插入记录 (X)退出\n");
fprintf(fp,"\n%d %s %s %s %s %d",stud[record_num-1].GetNo(),stud[record_num-1].GetStuNo(),
stud[record_num-1].GetName(),stud[record_num-1].GetSex(),
stud[record_num-1].GetDept(),stud[record_num-1].GetGrade());
enter=getchar();
scanf("%c",&r_order);
enter=getchar();//接收回车符
}
else
{
printf("输入命令有误,请重新选择:\n(A).全部显示 (S).输入查询语句 (I).插入记录 (X)退出\n");
scanf("%c",&r_order);
enter=getchar();//接收回车符
}
}
fclose(fp);
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -