用C语言实现 学生管理系统(要带注解)?
用C语言实现 学生管理系统
要求:
1.能建立以班为单位的学生基础数据文件,该文件能反映各科成绩和学生的基本信息.
2.能按班并能选择任意一科成绩排序,并输出排序后的班文件.
3.能按年级并能选择任意一科成绩排序,并输出排序后的年级文件.
4.能实现查询功能.可选择名字,也可选择某一科成绩项进行查询.
5.能实现统计某学生的总成绩和平均成绩.
6.能实现统计某班同学的总成绩和平均成绩.
7.能实现统计某年级的总成绩和平均成绩.
我贴出这篇帖子关键是想学学一些编程思路,希望能有对每一条语句的解释。
谢谢各位高人出谋划策!!
[解决办法]
前几天不是给你贴了一个吗?哪看不懂?
- C/C++ code
#include <stdio.h>#include <string.h>#include <malloc.h>#define STUDENT struct student#define LEN sizeof(STUDENT)#include<stdarg.h>#include <stdlib.h>#include <conio.h> STUDENT { long num; char name[5]; int math; int english; int chengxu; int average; STUDENT *next;};int n=0; void menu() { printf(" **************成绩管理系统**************\n"); printf(" *\t1--成绩输入\t2--显示成绩 *\n"); printf(" *\t3--成绩查询\t4--删除成绩 *\n"); printf(" *\t5--排列成绩\t6--插入成绩 *\n"); printf(" *\t0--退出 \t7--保存于文件中 *\n"); printf(" ****************************************\n"); printf("请选择(0--7):");}char choice(){ char select=getche(); return (select);}STUDENT *create(){ STUDENT *head,*p1,*p2; p1=p2=(STUDENT *)malloc(LEN); scanf("%ld %s %d %d %d",&p1->num,p1->name,&p1->math,&p1->english,&p1->chengxu); p1->average=(p1->math+p1->english+p1->chengxu)/3; head=NULL; while (p1->num!=0) { n++; if(n==1) head=p1; else p2->next=p1; p2=p1; p1=(STUDENT *) malloc(LEN); scanf("%ld %s %d %d %d",&p1->num,p1->name,&p1->math,&p1->english,&p1->chengxu); p1->average=(p1->math+p1->english+p1->chengxu)/3; } p2->next=NULL; free(p1); printf("\n"); return(head);}void print(STUDENT *head)//打印成绩信息{ STUDENT *p; p=head; if(head!=NULL) { printf("\n全部成绩为:\n\n"); printf("学号\t姓名\t数学\t英语\t程序\t平均分\n\n"); do { printf("%ld\t%s\t%d\t%d\t%d\t%d\n", p->num, p->name,p->math,p->english,p->chengxu,p->average); p=p->next; }while(p!=NULL); printf("\n"); } else printf("\n目前数据为空,还没有任何信息,请先创建成绩信息!\n\n");}void search(STUDENT *head,char nam[]) //根据姓名查找成绩信息{ STUDENT *p5; if(head==NULL) { printf("\n目前数据为空,还没有任何信息,请先创建成绩信息!\n\n"); return; } p5=head; while(strcmp(p5->name,nam)&&p5->next!=NULL) p5=p5->next; if(strcmp(p5->name,nam)==0) { printf("\n该同学成绩信息为:\n\n"); printf("学号\t姓名\t数学\t英语\t程序\t平均分\n"); printf("%ld\t%s\t%d\t%d\t%d\t%d\n\n",p5->num, p5->name,p5->math,p5->english,p5->chengxu,p5->average); } else printf("\n没有找到该同学的成绩信息!\n\n");}STUDENT *del(STUDENT *head,long num)//根据学号删除学生信息{ STUDENT *p6,*p7; if(head==NULL) { printf("\n删除失败!目前数据为空,还没有任何信息,请先创建成绩信息!\n"); return (head); } p6=head; while(num!=p6->num &&p6->next!=NULL) { p7=p6; p6=p6->next; } if(num==p6->num) { if(p6==head) head=p6->next; else p7->next=p6->next; printf ("\n已删除该名学生的成绩信息!\n"); n--; } else printf ("\n没有找到该名学生的成绩信息!\n"); return(head);}STUDENT *sort(STUDENT *head) //根据平均分排序{ STUDENT *temp,*t,*p3,*p4; temp=head; head=NULL; while(temp!=NULL) { t=temp; temp=temp->next; if(head!=NULL&&head->average<t->average) { p3=head; while(p3!=NULL&&p3->average<t->average) { p4=p3; p3=p3->next; } t->next=p3; p4->next=t; } else { t->next=head; head=t; } } return(head);}STUDENT *insert( STUDENT *head, STUDENT *stud) //根据平均分插入成绩信息{ STUDENT *p3,*p4; if(head!=NULL&&head->average<stud->average) { p3=head; while(p3!=NULL&&p3->average<stud->average) { p4=p3; p3=p3->next; } stud->next=p3; p4->next=stud; } else { stud->next=head; head=stud; } n++; return (head);}void save(STUDENT *head) //存入文件{ FILE *fp; STUDENT *p; fp=fopen("d:\\student.txt","wb"); if(fp==NULL) { printf("无法打开!"); exit(0); } p=head; while(p!=NULL) { fwrite(p,LEN,1,fp); p=p->next; } fclose(fp);}STUDENT *load() //从文件中读取{ FILE *fp; STUDENT *q,*head=NULL; fp=fopen("d:\\student.txt","rb"); if(fp==NULL) { return head; } while(!feof(fp)) { q=(STUDENT *)malloc(LEN); if(fread(q,LEN,1,fp)==1) { q->next=head; head=q; n++; } } fclose(fp); return head;}int main(int argc, char *argv[]){ STUDENT *head,*stu; long del_num; char select,nam[5]; select=0; head=load(); while(select!='0') { system("cls"); menu(); select=choice(); switch(select) { case '0': printf("\n\n您选择的是退出,欢迎您今后再次使用,再见!\n\n\n"); continue; case '1': printf("\n\n您选择的是成绩输入!\n"); printf("\n请输入成绩!\n\n"); printf("学号\t姓名\t数学\t英语\t程序\n"); head=create(); break; case '2': printf("\n\n您选择的是显示成绩!\n"); print(head); break; case '3': printf("\n\n您选择的是成绩查询!\n"); printf("\n请输入要查寻的姓名:"); scanf("%s",nam); search(head,nam); break; case '4': printf("\n\n您选择的是删除成绩!\n"); printf("\n请输入要删除同学的学号:"); scanf("%ld",&del_num); head=del(head,del_num); printf("\n"); break; case '5': printf("\n\n您选择的是排列成绩!\n"); head=sort(head); printf("\n按平均分排列后的所有成绩为:\n"); print(head); break; case '6': printf("\n\n您选择的是插入成绩!\n"); printf("\n请输入插入成绩的信息!\n"); printf("\n学号\t姓名\t数学\t英语\t程序\t平均分\n"); stu=(STUDENT *)malloc(LEN); scanf("%ld %s %d %d %d",&stu->num,stu->name,&stu->math,&stu->english,&stu->chengxu); stu->average=(stu->math+stu->english+stu->chengxu)/3; head=insert(head,stu); printf("\n"); break; case '7': printf("\n\n您选择的是在文件中保存成绩!\n"); save(head); printf("\n保存成功!\n\n"); break; default: printf("\n\n您的选择是错误的!\n\n"); } system("PAUSE"); } return (0);}
[解决办法]
- C/C++ code
#include <stdio.h> //scanf,printf函数的实现在这个系统头文件里,也就是说想用scanf(),printf()就得包含这个头文件#include <string.h>//strcmp这个函数的实现在这个系统头文件里,strcmp的功能是比较两个字符串是否相等,相等则返回1,否则返回0#include <malloc.h>//malloc和free函数的实现在这个系统头文件里,#define STUDENT struct student //定义宏变量student,可以理解为就是字符串替换student=STUDENT struct#define LEN sizeof(STUDENT)//同上定义变量LEN,可以理解为就是字符串替换LEN=sizeof(STUDENT)#include <stdlib.h>//exit和system函数的实现在这个系统头文件里,也就是说想用exit(),system()就得包含这个头文件#include <conio.h>//同上,getche函数的实现在这个系统头文件里 STUDENT //定义一个结构体STUDENT{ long num; //定义long类型的变量 char name[5];//定义字符数组,其长度是5,其中下标0-3可用于存储,name[4]预留存'\0' int math;//定义int类型的变量 int english;//意义同上 int chengxu;//意义同上 int average;//意义同上 STUDENT *next;//定义结构体类型指针,指向结构体STUDENT};int n=0; //定义全局变量n,并赋值为0 void menu() //定义用于显示界面的函数{ printf(" **************成绩管理系统**************\n"); printf(" *\t1--成绩输入\t2--显示成绩 *\n"); printf(" *\t3--成绩查询\t4--删除成绩 *\n"); printf(" *\t5--排列成绩\t6--插入成绩 *\n"); printf(" *\t0--退出 \t7--保存于文件中 *\n"); printf(" ****************************************\n"); printf("请选择(0--7):");}char choice()//定义用户选择操作的函数{ char select=getche(); //定义变量select接受用户的键盘输入选择 return (select);//返回select,也就是返回用户的键盘输入选择值}