#include "stdafx.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#define M 3
#define N 100
#define LEN 9
void no_deal(int i);
int score_input(int i);
void average(int i);
void menu();
int load();
void topput_();
void printf_face();
void printf_one(int i);
void puts_();
void printf_back();
void browse();
typedef struct student //定义学生信息结构体
{
char num[11];
char name[20];
int score[M];
double aver;
}STU;
STU stu[N];
int no_input(int i,int n)
{
int j,k,w1;
do
{
w1=0;
printf("学号:\t\t [%d位,低于%d位前面补0,长的截尾处理!]",LEN,LEN);
scanf("%s",stu[i].num);
no_deal(i);
for(j=0;stu[i].num[j]!='\0';j++)
if(stu[i].num[j]<'0'||stu[i].num[j]>'9')
{
puts("别开玩笑!只能输入0-9.好吧,再给你一次机会,别让我失望了!\n");
w1=1;
break;
}
if(w1==1)
for(k=0;k<n;k++)
if(k!=i&&strcmp(stu[k].num,stu[i].num)==0)
{
puts("已经存在啦!重来一次!\n");
w1=1;
break;
}
}while(w1==1);
return 0;
}
void input(int i)
{
no_input(i,i);
printf("姓名:");
scanf("%s",stu[i].name);
score_input(i);
average(i);
}
/***************************保存学生信息*************************/
int save(int n)
{
FILE *fp;
int i;
if((fp=fopen("yao.txt","wb"))==NULL)
{
printf("无法打开文件!\n任意键退出程序.......\n");
getch();
return 0;
}
for(i=0;i<n;i++)
if(stu[i].aver!=0)
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("文件写入发生错误\n");
fclose(fp);
return 0;
}
void copy()
{
char outfile[20],infile[10];
FILE *sfp,*tfp;
STU *p=NULL;
system("cls");
printf("请输入需要被复制的文件名(默认数据处理在yao.txt中):\n");
scanf("%s",infile);
if((sfp=fopen(infile,"rb"))==NULL)
{
printf("无法打开文件!\n任意键退出程序......\n");
getch();
return;
}
printf("另存为.....,比如:hao.txt:\n");
scanf("%s",&outfile);
if((tfp=fopen(outfile,"wb"))==NULL)
{
printf("无法打开文件!\n\n");
getch();
return;
}
while(!feof(sfp))
fputc(fgetc(sfp),tfp);
fclose(sfp);
fclose(tfp);
printf("\n复制成功!!!!\n");
printf("\n输入任意键返回主菜单");
getch();
menu();
}
/************************学号格式调整*********************/
void no_deal(int i)
{
int len=strlen(stu[i].num);
int j,k=9;
for(j=len-1;j>=0;j--)
{
stu[i].num[k--]=stu[i].num[j];
}
for(j=k;j>=0;j--)
stu[i].num[j]='0';
stu[i].num[10]='\0';
}
void del()
{
struct student s;
int i,k,n,c,w0=1;
system("cls");
n=load();
do
{
system("cls");
k=-1;
topput_();
printf_face();
for(i=0;i<n;i++)
if(stu[i].aver!=0)
printf_one(i);
puts_();
do
{
printf("\n\n输入你要删除记录的学号! no.:\t['Ctrl-z' 退出]");
if(scanf("%s",s.num)!=1)
menu();
for(i=0;i<n;i++)
if(strcmp(s.num,stu[i].num)==0)
{
k=i;
s=stu[i];
}
if(k==-1)
printf("\n\n不存在!请重新输入!");
}while(k==-1);
puts("\n");
printf_face();
printf_one(k);
printf("\n你确定?\n\t1).确定 2).不,要删除其他的 3).不保存退出[]\b\b");
scanf("%d",&c);
if(c==1)
{
stu[k].aver=0;
printf("\n\n操作成功!\n\n要继续删数据吗?\n\t1).继续 2).返回主菜单\t[ ]\b\b");
scanf("%d",&w0);
}
if(c==3)
w0=0;
if(w0!=0&&c!=3)
save(n);
}while(w0==1);
menu();
}
int score_input(int i)
{
int j;
for(j=0;j<M;j++)
{
printf("分数 %d:",j+1);
scanf("%d",&stu[i].score[j]);
}
return 0;
}
void average(int i)
{
int j,sum;
for(sum=0,j=0;j<M;j++)
sum+=stu[i].score[j];
stu[i].aver=sum*1.0/M; //乘以1.0转为double型
}
void printf_one(int i)
{
int j;
printf("%11s %-14s",stu[i].num,stu[i].name);
for(j=0;j<M;j++)
printf("%9d",stu[i].score[j]);
printf(" %9.2f\n",stu[i].aver);
}
void puts_()
{
printf("\n\n------------------------------------------------------------------");
}
int modify_data(int i,int n)
{
int c,w1;
do
{
puts("\n你想修改什么:=>\n\n1).学号\t2).姓名\t3).数学\t4).英语\t5).C语言\
\n6).重新输入所有分数\t7).重输所有记录\t8).取消并返回");
printf("输入:[]\b\b");
scanf("%d",&c);
if(c>8||c<1)
{
puts("\n选择失误!严肃点,再来一次!");
getchar();
}
}while(c>8||c<1);
do
{
switch(c)
{
case 1:no_input(i,n);
break;
case 2:printf("姓名:");
scanf("%s",stu[i].name);
break;
case 3:printf("数学:");
scanf("%s",stu[i].score[0]);
break;
case 4:printf("英语:");
scanf("%s",stu[i].score[1]);
break;
case 5:printf("C语言:");
scanf("%s",stu[i].score[2]);
break;
case 6:score_input(i);
break;
case 7:input(i);
break;
case 8:menu();
}
if(c>2&&c<7)
average(i);
puts("\n现在:\n");
printf_face();
printf_one(i);
printf("\n你确定你目前的决定?\n\n\t1).不不,重修改一下!\n\t3).算了还是走吧,别保存了![]\b\b");
scanf("%d",&w1);
}while(w1==2);
return w1;
}
void enter()
{
int i,n;
system("cls");
printf("输入你要记录的学生数吧:(1-%d)?\t['0'返回]:\n",N);
scanf("%d",&n);
if(n==0)
menu();
else
{
printf("\n\t好的!开始输入....\n");
for(i=0;i<n;i++)
{
printf("\n请输入第%d个的记录\n",i+1);
input(i);
}
if(i!=0)
save(n);
printf_back();
}
}
int load()
{
FILE *fp;
int i;
if((fp=fopen("yao.txt","rb"))==NULL)
{
printf("无法打开文件!\n任意键退出程序.......\n");
getch();
return 0;
}
for(i=0;!feof(fp);i++)
fread(&stu[i],sizeof(struct student),1,fp);
fclose(fp);
return (i-1);
}
void printf_back()
{
int w;
printf("\n\t操作成功!\n");
printf("\t接着干什么?\n\t1).立刻浏览全部数据\t2).返回:[ ]\b\b");
scanf("%d",&w);
if(w==1)
browse();
else
menu();
}
void printf_face()
{
printf("\n\t学号\t姓名\t\t 数学\t 英语 c语言 平均分\n");
}
/**********************************增加学生信息**************************/
int add()
{
int i,n,m,k;
FILE *fp;
system("cls");
n=load();
printf("你需要加入多少学生:(0-%d)?:",N-n);
scanf("%d",&m);
if(m==0)
menu();
else
{
k=m+n;
for(i=n;i<k;i++)
{
printf("\n请输入第%d个学生的记录\n",i-n+1);
input(i);
}
if((fp=fopen("yao.txt","ab"))==NULL)
{
printf("文件打不开!\n");
getch();
return 0;
}
for(i=n;i<k;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("文件写入错误!\n");
fclose(fp);
printf_back();
}
return 0;
}
void topput_()
{
printf("\n 记 录 浏 览 ");
printf("\n--------------------------------------------------------------------------------\n");
}
void browse()
{
int i,n;
n=load();
system("cls");
topput_();
printf_face();
for(i=0;i<n;i++)
printf_one(i);
puts_();
printf("\n\t 这里一共有 %d 个记录!\n",n);
printf("\n\t 输入任意键返回主菜单... ...");
getch();
menu();
}
/*******************************按姓名查找********************************/
void search()
{
int i,n,k,w1=1,w2,w3,w4;
struct student s;
system("CLS");
n=load();
do
{
do
{
k=-1;
printf("\n\n输入你要查找记录的主人公! 姓名:");
scanf("%s",s.name);
printf_face();
for(i=0;i<n;i++)
if(strcmp(s.name,stu[i].name)==0)
{
k=i;
printf_one(k);
}
if(k==-1)
{
printf("\n\n不存在! 请重新输入!");
printf("\n\n要继续吗?\n\t1).继续\t 2).不,我要返回 \t[ ]\b\b");
scanf("%d",&w1);
}
}while(k==-1 && w1!=2);
w4=w3=0;
if(k!=-1)
{
printf("\n\n接着干什么?\n\t1).再次查找 2).修改 3).删除 4).返回主菜单 [ ]\b\b");
scanf("%d",&w2);
switch(w2)
{
case 2:w3=modify_data(k,n);break;
case 3:
{
printf("\n\n你确定了吗?\n\t1).确定 2).不,还是返回吧! \t[ ]\b\b");
scanf("%d",&w4);
if(w4==1)
stu[k].aver=0;
break;
}
}
if(w3==1 || w4==1)
{
save(n);
printf("\n\n操作成功!");
printf("\n\n接着干什么?\n\t1).再次查找 2).返回 [ ]\b\b");
scanf("%d",&w2);
}
}
}while(w2==1);
menu();
}
/**************************学生成绩排名(按平均成绩排名)***********************/
void order()
{
int i,j,k,n;
struct student s;
system("CLS");
n=load();
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(stu[j].aver>stu[k].aver)
k=j;
s=stu[i];
stu[i]=stu[k];
stu[k]=s;
}
save(n);
puts("\n\n");
printf_back();
}
/* **********************学生信息修改*********************/
void modify()
{
struct student s;
int i,n,k,w0=0,w1,w2=0;
n=load();
do
{
system("CLS");
k=-1;
topput_();
printf_face();
for(i=0;i<n;i++)
printf_one(i);
puts_();
do
{
printf("\n\n输入你要修改记录的学号! 学号. :\t【'Ctrl-z' 退出】");
if(scanf("%s",s.num)!=1)
menu();
for(i=0;i<n;i++)
if(strcmp(s.num,stu[i].num)==0)
{
k=i;
s=stu[i];
}
if(k==-1)
printf("\n\n不存在! 请重新输入~");
}while(k==-1);
printf_face();
printf_one(k);
w1=modify_data(k,n);
if(w1==1)
{
printf("\n操作成功!\n\n决定修改别的吗?\n\n\t1).是的\t2).不!保存并返回\t[ ]\b\b");
scanf("%d",&w0);
w2=1;
}
else
{
w0=0;
if(w2==1)
stu[k]=s;
}
if(w0!=1 && w2==1)
save(n);
}while(w0==1);
menu();
}
/* *************************主界面******************* */
void menu()
{
int n,w1;
do
{
system("cls");
puts("\t\t\t\t学生信息管理系统\n");
puts("\t\t\t\t\t\t ---何耀");
puts("\t\t*************************主菜单***********************\n");
puts("\t\t1.初始数据输入(会覆盖已有数据)");
puts("\t\t2.可选择个数的数据添加");
puts("\t\t3.数据部分修改");
puts("\t\t4.数据部分删除");
puts("\t\t5.数据查看与浏览");
puts("\t\t6.数据查找(按姓名)");
puts("\t\t7.数据排序(按平均分降序)");
puts("\t\t8.已有文件拷贝");
puts("\t\t0.退出系统");
puts("\t\t*******************************************************\n");
printf("\t\t请输入你的选择(0-8):");
scanf("%d",&n);
if(n<0||n>8)
{
printf("\n\t\t你的选择不在范围内,请重新输入"); /*输入必须是0-8之间*/
getch();
w1=1;
}
else
w1=0;
}while(w1==1);
/*功能选择*/
switch(n)
{
case 1:enter();
break;
case 2:add();
break;
case 3:modify();
break;
case 4:del();
break;
case 5:browse();
break;
case 6:search();
break;
case 7:order();
break;
case 8:copy();
break;
case 0:exit(0);
break;
}
}
int main(int argc, char* argv[])
{
printf("Hello World!\n");
menu();
return 0;
}