C课程设计 题目:学生公共选修课管理系统 一、 功能需求说明(必须采用结构体和动态链表实现) (1)用户登录与主界面模块。负责用户登录窗口的生成、用户名以及用户密码的输入与确认。 (2)输入模块。涉及课程信息(包括开课学院,开课教师工号及姓名,开课课程名,课程学分,考试形式)、学生信息的输入(学生所在院系,学生学号,学生姓名,学生性别,年级)。 (3)查询模块。实现按学号查询、按课程查询、按选课学生所在院系查询 (4)更新模块。主要实现记录的修改、删除和排序操作。 (5)统计模块。查询完成选课的课程信息以及未成功开课的课程信息,查询每门课的选课人数。(若选课人数没有达到50人,则不能开课) (6)选课模块。每个学生每学期选课不能超过3门。可以统计每个学生所选课程的总学分。 (7)可以根据实际情况做功能扩充 二、加分项 (1)使用图形界面。 (4) 使用线、图表示查询记录和统计信息 (3)可参考实际情况对软件进行功能扩充。 三、设计要求 1、不同的模块都要有出错处理,并能给提示。如输入数据错误,文件操作错误等。 2、以上各个功能均编写成子函数,有良好的注释说明,由主函数调用实现。 3、必须采用结构体数组或链表结构进行存储和管理; 4、必须使用文件保存数据 5、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观 要求!!!: 1.只能使用 C 语言,工具采用 TC2.0 或 3.0,源程序要有适当的 注释,使程序容易阅读,所有程序要求使用多文件多函数编程方式。 2.要有用户界面。要求至少采用文本菜单界面;鼓励采用图形菜 单界面,使用文件保存数据,鼓励自行增加新功能。 3.写课程设计报告(要求正规打印,A4 幅面,双面打印),内容 包括: 封面(以附件格式为主) 课程设计题目、内容、要求。 总体设计(包含几大功能模块),画出系统功能模块结构图 详细设计(各功能模块的具体实现,画出相关流程图) 公用数据结构设计及用法说明 各函数模块的功能介绍,程序结构(画流程图),数据结构设 计描述,参数说明等。(画流程图推荐使用 Microsoft Visio 工具) 试验结果(包括输入数据和输出结果) 体会,总结(课程设计完成了哪些功能,有什么扩展功能 有 什么地方需要改进,通过课程设计有何收获,调试程序的体会等) 参考文献
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<conio.h>
typedef
unsigned
char
uint8_t;
typedef
unsigned
short
uint16_t;
typedef
unsigned
int
uint32_t;
#define CLASS_CLS system("cls")
#define CLASS_NAME 80
typedef
struct
class
{
char
name[CLASS_NAME];
/* 课程名称 -- 唯一性 */
uint32_t nature;
/* 课程性质(必修或者选修) */
uint32_t total_period;
/* 课程总学时 */
uint32_t teach_period;
/* 授课学时 */
uint32_t exper_period;
/* 上机学时 */
uint32_t start_time;
/* 课程开始时间 */
uint8_t score;
/* 课程学分 */
uint8_t is_exsit;
/* 课程是否存在 */
struct
class
*next;
} class_t;
// 课程结构体
class_t *head = NULL;
static
uint32_t count = 1;
void
play(
char
*text,
int
display,
int
time
,
int
nu)
//动画打印
{
CLASS_CLS;
int
i, len;
for
(i = 0; i <= nu; i++)
{
printf
(
"\n"
);
}
for
(i = 0; i < 25; i++)
{
printf
(
" "
);
}
len =
strlen
(text);
for
(i = 0; i < len; i++)
{
printf
(
"%c"
, text[i]);
Sleep(display);
}
Sleep(
time
);
}
void
titile(
char
*text,
char
*str)
{
CLASS_CLS;
uint8_t i;
for
(i = 0; i < 25; i++)
{
printf
(
" "
);
}
printf
(
"%s\n"
, text);
for
(i = 0; i <= 60; i++)
{
printf
(
"%s"
, str);
}
printf
(
"\n"
);
}
void
menu(
void
)
{
titile(
"【学生选课系统】"
,
"-"
);
printf
(
"\n\t|-----------------------------------|"
);
printf
(
"\n\t| [1]--增加课程 |"
);
printf
(
"\n\t| [2]--浏览课程 |"
);
printf
(
"\n\t| [3]--查询课程 |"
);
printf
(
"\n\t| [4]--删除课程 |"
);
printf
(
"\n\t| [5]--修改课程 |"
);
printf
(
"\n\t| [Q]--退出系统 |"
);
printf
(
"\n\t|-----------------------------------|"
);
}
void
get_bat_data(
void
)
{
class_t *point, *q;
uint32_t count = 0;
FILE
*fp =
fopen
(
"c:\\student_elective.dat"
,
"rb"
);
rewind
(fp);
point = (class_t *)
malloc
(
sizeof
(class_t));
head = point;
while
(!
feof
(fp))
{
count++;
fread
(point,
sizeof
(class_t), 1, fp);
point->next = (class_t *)
malloc
(
sizeof
(class_t));
q = point;
point = point->next;
}
q->next = NULL;
fclose
(fp);
}
void
save_bat_data(
void
)
{
class_t *point = head;
FILE
*fp =
fopen
(
"c:\\student_elective.dat"
,
"w+"
);
while
(NULL != point)
{
count++;
fwrite
(point,
sizeof
(class_t), 1, fp);
point = point->next;
}
fclose
(fp);
}
uint32_t num_check(
void
)
{
char
ch;
uint32_t sum = 0;
while
(1)
{
ch = getch();
if
(
'\n'
== ch ||
'\r'
== ch)
{
return
sum;
}
else
if
(
'\b'
== ch)
{
sum /= 10;
printf
(
"\b \b"
);
}
else
if
((
'0'
<= ch) && (
'9'
>= ch))
{
sum *= 10;
sum += ch -
'0'
;
printf
(
"%d"
, ch -
'0'
);
}
}
}
void
create(
void
)
{
class_t *point, *q;
char
tmp[CLASS_NAME], ch;
uint8_t flag = 0;
while
(1)
{
if
(1 != count)
{
printf
(
"是否继续增加课程(y/n):"
);
gets
(tmp);
if
(
strcmp
(tmp,
"n"
) == 0)
{
break
;
}
}
point = (class_t *)
malloc
(
sizeof
(class_t));
point->is_exsit = 0;
printf
(
"\n====请输入第%d个选修课程信息====\n"
, count);
printf
(
"选择课程名称:"
);
gets
(point->name);
q = head;
while
(NULL != q)
{
if
(
strcmp
(q->name, point->name) == 0)
{
flag = 1;
printf
(
"课程名称重复或者不合格,请重新输入...\n"
);
break
;
}
q = q->next;
}
if
(1 == flag)
{
continue
;
}
printf
(
"课程性质:"
);
printf
(
"\n[B]--【必修】 [X]--【选修】"
);
while
(1)
{
ch = getch();
if
(ch ==
'b'
|| ch ==
'B'
)
{
point->nature = 1;
break
;
}
if
(ch ==
'x'
|| ch ==
'X'
)
{
point->nature = 2;
break
;
}
}
printf
(
"\n输入总学时:(只接受数字!)"
);
point->total_period = num_check();
printf
(
"\n输入授课学时:(只接受数字!)"
);
point->teach_period = num_check();
printf
(
"\n输入上机学时:(只接受数字!)"
);
point->exper_period = num_check();
printf
(
"\n输入本课程学分:(只接受数字!)"
);
point->score = num_check();
printf
(
"\n输入开课学期:(只接受数字!)"
);
point->start_time = num_check();
point->is_exsit = 1;
point->next = head;
head = point;
count++;
}
printf
(
"信息录入完毕,按任意键继续……"
);
getch();
}
void
display(
void
)
{
class_t *point = head;
CLASS_CLS;
titile(
"【查看课程】"
,
"-"
);
printf
(
"\n名称 \t性质\t总学时\t授课学时\t上机学时\t学分\t开课学期"
);
while
(NULL != point)
{
if
(1 == point->is_exsit)
{
printf
(
"\n%-14s "
, point->name);
if
(1 == point->nature)
{
printf
(
"必修课"
);
}
else
{
printf
(
"选修课"
);
}
printf
(
" %d时 %d时 %d时 %d分 %d时"
, point->total_period, point->teach_period, point->exper_period, point->score, point->start_time);
}
point = point->next;
}
getch();
}
// 对照学生管理系统自行拓展
void
search(
void
)
{
}
void
modify(
void
)
{
}
void
delete
(
void
)
{
}
int
main(
void
)
{
uint8_t value;
uint8_t movie = 1;
char
choice[3];
FILE
*fp =
fopen
(
"c:\\student_elective.dat"
,
"a"
);
fclose
(fp);
system
(
"color 30"
);
system
(
"mode con:cols=100 lines=35"
);
system
(
"title 【选修课系统】"
);
if
(1 == movie)
{
play(
"欢迎使用【选修课系统】"
, 80, 1500, 10);
}
while
(1)
{
CLASS_CLS;
menu();
do
{
gets
(choice);
value =
atoi
(choice);
}
while
((value > 12) || (value < 0));
switch
(value)
{
case
1:
create();
break
;
case
2:
display();
break
;
case
3:
search();
break
;
case
4:
modify();
break
;
case
5:
delete
();
break
;
case
6:
save_bat_data();
break
;
case
7:
get_bat_data();
break
;
case
8:
exit
(1);
break
;
default
:
break
;
}
}
return
0;
}
数组的长度是固定的,但是链表可以任意一个长度
所以你可以采用很多相关的技术,来灵活的运用
不一定说链表就比数组要好,这是程序中特殊的情况造成的
但是你最好还是两个办法都事先下
实现了这样的功能,程序的完备性可以得到提高
一般来说数组我们可以使用变量来定义的
而结构体的定义就可以借助链表了
推荐使用链表,链表的应用,将结构体涵盖其中,结构体的定义和应用,是C语言程序设计的升华。
通过链表,可以很容易实现节点的增加和删除,不需要像数组一样,逐个遍历之后还有移动前后元素。
当然,数组的随机查询是非常方便的,这是牺牲了内存空间的,数组的定义必须是一个完整的连续空间,而链表中节点可以是离散分布,不需要连续分布。对于一个系统来说,存储的数据量非比较大,使用链表的话,更合适。
楼上大哥说的很对,在存储对象长度未知的情况下使用链表是最合适的,插入与删除都比较方便,数组一旦确定长度就无法进行插入与删除。课设设计自己做一下对C语言的学习有很大长进。