#include <stdio.h>
#include <stdlib.h>
#define max 10 //定义最大可存储最多学生数
#define year 4 //定义大学为4年
struct Student {
char name[10];
int id;
int yw[year];
int sx[year];
int yy[year];
} student[max];//建立一个学生结构体数组
/*
下面分别 读取和写入
*/
void textToStu(){ //读取text去结构数组
//1.读取text文件
FILE *fp = fopen("student.txt", "r");
if(NULL == fp) { //确保成功打开文件,否则退出系统
printf("数据获取失败!即将退出系统...\n");
Sleep(1000);
printf("3\n");
Sleep(1000);
printf("2\n");
Sleep(1000);
printf("1\n");
exit(0);
}else{
printf("数据读取成功!即将进入系统...\n");
Sleep(1000);
printf("3\n");
Sleep(1000);
printf("2\n");
Sleep(1000);
printf("1\n");
}
//2 读取问text文件内容并存到结构体容器中
int num = 0;
int r;
r = fread(&student[num], sizeof(struct Student),1, fp);
while(r) {
num++;
r = fread(&student[num], sizeof(struct Student),1, fp);
}
//3 关闭文件
fclose(fp);
}
void stuToText(){ //读取结构数组去text
FILE *fp = fopen("student.txt", "w");
//从嫁给他数组容器写入数据到text
int count = 0;
int sum=getStuSum();
while(count < sum) {
fwrite(&student[count], sizeof(struct Student),1, fp);
count++;
}
printf("\n\n\n数据写入成功!即将退出系统!\n");
Sleep(1000);
printf("3\n");
Sleep(1000);
printf("2\n");
Sleep(1000);
printf("1\n");
fclose(fp);
}
/*
从数组获取学生个数 格式化学生数组某一个位置上面的内容
*/
int getStuSum(){ //获取学生个数
int i=0,j=0;
for(;i<max;i++){
if( student[i].id==0 ){
j++;
}
}
printf("<<<<<< 当前学生个数为:%d >>>>>>\n",max-j);
return max-j;
}
void removeIdStu(int i){ //移除数组下标为i的学生
student[i].name[0] = '\0';
student[i].id = 0 ;
int j=0;
for(;j<year;j++){
student[i].yw[j] = '\0' ;
student[i].sx[j] = '\0' ;
student[i].yy[j] = '\0' ;
}
printf("************* 删除成功 ***********\n");
}
/*
下面为对学生数组进行操作的方法
*/
void addStu() { //增加学生
char name[10];
int id;
printf("\t请输入要添加的学生学号:");
scanf("%d", &id);
printf("\t请输入要添加的学生名字:");
scanf("%s", name);
int i=0;
printf("<<<<<< 即将准备添加学生时");
int sum=getStuSum();
for(;i<=sum;i++){
if( id ==student[i].id ) { printf("******* 录入失败!该学生的学号已被录入!*******\n");break; }
if( strcmp(name , student[i].name )==0 ){ printf("******* 录入失败!该学生的姓名已被录入!*******\n"); break;}
if( i == sum ){
student[i].id = id;
strcpy( student[i].name , name);
printf("*-*-*-* 学号:%d 姓名:%s 信息录入成功!*-*-*-*\n",student[i].id , student[i].name);
}
}
}
void researchStu() { //查询某位学生成绩
int id; //接收用户输入的学号
int count=0 ;
int sum = getStuSum();
printf("\t 请输入要查询成绩的学号:");
scanf("%d", &id);
while(count <= sum) {
if( student[count].id == id){
printf("\t学号:%d 名字:%s \n", student[count].id ,student[count].name );
printf("[ ][ ][ ] 该学生成绩如下 [ ][ ][ ]\n");
int j=0;
for(;j<year;j++){
printf("- - - - -第%d年 语文:%d 数学:%d 英语:%d \n" ,j+1, student[count].yw[j], student[count].sx[j], student[count].yy[j] );
}
break;
}
else {
count++;
}
}
if(count > sum) {
printf("******* 未找到该学生!*******\n");
}
}
void showAllStu() { //查看全部 学生信息
int count = 0;
int sum = getStuSum();
while(count < sum) {
printf("\t学号:%d 名字:%s \n", student[count].id ,student[count].name );
int j=0;
for(;j<year;j++){
printf("- - - - -第%d年 语文:%d 数学:%d 英语:%d \n",j+1, student[count].yw[j], student[count].sx[j], student[count].yy[j] );
}
count++;
}
if(count==0){
printf("****** 无法获取全部学生,当前无学生!******\n");
}
}
void loginStuGrade(int gradeMs){ //0登记成绩 或者 1修改某位学生的成绩
if(gradeMs){
printf("\t 请输入需要修改成绩的学生学号:");
}
else{
printf("\t 请输入需要登记成绩的学生学号:");
}
int flag;
int id; //接收输入的学号
scanf("%d", &id);
int count = 0;
int sum=getStuSum();
while(count < sum) {
if( student[count].id == id ){
int k=0;
for(;k<year;k++){ //在修改成绩模式中,如果某一年全部成绩数据为零,则flag标记加一,当标记flag加到2以上时,就判断改学生成绩数据为空,则,当调用修改成绩方法时,当大部分成绩数据数据为零,则无法修改成绩
if( (student[count].yw[k] ==0)&&(student[count].sx[k]==0)&&(student[count].yy[k]==0 ) ){ flag++;}
}
if( (flag>=3)&&(gradeMs==1) ){//在修改成绩模式中 当flag大于等于2时,证明学生成绩大部分为空,则无法修改成绩
printf("****** 当前学生成绩 大部分or全部 均为空,无法修改成绩,请从教师模式登记录入成绩 ******\n");
break;
}
int j=0;
for(;j<year;j++){
printf("\t 请输入第%d年成绩 (语文 数学 英语)(xx xx xx):",j+1);
int yw=0 ,sx=0 ,yy=0;
scanf("%d", &yw);
scanf("%d", &sx);
scanf("%d", &yy);
student[count].yw[j] = yw;
student[count].sx[j] = sx;
student[count].yy[j] = yy;
}
printf("** *<!<!<! 登记成功 !>!>!>* ** \n");
break;
}
count++;
}
if(count >= sum) {
printf("******* 未找到该学生!*******\n");
}
}
void deleteStu() { //删除学生
int id;
int count=0;
int sum=getStuSum();
printf("\t 请输入想要删除的学生的学号:");
scanf("%d", &id);
while(count < sum) {
if( student[count].id == id ) {
printf("***找到学生%s 准备执行该学生删除!***\n",student[count].name);
for(; count < sum; count++) {
strcpy(student[count].name, student[count + 1].name );
student[count].id = student[count + 1].id;
int j=0;
for(;j<year;j++){
student[count].yw[j] = student[count + 1].yw[j];
student[count].sx[j] = student[count + 1].sx[j];
student[count].yy[j] = student[count + 1].yy[j];
}
}
printf("******* 删除成功!*******\n");
break;
} else {
count++;
}
}
removeIdStu( sum-1 );//移除最后一位学生
if(count >= sum) {
printf("******* 未找到该学生信息!*******\n");
}
}
//int main()
//{
// textToStu(); //读取text去结构数组
// int i;
// while(1){
// printf("\n");
// printf("\t 请输入模式:");
// scanf("%d",&i);
// switch (i){
// case 1:
// addStu(); //添加 一个学生姓名
// continue;
// case 2:
// researchStu(); //查询某位学生成绩
// continue;
// case 3:
// showAllStu();//查看全部学生内容
// continue;
// case 4:
// int what;
// scanf("%d",&what);
// loginStuGrade(what);//登记成绩 或者 修改某位学生的成绩
// continue;
// case 5:
// deleteStu(); //删除某个学生
// continue;
// case 6:
// getStuSum();//获取学生个数
// continue;
// }
// if( i==(-1) ) {
// break;
// }
// }
// stuToText(); //读取结构数组去text
//}
int main(){
textToStu(); //读取text去结构数组
while(1){
printf("\n\n\n\n********************************************************************************************************\n");
printf(" \t \t 《《《《《<<<<< 请选择登录模式 >>>>>》》》》》\n (输入1为学生模式登录) (输入2为教师模式登录)(输入3为管理员模式登录)(退出系统输入-1):");
int i ;//登录模式
int zh, mm;//账号密码
int ms;//内部模式
int gradeMs;
scanf("%d",&i);
if (i == 1){
printf("\n \t \t\t 当前为 <学生模式> \n \t\t 请分别输入账号和密码 (xxx xxx)中间用空格隔开: ");
scanf("%d",&zh);
scanf("%d",&mm);
if(( zh == 123) && ( mm == 456) ){
printf("\t\t~~~~~~~ 登录成功,请选择模式 ~~~~~~~\n");
while(1){
printf("\n\n\n");
printf("\t(输入1查询成绩)(输入-1退出学生模式):");
scanf("%d",&ms);
switch (ms){
case 1:
researchStu(); //查询某位学生成绩
continue;
}
if( ms == -1 ){
break;
}else{
printf("*******当时输入有误,请重新输入!*******\n");
continue;
}
}
}else{
printf("****************** 当前输入的账号或密码有误! ******************");
}
}
if (i == 2){
printf("\n \t \t\t 当前为 <教师模式> \n \t\t请分别输入账号和密码 (xxx xxx)中间用空格隔开: ");
scanf("%d",&zh);
scanf("%d",&mm);
if(( zh == 123) && (mm == 456) ){
printf("\t\t*******登录成功,请选择模式*********\n");
while(1){
printf("\n\n\n");
printf("\t(输入1登记学生成绩)(输入2修改学生成绩)(输入-1退出教师模式):");
scanf("%d",&ms);
switch (ms){
case 1:
gradeMs=0;//0为登记学生成绩
loginStuGrade(gradeMs);//登记成绩 或者 修改某位学生的成绩
continue;
case 2:
gradeMs=1;//1为修改学生成绩
loginStuGrade(gradeMs);//登记成绩 或者 修改某位学生的成绩
continue;
}
if(ms == -1){
break;
}else{
printf("**********当时输入有误,请重新输入!***********\n");
continue;
}
}
}else{
printf("****************** 当前输入的账号或密码有误! ******************");
}
}
if (i == 3){
printf("\n \t \t\t 当前为 <管理员模式> \n \t\t请分别输入账号和密码 (xxx xxx)中间用空格隔开: ");
scanf("%d",&zh);
scanf("%d",&mm);
if( ( zh == 123) && (mm == 456) ){
printf("\t\t******登录成功,请选择模式*******\n");
while(1){
printf("\n\n\n");
printf("(输入1查询学生成绩)(输入2修改学生成绩)(输入3增加学生)(输入4删除学生)(输入5查看全部学生)(输入6查看学生总数)( 输入-1退出管理员模式 ):");
scanf("%d",&ms);
switch (ms){
case 1:
researchStu(); //查询某位学生成绩
continue;
case 2:
gradeMs=1;
loginStuGrade(gradeMs);//0登记成绩 或者 1修改某位学生的成绩
continue;
case 3:
addStu();//添加学生
continue;
case 4:
deleteStu(); //删除某个学生
continue;
case 5:
showAllStu();//查看全部学生内容
continue;
case 6:
getStuSum();//获取学生个数
continue;
}
if(ms == -1){
break;
}else{
printf("*********当时输入有误,请重新输入!**********\n");
continue;
}
}
}else{
printf("****************** 当前输入的账号或密码有误! ******************");
}
}
if(i == -1){
printf("\n****你已退出系统,谢谢!*****");
break;
}
}
stuToText(); //读取结构数组去text
return 0;
}