1、个人收集整理 勿做商业用途 巢湖学院计算机与信息工程学院 课程名称 C++课程设计 课题名称 学生信息管理系统 专 业 计算机科学与技术 班 级 11级计本3班 学 号 11011169 姓 名 程张磊 联系方式 18226926353 指导教师 许荣泉 目录 一、 系统的设计需求—-—--———--—-—
2、————-———---2 二、 系统的功能模块划分—--————-——------——---—2 三、 系统的整体设计—--——---———-—----—---—--——2 四、 调试分析-——----—---—-—-—-—-—————--—--—-—6 五、 总结-———----—-—--—-—-—--————-—---—-—————7 六、 附件:代码——-——-——-—----——-—-—-—-—----—-7 一、系统的设计需求 1、整个系统均用C语言实现; 2、利用指针、链表来实现学生成绩的数据结构设计; 3、系统具有输入、显示、删除、排序、退出
3、基本功能; 4、系统的各个功能模块都用函数的形式来实现; 5、可以将学生信息全部显示出来出来。 二、系统的功能模块划分 每一条记录包括一个学生的姓名、成绩。同时 1、输入功能:一次可以完成一个学生成绩记录的输入。 2、显示功能:完成全部学生记录的显示。 3、删除功能:对指定学生的成绩进行删除。 4、排序功能:按学生从大到小进行排序。 5、修改功能:对学生的成绩进行修改。 三、系统的整体设计 1).数据结构设计: A、输入功能的设计: void insert_func(void) {char s_temp[4]; ptr=(struct
4、student *) malloc(sizeof(struct student)); printf(” Student name : "); gets(ptr—〉name);// gets从标准输入设备读取字符串// printf(" Student score: ”); gets(s_temp); ptr-〉score = atoi(s_temp);//把字符串转化为 整数// B、删除功能的设计: void delete_func(void)//现在进入删除操作// {char del_name[20]; printf(” Delete student name: ");
5、 gets(del_name); prev = head; current = head—>next; while ((current != NULL) && (strcmp(current—〉name , del_name)!=0))//用到了strcmp 比较字符串 {prev = current; current = current-〉next; }if (current != NULL) {prev->next = current—>next; free(current);//释放当前位置// printf(” %s student record deleted\n
6、del_name);//输出被删除的姓名// }else printf(” Student %s not found\n",del_name);//否则此学生不存在// C、排序功能的设计: void sort_func(void) //插入数据// {prev = head;//把头指针所指的值付给prev// current = head—>next;//把头指针的下一个指针值付给当前指针所指的位置// while ((current != NULL) && (current—>score 〉 ptr->score)) {prev = current; curren
7、t = current->next; }ptr—>next = current; prev—>next = ptr; D、修改功能的设计: void modify_func(void) {char n_temp[20],s_temp[4];//定义字符类型// printf(” Modify student name: "); gets(n_temp);//这样输入姓名 current=head—>next; while ((current != NULL) && (strcmp(current->name , n_temp)!=0)) {prev = current;
8、current = current-〉next; }if (current != NULL) {printf(" **************************\n”); printf(" Student name : %s\n”,current->name); printf(” Student score: %d\n”,current—〉score); printf(" **************************\n"); printf(" Please enter new score: ”); gets(s_temp); current-〉score =
9、 atoi(s_temp); printf(" %s student record modified\n”,n_temp); }//输出被修改的成绩// else printf(" Student %s not found\n”,n_temp);//否则此学生不存在// anykey_func(); E、显示功能的设计: void display_func(void)//定义显示// {int count=0; system(”cls"); if(head—〉next == NULL)//如果头指针所指数为空// {printf(” No student record\n
10、//则输出学生记录为空// }else//否则输出学生姓名和成绩// {printf(” NAME SCORE\n"); printf(” ——---——-———-——————--—--——--\n"); current=head-〉next; while(current != NULL) {printf(" %—20s %3d\n", current—〉name, current—〉score); count++; current=current->next; if(count % 20 == 0) getch(); }printf
11、 --—-—---———————----———————-\n"); printf(" Total %d record(s) found\n", count); 2)。功能模块的具体设计 整个系统除了主函数外,另外还有8个函数,实现5大功能:输入功能、显示功能、排序功能、删除功能、修改功能。各个函数的详细设计说明分别如下: 1、 主函数 main() 利用while()循环和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。 2、 输入记录函数getch(); insert_func(); 这是一个无参函数,用来执行第学生成绩记录的输入,当当没有
12、学生纪录时就开始进行输入操作。 算法:先声明一个首节点head,并将head—〉next设为NULL.然后用 if((fptr=fopen(“slist。dat",”r”))==NULL)对程序进行判断如果成立则进行输入,输入时运用getch()函数和insert_func()主导来完成。 最终效果图: 3、 显示记录函数 void display_func(void) 这是一个不返回值的有参函数,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。 算法: 先用if语句对头指针的下一给位置进行判断看是否为空如果为空则不显示如果不为空则输出学生姓名及成绩。算法:现将
13、head->next赋值给当前位置current然后再用while对current进行定义最后输出。 最终效果: 4、 删除记录函数void delete_func(void)这是一个有参函数,先输入要删除的学生记录的 姓名,找到后显示该学生信息,等确认后便可进行删除。 算法:从p指向的第一个结点开始,检查该结点中的num值是否等于输入的要求删除的那个姓名。如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此进行下去,直到遇到表尾为止.最终效果: 5、排序函数void sort_func(void) 这是一个有参函数,按学生成绩的大小进行排 6、修改函数 void
14、modify_func(void)这是一个有参函数,先输入要修改的学生姓名找到后对其成绩进行修改. 算法:先将head—〉next赋值给当前位置current然后用while函数对其进行定义然后检查该节点中的姓名是不是p要找的如果相等就修改,如不相等,就将current –>next赋值给current在于p节点比较直到遇到表尾为止。 四、调试分析 (1)刚开始没有那个初始化函数,程序运行后,没有输入任何数据就试得去执行显示功能,结果显示的是一些乱码!加入初始化函数后,这种现象也随之消失。 (2)刚开始执行输入函数,输入十个学生的成绩,输完后执行显示功能,学生成绩记录是
15、按输入时的顺序显示的,试着在其中增加一些语句,希望能把学号按从大到小的顺序显示,但暂时没有成功,但最后还是按从大到小的顺序输出了。 (3)在输入函数中设了一个无限循环,可以输入无数个学生的成绩信息,但最后失败了只能一个一个输入。 (4)输入太多个学生的成绩时,屏幕显示不能控制为一页一页显示,所以为了方便起见,不要输入太多记录,十七左右为最佳。 五、 总结 经过C语言课程设计,感觉自己收获不少!这次课程设计虽然花了我不少时间,但正是这些时间,让我见识到了C语言的重要性。这个学生成绩管理系统都是在自己知识范围内完成的,所以界面清晰简单,可能不是很好看,但绝对实用! 从这里
16、我也得到一个体会,做一个程序,或者开发一个软件,应该着重从它的后台制作入手,不能做出一个中看不中用的程序或者软件。
相信这次的课程设计为我以后继续从事计算机工作打了一个小小的开头。
六、附件:代码
/* file name: slist.c */
/* 单向键结链表,插入、删除使用排序 */
//学会对文件操作文件操作和单链表一起使用
#include 17、 write_func(void);
void insert_func(void);
void sort_func(void);// sort意思为类型//
void delete_func(void);
void display_func(void); /*DSFGAFSHDGSJHDF*/
void modify_func(void); /*DSFGAFSHDGSJHDF*/
void anykey_func(void); /*DSFGAFSHDGSJHDF*/
struct student
{
char name[20]; /*DSFGAFSHDGSJHDF*/ 18、
int score;
struct student *next;
};
struct student *ptr, *head, *current, *prev;//全部声明为全局变量
int main(void)
{
char option1;
system(”cls");//清屏
read_func();//func意思为目前使用者定义函式的参数列的数目//
while(1)
{
printf("****************************************\n”);
printf(" 1。插入\n"); 19、
printf(" 2。删除\n");
printf(” 3。显示\n”);
printf(" 4.修改\n");
printf(" 5。退出\n”);
printf("****************************************\n");
printf(" Please enter your choice (1-5)...”);
option1=getche();
printf(”\n");/*DSFGAFSHDGSJHDF*/
switch(op 20、tion1)
{
case '1’:
insert_func();
break;
case '2’:
delete_func();
break;
case ’3':
display_func();
break;
case ’4':
modify_func();
break;
case '5':
// write_func();//写入参数数目//
exit(0);//这里也处理的比较好
}
}
}
void read_func(void)
{
FILE *fptr;// FILE意思为归档//
head=(struct student *) m 21、alloc(sizeof(struct student));
head—>next = NULL;
/* 开始时,若表中不存在数据,则要求输入第一笔数据 */
if((fptr=fopen(”slist.dat”,”r")) == NULL)
{printf(" Data file not exist\n”);//数据文件不存在//
printf(" Press any key to edit first record。.。\n");
getch();//字符插入函数//
insert_func();//不存在就实行插入操作
}else
{ptr=(struct studen 22、t *) malloc(sizeof(struct student));
while(fscanf(fptr, "%s %d", ptr->name, &ptr-〉score) != EOF)
{sort_func();
ptr=(struct student *) malloc(sizeof(struct student));
}fclose(fptr);//关闭fptr所指的文件释放缓冲区//
}}
void write_func(void)
{FILE *fptr;
fptr=fopen(”slist。dat”,"w");
current=head->next;// c 23、urrent意思为当前的//
while(current != NULL)
{fprintf(fptr, ”%s %d\n”, current—>name, current-〉score);
current = current—>next;
}fclose(fptr);
}void insert_func(void) //一插入就比较字符串(想比较很简单) 不是等到全部插完了才比较
{char s_temp[4];
ptr=(struct student *) malloc(sizeof(struct student));
printf(" Student name : ”); 24、
gets(ptr—〉name);// gets从标准输入设备读取字符串//
printf(” Student score: ”);
gets(s_temp);
ptr—〉score = atoi(s_temp);//把字符串转化为 整数//
sort_func();
}/*以分数高低由大到小排列*/
void sort_func(void) //插入数据//
{prev = head;//把头指针所指的值付给prev//
current = head-〉next;//把头指针的下一个指针值付给当前指针所指的位置//
while ((current != NULL) && 25、 (current—〉score > ptr—>score))
{prev = current;
current = current->next;
}ptr—〉next = current;
prev-〉next = ptr;
}//前面是进行成绩排序操作//
void delete_func(void)//现在进入删除操作//
{char del_name[20];
printf(” Delete student name: ”);
gets(del_name);
prev = head;
current = head—〉next;
while ((current ! 26、 NULL) && (strcmp(current—〉name , del_name)!=0))//用到了strcmp 比较字符串
{prev = current;
current = current—〉next;
}if (current != NULL)
{prev—〉next = current->next;
free(current);//释放当前位置//
printf(" %s student record deleted\n",del_name);//输出被删除的姓名//
}else
printf(" Student %s not found\n",del_nam 27、e);//否则此学生不存在//
//以上为删除操作//
anykey_func();
}//进入修改操作//
void modify_func(void)
{char n_temp[20],s_temp[4];//定义字符类型//
printf(” Modify student name: ”);
gets(n_temp);//这样输入姓名
current=head-〉next;
while ((current != NULL) && (strcmp(current->name , n_temp)!=0))
{prev = current;
current = curre 28、nt—>next;
}if (current != NULL)
{printf(” **************************\n”);
printf(” Student name : %s\n",current—〉name);
printf(" Student score: %d\n”,current—〉score);
printf(" **************************\n");
printf(" Please enter new score: ");
gets(s_temp);
current—〉score = atoi(s_temp);
29、
printf(” %s student record modified\n”,n_temp);
}//输出被修改的成绩//
else
printf(" Student %s not found\n”,n_temp);//否则此学生不存在//
anykey_func();
}//进入显示操作//
void display_func(void)//定义显示//
{int count=0;
system(”cls”);
if(head—>next == NULL)//如果头指针所指数为空//
{printf(” No student record\n");//则输出学生记录为空 30、//
}else//否则输出学生姓名和成绩//
{printf(” NAME SCORE\n”);
printf(" ——--—-—-———---—---—---—-—-—\n");
current=head-〉next;
while(current != NULL)
{printf(” %—20s %3d\n", current—〉name, current-〉score);
count++;
current=current-〉next;
if(count % 20 == 0) getch();
}printf(” ——-—--—-—----————————-———-—\n");
printf(” Total %d record(s) found\n”, count);
}anykey_func();
}void anykey_func(void)//任何键继续
{printf(" Press any key to continue。..”);
getch();
printf(”\n”);
}
- 11 -






