(ps:没有自己编译过)
//我写 C++比较多
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define TOTAL_STUD 1000
typedef struct stud {
char name[20]
int score
} students[TOTAL_STUD],sorted[TOTAL_STUD]
void delstud (int i) {
students[i].name = "无效学生"
students[i].score = -999
return
}
#define show(listname,i) printf("%04d %s %d\n",i,listname[i].name,listname[i].score)
int cmpfunc (const void * a, const void * b)
{
return ( *(stud*)a.score - *(stud*)b.score )
} // 本段代码修改自此处
void run(int menu) {
switch (menu) {
case 1:
char uname[20]
int uid,uscore
printf("请输入学生姓名:")
scanf("%s",uname)
printf("\n 请输入学生学号:")
scanf("%d",&uid)
printf("\n 请输入学生成绩:")
scanf("%d",&uscore)
students[uid].name = uname
students[uid].score = uscore
printf("\n\n插入成功!\n\n")
break
case 2:
int delid
printf("要删除谁?学号?")
scanf("%d",&delid)
delstud(delid)
break
case 3:
for (int i = 0i <TOTAL_STUDi++) {
strcpy(sorted[i].name,students[i].name)
sorted[i].score=students[i].score
}
qsort(sorted,TOTAL_STUD,sizeof(stud),cmpfunc)
printf("学号 姓名 分数\n")
for (int i = 0i <TOTAL_STUDi++) {
if (sorted[i].score >-900) show(sorted,i)
}
break
case 4:
for (int i = 0i <TOTAL_STUDi++) {
if (students[i].score >-900) show(students,i)
}
break
case 5:
int delid
printf("要查询谁?学号?")
scanf("%d",&delid)
show(students,delid)
break
default:
printf("-- %d 无此功能。请重试。--",menu)
}
return
}
int main() {
int key = -1
for (int i = 0i <TOTAL_STUDi++) {
delstud(i)
}
while (key != 0) {
printf("---成绩管理系统 V0.9 ---\n 请选择:\n1 -- 录入\n2 -- 删除\n3 -- 排序输出\n4 -- 不排序输出\n5 -- 查询\n0 -- 退出")
key=getch()-48
if (key>0) run(key)
else {
printf("谢谢使用!再见!")
return 0
}
}
return 0
}
1、一定要先写好主函数的框架,然后再往上面加东西,这样说有点笼统,我把我的主函数在下面,可以借鉴下哈。我的主函数是一个while(1)的无限循环,里面一个switch选择,利用一个菜单函数,让其返回值当成switch选择的值,然后进入不同的功能主函数,其他功能主函数和主函数的套路一样。
2、输入模块一定要注意输入的格式,我采用的尾插法,每次处理好一个节点后就让用户判定是否继续输入,在格式控制方面,我当用户输入一次,就判定它是否符号规范,如果不规范,就重新输入。最后存入文件中。
3、一定要把函数写的利用率高一点,这样就可以减少代码的重复书写,这个全凭自己的写代码的风格了,我自己在这点也没有做太好,反省中,以前刚开始学c的时候有人说c语言的主体是函数,不太懂,等写完这个,感觉说的真的很对,c语言的函数写好后,在该用的时候直接引用,很方便。
完整代码: