1. c语言程序设计 班级学生成绩管理系统
设计课题一:班级成绩管理系统
一、 问题描述:
对一个有N个学生的班级,每个学生有M门课程。该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。
二、功能要求:
1、本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。
2、本系统显示这样的菜单:
请选择系统功能项:
a、 成绩录入
b、 成绩显示
c、 成绩保存
d、 成绩排序
e、 成绩修改(要求先输入密码)
f、 成绩统计
(1) 显示每门课程成绩最高的学生的基本信息
(2) 显示每门课程的平均成绩
(3) 显示超过某门课程平均成绩的学生人数
g、 退出系统
3、执行一个具体的功能之后,程序将重新显示菜单。
4、将学生成绩保存到文件中。
三、算法提示:
1、数据结构:结构体类型数组。
2、数据库结构:下表构成该系统的基本数据库。
姓名 学号 课程名称1 课程名称2 ●●●●●●
char Char float float
四、测试数据:
学生人数N=10
课程门数M=4
课程名:数学、语文、英语、政治
五、其它
对该系统有兴趣的同学可以在实现上述基本功能后,完善系统的其它功能。
问题补充:
今天谁能给我答案啊!!!!!!!急急!!!!!!!
提问者: 342123465 - 一级
最佳答案
C语言课程设计报告—班级成绩管理系统
需要分析:
学生成绩管理系统有13种功能。把这13个功能做成13个子函数。在主函当数中设计一个菜单对这13个子数进行管理。来实现对整个系统的操作。
根据课题的要求。每一个学生的包括姓名(char)、学号(char)、M门课程的成绩(float).再加上系统功能上的要求每一学生的信息还要总分和名次等。所以自然的想到要用结构体来定义每一个学生的信息结构。然后用链表把它们组成一个有序的整体。用对链表的操作来实现对所有学生信息的统一管理(成绩显示、成绩排序、成绩修改等)。最后为了以后按照处理后的顺序保存到文件中。
. 各函数的功能:
概要设计:
程序的模块组成:
主 函 数: int main()
新建函数:STUDENT *init()
输入函数 :STUDENT *create()
显示函数: void print(STUDENT *head)
删除函数: STUDENT *delete(STUDENT *head)
按名字寻找函数: void lookup(STUDENT *head)
保存函数: void save(STUDENT *head)
按总分排序函数: STUDENT *sort(STUDENT *head)
计算总分和均分函数: void computer(STUDENT *h)
修改函数: STUDENT *Modify(STUDENT *head,STUDENT *new)
按学号排序函数: STUDENT *index(STUDENT *h)
菜单函数:int menu_select()
各个函数的主要功能:
输入函数: 随时输入数据。
菜单函数:显示系统主菜单。
显示函数: 显示所有学生的信息。
寻找函数: 方便学生查找自己的成绩。
删除函数: 删除某学生的信息。
排序函数: 按总成绩排序。
按学号排序函数: 按学号排序。
插入函数: 可以插入新的信息。
保存函数: 保存好学生成绩,以免丢失。
统计函数:
l 显示每门课程成绩最高的学生的基本信息。
l 显示每门课程的平均成绩。
l 显示超过某门课程平均成绩的学生人数。
课题的功能模块的划分:
开始
菜单界面
功能选择
初始化函数
输入学生信息
删除学生信息
显示学生信息
查找学生信息
按成绩排序
保存到文件
从文件读数据
插入学生成绩
分类合计
退出系统
结束
详细设计: 整个系统除了主函数外,另外还有14个函数,实现八大功能:输入功能、显示功能、查找功能、排序功能、插入功能、保存功能、读取功能。各个函数的详细设计说明分别如下:
主函数 main()
利用无限次循环for(;;)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。
菜单选择函数 int menu_select()
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择。等执行完每一个函数功能后,返回菜单。
代码设计: 初始化函数 STUDENT *init()
这是一个无参函数,里面只有两个语句,它的作用是使链表初始化,使head的值为NULL和一个清屏语句。比如:没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!
输入记录函数 STUDENT *create() 这是一个无参函数,用来执行学生成绩记录的输入,当学生为@时停止输入,函数结束后,带回一个链表头的指针指向一下个学生的信息插在表头。
N-S流程图如下:
head=NULL无条件循环
指针p指向新开辟的单元
指针p是否为空
是 否
输入学号p->num
输出 p->num是否为@
内存 是 否
溢出 输入姓名p->name
停止 for(i=0;i<3;i++)
输入 输入成绩
返回 p->sum=s;
菜单 p->average=(float)s/3;
显示记录函数 void print(STUDENT *head)
这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。
算法:先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。重复执行此步聚直到p指针指向NULL为止。
N-S流程图如下:
p=head,使指向第一个结点
输出p所指向的结点
p指向一下个结点
当p指的不是表尾
程序调试:
由于本课题中的许多知识点都没有学过都要靠自己到课外的资料中去查找。在用的时候难免出现这样那样的错误。如开始设计出来的菜单不是预想的那样,而是总个窗中出现混乱。解决的这个问题的办法是调整。最后还是老师帮我帮我们找到了问题的所在——for 循环的次超过了链表中结点的数量。再就是自定义函数时由于课本的概念不清楚,多写了空格键,以至函数调用不出来。又如:在设计修改学生信息时的密密码时。当用户发现输入密码错误按了退格键后,因为“*”并没有消去。导致用户再次按退格键,又出现前面的情况。最终导致输入密码错误。所以用了两次退格键:
在对链表操作时,要特别链表指针的移动(p=p->next)和链表尾的判断 (p= =NULL)。没有指针的移动,就很容易出现死循环。而在运行过程中不能控制。所以你就会认为是死机。如果没有链表尾的判断。就会在运行过程出现想不到的错误。如:在显示链表信息时,后面就会出现乱码。
一个系统的菜单和提示信息非常重要。如果没有这些用户根本不知道怎么用你设计的这个系统。在设计的调试过程中也无法顺利的完成调试工作。有了一个清晰简单的菜单和一些提示信息这后,调试过程完成的非常顺利。
予我耐心解答的老师和同学,是他们为我小程序的成功起到了关键性的作用,那么多个日夜,如此多的困难,同学们勤恳塌实,从开始到结束,没有显出一点倦意,始终热情高涨,我感谢这种氛围,感谢学校提供的良好条件。
回顾起此次课程设计,至今我仍感慨颇多,的确,从拿到题目到完成整个编程,从理论到实践,在整整半个学期的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识重新温故。
本次课程设计结束了,对于我的影响很大。我通过这次实践学到了许多知识。学到了设计一个简单的系统。要注意哪些方面。也使我知道自己哪些方面做得还不够。
但我出总结出了一点点的经验如下:
1、要对系统的功能和要求做出详细的分析,并合理分解任务。
2、把分解出来的子任务,做给一个相对独立的模块。
3、在设计一个模块之前,要简单构想一下总界面的显视情况。
4、针对构想出来的界面进行程序的编写。
最后,感谢老师您对我的指导和从百忙中抽空看我的设计,谢谢!
附件:
源程序:
#include "stdio.h" /*I/O函数*/
#include "stdlib.h" /*其它说明*/
#include "string.h" /*字符串函数*/
#include "conio.h" /*屏幕操作函数*/
#include "mem.h" /*内存操作函数*/
#include "ctype.h" /*字符操作函数*/
#include "alloc.h" /*动态地址分配函数*/
#include "dos.h"
#define N 4 /*定义常数*/
typedef struct z1 /*定义数据结构*/
{
char no[12];
char name[20];
int score[N];
float sum;
float average;
int order;
struct z1 *next;
}STUDENT;
/*以下是函数原型*/
STUDENT *init(); /*初始化函数*/
STUDENT *create(); /*创建链表*/
STUDENT *delete(STUDENT *h); /*删除记录*/
void print(STUDENT *h); /* 显示所有记录*/
void lookup(STUDENT *h); /*查找*/
void save(STUDENT *h); /*保存*/
STUDENT *load(); /*读入记录*/
void computer(STUDENT *h); /*计算总分和均分*/
STUDENT *Modify(STUDENT *h); /*修改记录*/
void append(); /*追加记录*/
STUDENT *sort(STUDENT *h); /*按总分排序*/
STUDENT *index(STUDENT *h); /*按学号排序*/
int menu_select(); /*菜单函数*/
/******主函数开始*******/
main()
{
int i;
STUDENT *head; /*链表定义头指针*/
printf("\n\n\n\n\n\n\n\n\n");
printf(" * * ******* * ***** ***** * * ******* \n");
printf(" * * * * * * * ** * * * \n");
printf(" * * * * ******* * * * * * *** * ******* \n" );
printf(" * * * * * * * * * * * * * \n");
printf(" * * ******* ******* ***** * *** * * * ******* \n");
printf("\n");
printf("\n");
printf("\n");
sleep(2);
head=init(); /*初始化链表*/
clrscr(); /*清屏*/
for(;;) /*无限循环*/
{
switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/
{ /*值不同,执行的函数不同,break 不能省略*/
case 0:head=init();break; /*执行初始化*/
case 1:head=create();break; /*创建链表*/
case 2:print(head);break; /*显示全部记录*/
case 3:head=delete(head);break; /*删除记录*/
case 4:lookup(head);break; /*按名字查找记录*/
case 5:save(head);break; /*保存文件*/
case 6:head=load(); break; /*读文件*/
case 7:computer(head);break; /*计算总分和均分*/
case 8:head=Modify(head); break; /*修改记录,一般会插在表尾*/
case 9:head=sort(head);break; /*按部分排序*/
case 10:append();break; /*追加记录*/
case 11:head=index(head);break; /*按学号排序*/
case 12: exit(0); /*如菜单返回值为12程序结束*/
}
}
}
/*菜单函数,返回值为整数*/
menu_select()
{
char *menu[]={"***************MENU***************", /*定义菜单字符串数组*/
" 00. init list", /*初始化*/
" 01. Enter list", /*输入记录*/
" 02. print list ", /*显示单链表中所有记录*/
" 03. Delete a record from list", /*从表中删除记录*/
" 04. Search record on name", /*按照姓名查找记录*/
" 05. Save the file", /*将单链表中记录保存到文件中*/
" 06. Load the file", /*从文件中读入记录*/
" 07. compute the score", /*计算所有学生的总分和均分*/
" 08. Modify an information ", /*修改某学号的信息*/
" 09. sort to make new file", /*排序*/
" 10. append record to file", /*追加记录到文件中*/
" 11. index on nomber", /*按学号排序*/
" 12. Quit"}; /*退出*/
char s[3]; /*以字符形式保存选择号*/
int c,i; /*定义整形变量*/
gotoxy(1,1); /*移动光标*/
textcolor(YELLOW); /*设置文本显示颜色为黄色*/
textbackground(BLUE); /*设置背景颜色为蓝色*/
gotoxy(10,2); /*移动光标*/
putch(0xc9); /*输出左上角边框┏*/
for(i=1;i<44;i++)
putch(0xcd); /*输出上边框水平线*/
putch(0xbb); /*输出右上角边框 ┓*/
for(i=3;i<20;i++)
{
gotoxy(10,i);putch(0xba); /*输出左垂直线*/
gotoxy(54,i);putch(0xba); /*输出右垂直线*/
}
gotoxy(10,20);putch(0xc8); /*输出左上角边框┗*/
for(i=1;i<44;i++)
putch(0xcd); /*输出下边框水平线*/
putch(0xbc); /*输出右下角边框┛*/
window(11,3,53,19); /* 制作显示菜单的窗口,大小根据菜单条数设计*/
clrscr(); /*清屏*/
for(i=0;i<16;i++) /*输出主菜单数组*/
{
gotoxy(10,i+1);
cprintf("%s",menu[i]);
}
textbackground(BLACK); /*设置背景颜色为黑色*/
window(1,1,80,25); /*恢复原窗口大小*/
gotoxy(10,21); /*移动光标*/
do{printf("\n make by wenwei");
printf("\n Enter you choice(0~13):"); /*在菜单窗口外显示提示信息*/
scanf("%s",s); /*输入选择项*/
c=atoi(s); /*将输入的字符串转化为整形数*/
}while(c<0||c>14); /*选择项不在0~14之间重输*/
return c; /*返回选择项,主程序根据该数调用相应的函数*/
}
STUDENT *init()
{ clrscr();
return NULL;
}
/*创建链表*/
STUDENT *create()
{
int i; int s;
STUDENT *h=NULL,*info; /* STUDENT指向结构体的指针*/
clrscr();
for(;;)
{
info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/
if(!info) /*如果指针info为空*/
{
printf("\nout of memory"); /*输出内存溢出*/
return NULL; /*返回空指针*/
}
inputs("enter no:",info->no,11); /*输入学号并校验*/
if(info->no[0]=='@') { clrscr();break; } /*如果学号首字符为@则结束输入,清屏后返回*/
inputs("enter name:",info->name,15); /*输入姓名,并进行校验*/
printf("please input %d score \n",N); /*提示开始输入成绩*/
s=0; /*计算每个学生的总分,初值为0*/
for(i=0;i<N;i++) /*N门课程循环N次*/
{
do{
printf("score%d:",i+1); /*提示输入第几门课程*/
scanf("%d",&info->score[i]); /*输入成绩*/
if(info->score[i]>100||info->score[i]<0) /*确保成绩在0~100之间*/
printf("bad data,repeat input\n"); /*出错提示信息*/
}while(info->score[i]>100||info->score[i]<0);
s=s+info->score[i]; /*累加各门课程成绩*/
}
info->sum=s; /*将总分保存*/
info->average=(float)s/N; /*求出平均值*/
info->order=0; /*未排序前此值为0*/
info->next=h; /*将头结点做为新输入结点的后继结点*/
h=info; /*新输入结点为新的头结点*/
clrscr();
}
return(h); /*返回头指针*/
}
/*输入字符串,并进行长度验证*/
inputs(char *prompt, char *s, int count)
{
char p[255];
do{
printf(prompt); /*显示提示信息*/
scanf("%s",p); /*输入字符串*/
if(strlen(p)>count)printf("\n too long! \n"); /*进行长度校验,超过count值重输入*/
}while(strlen(p)>count);
strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
}
/*输出链表中结点信息*/
void print(STUDENT *h)
{
int i=0; /* 统计记录条数*/
STUDENT *p; /*移动指针*/
clrscr(); /*清屏*/
p=h; /*初值为头指针*/
printf("\n\n\n*********************************STUDENT************************************\n");
printf("|rec|nO | name | sc1| sc2| sc3| sc4| sum | ave |order|\n");
printf("|---|----------|---------------|----|----|----|----|--------|--------|-----|\n");
while(p!=NULL) /*只要p不是尾结点,就输出记录*/
{
i++;
printf("|%3d|%-10s|%-15s|%4d|%4d|%4d|%4d| %6.2f | %6.2f | %3d |\n", i, p->no,p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->sum,p->average,p->order);
p=p->next;
}
printf("***********************************end**************************************\n");
getch(); /*输入任一键返回主菜单*/
clrscr(); /*清屏*/
}
/*删除记录*/
STUDENT *delete(STUDENT *h)
{
STUDENT *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/
char s[12]; /*存放学号*/
char *pass="wenwei28";
char a[20],b=NULL;
int i=0;
clrscr();
printf("Input your password:");
while((i<20)&&(b!='\r'))
{ b=getch(); /*无回显输入*/
if(b==8)
{ if(i>0)
{a[--i]=NULL;
putchar(8); /*退格键*/
putchar(' '); /*以空格代替*/
putchar(8);
}
else putchar(7); /*没有任何字符的退格,响铃警告*/
}
else if(b!='\r')
{ a[i++]=b; /*只要不是退格和回车就接受*/
putchar('*');
}
else
{a[i]=NULL; break; /*密码输入完了,记得加个NULL到后面*/
}
}
if(strcmp(a,pass)!=0)
{clrscr();
printf("Password is mistake Tow seconds to return!");
sleep(2);clrscr();return h;
}
else {printf("Password is OK! Welcome to come!"); sleep(3);
}
clrscr(); /*清屏*/
printf("please deleted no\n"); /*显示提示信息*/
scanf("%s",s); /*输入要删除记录的学号*/
q=p=h; /*给q和p赋初值头指针*/
while(strcmp(p->no,s)&&p!=NULL) /*当记录的学号不是要找的,或指针不为空时*/
{
q=p; /*将p指针值赋给q作为p的前驱指针*/
p=p->next; /*将p指针指向下一条记录*/
}
if(p==NULL) /*如果p为空,说明链表中没有该结点*/
{ printf("\nlist no %s student\n",s);sleep(2);clrscr();return h;}
else /*p不为空,显示找到的记录信息*/
{
printf("*********************************have found********************************\n");
printf("|no | name | sc1| sc2| sc3| sc4| sum | ave |order|\n");
printf("|------------|---------------|----|----|----|----|--------|--------|-----|\n");
printf("|%-12s|%-15s|%4d|%4d|%4d|%4d| %6.2f | %6-5.2f | %3d |\n", p->no,
p->name,p->score[0],p->score[1],p->score[ q=p; /*保存当前结点的指针,作为下一结点的前驱*/
p=p->next; /*指针后移,新读入数据链到当前表尾*/
}
q->next=NULL; /*最后一个结点的后继指针为空*/
fclose(fp); /*关闭文件*/
printf("---You have success read data from file!!!---\n");
getch(); /*按任意键返回主菜单*/
clrscr();
return h; /*返回头指针*/
}
/*成绩统计*/
void computer(STUDENT *h)
{
STUDENT *p,*t,*q; /*定义移动指针*/
float saverage[N]={0}; /*均分初值为0*/
int i;
clrscr();
for (i=0;i<N;i++)
{ int n=0,j=0; /*保存记录条数初值为0*/
long s=0; /*总分初值为0*/
p=h; /*从头指针开始*/
while(p!=NULL) /*当p不为空时处理*/
{
s+=p->score[i]; /*累加总分*/
j++; /*统计记录条数*/
p=p->next; /*指针后移*/
h; /*返回头指针
}
2. 求C语言编写的“学生成绩管理系统”的程序带有流程图的最好~!
#include "stdio.h" #include "string.h" #include "stdlib.h" #include "conio.h"#include "mem.h" #include "ctype.h"#include "alloc.h"#define N 4struct student
{
long num;
char name[20];
char sex;
int chinese;
int math;
int english;
};
struct student stu[N];
int n;
int choose;
void fun1();
void fun2();
void fun3();
void fun4();void fun1()
{
int i;
for(i=0;i<N;i++)
{
printf("Please shuru xuehao:\n"); /*请输入学号*/
scanf("%ld",&stu[i].num);
printf("Please shuru mingzi:\n"); /*请输入名字*/
scanf("%s",stu[i].name);
getchar();
printf("Please shuru sex:\n"); /*请输入性别*/
scanf("%c",&stu[i].sex);
printf("Please shuru yuwen score:\n"); /*请输入语文分数*/
scanf("%d",&stu[i].chinese);
printf("Please shuru shuxue score:\n"); /*请输入数分数*/ scanf("%d",&stu[i].math); printf("Please input yingyu score:\n"); /*请输入英语分数*/ scanf("%d",&stu[i].English); printf("Please input jisuji score:\n"); /*请输入计算机分数*/
scanf("%d",&stu[i]. jisuji); printf("Please input zheng score:\n"); /*请输入政治分数*/ scanf("%d",&stu[i]. zheng);
data.score[5]=data.score[0]+data.score[1]+data.score[2]+data.scor e[3]+data. score[4]; /*显示总分*/ fwrite(&data,sizeof(data),1,fp); printf("another?y/n"); ch=getch(); if(ch=='n'||ch=='N') break; } }void xianshi() /*自定义显示数据函数*/{ float s;int n; if((fp=fopen("s_score.txt","rb+"))==NULL) { printf("Cannot reading this file.\n"); exit(0); } for(i=0;i<=1000;i++) { if((fread(&info[i],sizeof(info[i]),1,fp))!=1) break; /*用break结束本次循环*/ } getch(); fclose(fp);}void fun2()
{ int i;
for(i=0;i<N;i++)
{
printf("%ld\t%s\t%c\n",stu[i].num,stu[i].name,stu[i].sex);
printf("%d\t%d\t%d\n",stu[i].chinese,stu[i].math,stu[i].English);
}
}void fun3()
{ char name[20];
int k,f=0;
printf("Please shuru the person's name that to check to seek: "); /*请输入您所要查找的姓名*/
gets(name);
for(k=0;k<2;k++)
if(strcmp(name,stu[k].name)==0)
{ printf("%ld,%s,%c,%d,%d,%d",stu[k].num,stu[k].name,stu[k].sex,stu[k].chinese,stu[k].math,stu[k].english);
f=1;
}
if(f=0)
printf("Have no this person ~~~TOT"); /*没有这个人*/
}void fun4()
{ int k;
char newname[20];
printf("Please input the name of this student!\n"); /*请输入该学生的名字*/
gets(newname);
printf("The record of all students is:\n"); /*所有学生记录为*/
fun2();
for(k=0;k<2;k++)
if(strcmp(newname,stu[k].name)==0)
{
printf("Student whom you choose is:\n"); ?* 你选择的学生为*/
printf("%ld,%s,%c,%d,%d,%d",stu[k].num,stu[k].name,stu[k].sex,stu[k].chinese,stu[k].math,stu[k].english);
stu[k].num=stu[k+1].num;
strcpy(stu[k].name,stu[k+1].name);
stu[k].sex=stu[k+1].sex;
stu[k].chinese=stu[k+1].chinese;
stu[k].math=stu[k+1].math;
stu[k].english=stu[k+1].english; }
printf("The student's record was delete to complete!"); /*学生记录删除完毕*/}while(1){ clrscr(); /*清屏幕*/ gotoxy(1,1); /*移动光标*/ textcolor(RED); /*设置文本显示颜色为红色*/ textbackground(WHTIE); /*设置背景颜色为白色*/ window(1,1,99,99); /* 制作显示菜单的窗口,大小根据菜单条数设计*/ clrscr(); printf("******************************************************\n");
printf("***********welcome to use student manage**************\n");
printf ("*******************************************************\n");
printf("*************designer:jisuanjikexueyujishu************\n");printf ("***************************Procer:*****************\n");
printf ("***************chenjian,fusong,guoqingwen**************\n");
printf("*************** 1>shuru******2>xiugai*****************\n"); printf("*************** 3>shanchu****4>chazhao****************\n"); printf("*************** 5>xianshi****6>exit*******************\n"); printf("******************************************************\n"); printf("* ------------------------------------------------ * \n"); printf ("Please input the operation that you have to carry on:\n"); /*请输入您要进行的操作*/
scanf("%d",&choose);
while(choose!=1&&choose!=2&&choose!=3&&choose!=4)
{ printf("The numeral have another also the form press wrong~~~~ Please press one more time ^_^"); /*数字多也表按错~~~~请再按一遍*/
scanf("%d",&choose);
}
while(choose==1||choose==2||choose==3||choose==4)
{switch(choose)<br> {<br> case 1:fun1(); break;<br> case 2:fun2(); break;<br> case 3:fun3(); break;<br> case 4:fun4(); break;<br> }
printf("Please input the operation that you have to carry on:\n");/*请输入您要进行的操作*/
scanf("%d",&choose);
} 我这有N个~~来我宿舍,给你啊~~~呵呵
3. c语言帮帮忙 学生成绩管理 要用流程图描述实现算法,根据算法进行代码的编写
//biaobiao.cpp:.
//
#include"stdafx.h"
#include<stdio.h>
#include<math.h>
#include<string.h>
#defineMaxSize100
typedefstructstud
{
charname[10];
intnum;
floatc;
floatmath;
floatenglish;
floatzf;
intpnum;
intpzf;
}Stud;
voidReadFile(Studstud[],int&n)
{
FILE*fp;
longlength;
inti;
if((fp=fopen("stud.dat","rb"))==NULL){
n=0;
return;
}
fseek(fp,0,2);
length=ftell(fp);
rewind(fp);
n=length/sizeof(Stud);
if(n!=0)
n--;
else
stud[0].pnum=stud[0].pzf=-1;
for(i=0;i<=n;i++)
fread(&stud[i],sizeof(Stud),1,fp);
fclose(fp);
}
voidClearup(Studstud[],int&n)
{
FILE*fp;
if((fp=fopen("stud.dat","wb"))==NULL){
printf(">>文件不能打开 ");
return;
}
stud[0].pnum=stud[0].pzf=-1;
n=0;
fclose(fp);
printf("============================================================================ ");
}
voidSaveFile(Studstud[],int&n)
{
inti;
FILE*fp;
if((fp=fopen("stud.dat","wb"))==NULL){
printf(">>文件不能打开 ");
return;
}
if(n>1)
for(i=0;i<=n;i++)
fwrite(&stud[i],sizeof(Stud),1,fp);
fclose(fp);
printf("============================================================================ ");
}
voidInput(Studstud[],int&n)
{
inti;
intflag=0;
printf(">>请输入登记学生姓名学号C语言成绩数学成绩英语成绩: ");
n++;
scanf("%s%d%f%f%f",&stud[n].name,&stud[n].num,&stud[n].c,&stud[n].math,&stud[n].english);
stud[n].zf=stud[n].c+stud[n].math+stud[n].english;
for(i=0;i<=n-2;i++)
{
if(stud[i].num==stud[n].num)
{
flag=flag+1;
}
}
if(flag!=0)
printf("学号输入重复,请检查!! ");
stud[n].pnum=stud[n].pzf=0;
printf("============================================================================ ");
}
voidOutputFile(Studstud[],intn)
{
inti;
if(n<1)
{
printf(">>没任何记录 ");
return;
}
printf("----------------------------------------------------------------- ");
printf("|姓名|学号|C语言成绩|数学成绩|英语成绩|总分| ");
printf("----------------------------------------------------------------- ");
for(i=1;i<=n;i++)
{
printf("|%10s|%3d|%6.2f|%6.2f|%6.2f|%6.2f| ",stud[i].name,stud[i].num,stud[i].c,stud[i].math,stud[i].english,stud[i].zf);
printf("----------------------------------------------------------------- ");
}
}
voidDispnum(Studstud[],intn)
{ inti=2,j;
intk=stud[0].pnum;
if(n<1)
{
printf(">>没有这种记录,不能进行排序 ");
return;
}
stud[0].pnum=1;stud[1].pnum=-1;
while(i<=n)
{
j=0;
while(stud[j].pnum!=-1&&stud[stud[j].pnum].num<stud[i].num)
j=stud[j].pnum;
stud[i].pnum=stud[j].pnum;
stud[j].pnum=i;
i++;
}
printf("----------------------------------------------------------------- ");
printf("|姓名|学号|C语言成绩|数学成绩|英语成绩|总分| ");
printf("----------------------------------------------------------------- ");
while(k!=-1)
{
printf("|%10s|%3d|%6.2f|%6.2f|%6.2f|%6.2f| ",stud[k].name,stud[k].num,stud[k].c,stud[k].math,stud[k].english,stud[k].zf);
printf("----------------------------------------------------------------- ");
k=stud[k].pnum;
}
printf("============================================================================ ");
}
voidDispzf(Studstud[],intn)
{ inti=2,j;
intk=stud[0].pzf;
if(n<1)
{
printf(">>没有记录,不能进行排序 ");
return;
}
stud[0].pzf=1;stud[1].pzf=-1;
while(i<=n)
{
j=0;
while(stud[j].pzf!=-1&&stud[stud[j].pzf].zf<stud[i].zf)
j=stud[j].pzf;
stud[i].pzf=stud[j].pzf;
stud[j].pzf=i;
i++;
}
printf("----------------------------------------------------------------- ");
printf("|姓名|学号|C语言成绩|数学成绩|英语成绩|总分| ");
printf("----------------------------------------------------------------- ");
while(k!=-1)
{
printf("|%10s|%3d|%6.2f|%6.2f|%6.2f|%6.2f| ",stud[k].name,stud[k].num,stud[k].c,stud[k].math,stud[k].english,stud[k].zf);
printf("----------------------------------------------------------------- ");
k=stud[k].pzf;
}
printf("============================================================================ ");
}
voidxuehao(Studstud[],intn)
{
intnum,i,flag=0;
printf("请输入你要查询学生的学号: ");
scanf("%d",&num);
for(i=0;i<=n;i++)
{
if(stud[i].num==num)
{
printf("----------------------------------------------------------------- ");
printf("|姓名|学号|C语言成绩|数学成绩|英语成绩|总分| ");
printf("----------------------------------------------------------------- ");
printf("|%10s|%3d|%6.2f|%6.2f|%6.2f|%6.2f| ",stud[i].name,stud[i].num,stud[i].c,stud[i].math,stud[i].english,stud[i].zf);
printf("----------------------------------------------------------------- ");
flag++;
}
}
if(flag==0)printf("查询操作失败,没有你要查询的学生!!! ");
elseprintf("查询操作成功!!! ");
printf("============================================================================ ");
}
voidxingming(Studstud[],intn)
{
charname[10];
inti,flag=0;
printf("请输入你要查询的学生的姓名: ");
scanf("%s",&name);
for(i=0;i<=n;i++)
{
if(strcmp(stud[i].name,name)==0)
{
printf("----------------------------------------------------------------- ");
printf("|姓名|学号|C语言成绩|数学成绩|英语成绩|总分| ");
printf("----------------------------------------------------------------- ");
printf("|%10s|%3d|%6.2f|%6.2f|%6.2f|%6.2f| ",stud[i].name,stud[i].num,stud[i].c,stud[i].math,stud[i].english,stud[i].zf);
printf("----------------------------------------------------------------- ");
flag++;
}
}
if(flag==0)printf("查询操作失败,没有你要查询的学生!!! ");
elseprintf("查询操作成功!!! ");
printf("============================================================================ ");
}
voidModify(Studstud[],intn)
{
intNO,j;
intflag=0;
floatc,math,english;
printf("请输入你要修改学生的学号: ");
scanf("%d",&NO);
for(j=0;j<=n;j++)
{
if(stud[j].num==NO)
{
printf("请输入你要修改的学生的C语言成绩数学成绩英语成绩: ");
scanf("%f%f%f",&c,&math,&english);
stud[j].c=c;stud[j].math=math;stud[j].english=english;
stud[j].zf=stud[j].c+stud[j].math+stud[j].english;
flag++;
}
}
if(flag==0)printf("修改操作失败,该学号不存在!!! ");
elseprintf("修改操作成功!!! ");
printf("============================================================================ ");
}
voidDelete(Studstud[],int&n)
{
intNO,i,j;
intflag=0;
printf("请输入你要删除的学生的学号: ");
scanf("%d",&NO);
for(i=0;i<=n;i++)
{
if(stud[i].num==NO)
{
for(j=i;j<n;j++)
stud[j]=stud[j+1];
flag++;
}
}
if(flag==0)printf("删除操作失败,该学号不存在!!! ");
else{n--;
printf("删除操作成功!!! ");
}
printf("============================================================================ ");
}
voidmain()
{ doublemmy=sin(0.0);
Studstud[MaxSize];
intk,n;
printf("欢迎使用学生成绩管理系统!!! ");
printf("============================================================================ ");
ReadFile(stud,n);
do{
printf("1:学生登记2:显示学生信息 ");
printf("3:清空记录4:删除记录 ");
printf("5:按学号排序输出6:按总分排序输出 ");
printf("7:学号查询8:姓名查询 ");
printf("9:修改0:储存退出 ");
printf("请选择相应的功能:");
scanf("%d",&k);
if(k>9&&k<0)printf("操作不当,请重新输入: ");
switch(k)
{
case1:Input(stud,n);
break;
case2:OutputFile(stud,n);
break;
case3:Clearup(stud,n);
break;
case4:Delete(stud,n);
break;
case5:Dispnum(stud,n);
break;
case6:Dispzf(stud,n);
break;
case7:xuehao(stud,n);
break;
case8:xingming(stud,n);
break;
case9:Modify(stud,n);
break;
case0:SaveFile(stud,n);
break;
}
}while(k!=0);
}
效果图:
4. 急求C语言 学生成绩管理系统 程序及流程图(要简单的)
要最简单,学生成绩定义一个int数组,姓名或学号定义一个char数组。定义一个变量n记录当前数组保存的学生个数,初值0。
添加学生信息就给这两个数组赋值就好了。同时n++。
要删除那你循环遍历数组,通过学生名或学号找到数组对应下标。然后把之后的数组元素往前移动一位。同时n--。
修改信息就更简单,循环遍历到对应下标直接重新赋值。
如果想复杂点,可以用结构定义学生相关信息,然后写链表创建删除和修改。这方面我之前给别人写过好几个,你可以去我回答记录里先。
5. C语言程序设计学生成绩管理系统
随便写了些
不满意你自己在改改吧
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
typedef struct student{
int Num;
char name[12];
int age;
struct student* pNext;
}STUDENT,*PSTUDENT;
#define LEN sizeof(STUDENT)
PSTUDENT pHeader,pNail;
int n=0;
void PrintMenu();
bool ExistStudent(int Num);
void InsertInfo();
bool DeleteInfo(int Num);
bool UpdateInfo(int Num,PSTUDENT pNewInfo);
void PrintInfo();
int main()
{
PrintMenu();
int iSel=0;
while(1)
{
printf("输入操作选择:");
scanf("%d",&iSel);
switch(iSel)
{
case 0:
return 0;
case 1:
PrintInfo();
continue;
case 2:
InsertInfo();
continue;
case 3:
{
int num=0;
printf("输入要删除的学生学号:");
scanf("%d",&num);
if(DeleteInfo(num))
printf("删除成功!\n");
else
printf("删除失败!\n");
continue;
}
case 4:
{
int num=0;
printf("输入要修改的学生学号:");
scanf("%d",&num);
STUDENT stu={0};
printf("输入该学生的新信息(空格分隔):");
scanf("%d%s%d",&stu.Num,&stu.name,&stu.age);
if(UpdateInfo(num,&stu))
printf("修改成功!\n");
else
printf("修改失败!\n");
continue;
}
continue;
default:
continue;
}
}
return 0;
}
void PrintMenu()
{
printf("******操作菜单******\n");
printf("* 1. 打印学生信息\n");
printf("* 2. 添加学生信息\n");
printf("* 3. 删除学生信息\n");
printf("* 4. 修改学生信息\n");
printf("* 0. 退出系统\n");
printf("*********************\n");
}
void InsertInfo()
{
PSTUDENT pCur;
printf("请输入学生记录(各元素用空格分隔,输入学号为0时停止)\n");
while(true)
{
pCur = (PSTUDENT)malloc(LEN);
memset(pCur,NULL,LEN);
printf("==>:");
scanf("%d%s%d",&pCur->Num,pCur->name,&pCur->age);
if(pCur->Num==0)
break;
if(ExistStudent(pCur->Num))
{
printf("该学生信息已经存在!\n");
break;
}
if(n==0)
{
pNail=pHeader=pCur;
pHeader->pNext=NULL;
}
else
{
pNail->pNext=pCur;
pNail=pCur;
pCur->pNext=NULL;
}
n++;
}
}
bool DeleteInfo(int Num)
{
PSTUDENT pStu=pHeader;
if(!pStu)
return false;
for(pStu;pStu!=NULL;pStu=pStu->pNext)
{
if(Num==pStu->Num)
{
pHeader=pStu->pNext;
return true;
}
else if(pStu->pNext&&Num==pStu->pNext->Num)
{
pStu->pNext=pStu->pNext->pNext;
return true;
}
}
return false;
}
bool UpdateInfo(int Num,PSTUDENT pNewInfo)
{
PSTUDENT pStu=pHeader;
if(!pStu)
return false;
if(Num!=pNewInfo->Num&&ExistStudent(pNewInfo->Num))
return false;
for(pStu;pStu!=NULL;pStu=pStu->pNext)
{
if(Num==pStu->Num)
{
pStu->Num=pNewInfo->Num;
memset(pStu->name,0,sizeof(pStu->name));
strcpy(pStu->name,pNewInfo->name);
pStu->age=pNewInfo->age;
return true;
}
}
return true;
}
void PrintInfo()
{
PSTUDENT pStu=pHeader;
if(!pStu)
{
printf("没有学生信息!\n");
return;
}
for(pStu;pStu!=NULL;pStu=pStu->pNext)
printf("学号:%d 姓名:%s 年龄:%d\n",pStu->Num,pStu->name,pStu->age);
}
bool ExistStudent(int Num)
{
PSTUDENT pStu=pHeader;
if(!pStu)
return false;
for(pStu;pStu!=NULL;pStu=pStu->pNext)
{
if(Num==pStu->Num)
return true;
}
return false;
}
6. 怎么写c语言的学生成绩管理系统的流程图哦
在turbo
c
2.0下测试通过
[VC学生成绩管理系统.rar]
-
可以运行的c语言课程设计报告,里面有源码和详细的WORD文档.包含流程图.详细的分析等.
7. c语言学生成绩管理系统
学生成绩管理(c语言版)
/*11.3.2 源程序*/
/***********xuesheng.c***********/
/******头文件(.h)***********/
#include "stdio.h" /*I/O函数*/
#include "stdlib.h" /*其它说明*/
#include "string.h" /*字符串函数*/
#include "conio.h" /*屏幕操作函数*/
#include "mem.h" /*内存操作函数*/
#include "ctype.h" /*字符操作函数*/
#include "alloc.h" /*动态地址分配函数*/
#define N 3 /*定义常数*/
typedef struct z1 /*定义数据结构*/
{
char no[11];
char name[15];
int score[N];
float sum;
float average;
int order;
struct z1 *next;
}STUDENT;
/*以下是函数原型*/
STUDENT *init(); /*初始化函数*/
STUDENT *create(); /*创建链表*/
STUDENT *delete(STUDENT *h); /*删除记录*/
void print(STUDENT *h); /* 显示所有记录*/
void search(STUDENT *h); /*查找*/
void save(STUDENT *h); /*保存*/
STUDENT *load(); /*读入记录*/
void computer(STUDENT *h); /*计算总分和均分*/
STUDENT *insert(STUDENT *h); /*插入记录*/
void append(); /*追加记录*/
void (); /*复制文件*/
STUDENT *sort(STUDENT *h); /*排序*/
STUDENT *index(STUDENT *h); /*索引*/
void total(STUDENT *h); /*分类合计*/
int menu_select(); /*菜单函数*/
/******主函数开始*******/
main()
{
int i;
STUDENT *head; /*链表定义头指针*/
head=init(); /*初始化链表*/
clrscr(); /*清屏*/
for(;;) /*无限循环*/
{
switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/
{ /*值不同,执行的函数不同,break 不能省略*/
case 0:head=init();break; /*执行初始化*/
case 1:head=create();break; /*创建链表*/
case 2:head=delete(head);break; /*删除记录*/
case 3:print(head);break; /*显示全部记录*/
case 4:search(head);break; /*查找记录*/
case 5:save(head);break; /*保存文件*/
case 6:head=load(); break; /*读文件*/
case 7:computer(head);break; /*计算总分和均分*/
case 8:head=insert(head); break; /*插入记录*/
case 9:();break; /*复制文件*/
case 10:head=sort(head);break; /*排序*/
case 11:append();break; /*追加记录*/
case 12:head=index(head);break; /*索引*/
case 13:total(head);break; /*分类合计*/
case 14:exit(0); /*如菜单返回值为14程序结束*/
}
}
}
/*菜单函数,返回值为整数*/
menu_select()
{
char *menu[]={"***************MENU***************", /*定义菜单字符串数组*/
" 0. init list", /*初始化*/
" 1. Enter list", /*输入记录*/
" 2. Delete a record from list", /*从表中删除记录*/
" 3. print list ", /*显示单链表中所有记录*/
" 4. Search record on name", /*按照姓名查找记录*/
" 5. Save the file", /*将单链表中记录保存到文件中*/
" 6. Load the file", /*从文件中读入记录*/
" 7. compute the score", /*计算所有学生的总分和均分*/
" 8. insert record to list ", /*插入记录到表中*/
" 9. the file to new file", /*复制文件*/
" 10. sort to make new file", /*排序*/
" 11. append record to file", /*追加记录到文件中*/
" 12. index on nomber", /*索引*/
" 13. total on nomber", /*分类合计*/
" 14. Quit"}; /*退出*/
char s[3]; /*以字符形式保存选择号*/
int c,i; /*定义整形变量*/
gotoxy(1,25); /*移动光标*/
printf("press any key enter menu......\n"); /*压任一键进入主菜单*/
getch(); /*输入任一键*/
clrscr(); /*清屏幕*/
gotoxy(1,1); /*移动光标*/
textcolor(YELLOW); /*设置文本显示颜色为黄色*/
textbackground(BLUE); /*设置背景颜色为蓝色*/
gotoxy(10,2); /*移动光标*/
putch(0xc9); /*输出左上角边框┏*/
for(i=1;i<44;i++)
putch(0xcd); /*输出上边框水平线*/
putch(0xbb); /*输出右上角边框 ┓*/
for(i=3;i<20;i++)
{
gotoxy(10,i);putch(0xba); /*输出左垂直线*/
gotoxy(54,i);putch(0xba);
} /*输出右垂直线*/
gotoxy(10,20);putch(0xc8); /*输出左上角边框┗*/
for(i=1;i<44;i++)
putch(0xcd); /*输出下边框水平线*/
putch(0xbc); /*输出右下角边框┛*/
window(11,3,53,19); /* 制作显示菜单的窗口,大小根据菜单条数设计*/
clrscr(); /*清屏*/
for(i=0;i<16;i++) /*输出主菜单数组*/
{
gotoxy(10,i+1);
cprintf("%s",menu[i]);
}
textbackground(BLACK); /*设置背景颜色为黑色*/
window(1,1,80,25); /*恢复原窗口大小*/
gotoxy(10,21); /*移动光标*/
do{
printf("\n Enter you choice(0~14):"); /*在菜单窗口外显示提示信息*/
scanf("%s",s); /*输入选择项*/
c=atoi(s); /*将输入的字符串转化为整形数*/
}while(c<0||c>14); /*选择项不在0~14之间重输*/
return c; /*返回选择项,主程序根据该数调用相应的函数*/
}
STUDENT *init()
{
return NULL;
}
/*创建链表*/
STUDENT *create()
{
int i; int s;
STUDENT *h=NULL,*info; /* STUDENT指向结构体的指针*/
for(;;)
{
info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/
if(!info) /*如果指针info为空*/
{
printf("\nout of memory"); /*输出内存溢出*/
return NULL; /*返回空指针*/
}
inputs("enter no:",info->no,11); /*输入学号并校验*/
if(info->no[0]=='@') break; /*如果学号首字符为@则结束输入*/
inputs("enter name:",info->name,15); /*输入姓名,并进行校验*/
printf("please input %d score \n",N); /*提示开始输入成绩*/
s=0; /*计算每个学生的总分,初值为0*/
for(i=0;i<N;i++) /*N门课程循环N次*/
{
do{
printf("score%d:",i+1); /*提示输入第几门课程*/
scanf("%d",&info->score[i]); /*输入成绩*/
if(info->score[i]>100||info->score[i]<0) /*确保成绩在0~100之间*/
printf("bad data,repeat input\n"); /*出错提示信息*/
}while(info->score[i]>100||info->score[i]<0);
s=s+info->score[i]; /*累加各门课程成绩*/
}
info->sum=s; /*将总分保存*/
info->average=(float)s/N; /*求出平均值*/
info->order=0; /*未排序前此值为0*/
info->next=h; /*将头结点做为新输入结点的后继结点*/
h=info; /*新输入结点为新的头结点*/
}
return(h); /*返回头指针*/
}
/*输入字符串,并进行长度验证*/
inputs(char *prompt, char *s, int count)
{
char p[255];
do{
printf(prompt); /*显示提示信息*/
scanf("%s",p); /*输入字符串*/
if(strlen(p)>count)printf("\n too long! \n"); /*进行长度校验,超过count值重输入*/
}while(strlen(p)>count);
strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
}
/*输出链表中结点信息*/
void print(STUDENT *h)
{
int i=0; /* 统计记录条数*/
STUDENT *p; /*移动指针*/
clrscr(); /*清屏*/
p=h; /*初值为头指针*/
printf("\n\n\n****************************STUDENT********************************\n");
printf("|rec|nO | name | sc1| sc2| sc3| sum | ave |order|\n");
printf("|---|----------|---------------|----|----|----|--------|-------|-----|\n");
while(p!=NULL)
{
i++;
printf("|%3d |%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", i, p->no,p->name,p->score[0],p->score[1],
p->score[2],p->sum,p->average,p->order);
p=p->next;
}
printf("**********************************end*********************************\n");
}
/*删除记录*/
STUDENT *delete(STUDENT *h)
{
STUDENT *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/
char s[11]; /*存放学号*/
clrscr(); /*清屏*/
printf("please deleted no\n"); /*显示提示信息*/
scanf("%s",s); /*输入要删除记录的学号*/
q=p=h; /*给q和p赋初值头指针*/
while(strcmp(p->no,s)&&p!=NULL) /*当记录的学号不是要找的,或指针不为空时*/
{
q=p; /*将p指针值赋给q作为p的前驱指针*/
p=p->next; /*将p指针指向下一条记录*/
}
if(p==NULL) /*如果p为空,说明链表中没有该结点*/
printf("\nlist no %s student\n",s);
else /*p不为空,显示找到的记录信息*/
{
printf("*****************************have found***************************\n");
printf("|no | name | sc1| sc2| sc3| sum | ave |order|\n");
printf("|----------|---------------|----|----|----|--------|-------|-----|\n");
printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", p->no,
p->name,p->score[0],p->score[1],p->score[2],p->sum,
p->average,p->order);
printf("********************************end*******************************\n");
getch(); /*压任一键后,开始删除*/
if(p==h) /*如果p==h,说明被删结点是头结点*/
h=p->next; /*修改头指针指向下一条记录*/
else
q->next=p->next; /*不是头指针,将p的后继结点作为q的后继结点*/
free(p); /*释放p所指结点空间*/
printf("\n have deleted No %s student\n",s);
printf("Don't forget save\n");/*提示删除后不要忘记保存文件*/
}
return(h); /*返回头指针*/
}
8. 题目:学生成绩管理系统(C语言)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define max 20
typedef struct student //学生
{
char sno[max]; // 学号
char sname[max]; //姓名
char sex[max]; //性别
char age[max]; //年龄
char depart[max]; //系
char classs[max]; //班
char grade[max]; //年级
struct student* next;
} student;
student* head;
int LogOn() //登录模块,已实现输入密码不回显,如果中途发现输错某几位,可退格键重输
{
char username[max],password[max];
printf("\n请输入用户名:");
scanf("%s",username);
printf("\n请输入密码(最多15位):");
//开始以不回显且支持退格方式获取输入密码
int i=0;
while((i>=0)&&(password[i++]=getch())!=13)//条件i>=0是用于限制退格的范围
{
if(password[i-1]=='\b')//对退格键的处理
{
printf("%c%c%c",'\b','\0','\b');
i=i-2;
}
else
printf("*");
}
password[--i]='\0';
//已获取密码。验证用户身份
if(!strcmp(username,"zhang")&&!strcmp(password,"8147086"))
{
printf("\n登录成功!");
return 1;
}
else
return 0;
}
void regist()
{
char ch;
student *s,*ptr; //s用来建新结点,ptr用来暂存头结点
do
{
s=(student*)malloc(sizeof(student)); // 新建一个学生结点
printf("\n开始注册..."); //开始注册
printf("\n请输入该学生的学号:");
scanf("%s",s->sno);
printf("\n请输入该学生的姓名:");
scanf("%s",s->sname);
printf("\n请输入该学生的性别:");
scanf("%s",s->sex);
printf("\n请输入该学生的年龄:");
scanf("%s",s->age);
printf("\n请输入该学生的系:");
scanf("%s",s->depart);
printf("\n请输入该学生所在的班:");
scanf("%s",s->classs);
printf("\n请输入该学生所在的年级");
scanf("%s",s->grade);
ptr=head;
head=s;//将新结点插入队头
s->next=ptr;
fflush(stdin);
printf("\n请问是否继续注册?(Y/N)");
scanf("%c",&ch);
}while(ch=='Y'||ch=='y');
return;
}
void ElePrint(char str[]) //输出单个元素
{
if(str==NULL) exit(0);
printf("%s",str);
for(unsigned int i=0;i<12-strlen(str);i++) printf(" ");//为了对齐输出,需插入一些空格
return;
}
int LinePrint(student *ptr) //输出一行
{
if(ptr==NULL) //检查传进来的指针
return 0;
printf("\n");
ElePrint(ptr->sno);
ElePrint(ptr->sname);
ElePrint(ptr->age);
ElePrint(ptr->sex);
ElePrint(ptr->depart);
ElePrint(ptr->classs);
ElePrint(ptr->grade);
return 1;
}
void print() //输出全部学生信息
{
student *ptr=head;
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(ptr)
{
LinePrint(ptr);
ptr=ptr->next;
}
printf("\n");
return;
}
void search()//查询模块
{
int method;//查询方式
char no[max],name[max],departm[max],clss[max],grades[max]; //用来接收查询关键字
while(1)
{
printf("\n请选择查询方式");
printf("\n1.按学号查询");
printf("\n2.按姓名查询");
printf("\n3.按所在系查询");
printf("\n4.按所在班级查询");
printf("\n5.按所在年级查询");
printf("\n6.打印全部学生信息");
printf("\n7.返回主菜单\n");
scanf("%d",&method);
student *p=head,*temp;
switch(method)
{
case 1:
printf("\n请输入要查询的学号:");
scanf("%s",no);
while(p)
{
if(!strcmp(p->sno,no))
break;
else
{
temp=p;
p=p->next;
}
}
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
LinePrint(p);
break;
case 2:
printf("\n请输入要查询的姓名:");
scanf("%s",name);
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->sname,name))
LinePrint(p);
p=p->next;
}
break;
case 3:
printf("\n请输入学生所在的系:");
scanf("%s",departm);
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->depart,departm))
LinePrint(p);
p=p->next;
}
break;
case 4:
printf("\n请输入学生所在的班:");
scanf("%s",clss);
printf("\n请输入学生所在的年级:");
scanf("%s",grades);
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->classs,clss)&&!strcmp(p->grade,grades))
LinePrint(p);
p=p->next;
}
break;
case 5:
printf("\n请输入学生所在的年级:");
scanf("%s",grades);
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->grade,grades))
LinePrint(p);
p=p->next;
}
break;
case 6:
print();
break;
case 7:
return;
default:
printf("很抱歉,暂无此查询方式!");
break;
}
}
}
void modify()//修改学生信息
{
char num[max];
student *p=head;
printf("\n请输入要修改的学生的学号:");
scanf("%s",num);
while(p)
{
if(!strcmp(p->sno,num))
break;
else
p=p->next;
}
if(p==NULL)
{
printf("\n错误:没有此学生的信息!\n");
return;
}
LinePrint(p);
printf("\n请输入要修改的该学生的信息:");
printf("\n1.姓名");
printf("\n2.性别");
printf("\n3.年龄");
printf("\n4.所在的系");
printf("\n5.所在的班");
printf("\n6.所在的年级");
char name1[max],sex1[max],age1[max],depart1[max],class1[max],grade1[max];
int select;
fflush(stdin);
scanf("%d",&select);
printf("\n请输入新的信息:");
switch(select)
{
case 1:
scanf("%s",name1);
strcpy(p->sname,name1);
break;
case 2:
scanf("%s",sex1);
strcpy(p->sex,sex1);
break;
case 3:
scanf("%s",age1);
strcpy(p->age,age1);
break;
case 4:
scanf("%s",depart1);
strcpy(p->depart,depart1);
break;
case 5:
scanf("%s",class1);
strcpy(p->classs,class1);
break;
case 6:
scanf("%s",grade1);
strcpy(p->grade,grade1);
break;
default:
printf("\nError!");
break;
}
LinePrint(p);
return;
}
void del()// 删除某学生的信息
{
student *p=head,*temp=head,*s;
char num1[max];
printf("\n请输入要删除的学生的学号:");
scanf("%s",num1);
while(p)//查找该学生所在的结点
{
if(!strcmp(p->sno,num1))
break;
else
{
temp=p;
p=p->next;
}
}//while
if(!p)
{
printf("\n不存在此学生的信息.");
return;
}
LinePrint(p);//输出该学生的信息
printf("\n请问真的要删除该学生的信息吗?(Y/N)");
char ch;
fflush(stdin);
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
{
s=p->next;
temp->next=s;
free(p);
printf("\n已经删除该学生的信息.");
}
return;
}
void sort() //排序模块。将学生记录按学号从小到大排列。用起泡排序算法实现
{
student *ptr,*s=head,*p;
int count=0,count1;
while(s)//统计链表结点个数
{
count++;
s=s->next;
}
for(int i=1;i<count;i++)
{
ptr=head;
p=NULL;
count1=count-i; //用来控制每轮起泡排序的终点,即每次把学号最小的结点移到倒数第i个结点
while(ptr&&ptr->next&&(count1--))
{
if(strcmp(ptr->sno,ptr->next->sno)>0)
{
s=ptr->next;
ptr->next=s->next;
if(p==NULL) //ptr处于队头时
head=s;
else
p->next=s;
s->next=ptr;
p=s;
}
else
{
ptr=ptr->next;
if(p==NULL) //ptr处于队头时
p=head;
else
p=p->next;
}
}
}
return;
}
void quit()
{
char ch;
printf("\n真的要退出?(Y/N)");
fflush(stdin);
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
exit(0);
return;
}
int main()
{
int option;
printf("\nCopyright@2005 KongXinCai All rights reserved.");
printf("\n欢迎使用学生信息管理系统!\n");
//登录模块
int icheck=0;
while(icheck<3)
{
if(LogOn()==0)
icheck++;
else
break;
}
if(icheck==3)
{
printf("\n连续登录三次不成功,退出!");
exit(0);
}
//系统界面
while(1)
{
printf("\n\n请选择需要的服务:");
printf("\n1.注册");
printf("\n2.查询");
printf("\n3.修改");
printf("\n4.删除");
printf("\n5.排序");
printf("\n7.求平均");
printf("\n6.退出\n");
scanf("%d",&option);
switch(option)
{
case 1:
regist();
break;
case 2:
search();
break;
case 3:
modify();
break;
case 4:
del();
break;
case 5:
sort();
break;
case 6:
quit();
break;
}
}
return 0;
}
回答者: 493838148 - 七级 2010-6-12 11:27
检举 //我以前写的
#include "stdio.h"
#include "math.h"
#define N 30
struct student
{
long int num;
char name[10];
char sex[3];
int Chinese,Math,English,total,average;
}stu[N]={{4001,"lks","m",100,100,100},{4002,"lyt","w",99,63,89},{4003,"asd","w",60,70,80},{4004,"fgh","m",41,100,98},
{4005,"asd","m",74,74,87},{4006,"yt","m",85,58,78},{4007,"qwe","w",74,100,87},{4008,"dcs","w",74,85,96},
{4009,"qfg","m",74,78,36},{4010,"gft","m",45,85,98},{4011,"mn","m",60,77,17},{4012,"yer","w",78,78,100},{4013,"lsd","m",100,89,85}
},s;
int M=13;
void modify(struct student stu[])
{
int t;
long num;
char z;
t=search(stu)-400;
printf("input num:");
scanf("%ld",&stu[t].num);
printf("input name:");
scanf("%s",stu[t].name);
printf("input sex:");
scanf("%s",stu[t].sex);
printf("input score of Chinese:");
scanf("%d",&stu[t].Chinese);
printf("input score of Math:");
scanf("%d",&stu[t].Math);
printf("input score of English:");
scanf("%d",&stu[t].English);
stu[t].average=(stu[t].English+stu[t].Math+stu[t].Chinese)/3;
stu[t].total=stu[t].English+stu[t].Math+stu[t].Chinese;
printf("\tNUM\tNAME\tSEX\tCHINESE\tMATH\tENGLISH\tTOTAL\tAVERAGE\n");
printf("\t%4ld\t",stu[t].num);
printf(" %s\t",stu[t].name);
printf("%s\t",stu[t].sex);
printf("%4d\t%4d\t%4d\t%4d%8d\n",stu[t].Chinese,stu[t].Math,stu[t].English,stu[t].total,stu[t].average);
printf("Next?y/n???");
scanf("%s",&z);
if (z=='y')
modify(stu);
}
void output(struct student stu[])
{
int i;
printf("\tNUM\tNAME\tSEX\tCHINESE\tMATH\tENGLISH\tTOTAL\tAVERAGE\n");
for (i=0;i<M;i++)
{
printf("\t%4ld\t",stu[i].num);
printf(" %s\t",stu[i].name);
printf("%s\t",stu[i].sex);
printf("%4d\t%4d\t%4d\t%4d%8d\n",stu[i].Chinese,stu[i].Math,stu[i].English,stu[i].total,stu[i].average);
}
}
void sort(struct student stu[])
{
int i,j,t;
printf("1.an yingyu chengcheji paixu\n2.an yuwen chengji paixu\n3.an shuxue chengji paixu\n4.an pingjue chengji paixu\n5.an zongfen paixu\n");
scanf("%d",&t);
switch (t)
{
case 1:
for (i=0;i<M-1;i++)
for (j=0;j<M-i-1;j++)
{
if (stu[j].English<stu[j+1].English)
{
s=stu[j];
stu[j]=stu[j+1];
stu[j+1]=s;
}
}
output(stu);
getch();
break;
case 2:
for (i=0;i<M-1;i++)
for (j=0;j<M-i-1;j++)
{
if (stu[j].Chinese<stu[j+1].Chinese)
{
s=stu[j];
stu[j]=stu[j+1];
stu[j+1]=s;
}
}
output(stu);
getch();
break;
case 3:
for (i=0;i<M-1;i++)
for (j=0;j<M-i-1;j++)
{
if (stu[j].Math<stu[j+1].Math)
{
s=stu[j];
stu[j]=stu[j+1];
stu[j+1]=s;
}
}
output(stu);
getch();
break;
case 4:
for (i=0;i<M-1;i++)
for (j=0;j<M-i-1;j++)
{
if (stu[j].average<stu[j+1].average)
{
s=stu[j];
stu[j]=stu[j+1];
stu[j+1]=s;
}
}
output(stu);
getch();
break;
case 5:
for (i=0;i<M-1;i++)
for (j=0;j<M-i-1;j++)
{
if (stu[j].total<stu[j+1].total)
{
s=stu[j];
stu[j]=stu[j+1];
stu[j+1]=s;
}
}
output(stu);
getch();
break;
}
}
int search(struct student stu[])
{
long t,i,z,K='y';
char name[20];
printf("1.an xuehao chazhao\n2.an xingming chazhao\n");
scanf("%d",&z);
switch (z)
{
case 1:
printf("qing shuru xuehao:\n");
scanf("%ld",&t);
for (i=0;i<M;i++)
{
if (stu[i].num==t)
{
K='x';
printf("\tNUM\tNAME\tSEX\tCHINESE\tMATH\tENGLISH\tTOTAL\tAVERAGE\n");
printf("\t%4ld\t",stu[i].num);
printf(" %s\t",stu[i].name);
printf(" %s\t",stu[i].sex);
printf("%4d\t%4d\t%4d\t%4d%6d\n",stu[i].Chinese,stu[i].Math,stu[i].English,stu[i].total,stu[i].average);
return(stu[i].num);
getche();
break;
}
}
if (K='y')
{
printf("No find");
getchar();
}
break;
case 2:
printf("qing shuru xingming:");
scanf("%s",name);
for (i=0;i<M;i++)
{
if (strcmp(stu[i].name,name)==0)
{
K='x';
printf("\tNUM\tNAME\tSEX\tCHINESE\tMATH\tENGLISH\tTOTAL\tAVERAGE\n");
printf("\t%4ld\t",stu[i].num);
printf(" %s\t",stu[i].name);
printf(" %s\t",stu[i].sex);
printf("%4d\t%4d\t%4d\t%4d%6d\n",stu[i].Chinese,stu[i].Math,stu[i].English,stu[i].total,stu[i].average);
getche();
break;
}
}
if (K='y')
{
printf("No find");
getchar();
}
break;
}
}
void insert(struct student stu[])
{
int i;
char z='y';
for (i=M;i<=N&&z=='y';i++)
{
printf("input num:");
scanf("%ld",&stu[i].num);
printf("input name:");
scanf("%s",stu[i].name);
printf("input name:");
scanf("%s",stu[i].sex);
printf("input score of Chinese:");
scanf("%d",&stu[i].Chinese);
printf("input score of Math:");
scanf("%d",&stu[i].Math);
printf("input score of English:");
scanf("%d",&stu[i].English);
stu[i].average=(stu[i].English+stu[i].Math+stu[i].Chinese)/3;
stu[i].total=stu[i].English+stu[i].Math+stu[i].Chinese;
printf("Next?y/n???");
z=getche();
if (z!='y')
{
M=i+1;
sort(stu);
output(stu);
}
}
}
void delete(struct student stu[])
{
long t,i,z;
char l,name[20];
printf("1.an xuehao shanchu/n2.an xingming chanchu");
scanf("%d",&z);
switch (z)
{
case 1:
printf("qing shuru xuehao:");
scanf("%ld",&t);
for (i=0;i<M;i++)
{
if (stu[i].num==t)
{
printf("\tNUM\tNAME\tSEX\tCHINESE\tMATH\tENGLISH\tTOTAL\tAVERAGE\n");
printf("\t%4ld\t",stu[i].num);
printf(" %s\t",stu[i].name);
printf("%s\t",stu[i].sex);
printf("%4d\t%4d\t%4d\t%4d%8d\n",stu[i].Chinese,stu[i].Math,stu[i].English,stu[i].total,stu[i].average);
break;
}
}
printf("Go on?y/n???");
scanf("%s",&l);
if (l=='y')
{
for (;i<M;i++)
{
stu[i]=stu[i+1];
}
stu[M-1].num=0;
output(stu);
}
else
break;
case 2:
printf("qing shuru xingming:");
scanf("%s",name);
for (i=0;i<M;i++)
{
if (strcmp(stu[i].name,name)==0)
{
printf("\tNUM\tNAME\tSEX\tCHINESE\tMATH\tENGLISH\tTOTAL\tAVERAGE\n");
printf("\t%4ld\t",stu[i].num);
printf(" %s\t",stu[i].name);
printf("%s\t",stu[i].sex);
printf("%4d\t%4d\t%4d\t%4d%8d\n",stu[i].Chinese,stu[i].Math,stu[i].English,stu[i].total,stu[i].average);
break;
}
}
printf("Go on?y/n???");
scanf("%s",&l);
if (l=='y')
{
for (;i<M;i++)
{
stu[i]=stu[i+1];
}
stu[M-1].num=0;
output(stu);
}
else
break;
}
}
main()
{
int choice,i;
clrscr();
for (i=0;i<M;i++)
{
stu[i].average=(stu[i].English+stu[i].Math+stu[i].Chinese)/3; ;
stu[i].total=stu[i].English+stu[i].Math+stu[i].Chinese;
}
for (;;)
{
printf("\n------ xuesheng chengji guanli xitong------\n");
printf("1.modify xuesheng jilu \n");
printf("2.output xuesheng jilu\n");
printf("3.sort xuesheng jilu\n");
printf("4.search xuesheng jilu\n");
printf("5.insert xuesheng jilu\n");
printf("6.delete xuesheng jilu\n");
printf("7. exit\n");
printf("pllease input(1-7):\n");
scanf("%d",&choice);
switch (choice)
{
case 1:
modify(stu);
break;
case 2:
output(stu);
break;
case 3:
sort(stu);
break;
case 4:
search(stu);
break;
case 5:
insert(stu);
break;
case 6:
delete(stu);
break;
case 7:
exit();
break;
}
}
getch();
}
9. c语言“学生成绩管理系统”课程设计报告 我想知道要重新创建一个txt用来录入学生成绩么怎么弄ns流程图
我的这个程序不是所有的功能都能实现,我当初也是做的这个程序,我答辩时老师只是看了你的程序的运行情况,并没有仔细看你的题目要求,只要能运行出来就可以了,这是那程序和流程图,希望可以帮到你:
#include<stdio.h>
#include<string.h>
#defineN3
structstudent
{
intmath;
intnumber;
charname[20];
intlanguage;
intJN;
}student[4];
voidmain()
{
voidsave();/*对输入的学生信息进行保存*/
voidload();/*将用户输入的学生信息读入到(out.txt)中*/
voidinput();/*将学生的信息输入进去*/
voidsum();/*对用户输入的学生成绩进行求和*/
voidsearch();/*统计用户输入的学生成绩中只要有于60分的人数和姓名*/
voidoutput();/*实现循环功能*/
intn;
printf(" ");
printf("学生成绩管理 ");
printf(" ");
printf("1.录入学生信息 ");
printf("2.浏览学生的平均分和总分 ");
printf("3.不及格的人数和姓名及科目 ");
printf("4.全班学生信息 ");
printf("5.退出 ");
printf("请输入你的选择 ");
printf(" ");
scanf("%d",&n);
switch(n)
{
case1:printf("输入信息 ");printf(" ");input();main();break;
case2:printf("浏览学生的平均分和总分 ");printf(" ");sum();main();break;
case3:printf("不及格的人数和姓名 ");printf(" ");search();main();break;
case4:printf("全班学生信息 ");printf(" ");output();main();break;
default:break;
}
}
voidsave(intm)
{
inti;
FILE*fp;
if((fp=fopen("out.txt","wb"))==NULL) //在当前程序运行目录下自动建立out.dat文件,用二进制打开
{
printf("打开文件出错 ");
return;
}
for(i=0;i<m;i++)
if(fwrite(&student[i],sizeof(structstudent),1,fp)!=1)
printf("cuo ");
fclose(fp);
}
voidinput()
{
inti;
for(i=0;i<N;i++)
{
printf("请输入学生的学号:");
scanf("%d",&student[i].number);
printf("请输入姓名: ");
scanf("%s",student[i].name);
printf("请输入数学成绩: ");
scanf("%d",&student[i].math);
printf("请输入c语言成绩: ");
scanf("%d",&student[i].language);
printf("请输入日语成绩: ");
scanf("%d",&student[i].JN);
printf("请输入你的选择 ");
printf(" ");
}
printf(" 创建完毕! ");
save(N);
}
voidsum()
{ inti;intsum[N],ave[N];
for(i=0;i<N;i++)
{
sum[i]=student[i].math+student[i].language+student[i].JN;
ave[i]=sum[i]/3;
}
for(i=0;i<3;i++)
printf("第%d名学生的总分:%3d,平均分%d ",i+1,sum[i],ave[i]);
}
voidoutput()
{
inti;
for(i=0;i<N;i++)
{
printf("学生的学号%d:",student[i].number);
printf("姓名:%s ",student[i].name);
printf("数学成绩:%d ",student[i].math);
printf("c语言成绩:%d ",student[i].language);
printf("日语成绩:%d ",student[i].JN);
printf(" ");
}
}
voidsearch()
{
inti,j=0;
for(i=0;i<N;i++)
if(student[i].math<50||student[i].language<50||student[i].JN<50)
{printf("姓名:%s ",student[i].name);j++;}
printf("不及格人数是%d",j);
}
voidload()
{
inti;
FILE*fp;
if((fp=fopen("out.txt","rb"))==NULL)
{ printf("打开文件出错 ");
return;
}
for(i=0;i<4;i++)
if(fread(&student[i],sizeof(structstudent),1,fp)!=1)
{
if(feof(fp));
{fclose(fp);
return;}
printf("打开文件出错 ");
}
fclose(fp);
10. 用C语言怎么学生成绩管理系统
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int shoudsave=0; /* */
struct student
{
char num[10];/* 学号 */
char name[20];
char sex[4];
int cgrade;
int mgrade;
int egrade;
int totle;
int ave;
char neartime[10];/* 最近更新时间 */
};
typedef struct node
{
struct student data;
struct node *next;
}Node,*Link;
void menu()
{
printf("********************************************************************************");
printf("\t1登记学生资料\t\t\t\t\t2删除学生资料\n");
printf("\t3查询学生资料\t\t\t\t\t4修改学生资料\n");
printf("\t5保存学生资料\t\t\t\t\t0退出系统\n");
printf("********************************************************************************\n");
}
void printstart()
{
printf("-----------------------------------------------------------------------\n");
}
void Wrong()
{
printf("\n=====>提示:输入错误!\n");
}
void Nofind()
{
printf("\n=====>提示:没有找到该学生!\n");
}
void printc() /* 本函数用于输出中文 */
{
printf(" 学号\t 姓名 性别 英语成绩 数学成绩 C语言成绩 总分 平均分\n");
}
void printe(Node *p)/* 本函数用于输出英文 */
{
printf("%-12s%s\t%s\t%d\t%d\t%d\t %d\t %d\n",p->data.num,p->data.name,p->data.sex,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.totle,p->data.ave);
}
Node* Locate(Link l,char findmess[],char nameornum[]) /* 该函数用于定位连表中符合要求的接点,并返回该指针 */
{
Node *r;
if(strcmp(nameornum,"num")==0) /* 按学号查询 */
{
r=l->next;
while(r!=NULL)
{
if(strcmp(r->data.num,findmess)==0)
return r;
r=r->next;
}
}
else if(strcmp(nameornum,"name")==0) /* 按姓名查询 */
{
r=l->next;
while(r!=NULL)
{
if(strcmp(r->data.name,findmess)==0)
return r;
r=r->next;
}
}
return 0;
}
void Add(Link l) /* 增加学生 */
{
Node *p,*r,*s;
char num[10];
r=l;
s=l->next;
while(r->next!=NULL)
r=r->next; /* 将指针置于最末尾 */
while(1)
{
printf("请你输入学号(以'0'返回上一级菜单:)");
scanf("%s",num);
if(strcmp(num,"0")==0)
break;
while(s)
{
if(strcmp(s->data.num,num)==0)
{
printf("=====>提示:学号为'%s'的学生已经存在,若要修改请你选择'4 修改'!\n",num);
printstart();
printc();
printe(s);
printstart();
printf("\n");
return;
}
s=s->next;
}
p=(Node *)malloc(sizeof(Node));
strcpy(p->data.num,num);
printf("请你输入姓名:");
scanf("%s",p->data.name);
getchar();
printf("请你输入性别:");
scanf("%s",p->data.sex);
getchar();
printf("请你输入c语言成绩:");
scanf("%d",&p->data.cgrade);
getchar();
printf("请你输入数学成绩:");
scanf("%d",&p->data.mgrade);
getchar();
printf("请你输入英语成绩:");
scanf("%d",&p->data.egrade);
getchar();
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle / 3;
/* 信息输入已经完成 */
p->next=NULL;
r->next=p;
r=p;
shoudsave=1;
}
}
void Qur(Link l) /* 查询学生 */
{
int sel;
char findmess[20];
Node *p;
if(!l->next)
{
printf("\n=====>提示:没有资料可以查询!\n");
return;
}
printf("\n=====>1按学号查找\n=====>2按姓名查找\n");
scanf("%d",&sel);
if(sel==1)/* 学号 */
{
printf("请你输入要查找的学号:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
printf("\t\t\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
else if(sel==2) /* 姓名 */
{
printf("请你输入要查找的姓名:");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)
{
printf("\t\t\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
else
Wrong();
}
void Del(Link l) /* 删除 */
{
int sel;
Node *p,*r;
char findmess[20];
if(!l->next)
{
printf("\n=====>提示:没有资料可以删除!\n");
return;
}
printf("\n=====>1按学号删除\n=====>2按姓名删除\n");
scanf("%d",&sel);
if(sel==1)
{
printf("请你输入要删除的学号:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:该学生已经成功删除!\n");
shoudsave=1;
}
else
Nofind();
}
else if(sel==2)
{
printf("请你输入要删除的姓名:");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:该学生已经成功删除!\n");
shoudsave=1;
}
else
Nofind();
}
else
Wrong();
}
void Modify(Link l)
{
Node *p;
char findmess[20];
if(!l->next)
{
printf("\n=====>提示:没有资料可以修改!\n");
return;
}
printf("请你输入要修改的学生学号:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
printf("请你输入新学号(原来是%s):",p->data.num);
scanf("%s",p->data.num);
printf("请你输入新姓名(原来是%s):",p->data.name);
scanf("%s",p->data.name);
getchar();
printf("请你输入新性别(原来是%s):",p->data.sex);
scanf("%s",p->data.sex);
printf("请你输入新的c语言成绩(原来是%d分):",p->data.cgrade);
scanf("%d",&p->data.cgrade);
getchar();
printf("请你输入新的数学成绩(原来是%d分):",p->data.mgrade);
scanf("%d",&p->data.mgrade);
getchar();
printf("请你输入新的英语成绩(原来是%d分):",p->data.egrade);
scanf("%d",&p->data.egrade);
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle/3;
printf("\n=====>提示:资料修改成功!\n");
shoudsave=1;
}
else
Nofind();
}
void Disp(Link l)
{
int count=0;
Node *p;
p=l->next;
if(!p)
{
printf("\n=====>提示:没有资料可以显示!\n");
return;
}
printf("\t\t\t\t显示结果\n");
printstart();
printc();
printf("\n");
while(p)
{
printe(p);
p=p->next;
}
printstart();
printf("\n");
}
void Tongji(Link l)
{
Node *pm,*pe,*pc,*pt,*pa; /* 用于指向分数最高的接点 */
Node *r=l->next;
if(!r)
{
printf("\n=====>提示:没有资料可以统计!\n");
return ;
}
pm=pe=pc=pt=pa=r;
while(r!=NULL)
{
if(r->data.cgrade>=pc->data.cgrade)
pc=r;
if(r->data.mgrade>=pm->data.mgrade)
pm=r;
if(r->data.egrade>=pe->data.egrade)
pe=r;
if(r->data.totle>=pt->data.totle)
pt=r;
if(r->data.ave>=pa->data.ave)
pa=r;
r=r->next;
}
printf("------------------------------统计结果--------------------------------\n");
printf("总分最高者:\t%s %d分\n",pt->data.name,pt->data.totle);
printf("平均分最高者:\t%s %d分\n",pa->data.name,pa->data.ave);
printf("英语最高者:\t%s %d分\n",pe->data.name,pe->data.egrade);
printf("数学最高者:\t%s %d分\n",pm->data.name,pm->data.mgrade);
printf("c语言最高者:\t%s %d分\n",pc->data.name,pc->data.cgrade);
printstart();
}
void Sort(Link l)
{
Link ll;
Node *p,*rr,*s;
ll=(Link)malloc(sizeof(Node)); /* 用于做新的连表 */
ll->next=NULL;
if(l->next==NULL)
{
printf("\n=====>提示:没有资料可以排序!\n");
return ;
}
p=l->next;
while(p)
{
s=(Node*)malloc(sizeof(Node)); /* 新建接点用于保存信息 */
s->data=p->data;
s->next=NULL;
rr=ll;
while(rr->next!=NULL && rr->next->data.totle>=p->data.totle)
rr=rr->next;
if(rr->next==NULL)
rr->next=s;
else
{
s->next=rr->next;
rr->next=s;
}
p=p->next;
}
free(l);
l->next=ll->next;
printf("\n=====>提示:排序已经完成!\n");
}
void Save(Link l)
{
FILE* fp;
Node *p;
int flag=1,count=0;
fp=fopen("c:\\student","wb");
if(fp==NULL)
{
printf("\n=====>提示:重新打开文件时发生错误!\n");
exit(1);
}
p=l->next;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1)
{
p=p->next;
count++;
}
else
{
flag=0;
break;
}
}
if(flag)
{
printf("\n=====>提示:文件保存成功.(有%d条记录已经保存.)\n",count);
shoudsave=0;
}
fclose(fp);
}
void main()
{
Link l;/* 连表 */
FILE *fp; /* 文件指针 */
int sel;
char ch;
char jian;
int count=0;
Node *p,*r;
printf("\t\t\t\t学生成绩管理系统\n\t\t\t\t-------福建农业职业学院计应0501 黄欢(32号)\n");
l=(Node*)malloc(sizeof(Node));
l->next=NULL;
r=l;
fp=fopen("C:\\student","rb");
if(fp==NULL)
{
printf("\n=====>提示:文件还不存在,是否创建?(y/n)\n");
scanf("%c",&jian);
if(jian=='y'||jian=='Y')
fp=fopen("C:\\student","wb");
else
exit(0);
}
printf("\n=====>提示:文件已经打开,正在导入记录......\n");
while(!feof(fp))
{
p=(Node*)malloc(sizeof(Node));
if(fread(p,sizeof(Node),1,fp)) /* 将文件的内容放入接点中 */
{
p->next=NULL;
r->next=p;
r=p; /* 将该接点挂入连中 */
count++;
}
}
fclose(fp); /* 关闭文件 */
printf("\n=====>提示:记录导入完毕,共导入%d条记录.\n",count);
while(1)
{
menu();
printf("请你选择操作:");
scanf("%d",&sel);
if(sel==0)
{
if(shoudsave==1)
{ getchar();
printf("\n=====>提示:资料已经改动,是否将改动保存到文件中(y/n)?\n");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
Save(l);
}
printf("\n=====>提示:你已经退出系统,再见!\n");
break;
}
switch(sel)
{
case 1:Add(l);break; /* 增加学生 */
case 2:Del(l);break;/* 删除学生 */
case 3:Qur(l);break;/* 查询学生 */
case 4:Modify(l);break;/* 修改学生 */
case 5:Save(l);break;/* 保存学生 */
case 9:printf("\t\t\t==========帮助信息==========\n");break;
default: Wrong();getchar();break;
}
}
}
/* */
/*
学生成绩管理程序
编制一个统计学生考试分数的管理程序。
设学生成绩已以一个学生一个记录的形式存储在文件中,
每位学生记录包含的信息有:姓名,学号和各门功课的成绩。
程序具有以下几项功能:求出各门课程的总分,平均分,按姓名,
按学号寻找其记录并显示,浏览全部学生成绩和按总分由高到低显示学生信息等。
*/
#include <stdio.h>
#define SWN 3 /* 课程数 */
#define NAMELEN 20 /* 姓名最大字符数 */
#define CODELEN 10 /* 学号最大字符数 */
#define FNAMELEN 80 /* 文件名最大字符数 */
#define BUFLEN 80 /* 缓冲区最大字符数 */
/* 课程名称表 */
char schoolwork[SWN][NAMELEN+1] = {"Chinese","Mathematic","English"};
struct record
{
char name[NAMELEN+1]; /* 姓名 */
char code[CODELEN+1]; /* 学号 */
int marks[SWN]; /* 各课程成绩 */
int total; /* 总分 */
}stu;
struct node
{
char name[NAMELEN+1]; /* 姓名 */
char code[CODELEN+1]; /* 学号 */
int marks[SWN]; /* 各课程成绩 */
int total; /* 总分 */
struct node *next; /* 后续表元指针 */
}*head; /* 链表首指针 */
int total[SWN]; /* 各课程总分 */
FILE *stfpt; /* 文件指针 */
char stuf[FNAMELEN]; /* 文件名 */
/* 从指定文件读入一个记录 */
int readrecord(FILE *fpt,struct record *rpt)
{
char buf[BUFLEN];
int i;
if(fscanf(fpt,"%s",buf)!=1)
return 0; /* 文件结束 */
strncpy(rpt->name,buf,NAMELEN);
fscanf(fpt,"%s",buf);
strncpy(rpt->code,buf,CODELEN);
for(i=0;i<SWN;i++)
fscanf(fpt,"%d",&rpt->marks[i]);
for(rpt->total=0,i=0;i<SWN;i++)
rpt->total+=rpt->marks[i];
return 1;
}
/* 对指定文件写入一个记录 */
writerecord(FILE *fpt,struct record *rpt)
{
int i;
fprintf(fpt,"%s\n",rpt->name);
fprintf(fpt,"%s\n",rpt->code);
for(i=0;i<SWN;i++)
fprintf(fpt,"%d\n",rpt->marks[i]);
return ;
}
/* 显示学生记录 */
displaystu(struct record *rpt)
{
int i;
printf("\nName : %s\n",rpt->name);
printf("Code : %s\n",rpt->code);
printf("Marks :\n");
for(i=0;i<SWN;i++)
printf(" %-15s : %4d\n",schoolwork[i],rpt->marks[i]);
printf("Total : %4d\n",rpt->total);
}
/* 计算各单科总分 */
int totalmark(char *fname)
{
FILE *fp;
struct record s;
int count,i;
if((fp=fopen(fname,"r"))==NULL)
{
printf("Can't open file %s.\n",fname);
return 0;
}
for(i=0;i<SWN;i++)
total[i]=0;
count=0;
while(readrecord(fp,&s)!=0)
{
for(i=0;i<SWN;i++)
total[i]+=s.marks[i];
count++;
}
fclose(fp);
return count; /* 返回记录数 */
}
/* 列表显示学生信息 */
void liststu(char *fname)
{
FILE *fp;
struct record s;
if((fp=fopen(fname,"r"))==NULL)
{
printf("Can't open file %s.\n",fname);
return ;
}
while(readrecord(fp,&s)!=0)
{
displaystu(&s);
printf("\n Press ENTER to continue...\n");
while(getchar()!='\n');
}
fclose(fp);
return;
}
/* 构造链表 */
struct node *makelist(char *fname)
{
FILE *fp;
struct record s;
struct node *p,*u,*v,*h;
int i;
if((fp=fopen(fname,"r"))==NULL)
{
printf("Can't open file %s.\n",fname);
return NULL;
}
h=NULL;
p=(struct node *)malloc(sizeof(struct node));
while(readrecord(fp,(struct record *)p)!=0)
{
v=h;
while(v&&p->total<=v->total)
{
u=v;
v=v->next;
}
if(v==h)
h=p;
else
u->next=p;
p->next=v;
p=(struct node *)malloc(sizeof(struct node));
}
free(p);
fclose(fp);
return h;
}
/* 顺序显示链表各表元 */
void displaylist(struct node *h)
{
while(h!=NULL)
{
displaystu((struct record *)h);
printf("\n Press ENTER to continue...\n");
while(getchar()!='\n');
h=h->next;
}
return;
}
/* 按学生姓名查找学生记录 */
int retrievebyn(char *fname, char *key)
{
FILE *fp;
int c;
struct record s;
if((fp=fopen(fname,"r"))==NULL)
{
printf("Can't open file %s.\n",fname);
return 0;
}
c=0;
while(readrecord(fp,&s)!=0)
{
if(strcmp(s.name,key)==0)
{
displaystu(&s);
c++;
}
}
fclose(fp);
if(c==0)
printf("The student %s is not in the file %s.\n",key,fname);
return 1;
}
/* 按学生学号查找学生记录 */
int retrievebyc(char *fname, char *key)
{
FILE *fp;
int c;
struct record s;
if((fp=fopen(fname,"r"))==NULL)
{
printf("Can't open file %s.\n",fname);
return 0;
}
c=0;
while(readrecord(fp,&s)!=0)
{
if(strcmp(s.code,key)==0)
{
displaystu(&s);
c++;
break;
}
}
fclose(fp);
if(c==0)
printf("The student %s is not in the file %s.\n",key,fname);
return 1;
}
main()
{
int i,j,n;
char c;
char buf[BUFLEN];
FILE *fp;
struct record s;
clrscr();
printf("Please input the students marks record file's name: ");
scanf("%s",stuf);
if((fp=fopen(stuf,"r"))==NULL)
{
printf("The file %s doesn't exit, do you want to creat it? (Y/N) ",stuf);
getchar();
c=getchar();
if(c=='Y'||c=='y')
{
fp=fopen(stuf,"w");
printf("Please input the record number you want to write to the file: ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("Input the student's name: ");
scanf("%s",&s.name);
printf("Input the student's code: ");
scanf("%s",&s.code);
for(j=0;j<SWN;j++)
{
printf("Input the %s mark: ",schoolwork[j]);
scanf("%d",&s.marks[j]);
}
writerecord(fp,&s);
}
fclose(fp);
}
}
fclose(fp);
getchar();
/*clrscr();*/
puts("Now you can input a command to manage the records.");
puts("m : mean of the marks.");
puts("t : total of the marks.");
puts("n : search record by student's name.");
puts("c : search record by student's code.");
puts("l : list all the records.");
puts("s : sort and list the records by the total.");
puts("q : quit!");
while(1)
{
puts("Please input command:");
scanf(" %c",&c); /* 输入选择命令 */
if(c=='q'||c=='Q')
{
puts("\n Thank you for your using.");
break; /* q,结束程序运行 */
}
switch(c)
{
case 'm': /* 计算平均分 */
case 'M':
if((n=totalmark(stuf))==0)
{
puts("Error!");
break;
}
printf("\n");
for(i=0;i<SWN;i++)
printf("%-15s's average is: %.2f.\n",schoolwork[i],(float)total[i]/n);
break;
case 't': /* 计算总分 */
case 'T':
if((n=totalmark(stuf))==0)
{
puts("Error!");
break;
}
printf("\n");
for(i=0;i<SWN;i++)
printf("%-15s's total mark is: %d.\n",schoolwork[i],total[i]);
break;
case 'n': /* 按学生的姓名寻找记录 */
case 'N':
printf("Please input the student's name you want to search: ");
scanf("%s",buf);
retrievebyn(stuf,buf);
break;
case 'c': /* 按学生的学号寻找记录 */
case 'C':
printf("Please input the student's code you want to search: ");
scanf("%s",buf);
retrievebyc(stuf,buf);
break;
case 'l': /* 列出所有学生记录 */
case 'L':
liststu(stuf);
break;
case 's': /* 按总分从高到低排列显示 */
case 'S':
if((head=makelist(stuf))!=NULL)
displaylist(head);
break;
default: break;
}
}
}