资源描述
C语言程序设计训练报告
姓 名: 李康
班 级: 电子13-1
学 号: 13034520123
指 导 教 师: 姚明
设 计 时 间:2014.6.23-2014.6.27
广东石油化工学院计算机与电子信息学院
目 录
一.训练目的 7
二.训练题目描述和要求 7
三.训练报告内容 8
3.1需求分析 8
3.2 概要设计 8
3.3 详细设计 8
3.4 主要源程序代码 8
3.5 测试分析 9
3.6 设计结果 9
四.结论与心得 9
一.训练目的
(报告正文部分):
(要求:正文部分一律用小四号字,宋体,1.5倍行距。)
1、通过本次课程设计,锻炼我们应用C语言的语法规则和已经掌握的一些较为简单的算法,自己解决一个较简单的课题,初步积累编程经验。
2、通过学习掌握程序设计的方法与编程技术,学会良好的程序设计风格,为计算机在不同领域的应用打下坚实的基础。
二.训练题目描述和要求
题目:学生成绩管理系统
应用链表及外部文件,独立设计上述应用系统,并编程实现以下功能:
① 信息录入
录入学生信息(包括姓名、学号、各科成绩)。
② 信息查询
输入学号,查询与学号相对应的信息(包括成绩),并按可选的自定义规则进行排序。
按班级查询学生成绩。
按班级统计学科总分、平均分等。
③ 信息删除与修改
输入学号,删除该学号对应的成绩信息。
输入学号,查询并显示出该学号信息,并在此基础上进行修改。
④ 计算学生成绩
计算每位学生的总分。
计算每位学生的平均分。
成绩排序。
⑤信息保存
将学生信息保存在文件中。
⑥根据以上功能需求,定义通讯录信息结构,并采用链表结构对数据进行存储。
⑦提供友好的用户界面,方便用户操作。
三.训练报告内容
3.1需求分析
3.2 概要设计
3.3 详细设计
3.4 主要源程序代码
3.5 测试分析
3.6 设计结果
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#include <ctype.h>
#define YES 1
#define NO 0
typedef struct
{
int num;
float math_score;
float engl_score;
float chin_score;
float phy_score;
float chem_score;
double aver_score;
double sum_score;
char sex;
}StudentDate;//学生基本信息
typedef struct student
{
char name[20];//学生姓名
StudentDate one;//学生其他信息
int rank;//成绩排名
struct student *next;
}Student, *List;
Student *startCheck(void);//开始检查
Student *createListHead(void);//创建链表的头
void menu(void);//主菜单
void sortList(Student *pHead);//排序链表
void readListWithFile(Student *pHead, char *file_name);//从文件中读取数据,并保存在链表中
void sorttList(Student *pHead);//排序链表
int userChioce(Student *pHead);//用户选择
int sortMenu(void);//打印选择菜单
void passwordCheck(void);//密码检测
void correctWord(void);//修改密码
void addStudentInfo(Student *pHead);//向链表的末尾添加数据
int scanMenu(void);//浏览菜单
void findStudentInfo(Student *pHead);//查找学生信息
void delStudentInfo(Student *pHead);//删除某一个学生信息
void alterStudentInfo(Student *pHead);//修改学生信息
void saveList(Student *pHead);//将链表保存在文件里
void printList(Student *pHead);//打印链表
void statisStudentInfo(Student *pHead);//查看学生信息
int statisMenu(void);//查看菜单
void gotoxy(int x, int y);//改变光标位置函数
void inputData(Student *pHead, Student *node);//输入信息,并检测是否合法
int main(void)
{
Student *pHead;
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//得到窗口句柄
SMALL_RECT rc = { 0, 0, 94 - 1, 30 - 1 }; //{Y位置,X位置,宽,高}
SetConsoleWindowInfo(hOut, true, &rc);// 重置窗口位置和大小
system("color 5B");//设置控制台颜色
pHead = startCheck();//读取信息
while (1)
{
if (9 == userChioce(pHead)) //按9时退出系统
{
break;
}
}
return 0;
}
void menu(void)
{
system("CLS");//清屏
printf("\n\n\n\t\t\t\t┌─────────────────┐\n");
printf("\t\t\t\t│ 学生成绩统计系统 │\n");
printf("\t\t\t\t├─────────────────┤\n");
printf("\t\t\t\t│ 1 增加学生记录 │\n");
printf("\t\t\t\t├─────────────────┤\n");
printf("\t\t\t\t│ 2 删除学生记录 │\n");
printf("\t\t\t\t├─────────────────┤\n");
printf("\t\t\t\t│ 3 修改学生记录 │\n");
printf("\t\t\t\t├─────────────────┤\n");
printf("\t\t\t\t│ 4 查找学生信息 │\n");
printf("\t\t\t\t├─────────────────┤\n");
printf("\t\t\t\t│ 5 统计学生成绩 │\n");
printf("\t\t\t\t├─────────────────┤\n");
printf("\t\t\t\t│ 6 查看学生成绩 │\n");
printf("\t\t\t\t├─────────────────┤\n");
printf("\t\t\t\t│ 7 修改登陆密码 │\n");
printf("\t\t\t\t├─────────────────┤\n");
printf("\t\t\t\t│ 8 关于 │\n");
printf("\t\t\t\t├─────────────────┤\n");
printf("\t\t\t\t│ 9 退出系统 │\n");
printf("\t\t\t\t└─────────────────┘\n");
}
void gotoxy(int x, int y)//x为列坐标,y为行坐标
{
COORD pos = { x, y };
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut, pos);
}
Student *startCheck(void)
{
Student *pHead;
FILE *fp1;
char password[20] = "123456";
int i;
if ((fp1 = fopen("password.dat", "rb")) == NULL)//若密码文件不存在,新建密码文件
{
fp1 = fopen("password.dat", "wb");
fwrite(password, 20, 1, fp1);
fclose(fp1);
printf("密码初始化完成!(默认密码为:123456)");
passwordCheck();
}
else
{
passwordCheck();
}
//读条
system("CLS");
system("title 学生成绩统计系统-载入中");//将标题栏命名为“学生成绩统计系统”
printf("\n\n\t\t\t欢迎进入本系统!正在载入.....");
printf("\n\n\n\n\t\t\t┏━━━━━━━━━━┓\n");
printf("\t\t\t┃ ┃\n");
printf("\t\t\t┗━━━━━━━━━━┛\n");
gotoxy(26, 7);
for ( i = 0; i < 10; i++)
{
printf("█");
Sleep(100);
}
pHead = createListHead();
readListWithFile(pHead, "stud.dat");
return pHead;
}
Student *createListHead(void)
{
Student *pHead;
pHead = (List)malloc(sizeof(Student));
pHead->next = NULL;
return pHead;
}
void readListWithFile(Student *pHead, char *file_name)
{
FILE *fp;
Student *p1, *p2;
int count, rank = 0;
StudentDate dat;
char stu_name[20];
fp = fopen(file_name, "r");
if (fp == NULL)
{
fp = fopen(file_name, "w");
fclose(fp);
return;
}
fseek(fp, 0L, 2);
count = ftell(fp);
p1 = pHead;
fp = fopen(file_name, "r");
while (!feof(fp))
{
p2 = (List)malloc(sizeof(Student));
fscanf(fp, "%d%s %c%f%f%f%f%f\n", &p2->one.num, p2->name, &p2->one.sex, &p2->one.chin_score,
&p2->one.math_score, &p2->one.engl_score, &p2->one.chem_score, &p2->one.phy_score);
p2->one.sum_score = (double)(p2->one.chin_score + p2->one.chin_score + p2->one.engl_score +
p2->one.chem_score + p2->one.phy_score);
p2->one.aver_score = p2->one.sum_score / 5;
p2->next = NULL;
p1->next = p2;
p1 = p2;
if (ftell(fp) == count)
{
break;
}
}
//将链表排序,并初始化排名
for (p1 = pHead->next; p1 != NULL; p1 = p1->next)
{
for (p2 = p1->next; p2 != NULL; p2 = p2->next)
{
if (p2->one.aver_score > p1->one.aver_score)
{
dat = p2->one;
strcpy(stu_name, p2->name);
p2->one = p1->one;
strcpy(p2->name, p1->name);
p1->one = dat;
strcpy(p1->name, stu_name);
}
}
p1->rank = ++rank;
}
fclose(fp);
}
void sortList(Student *pHead)
{
Student *p1, *p2;
StudentDate dat;
char stu_name[20];
int bum, count = 0, rank;
system("title 学生成绩统计系统-查看");//将标题栏命名为“学生成绩统计系统”
bum = sortMenu();
if (bum == 1)//按平均分高低排序
{
for (p1 = pHead->next; p1 != NULL; p1 = p1->next)
{
for (p2 = p1->next; p2 != NULL; p2 = p2->next)
{
if (p2->one.aver_score > p1->one.aver_score)
{
dat = p2->one;
rank = p2->rank;
strcpy(stu_name, p2->name);
p2->one = p1->one;
p2->rank = p1->rank;
strcpy(p2->name, p1->name);
p1->one = dat;
p1->rank = rank;
strcpy(p1->name, stu_name);
}
}
}
}
else
{
if (bum == 2)//按学号高低排序
{
for (p1 = pHead->next; p1 != NULL; p1 = p1->next)
{
for (p2 = p1->next; p2 != NULL; p2 = p2->next)
{
if (p2->one.num < p1->one.num)
{
dat = p2->one;
rank = p2->rank;
strcpy(stu_name, p2->name);
p2->one = p1->one;
p2->rank = p1->rank;
strcpy(p2->name, p1->name);
p1->one = dat;
p1->rank = rank;
strcpy(p1->name, stu_name);
}
}
}
}
else
{
if (bum == 3)
{
return;
}
else
{
sortList(pHead);
}
}
}
printList(pHead);
}
void printList(Student *pHead)
{
int count = 0;
pHead = pHead->next;
system("CLS");
printf("\t\t\t\t计科6班成绩!");
printf("\n\n ┏━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┓");
printf("\n ┃ 学号 ┃ 姓 名 ┃性别┃语 文┃数 学┃英 语┃化 学┃物 理┃平均分┃总 分┃名次┃\n");
while (pHead)
{
printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");
printf(" ┃ %-5d┃ %-6s ┃ %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", pHead->one.num,
pHead->name, pHead->one.sex, pHead->one.chin_score, pHead->one.math_score,
pHead->one.engl_score, pHead->one.chem_score
, pHead->one.phy_score, pHead->one.aver_score, pHead->one.sum_score, pHead->rank);
pHead = pHead->next;
count++;
}
printf(" ┗━━━┻━━━━┻━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━┛\n");
printf("\t\t\t该班一共%d个人!", count);
getch();
}
int userChioce(Student *pHead)
{
int bum;
system("title 学生成绩统计系统-主菜单");//将标题栏命名为“学生成绩统计系统”
menu();
printf("请按键选择: ");
bum = (int)(getch() - '0');
switch (bum)
{
case 1:
addStudentInfo(pHead);
break;
case 2:
delStudentInfo(pHead);
break;
case 3:
alterStudentInfo(pHead);
break;
case 4:
findStudentInfo(pHead);
break;
case 5:
statisStudentInfo(pHead);
break;
case 9:
break;
case 6:
sortList(pHead);
break;
case 7:
correctWord();
break;
case 8:
MessageBox(NULL, TEXT("特性:进入系统需输入密码,可以修改密码;展示学生信息时,以表格的方式呈现;输入学生信息时,不能输入已存在的学号;以链表、文件为基础;作者:HappyBeers"), TEXT("关于"), MB_OK);
break;
default:
break;
}
return bum;
}
int sortMenu(void)
{
int bum;
system("CLS");
printf("\n\n\n");
printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t┃ 以什么方式查询 ? ┃\n");
printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("\t\t┃ 1 按成绩的高低 ┃\n");
printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("\t\t┃ 2 按学号的升次 ┃\n");
printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("\t\t┃ 3 返回主菜单 ┃\n");
printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("请按键选择:");
bum = (int)(getch() - '0');
system("CLS");
return bum;
}
void passwordCheck(void)
{
char password[20], inputword[20];
int i = 0, j = 0;
char c = 0;
FILE *fp = fopen("password.dat", "rb");
system("title 学生成绩统计系统-密码输入");//将标题栏命名为“学生成绩统计系统”
fread(password, 20, 1, fp);
for (i = 0; i < 5; i++)
{
j = 0;
printf("\n\n\n\t\t你还有%d次机会输入正确密码: ", 3-i);
printf("\n\n\n\n\t\t\t┏━━━━━━━━┓\n");
printf("\t\t\t┃ ┃\n");
printf("\t\t\t┗━━━━━━━━┛\n");
gotoxy(26, 8);
while ((c = getch()) != 13 && j < 20)
{
if (c == '\b' && j >0)
{
putchar('\b');
putchar(' ');
putchar('\b');
j--;
}
else
{
if (isprint(c))//isprint为检测C是否为可打印的函数
{
putchar('*');
inputword[j] = c;
j++;
}
}
}
inputword[j] = '\0';
if (strcmp(inputword, password) == 0)
{
return;
}
else
{
system("CLS");
printf("\t\t\t密码输入错误");
}
}
if (5 == i)
{
system("CLS");
printf("\n\n\n\t\t你已浪费所有机会!程序即将退出!");
Sleep(2000);
exit(0);
}
fclose(fp);
system("CLS");
return;
}
void correctWord(void)
{
char password[20];
FILE *fp;
int i = 0;
char c;
system("title 学生成绩统计系统-修改密码");//将标题栏命名为“学生成绩统计系统”
system("CLS");
printf("\n\n\n\n\t\t\t请输入新的密码:");
while ((c = getch()) != 13 && i < 20)
{
if (c == '\b'&&i > 0)
{
putchar('\b');
putchar(' ');
putchar('\b');
i--;
}
else
{
if (isprint(c))//isprint为检测C是否为可打印的函数
{
putchar('*');
password[i] = c;
i++;
}
}
}
password[i] = '\0';
printf("\n\t\t\t是否将密码修改为<%s>? Y or N:", password);
c = getch();
if (c == 'Y' || c == 'y')
{
fp = fopen("password.dat", "wb");
fwrite(password, 20, 1, fp);
fclose(fp);
printf("\n\t\t\t修改成功!\n");
}
else
{
return;
}
getch();
}
void addStudentInfo(Student *pHead)
{
FILE *fp;
Student *p1, *p2, *p3 = pHead;
StudentDate dat;
int judge = YES, rank = 0;
char bum, stu_name[20];
system("title 学生成绩统计系统-添加");//将标题栏命名为“学生成绩统计系统”
fp = fopen("stud.dat", "a");
while (pHead->next)
{
pHead = pHead->next;
}
while (judge)
{
p1 = (List)malloc(sizeof(Student));
inputData(p3, p1);
p1->next = NULL;
pHead->next = p1;
pHead = p1;
fprintf(fp, "%d %s %c %.1f %.1f %.1f %.1f %.1f\n", p1->one.num, p1->name, p1->one.sex, p1->one.chin_score,
p1->one.math_score, p1->one.engl_score, p1->one.chem_score, p1->one.phy_score);
printf("是否继续添加?(Y/N)");
bum = getch();
if (bum == 'n' || bum == 'N')
{
break;
}
}
//并交换排名
for (p1 = p3->next; p1 != NULL; p1 = p1->next)
{
for (p2 = p1->next; p2 != NULL; p2 = p2->next)
{
if (p2->one.aver_score > p1->one.aver_score)
{
dat = p2->one;
strcpy(stu_name, p2->name);
p2->one = p1->one;
strcpy(p2->name, p1->name);
p1->one = dat;
strcpy(p1->name, stu_name);
}
}
p1->rank = ++rank;
}
fclose(fp);
}
int scanMenu(void)
{
int bum;
system("CLS");
printf("\n\n\n");
printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t┃ 以什么方式查询 ? ┃\n");
printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("\t\t┃ 1 按学生的学号 ┃\n");
printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("\t\t┃ 2 按学生的姓名 ┃\n");
printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("\t\t┃ 3 返回主菜单 ┃\n");
printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("请按键选择:");
bum = (int)(getch() - '0');
system("CLS");
return bum;
}
void findStudentInfo(Student *pHead)
{
int bum, count = 0;
int num;
char student_name[20];
pHead = pHead->next;
system("title 学生成绩统计系统-查找");//将标题栏命名为“学生成绩统计系统”
bum = scanMenu();
if (bum == 1)
{
printf("请输入学生的学号:");
scanf("%d", &num);
while (pHead)
{
if (pHead->one.num == num)
{
if (count == 0)
{
printf("\n\t\t\t已经查到!\n");
printf("\n\n\n\n ┏━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┓");
printf("\n ┃ 学号 ┃ 姓 名 ┃性别┃语 文┃数 学┃英 语┃化 学┃物 理┃平均分┃总 分┃名次┃\n");
count = 1;
}
printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");
printf(" ┃ %-5d┃ %-6s ┃ %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", pHead->one.num,
pHead->name, pHead->one.sex, pHead->one.chin_score, pHead->one.math_score,
pHead->one.engl_score, pHead->one.chem_score
, pHead->one.phy_score, pHead->one.aver_score, pHead->one.sum_score, pHead->rank);
break;
}
pHead = pHead->next;
}
if (pHead == NULL)
{
printf("\n\t\t\t没有该学生记录!\n");
}
else
{
printf(" ┗━━━┻━━━━┻━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━┛\n");
}
}
else
{
if (bum == 2)
{
printf("请输入学生姓名:");
scanf("%s", student_name);
while (pHead)
{
if (strcmp(student_name, pHead->name) == 0)
{
if (count == 0)
{
printf("\n\t\t\t已经查到!\n");
printf("\n\n\n\n ┏━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┓");
printf("\n ┃ 学号 ┃ 姓 名 ┃性别┃语 文┃数 学┃英 语┃化 学┃物 理┃平均
展开阅读全文