C语言管理系统527和.doc
山东师范大学实验报告实验课程C语言程序设计实验项目学生成绩管理系统实验时间2011年 6月专业、班级信息管理与信息系统专业二班姓 名李旭东学 号0姓 名徐慰光学 号9姓 名郭世杰学 号1姓 名李延帮学 号4姓 名韩植丞学 号5教师批阅意见: 成绩 指导教师签名 (实验报告包含的主要内容:实验目的和要求;实验内容和原理;主要仪器设备;操作方法与实验步骤;实验数据记录与处理;实验结果与分析;讨论与心得等)一 设计内容1. 需求分析1.1项目需求概述 通过此系统可以实现如下功能:1) 数据信息的录入2) 学生、课程及成绩全部显示3) 排序功能4) 查询功能5) 成绩修改及删除6) 退出系统a) 功能要求及说明 1、数据信息的录入1)学生基本信息录入:学号不允许重复 2)课程信息的录入3)学生成绩录入2、学生、课程及成绩显示:输出所有的学生信息及成绩信息 3、查询功能1)学生信息查询输入一个学号或姓名(可实现选择),查出此学生的基本信息并显示输出。2)成绩查询:输入一个学号时,查询出此学生的所有课程成绩信息并以列表显示,显示内容包括:学号、课程名、平时成绩、卷面成绩、综合成绩输入一个学生的姓名时,查询出此学生的所有课程成绩信息并以列表显示,显示内容包括:学号、姓名、课程名、综合成绩输入一门课程名称,可查询出所有选修这门课程的学生成绩。 3)成绩修改在修改成绩之前必须输入正确的用户密码才能进入成绩修改菜单进行操作。 4、排序功能 1)学号排序 2)成绩排序5、 删除功能删除一个学生所有信息。6、退出系统2. 概要设计功能模块图: 学生成绩管理系统查询信息修改成绩退出系统删除信息学生/课程信息输入信息排序 3. 详细设计 2.1 开始输入选择的值判断登入查询修改排序输出删除退出系统流程描述二 调试中的问题及解决 这次距上次使用C语言编程已经过了很长时间,许多地方都显得生疏了些。出现的bug主要集中于各种指令使用时的细节问题。下面列举几个例子: 1)结构体的结构体存储取 第一次输入时使用的是fprintf和fread,在读取后存入的过程中,程序出现了数据溢出后强制跳出的现象。后经过调试及查阅相关资料发现bug的原因是fprintf和fread不配套,后将fread改为fscanf后程序运行正常。 2)连续使用scanf输入字符串和字符 在读取信息的过程连续使用了scanf,其中夹杂着字符和字符串两种数据类型,编译运行后,发现在运行至输入字符的语句时,程序直接跳过了此步。后经调试和查阅相关资料后发现bug的原因是scanf在连续读取时会将回车等行为当做一个字符进行读入,故程序运行时会显示跳过了此步。后在用scanf读入字符时,加入fflush(stdin);语句,阻止回车的读入,程序运行正常。三 使用说明及测试结果: 本系统是基于C语言平台的教师端学生成绩管理系统。数据保存方式是使用C语言新建并读取文件,相对来说保密性较差,数据信息易通过文件直接修改。#include "stdafx.h"#include<stdio.h>#include<math.h>#include<stdio.h>#include<math.h>#include<string.h>#define N 100#define M 10int i=0,j,a=30,b=3;int p,q,TotN;/char nameN;/unsigned long NON;/int scoreNM;float AverscoreM,AveN;unsigned long NO30=, ,;char name3016="李月","李文华","刘晓磊","赵丹","尹燕芬","赵聪聪","杜春艳","谢金彬","郭士杰","宋婷婷","姜一秀","王玮玉","翟庆峰","翟文彩","高雪","姬生杰","李微微","杨阔宇","朱蕾","宁艳","侯彩萍","张春燕","田雅","刘夫阳","郑立法","陈雪宏","常园","慈滢云","彭新","李文琦"int score303=96,93,75,90,75,67,80,91,82,71,87,60,93,79,73,88,95,90,76,89,84,79,88,82,92,85,96,77,92,70,91,80,89,81,89,91,76,85,83,85,88,88,79,81,88,83,87,77,81,79,86,75,84,78,81,88,80,83,83,86,86,80,80,90,78,82,79,82,85,72,78,79,76,79,83,76,74,83,78,76,79,70,79,71,75,73,83,76,78,75;int l;intflag=1;void main() /*主函数*/ void menu();void modify(); void input1(); void input2(); void print1(); void print2(); void print3();void print4();void print5(); void print6();void print7();void printwrong1(); void printwrong2();void calculate(); void calculate1(); void calculate2(); void sort1(); void sort2(); void sort3(); void sort4();void search();void Exite(); void Delete();menu();switch(p)case 1: input1();system("cls");/*清屏*/print1();print2();main();case 2:modify();print1();print2();main();case 3:calculate();main();case 4:sort1();case 5:search();main();case 6:Delete();system("cls");/*清屏*/print1();print2();main();case 0:Exite();default:printwrong1();system("cls");/*清屏*/main();void calculate()/*计算函数*/int q;printf("n 1 个人平均成绩及个人总成绩n 2 单科平均成绩n 3 单科方差及标准差nn");scanf("%d",&q);switch(q)case 1:calculate1();system("cls");/*清屏*/print3();print4();main();break;case 2:calculate2();system("cls");/*清屏*/print1();print2();print5();main();break;case 3:int i=0;int j;long double t1=0.0;long double t2=0.0;long double varianceN;long double sqrtvarianceN;for(j=0;j<b;j+)for(i=0;i<a;i+)calculate1();t1+=Avei*Avei;t2+=Avei;variancej=t1/a-(t2/a*t2/a);sqrtvariancej=sqrt(variancej);if( i>=a)system("cls");/*清屏*/printwrong2();main();for(j=0;j<b;j+)printf("方差%d %5.2fn",i,variancej);printf("标准差%d %5.2fn",i,sqrtvariancej);main();break;void sort1()int j,i,l,t2,t3;char s16;unsigned long t4;for(j=0;j<b;j+)if(j=0)printf("nt1t学号排序n");elseif(j>0)printf("t%d",j+1);printf("t对第");printf("%d",j);printf("门课程进行排序n");printf("t%dt对总分进行排序n",b+1);scanf("%d",&l);if(l=1)sort2();system("cls");/*清屏*/printf("排序后:n");print1();print2();printf("n");main();else if(l>1&&l<=b)sort3();system("cls");/*清屏*/printf("排序后:n");print1();print2();printf("n");main();else if(l=b+1)sort4();else if(l>b+2)printwrong1();void search()int c,m;char Name116;printf("n 1 已知学号查询n 2 已知姓名查询n");scanf("%d",&c);if(c=1)printf("输入学号n");scanf("%d",&m);i=0;while(m!=NOi&&i<N)i+;if(i<N)printf("n所查询个人信息为:n");print1();printf("%5u",NOi);printf("%12s",namei);for(j=0;j<b;j+)printf("%8d",scoreij);printf("n");else printf("n没有这个学号,输入错误");else if(c=2)printf("输入姓名n");scanf("%s",Name1);for(i=0;0 = strcmp(Name1,namei);i+)printf("n所查询个人信息为:n");print1();printf("%5u",NOi);printf("%16s",namei);for(j=0;j<b;j+)printf("%10d",scoreij); printf("n没有这个学生信息,输入错误");elseprintf("输入错误");void Delete()int n1;int n2;int c;char Name1;char Name;printf("nt1 t删除的学号nt2删除的姓名n");scanf("%d",&c);if(c=1)printf("n输入需要删除的学号:n");scanf("%u",&n1);while(n1!=NOi&&i<N)for(;i<a;i+;)NOi=NOi+1;strncpy(namei,namei+1,16);for(j=0;j<b;j+)scoreij=scorei+1j;if( i<N)NOi=n2;elseprintf("error occured!");elseif(c=2)printf("n输入需要删除的姓名:n");scanf("%s",Name);for(;i<N;i+)if(0 = strcmp(Name,namei) )for(;i<a;i+)strncpy(namei,Name1,16);NOi=NOi+1;for(j=0;j<b;j+)scoreij=scorei+1j;if( i>N)printf("error occured");return;elseprintwrong1();system("cls");/*清屏*/print1();print2();main();void menu()printf("欢迎登录学生管理系统n");printf(" 1 输入学生信息");printf(" 2 修改学生信息n");printf(" 3 学生信息计算");printf(" 4 学生信息排序n");printf(" 5 学生信息查询");printf(" 6 删除学生信息n");printf("-退出本系统()n");scanf("%d",&p); void input1 () /*课程数和人数输入函数*/printf("您要输入的人数和课程数为(人数和课程数不可颠倒):n");scanf("%d,%d",&a,&b);if(a>M|b>N)printwrong1();input2();void input2()/*输入函数*/for(i=0;i<a;i+)printf("输入学号:n");printf("(提示:学号只能是纯数字,不能是字母或其他符号,否则系统不能识别。)n");j=scanf("%u",&NOi);printf("输入姓名:n");scanf("%s",&namei);printf("输入成绩:n");printf("(提示:成绩只能是纯数字,不能是字母或其他符号,否则系统不能识别。)n");for(j=0;j<b;j+)scanf("%d",&scoreij);void modify()/*修改函数*/int n1;int n2;int c;char Name1;char Name;printf("nt1 t修改学号修改姓名n");scanf("%d",&c);if(c=1)printf("n输入需要修改的学号:n");scanf("%u",&n1);printf("n修改学号为:n");scanf("%u",&n2);while(n1!=NOi&&i<N)i=0;i+;if( i<N)NOi=n2;elseprintf("error occured!");elseif(c=2)printf("n输入需要修改的姓名:n");scanf("%s",Name);printf("n修改姓名为:n");scanf("%s",Name1);for(;i<N;i+)if(0 = strcmp(Name,namei) )break;if( i>N)printf("error occured");return;/m=strcmp(Name,Name1);if( m>0|m<0&&i<N)i+;strncpy(namei,Name1,16);elseprintwrong1();system("cls");/*清屏*/printf("n修改学号后的个人信息为:n");print1();print2();main();void print1()printf("n 学号tt姓名");for(j=0;j<b-1;j+)printf("t课程");printf("%d",j+1);if(j=b-1)printf("t课程");printf("%dn",j+1);void print2()int j;for(i=0;i<a;i+)printf("%10u",NOi);printf("%10s",&namei);for(j=0;j<b;j+)for(j=0;j<b-1;j+)printf("%8d",scoreij);printf("%8dn",scoreij);for(;j>b;)printwrong2();system("cls");/*清屏*/main();void print3()printf("n 学号tt姓名");for(j=0;j<b;j+)printf("t课程");printf("%d",j+1 );printf("t平均成绩 总成绩n");void print4()int j;for(i=0;i<a;i+)printf("%10u",NOi);printf("%10s",&namei);for(j=0;j<b;j+)printf("%8d",scoreij);printf("%10.2f %8dn",Avei,Toti);for(;j>b;)system("cls");/*清屏*/printwrong2();main();for(;i>a;)system("cls");/*清屏*/printwrong2();main();void print5()printf("单科平均成绩为:tt ");for(j=0;j<b;j+)printf("%6.2f ",Averscorej);printf("n");void print6()printf("n 学号tt姓名");for(j=0;j<b;j+)printf("t课程");printf("%d",j+1 );printf("t总成绩n");void print7()int j;for(i=0;i<a;i+)printf("%10u",NOi);printf("%10s",&namei);for(j=0;j<b;j+)printf("%8d",scoreij);printf(" %8dn",Toti);for(;j>b;)system("cls");/*清屏*/printwrong2();main();for(;i>a;)system("cls");/*清屏*/printwrong2();main();void printwrong1()printf("n您输入有误,请重新输入。n");void printwrong2()printf("n出现错误,回到主菜单n");void Exite() return;void calculate1()float t;for(i=0;i<a;i+)for(j=0,t=0;j<b;j+)t=t+scoreij;Toti=t;Avei=t/(float)b;void calculate2()double t;for(j=0;j<b;j+)t=0;for(i=0;i<a;i+)t=t+scoreij;Averscorej=t/(double)a;void sort2()int c,t1;char s16;unsigned long t4;printf("n");for(c=0;c<a;c+)for(i=0;i<a-c;i+)if(NOi>NOi+1)t4=NOi;NOi=NOi+1;NOi+1=t4;strncpy(s,namei,16);strncpy(namei,namei+1,16);strncpy(namei+1,s,16);for(j=0;j<b;j+)t1=scoreij;scoreij=scorei+1j;scorei+1j=t1;void sort3()int c,t1,t2;char s16;unsigned long t4;if(l>1&&l<b)for(c=0;c<a;c+)for(i=0;i<a-c;i+)if(scoreil-1<scorei+1l-1)for(;j=l-1;)t1=scoreil-1;scoreil-1=scorei+1l-1;scorei+1j-1=t1;t4=NOi;NOi=NOi+1;NOi+1=t4;strncpy(s,namei,16);strncpy(namei,namei+1,16);strncpy(namei+1,s,16);for(j=0;j<l-1;j+)t1=scoreij;scoreij=scorei+1j;scorei+1j=t1;for(;j>l-1&&j<b;j+)t1=scoreij;scoreij=scorei+1j;scorei+1j=t2;void sort4()int c,t1,t2,t3;char s16;unsigned long t4;if(l>1&&l<b)for(c=0;c<a;c+)for(i=0;i<a-c;i+)if(Toti<Toti+1)t3=Toti;Toti=Toti+1;Toti+1=t3;for(j=0;j<b;j+)t1=scoreij;scoreij=scorei+1l-1;scorei+1l-1=t1;t4=NOi;NOi=NOi+1;NOi+1=t4;strncpy(s,namei,16);strncpy(namei,namei+1,16);strncpy(namei+1,s,16);printf("n");system("cls");/*清屏*/printf("排序后:n");print6();print7();printf("n");main();四 课程设计收获及心得体会本次的课程使我对C语言进行了比较深刻的重温,熟悉了许多相关的函数用法,也对C的编译思路有了更新的一步理解。虽然在实际运行中,很多方面尤其对细节的处理上出现了很多问题,不过这同时也是一个很好的锻炼,这会使我在其他编程工具的使用上获得更多的启发。感谢这次机会是我让我认识到了自己的许多不足。