大一上学期结束,老师布置的一个小项目
项目要求:1.输入数据到文件 2.根据学号查询成绩 3.根据学号、科目名修改成绩 4.根据学号删除成绩 5.统计成绩(各科最高和平均)
1)链表的话就要先把“车厢”设置好,一个是数据域一个是指针域
struct Student
{
char name[10];
int num;
int Language;
int Math;
int English;
};
typedef struct _Node
{
Student stu;
struct _Node* pNext;
}Node;
当然不能忘了“车头”
Node* g_phead = NULL;
2)写项目的开始界面(简洁)
void start()
{
system("cls");
for (int i = 0; i < 5; i++)
{
printf("\n");
}
printf("\t\t\t\t\t*****************************************\n");
printf("\t\t\t\t\t*\t 学生成绩管理系统\t\t*\n");
printf("\t\t\t\t\t*****************************************\n");
printf("\t\t\t\t\t*\t\t1.输入成绩\t\t*\n");
printf("\t\t\t\t\t*\t\t2.查询成绩\t\t*\n");
printf("\t\t\t\t\t*\t\t3.修改成绩\t\t*\n");
printf("\t\t\t\t\t*\t\t4.删除成绩\t\t*\n");
printf("\t\t\t\t\t*\t\t5.统计成绩\t\t*\n");
printf("\t\t\t\t\t*\t\t0.退出系统\t\t*\n");
printf("\t\t\t\t\t*****************************************\n\n");
printf("\t\t\t\t\t输入相应功能选项:");
}
3)数据的输入(包括savefile()函数和print()函数)
void Input()
{
void savefile(); void print();
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->pNext = NULL;
if (g_phead == NULL)
{
g_phead = pNewNode;
}
else
{
pNewNode->pNext = g_phead;
g_phead = pNewNode;
}
printf("\n\t\t\t\t\t请输入学生姓名:");
scanf("%s", &pNewNode->stu.name);
printf("\n\t\t\t\t\t请输入学生学号:");
scanf_s("%d", &pNewNode->stu.num);
printf("\n\t\t\t\t\t请输入学生语文成绩:");
scanf_s("%d", &pNewNode->stu.Language);
printf("\n\t\t\t\t\t请输入学生数学成绩:");
scanf_s("%d", &pNewNode->stu.Math);
printf("\n\t\t\t\t\t请输入学生英语成绩:");
scanf_s("%d", &pNewNode->stu.English);
savefile();
print();
system("pause");
}
savefile()函数,保存成绩进文件
void savefile()
{
FILE* fp;
fp = fopen("学生成绩.txt", "w");
if (fp == NULL)
{
printf("打开文件失败");
return;
}
Node* p = g_phead;
while (p != NULL)
{
fwrite(&p->stu, 1, sizeof(Student), fp);
p = p->pNext;
}
fclose(fp);
printf("\n\t\t\t\t\t学生信息录入成功\n");
}
print()函数,在界面上打印出每名学生的各科成绩
void print()
{
Node* p = g_phead;
printf("\t\t\t\t\t*****************************************\n");
printf("\t\t\t\t\t*\t 学生成绩管理系统\t\t*\n");
printf("\t\t\t\t\t*****************************************\n");
printf("\n\t\t\t\t\t* 学号 *姓名 *语文 *数学 *英语 *\n");
printf("\t\t\t\t\t*****************************************\n");
while (p != NULL)
{
printf("\n\t\t\t\t\t* %d %s %d %d %d *\n", p->stu.num, p->stu.name, p->stu.Language, p->stu.Math, p->stu.English);
printf("\t\t\t\t\t*****************************************\n");
p = p->pNext;
}
}
4)数据的查找
Node* Find()
{
int num; char name[20];
printf("\n\t\t\t\t\t请输入目标学生学号:");
scanf_s("%d", &num);
printf("\n\t\t\t\t\t请输入目标学生姓名:");
scanf("%s", name);
Node* p = g_phead;
while (p != NULL)
{
if (p->stu.num == num || 0 == strcmp(p->stu.name, name))
{
return p;
}
p = p->pNext;
}
return NULL;
}
5)数据的修改
void Modify()
{
int num;
printf("\n\t\t\t\t\t请输入目标学生学号:");
scanf_s("%d", &num);
Node* p = g_phead;
while (p != NULL)
{
if (p->stu.num == num)
{
int n;
printf("\t\t\t\t\t*****************************************\n");
printf("\t\t\t\t\t*\t 学生成绩管理系统\t\t*\n");
printf("\t\t\t\t\t*****************************************\n");
printf("\t\t\t\t\t*\t\t1.英语 \t\t*\n");
printf("\t\t\t\t\t*\t\t2.语文 \t\t*\n");
printf("\t\t\t\t\t*\t\t3.数学 \t\t*\n");
printf("\t\t\t\t\t*****************************************\n\n");
printf("\t\t\t\t\t输入相应功能选项:");
scanf("%d", &n);
if (n == 1)
{
printf("\t\t\t\t\t*\t\t新成绩: \t\t");
scanf_s("%d", &p->stu.English);
printf("\n\t\t\t\t\t修改成功\n");
print();
}
if (n == 2)
{
printf("\t\t\t\t\t*\t\t新成绩: \t\t");
scanf_s("%d", &p->stu.Language);
printf("\n\t\t\t\t\t修改成功\n");
print();
}
if (n == 3)
{
printf("\t\t\t\t\t*\t\t新成绩: \t\t");
scanf_s("%d", &p->stu.Math);
printf("\n\t\t\t\t\t修改成功\n");
print();
}
break;
}
p = p->pNext;
}
if (p == NULL)
{
printf("\n\t\t\t\t\t查无此人");
}
system("pause");
}
6)数据的删除
void Delete()
{
int num;
printf("\n\t\t\t\t\t请输入删除学生学号:");
scanf_s("%d", &num);
Node* p1; Node* p = g_phead; Node* p2;
if (g_phead->stu.num == num)
{
p1 = g_phead;
g_phead = g_phead->pNext;
free(p1);
print();
system("pause");
return;
}
while (p->pNext != NULL)
{
if (p->pNext->stu.num == num)
{
p2 = p->pNext;
p->pNext = p->pNext->pNext;
free(p2);
print();
system("pause");
return;
}
p = p->pNext;
if (p->pNext == NULL)
{
break;
}
}
if (p->pNext == NULL)
{
printf("\n\t\t\t\t\t查无此人\n");
system("pause");
}
}
7)数据的统计(每个功能我都写了一个函数去实现,最后整合在这个函数)
void Statistics()
{
int c;
int English(); int Math(); int Language(); int english(); int math(); int language();
printf("\t\t\t\t\t*****************************************\n");
printf("\t\t\t\t\t*\t 学生成绩管理系统\t\t*\n");
printf("\t\t\t\t\t*****************************************\n");
printf("\t\t\t\t\t*\t\t1.数学最高\t\t*\n");
printf("\t\t\t\t\t*\t\t2.语文最高\t\t*\n");
printf("\t\t\t\t\t*\t\t3.英语最高\t\t*\n");
printf("\t\t\t\t\t*\t\t4.数学平均\t\t*\n");
printf("\t\t\t\t\t*\t\t5.语文平均\t\t*\n");
printf("\t\t\t\t\t*\t\t6.英语平均\t\t*\n");
printf("\t\t\t\t\t*****************************************\n\n");
printf("\t\t\t\t\t输入相应功能选项:");
scanf_s("%d", &c);
if (c == 1)
{
int Max = Math();
printf("\t\t\t\t\t最高:\t\t %d\t\t\n", Max);
system("pause");
}
if (c == 2)
{
int Max = Language();
printf("\t\t\t\t\t最高:\t\t %d\t\t\n", Max);
system("pause");
}
if (c == 3)
{
int Max = English();
printf("\t\t\t\t\t最高:\t\t %d\t\t\n", Max);
system("pause");
}
if (c == 4)
{
int Avg = math();
printf("\t\t\t\t\t数学平均:\t\t %d\t\t\n", Avg);
system("pause");
}
if (c == 5)
{
int Avg = language();
printf("\t\t\t\t\t语文平均:\t\t %d\t\t\n", Avg);
system("pause");
}
if (c == 6)
{
int Avg = english();
printf("\t\t\t\t\t英语平均:\t\t %d\t\t\n", Avg);
system("pause");
}
}
附录:
int English()
{
int max(int a, int b);
Node* p = g_phead; Node* p1 = p->pNext; int Max = p->stu.English;
if (p1 != NULL)
{
while (p != NULL)
{
Max = max(Max, p1->stu.English);
p = p->pNext;
}
}
else return Max;
return Max;
}
int Math()
{
int max(int a, int b);
Node* p = g_phead; Node* p1 = p->pNext; int Max = p->stu.Math;
if (p1 != NULL)
{
while (p != NULL)
{
Max = max(Max, p1->stu.Math);
p = p->pNext;
}
}
else return Max;
return Max;
}
int Language()
{
int max(int a, int b);
Node* p = g_phead; Node* p1 = p->pNext; int Max = p->stu.Language;
if (p1 != NULL)
{
while (p != NULL)
{
Max = max(Max, p1->stu.Language);
p = p->pNext;
}
}
else return Max;
return Max;
}
int max(int a, int b)
{
if (a >= b)return a;
else return b;
}
int english()
{
int add(int a, int b);
Node* p = g_phead; int Avg = 0; int n = 1; int Add = 0;
while (p != NULL)
{
Add = add(p->stu.English, Add);
Avg = Add / n;
n = n + 1;
p = p->pNext;
}
return Avg;
}
int math()
{
int add(int a, int b);
Node* p = g_phead; int Avg = 0; int n = 1; int Add = 0;
while (p != NULL)
{
Add = add(p->stu.Math, Add);
Avg = Add / n;
n = n + 1;
p = p->pNext;
}
return Avg;
}
int language()
{
int add(int a, int b);
Node* p = g_phead; int Avg = 0; int n = 1; int Add = 0;
while (p != NULL)
{
Add = add(p->stu.Language, Add);
Avg = Add / n;
n = n + 1;
p = p->pNext;
}
return Avg;
}
int add(int a, int b)
{
int c;
c = a + b;
return c;
}
8)选择函数
void diagnosis(char ch)
{
switch (ch)
{
case'1':Input();
break;
case'2':
{
Node* p = Find();
if (p != NULL)
printf("\n\t\t\t\t\t*学号:%d *姓名:%s *语文:%d *数学:%d *英语:%d\n", p->stu.num, p->stu.name, p->stu.Language, p->stu.Math, p->stu.English);
else printf("\n\t\t\t\t\t无目标学生");
system("pause");
}
break;
case'3': Modify();
break;
case'4':Delete();
break;
case'5':Statistics();
break;
case'0':printf("\t\t\t\t\t感谢使用!!!\n");
_sleep(2000);
exit(-1);
break;
}
}
9)主函数
int main()
{
char ch; void diagnosis(char ch);
while (1)
{
start();
ch = getchar();
diagnosis(ch);
system("cls");
}
return 0;
}
总结:这个项目功能并不多,但细究小细节的话也是会让人头大。写之前我听了很多老师的讲课,写完后也去看了很多大佬的成果,我这个真的只能算入门,这些代码可以直接用,但推荐还是要自己思考一下,毕竟也不算太难,逻辑关系也不难搞懂