资源描述
课程实验报告
课程名称
C语言程序设计
班级
13新能源2班
实验日期
20XX8月1号
姓名
许鑫
学号
130370236
实验成绩
实验名称
学生成绩记录簿系统
实
验
题
目
描
述
本程序是非数值计算型算法设计,我设计出了学生成绩记录簿系统的基本功能,并设计了简单的界面。本程序主要考察对自定义函数的熟悉程度,本程序主要使用的是链表的相关操作,包括结构体链表的创建、输入、输出、查找、删除等。我设计的这个成绩记录簿系统也初步实现了学生成绩信息的显示、输入、删除、查找等必要的功能。
1.建立一个主界面
2.用switch语句进行分类讨论
3.分别进入录入,查询,删除,等子函数。
4.将子函数与主函数相连即可。
该程序可以建立学生的成绩记录。可以方便老师和同学方便的查阅成绩;
这个程序有录入和删除的功能;
还可以求出平均成绩,并排序
成绩记录簿中记录以下数据:学号、姓名、课程编号、课程名称、成绩、学分
添加成绩:需要输入学生的学号或姓名、课程编号及成绩,如已有该门课程成绩给出提示;
查询〔班级或个人成绩:
查询个人成绩:以学号或姓名作为关键字,可查询一个学生的所有成绩,和已完成的总学分。
查询班级成绩:以课程编号为关键字,成绩表后面要统计平均分、及格率及全班同学不同课程在不同分数段分布的人数及百分比。
拓展功能:
a> 程序启动时先从文件读入数据,如果文件中没有数据则给出提示;
b> 每次修改的数据写入文件
实
验
环
境
以自己的电脑为主要的实验平台,运用Visual C++ 6.0这个软件进行反复的编写实验。
实
验
界
面
截
图
1、开始时
2、添加
3、查询
4、查询成绩
5、写文本
6、读取
算
法
描
述
及
实
验
步
骤
主程序提供一个界面,允许用户选择。使用switch语句,用时直接输入数字即可。
增加函数,功能是插入学生成绩。使用一个无穷循环,直到录入"n"时结束。
删除函数,功能是删除,分为两步,先找后删。找,用strcmp函数 来做如果找到记录i值,反之记为-1;删除可以从i项开始将数组的后一项赋值给前一项。前一项自动被删掉。这样完成删除。
查询函数与之类似,将删除改为输出即可;
求平均值函数与查询类似只是输出时只输出平均值而已。
按平均值排序只要加一个排序函数即可。
退出函数什么都不写,即可。
程序流程图
查询成绩
添加成绩
添加学生成绩
添加课程编号
添加学生姓名
添加学生学号
查询班级成绩
查询学生成绩
查询班级成绩
查询学生成绩
课程编号
学号查询
姓名查询
调
试
过
程
及
实
验
结
果
总
结
经过一个多星期的编译原理课程设计,在我的努力下,顺利完成该课程设计。
通过该课程设计,掌握了编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程及其相关的技术,对课本上的知识也有了更深的理解。老师常说,课本上的知识是机械的,表面的,要学会去运用,要举一反三。现在终于深刻的了解了这句话。经过这次的课程设计,发现书本上很深奥的知识变的更为简单,同样,对实验原理也了有更深的理解。知道和理解了该理论在计算机中是怎样执行的, 对该理论在实践中的应用有深刻的理解 。通过该课程设计,把死板的课本知识变得生动有趣,激发了学习的积极性。能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。
课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。除了课堂外,课程设计是最能学到东西的,最考验人的。在做课程设计的这段时间,时刻都感到自己学的知识有多么的贫瘠。经过这次课程设计,让我对C++这门语言有了更深的认识,操作能力有了提高要想是写出的代码能运行,需要耐心细心,毅力以及充沛的体力。只有经过多次编辑,多次编译,再多次运行,才能编写出更好的程序,有时候需要多次的更正才能达到所要的运行结果。
附
录
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
struct Lesson
{
char LessonName[100];
char LessonNumber[100];
int LessonMark;
float LessonCredit;
};
struct Student
{
char Name[100];
char Number[100];
int LessonCount;
struct Lesson L[100];
};
struct Student S[MAX];
int StudentCount = 0;
void PrintInterface<>;
int Student_Insert<>;
int Student_Delete<>;
void Student_Select<>;
void Class_Select<>;
void WriteFile<>;
void ReadFile<>;
int main<>
{
int n;
{
PrintInterface<>;
scanf<"%d", &n>;
}
}
void PrintInterface<>
{
int n;
while <1>
{
printf<"\n ---欢迎使用学生成绩记录簿系统--- ">;
printf<"\n| 1、添加 |\n">;
printf<"\n| 2、删除 |\n">;
printf<"\n| 3、查学生成绩 |\n">;
printf<"\n| 4、查班成绩表 |\n">;
printf<"\n| 5、写入文本文件 |\n">;
printf<"\n| 6、读取文本文件 |\n">;
printf<"\n| 0、退出 |\n">;
printf<"\n -------------------------- ">;
printf<"\n选择操作:">;
scanf<"%d",&n>;
switch<n>{
case 1:
if <Student_Insert<>>
printf<"\n添加成功...回车继续\n">;
else
printf<"\n添加失败...回车继续\n">;
break;
case 2:
Student_Delete<>;
break;
case 3:
Student_Select<>;
break;
case 4:
Class_Select<>;
break;
case 5:
WriteFile<>;
break;
case 6:
ReadFile<>;
break;
case 0:
exit<1>;
break;
default:
printf<"无此功能,请重新选择,按回车确定\n">;
}
}
return 0;
}
int Student_Insert<>
{
int i,j,n;
printf<"\n请输入所添加的学生人数:">;
scanf<"%d", &n>;
if <StudentCount + n >= MAX>
return 0;
for <i = StudentCount; i < StudentCount + n; ++i>
{
printf<"\n\t第%d个学生:\n", i - StudentCount + 1>;
printf<"\n\t学生学号:">;
scanf<"%s", &S[i].Number>;
if<strlen<S[i].Number>!=8>
{
printf<"输入错误,请重新输入">;
return 0;
}
printf<"\n\t学生姓名:">;
scanf<"%s", S[i].Name>;
printf<"\n\t该学生所修课程数:">;
scanf<"%d", &S[i].LessonCount>;
for <j = 0; j < S[i].LessonCount; ++j>
{
printf<"\n\t第%d门课:\n", j + 1>;
printf<"\n\t\t课程编号:">;
scanf<"%s", S[i].L[j].LessonNumber>;
if<strlen<S[i].L[j].LessonNumber>!=5>
{
printf<"输入错误,请重新输入!">;
return 0;
}
printf<"\n\t\t课程名称:">;
scanf<"%s",S[i].L[j].LessonName>;
printf<"\n\t\t课程成绩:">;
scanf<"%d", &S[i].L[j].LessonMark>;
if<S[i].L[j].LessonMark<0 || S[i].L[j].LessonMark>100>
{
printf<"输入错误,请重新输入!">;
return 0;
}
printf<"\n\t\t课程学分:">;
scanf<"%f", &S[i].L[j].LessonCredit>;
if<S[i].L[j].LessonCredit<1 || S[i].L[j].LessonCredit>5>
{
printf<"输入错误,请重新输入!">;
return 0;
}
if <S[i].L[j].LessonMark < 60>
S[i].L[j].LessonCredit = 0;
}
}
StudentCount += n ;
return 1;
}
int Student_Delete<>
{
char a[100];
char b[100];
int i, j;
printf<"\n删除学生:\n">;
printf<"\n学生姓名:">;
scanf<"%s",a>;
printf<"\n学生学号:">;
scanf<"%s",b>;
if<strlen<b>!=8>
{
printf<"输入错误请重新输入">;
return 0;
}
for <i = 0; i < StudentCount; i++>
{
if <0==strcmp<S[i].Name, a> && 0==strcmp<S[i].Number, b>>
{
printf<"\n找到,删除\n">;
for <j = i + 1; j < StudentCount; j++>
{
S[j - 1] = S[j];
}
break;
}
}
if <i == StudentCount || i > StudentCount>
{
printf<"\n未找到该学生\n\n">;
return 0;
}
else
{
StudentCount--;
return 1;
}
}
void Student_Select<>
{
int x;
char y[100];
char a[100];
int i, j;
printf<"\n输入所查学生信息〔1.姓名 2.学号选择:">;
scanf<"%d", &x>;
if <x == 1 || x == 2>
{
if <x == 1>
{
printf<"\n姓名:">;
fflush<stdin>;
gets<a>;
for <i = 0; i < StudentCount; i++>
{
if <0==strcmp<S[i].Name,a>>
{
printf<"\n学号:%s\t姓名:%s\n", S[i].Number, S[i].Name>;
printf<"\n课程编号\t课程名称\t课程成绩\t课程学分\n">;
printf<"-----------------------------------------------------\n">;
for <j = 0; j < S[i].LessonCount; j++>
{
printf<"%s\t\t%s\t\t%d\t\t%f\n", S[i].L[j].LessonNumber,
S[i].L[j].LessonName, S[i].L[j].LessonMark,
S[i].L[j].LessonCredit>;
printf<"-----------------------------------------------------\n">;
}
printf<"\n\n">;
}
}
}
else
{
printf<"\n学号:">;
fflush<stdin>;
gets<y>;
for <i = 0; i < StudentCount; i++>
{
if <strcmp<S[i].Number,y>==0>
{
printf<"\n学号:%s\t姓名:%s\n", S[i].Number, S[i].Name>;
printf<"\n课程编号\t课程名称\t课程成绩\t课程学分\n">;
printf<"-----------------------------------------------------\n">;
for <j = 0; j < S[i].LessonCount; j++>
{
printf<"%s\t\t%s\t\t%d\t\t%f\n",
S[i].L[j].LessonNumber,S[i].L[j].LessonName,
S[i].L[j].LessonMark,S[i].L[j].LessonCredit>;
printf<"-----------------------------------------------------\n">;
}
printf<"\n\n">;
break;
}
}
}
printf<"查找完毕...回车继续\n">;
getchar<>;
}
else
{
printf<"选择错误...回车继续\n">;
getchar<>;
return;
}
}
void Class_Select<>
{
char a[100];
double x=0,y=0,z=0;
int i, j;
printf<"\n请输入课程编号:">;
fflush<stdin>;
scanf<"%s",a>;
printf<"学号\t姓名\t课程名称\t课程成绩\t课程学分\n">;
printf<"----------------------------------------------------\n">;
for <i = 0; i < StudentCount; i++>
{
for <j = 0; j < S[i].LessonCount; j++>
{
if <strcmp<S[i].L[j].LessonNumber,a>==0>
{
printf<"%s\t%s\t%s\t\t%d\t\t%f\n",
S[i].Number, S[i].Name, S[i].L[j].LessonName,
S[i].L[j].LessonMark, S[i].L[j].LessonCredit>;
printf<"----------------------------------------------------\n">;
z+=S[i].L[j].LessonMark;
x++;
if <S[i].L[j].LessonMark >= 60>
y++;
break;
}
}
}
printf<"\n平均分:%f\t及格率:%f%%\n\n", z/x, y/x*100>;
printf<"\n查找完毕...回车继续\n">;
getchar<>;
}
void WriteFile<>
{
FILE *fp;
int i, j;
char a[100];
printf<"\n请输入写入的文件地址:\n\n地址输入格式:例如d:\\\\Student.txt:">;
scanf<"%s",&a>;
printf<"\n写入中......\n">;
if <fp = fopen<a,"w">>
{
fprintf<fp,"%d\n",StudentCount>;
for <i = 0; i < StudentCount; i++>
{
fprintf<fp,"%s\t%s\t%d\n",S[i].Number, S[i].Name,S[i].LessonCount>;
for <j = 0; j < S[i].LessonCount; j++>
{
fprintf<fp,"%s\t%s\t%d\t%f\n", S[i].L[j].LessonNumber,S[i].L[j].LessonName,
S[i].L[j].LessonMark,S[i].L[j].LessonCredit>;
}
}
printf<"\n写入完成...回车继续\n">;
fclose<fp>;
}
else
{
printf<"\n写入失败...回车继续\n">;
}
getchar<>;
}
void ReadFile<>
{
FILE *fp;
int i, j;
char a[100];
printf<"\n请输入读取的文件地址:\n\n地址输入格式:例如d:\\\\student.txt:">;
scanf<"%s",&a>;
printf<"\n读取中......\n">;
if <fp = fopen<a,"r">>
{
fscanf<fp,"%d",&StudentCount>;
for <i = 0; i < StudentCount; i++>
{
fscanf<fp,"%s%s%d",&S[i].Number, &S[i].Name,&S[i].LessonCount>;
for <j = 0; j < S[i].LessonCount; j++>
{
fscanf<fp,"%s%s%d%f",&S[i].L[j].LessonNumber,
&S[i].L[j].LessonName,&S[i].L[j].LessonMark,
&S[i].L[j].LessonCredit>;
}
}
printf<"\n读取成功...回车继续\n">;
fclose<fp>;
}
else
{
printf<"\n读取失败...回车继续\n">;
}
getchar<>;
}
17 / 17
展开阅读全文