简单的学生成绩管理系统(待优化)

#include<stdio.h>
#include<string.h>
struct Stu
{
char Name[12];
int ID;
int Math;
int Chinese;
int English;
};
struct Stu Student[100];
void Menu()
{
puts("1.Browse");
puts("2.Add");
puts("3.Delete");
puts("4.Modify");
puts("5.Find");
puts("0.Exit");
}
void Save()
{
FILE* pfw = fopen("data1.txt", "w");
if (pfw == NULL)
{
printf("Save failed!");
return;
}
int i = 0;
while (Student[i].ID != 0)
{
if (Student[i].ID != -1)
{
fwrite(&Student[i], 1, sizeof(struct Stu), pfw);
}
i++;
}
fclose(pfw);
}
void Load()
{
FILE* pfr = fopen("data1.txt", "r");
if (pfr == NULL)
{
printf("Load failed!");
return;
}
int i = 0;
int flag = 0;
do
{
flag=fread(&Student[i], 1, sizeof(struct Stu),pfr);
i++;
} while (flag== sizeof(struct Stu));
fclose(pfr);
}
int Judge(int nIndex,int i,int nMaxindex)
{
if (nIndex == 0) return Student[i].ID > Student[nMaxindex].ID;
if (nIndex == 1) return Student[i].Math < Student[nMaxindex].Math;
if (nIndex == 2) return strcmp(Student[i].Name, Student[nMaxindex].Name)>0;
}
void Sort(int nIndex)
{
int n = 0, nMaxindex = 0;
struct Stu Tmp;
while (Student[n].ID != 0)
n++;
for (int j = n-1;j>0 ; j--)
{
nMaxindex = 0;
for (int i = 1; i <= j; i++)
{
if (Judge(nIndex,i, nMaxindex))
{
nMaxindex = i;
}
}
if (nMaxindex != j)
{
Tmp = Student[j];
Student[j] = Student[nMaxindex];
Student[nMaxindex] = Tmp;
}
}
}
void Print()
{
int i = 0;
puts("Name IDnumber Math Chinese English ");
while (Student[i].ID != 0)
{
if (Student[i].ID != -1)
{
printf("%s %-8d %d %d %d ", Student[i].Name, Student[i].ID, Student[i].Math, Student[i].Chinese, Student[i].English);
}
i++;
}
}
int Browse()
{
puts("1.Sort by ID");
puts("2.Sort by Name");
puts("3.Sort by Math");
puts("4.Return");
char s = getchar();
while (getchar()!= ' ')continue;
switch (s)
{
case '1':Sort(0); Print(); break;
case '2':Sort(2); Print(); break;
case '3':Sort(1); Print(); break;
case '4': break;
default:puts("please obey!"); return 1;
}
return 0;
}
int Add()
{
int i = 0;
puts("Put ID");
int ID;
scanf("%d", &ID);
while (getchar() != ' ')continue;
while (Student[i].ID != 0 && Student[i].ID != -1)
{
if (Student[i].ID == ID)
{
return 1;
}
i++;
}
Student[i].ID = ID;
puts("Name");
scanf("%s", &Student[i].Name);
while (getchar() != ' ')continue;
puts("Math,Chinese,English");
scanf("%d,%d,%d", &Student[i].Math, &Student[i].Chinese, &Student[i].English);
while (getchar() != ' ')continue;
Save();
return 0;
}
int Delete()
{
int i = 0;
puts("Put ID");
int ID;
scanf("%d", &ID);
while (getchar() != ' ')continue;
while (Student[i].ID != 0)
{
if (Student[i].ID == ID)
{
Student[i].ID = -1;
break;
}
i++;
}
if (Student[i].ID == 0)
return 1;
Save();
return 0;
}
int Modify()
{
int i = 0;
puts("Put ID");
int ID;
scanf("%d", &ID);
while (getchar() != ' ')continue;
while (Student[i].ID != 0)
{
if (Student[i].ID == ID)
{
break;
}
i++;
}
if (Student[i].ID == 0)
return 1;
puts("Math,Chinese,English");
scanf("%d,%d,%d", &Student[i].Math, &Student[i].Chinese, &Student[i].English);
while (getchar() != ' ')continue;
Save();
return 0;
}
int Find()
{
int i = 0;
puts("Put ID");
int ID;
scanf("%d", &ID);
while (getchar() != ' ')continue;
while (Student[i].ID != 0)
{
if (Student[i].ID == ID)
{
printf("%s,%d,%d,%d ", Student[i].Name, Student[i].Math, Student[i].Chinese, Student[i].English);
break;
}
i++;
}
if (Student[i].ID == 0)
return 1;
return 0;
}
int main(void)
{
Load();
while (1)
{
Menu();
char s = getchar();
while (getchar() != ' ')continue;
switch (s)
{
case '1': {while(Browse()==1); break; }
case '2': {if (Add() == 1)puts("ID is duplicated"); else puts("Add success!"); break; }
case '3': {if (Delete() == 1)puts("ID doesn't exist"); else puts("Delete success!"); break; }
case '4': {if (Modify() == 1)puts("ID doesn't exist"); else puts("Modify success!"); break; }
case '5': {if (Find() == 1)puts("ID doesn't exist"); else puts("Find success!"); break; }
case '0': {return 0; }
default: {puts("Please obey!"); break; }
}
}
return 0;
}

简介:100个表示学生的结构体,有添加,浏览所有学生,根据学号查找、修改、删除的功能。添加时具有自动学号查重的功能。浏览时有多种排序功能

写这段代码收获;

1.if配合break跳循环很好用.

2.scanf里面要是用输入%s格式,如

scanf("%s", &Student[i].Name);

就不要用scanf接受多个格式的变量了,这个scanf就专门用来接%s,因为如果不这样做,输入的时候后面你想要输入的不属于%s格式的内容无法与前面你想输入进去属于%s的内容分开,造成你不想要的结果.

3. 用于对齐时,如果一列上的数据,有的大于等于8位,有的小于8位就会造成对不齐的效果,这个时候机智的将小于8位的数利用类似-%8d这种格式强制将其转化成8位的就可以了.

4.getchar()和scanf命令之后可以跟

while (getchar() != '
')continue;

来清空缓存区,还可以把上面的代码当暂停用

5.c语言文件操作在实际使用中,最好写一个Save()函数用来保存,每次修改和添加都调用一次Save()函数,再写一个Load()函数,这个函数只在main函数开头调用一次就可以,用来把文件里的数据导出到程序中进行处理或显示.

6.多个函数的代码只有局部不相同,此时设置一个判断函数来分别选择这个局部代码,可以使代码更简洁。

如这里面的Judge函数

原文地址:https://www.cnblogs.com/ma77045728/p/6953951.html