数据结构课程设计C语言 学生成绩管理系统

#include"stdio.h"
#include"malloc.h"
#include"stdlib.h"
#include"string.h"
#include"ctype.h"
#define size sizeof(struct student)
#define ture 1
#define max 10
#define error 0
int index_counter = 0;////////执行次数
int count_student = 1;// 学生数目
typedef struct student *pointer;
///////
typedef struct student
{

int num;////学号
int n_sub;////科目的个数
char name[max];//学生姓名
char subject[max][2*max];////科目
float score[max];///科目对应的的成绩
pointer next;////下一个节点的指针
};/////节点数据类型
typedef pointer lklist;
pointer head1;///
pointer rear1 = NULL;
///////////////////函数的声明////////////////////////函数的声明////////////////////////
lklist input_one_new(lklist stud);////一个学生信息的输入
lklist show_one_stu_new(lklist y);////显示一个学生的信息
lklist creat_input_new();//创建链表,并从键盘输入
float cal_one_sum(lklist sum_one);////计算一个学生总成绩
float calcu_sum_hight(lklist sum_h);/////获取最高总成绩
int input_num();///输入要操作的学号
char inout_name();
char continue_run_order();/////操作是否继续执行的选择
void show_stu_mew(lklist stu);////显示所有学生信息
void calculate_sum(lklist p);//计算学生信息
void find_stu_new(lklist fi);////查询信息
void update_new(lklist up);/////修改信息
void save_stu_new_tofile(lklist student);/////保存信息
void creat_input_to_file_new(lklist st);//////从文件读取信息到链表
void clear_record(lklist clear);////////清除记录
void free_pointer_quit(lklist s);/////释放空间,,,退出系统
void screen_clear();////////清除 文本窗口
/////////////////主函数//////////////主函数////////////////主函数////////////主函数 ////
/////////////
void main()
{
rear1=head1= (struct student*)malloc(size);
int select = -1;
char ch2;/////是程序等待
while (ture)//打印主菜单供用户选则的内容
{
printf("\n\n\n");
printf(" /*******************学生成绩统计系统************************/\n");

printf(" 1 ****** 从键盘输入学生信息\n\n");
printf(" 2 ****** 计算学生成绩\n\n");
printf(" 3 ****** 修改学生信息\n\n");
printf(" 4 ****** 查询学生信息\n\n");
printf(" 5 ****** 显示学生信息\n\n");
printf(" 6 ****** 保存学生信息\n\n");
printf(" 7 ****** 从文件输入学生信息\n\n");
printf(" 8 ****** 清除文本窗口\n\n");
printf(" 9 ****** 释放空间和退出系统\n\n");
while (ture)
{
printf(" 输入选择 [ 1 2 3 4 5 6 7 8 9] \n 您的选择是 :");
scanf_s("%d", &select);
fflush(stdin); //清空缓冲区
if (select == 1)
{
creat_input_new();
break;
}
else if (select == 2)
{
calculate_sum(he

ad1);
ch2 = getchar();
break;
}
else if (select == 3)
{
update_new(head1);
break;
}
else if (select == 4)
{
find_stu_new(head1);
break;
}
else if (select == 5)
{
show_stu_mew(head1);
ch2 = getchar();
break;
}
else if (select == 6)
{
save_stu_new_tofile(head1);
printf("信息已经保存!\n");
break;
}
else if (select == 7)
{
creat_input_to_file_new(rear1);
break;
}
else if (select == 8){
screen_clear();
break;
}
else
if (select == 9){
free_pointer_quit(head1);
break;
}
else
{
printf(" 输入错误,,请输入【0,1,2,3,4,5,6,7】中的一个");
break;
}

}
}
}
///////////函数实现//////////////////////////////函数实现///////////////////////函数实现//////////
lklist input_one_new(lklist stud){
int sub_c = 0;////////科目的个数
int cycle_index_counter = 0;///////控制WHILE循环的执行次数
printf("第【 %d 】个学生信息\n", count_student);
printf(" 学号 "); scanf_s("%d", &(stud->num)); fflush(stdin); //清空缓冲区
printf(" 姓名 "); scanf_s("%s", stud->name, max); fflush(stdin); //清空缓冲区
sub_c = 0;
while (cycle_index_counter != 1){
printf(" 科目【%d】 ", sub_c + 1); scanf_s("%s", stud->subject[sub_c], max); fflush(stdin); //清空缓冲区
printf(" 成绩【%d】 ", sub_c + 1); scanf_s("%f", &(stud->score[sub_c])); fflush(stdin); //清空缓冲区

printf(" 科目 【%d 】成绩输入是否继续?【输入 1 结束】\n", sub_c + 2);
scanf_s("%d", &cycle_index_counter); fflush(stdin); //清空缓冲区
sub_c++;
stud->n_sub = sub_c;
}
count_student++;
return stud;
}
lklist show_one_stu_new(lklist y){
printf(" 学号 %d \n", y->num);
printf(" 姓名 %s \n", y->name);
for (int i = 0; i n_sub; i++){
printf(" 科目 %s \n", y->subject[i]);
printf(" 成绩 %6.2f \n", y->score[i]);
}
return y;
}
float cal_one_sum(lklist sum_one){
float total = 0;//一个学生的总成绩
total = 0;//////必须有, //// /// / / / / /没有 ,计算所有学生的成绩
for (int i = 0; i < sum_one->n_sub; i++){
total = total + sum_one->score[i];
}
return total;
}
float calcu_sum_hight(lklist sum_h){
sum_h = sum_h->next;//指向首节点
float sum_hight = 0;
float sum_hig = 0;//// 临时存储
sum_hight = cal_one_sum(sum_h);
sum_h = sum_h->next;//指向首节点的下一个节点
while (sum_h!=NULL){
sum_hig = cal_one_sum(sum_h);
sum_hight = (sum_hig > sum_hight) ? sum_hig : sum_hight;
sum_h = sum_h->next;//指向下一个节点
}
return sum_hight;
}
lklist creat_input_new(){
pointer head=NULL, rear=NULL,temp=NULL;
int cycle_select=0;
head = head1;
rear1=rear = head;
printf

(" 计划要输入的信息 请 一次性输入!!!!!");
while (cycle_select != 1)
{
temp = (struct student*)malloc(size);
temp=input_one_new(temp);
rear->next = temp;
rear = temp;
printf(" 学生信息输入是否继续?【输入 1 结束】\n");
scanf_s("%d", &cycle_select); fflush(stdin); //清空缓冲区
}
rear1 = rear;
rear->next = NULL;
return head1;
}
void show_stu_mew(lklist stu){
stu= head1->next;
while ( stu != NULL){
stu= show_one_stu_new(stu);
stu = stu->next;
}
}
int input_num(){
int lg = 0;////学号
printf("请输入要处理的学生的学号 ");
scanf_s("%d", &lg); fflush(stdin); //清空缓冲区
return lg;
}
char *input_name(){
char nam[max];
printf("请输入要处理的学生的行姓名! ");
scanf_s("%s", nam, max); fflush(stdin); //清空缓冲区
return nam;
}
char continue_run_order(){
char chr;//////控制变量
printf("是否继续处理信息? 是 【 Y 】 否 【 N 】\n");
chr = getchar();
return chr;
}
void calculate_sum(lklist p){
p = p->next;//指向首节点
float average = 0;//一个学生的平均成绩
while (p != NULL){
average = cal_one_sum(p) / p->n_sub;///调用求和,并计算平均分
if ((average*p->n_sub )!= calcu_sum_hight(head1))
printf(" 计算结果 学号 %d 姓名 %s 总成绩 %f 平均分 %f \n ", p->num, p->name, cal_one_sum(p), average);
else
printf(" 成绩最高者 学号 %d 姓名 %s 总成绩 %f 平均分 %f \n ",p->num, p->name, cal_one_sum(p), average);
p = p->next;
}
}
void find_stu_new(lklist fi){
int select_f = 0;
char *name1 = NULL;
fi = fi->next;//指向首节点
int h;

while (ture){
printf("输入 【 1 】 按学号查找 输入 【 2 】 按姓名查找");
scanf_s("%d", &select_f); fflush(stdin); //清空缓冲区

if (select_f==1){
h =input_num() ;///接收 学号
while (fi != NULL){
if (h== fi->num)
fi = show_one_stu_new(fi);
fi = fi->next;
}
}
else if(select_f==2){
name1 = input_name();///接收 姓名
while (fi != NULL){
if (!strcmp((name1),fi->name))
fi = show_one_stu_new(fi);
fi = fi->next;
}

}
else
printf("查询失败!");
char chy = continue_run_order();/////接收是否继续执行的条件
if (chy == 'y' || chy == 'Y'){
fi = head1;
fi = fi->next;////////指向首节点
continue;
}
else
break;
}
}
void update_new(lklist up){

up = up->next;///指向首节点
while (ture){
int nu_h = input_num();
while (up!=NULL){
if (nu_h==up->num)
input_one_new(up);
up = up->next;
}
char c= continue_run_order();
if ( c== 'y' || c == 'Y'){
up = head1;/////////指向头节点
up = up->next;////指向首节点
continue;
}
else
break;
}
}//////

/修改学生信息
////////////////////不正确////////////////////////////不正确///////////////////////
void save_stu_new_tofile(lklist student){
FILE * file_pointer;////文件指针
fpos_t *position=NULL;
student = student->next;////指向首节点
fopen_s(&file_pointer, "d:\\学生信息.txt", "w");
if (file_pointer==NULL){
printf("文件打开失败!");
}
while (student!=NULL){
//fwrite(student,size,1,file_pointer);
fprintf(file_pointer," %5d%5d%5s",student->num,student->n_sub,student->name);
for (int i=0;in_sub;i++){
fprintf(file_pointer,"%12s%10.2f\n",student->subject[i],student->score[i]);
}
student = student->next;
}
//fgetpos(file_pointer,position);
printf("文件读写出错检测! 输出 0 表示没有出错 %d ",ferror(file_pointer));
fclose(file_pointer);////////
index_counter = 1;
}////保存已经输入的学生信息
///////////////////////不正确//////////////////////不正确//////////////////
void creat_input_to_file_new(lklist st){
FILE * fp1=NULL;
pointer temp0=NULL;
pointer rear0 = NULL;
rear0 = st;
temp0 = (pointer)malloc(size);
rear0->next = temp0;
rear0= temp0;//使 st 指向空接点 即链表的最后一得节点
fopen_s(&fp1,"d:\\学生信息.txt","r");
if (fp1 == NULL){
printf("文件打开失败!\n");
}
//fsetpos(fp1,&position);
while (!feof(fp1)){

fscanf_s(fp1,"%d%d",&(temp0->num),&(temp0->n_sub));
fscanf_s(fp1,"%s",temp0->name,max);
for (int i = 0; i < temp0->n_sub; i++){
fscanf_s(fp1,"%s",temp0->subject[i],max);
fscanf_s(fp1,"%f",&(temp0->score[i]));
}
fgetc(fp1);
rear0->next = temp0;
rear0= temp0;
temp0 = (pointer)malloc(size);
}
rear1 = rear0;
rear0->next = NULL;
printf("文件读写出错检测! 输出 0 表示没有出错 %d \n",ferror(fp1));
fclose(fp1);
}/////将信息从文件中读入链表
void clear_record(lklist clear){
if (clear==NULL){
return;
}
if (clear->next==NULL){
free(clear);
}
else{
void clear_record(head1);
free(clear);
clear = NULL;
}
}
void free_pointer_quit(lklist s){
if (index_counter == 1){
clear_record(head1);
exit(0);
}
if (index_counter == 0){
char ch;
printf("是否对已经输入的信息进行保存????【是:Y ; 否 N 】 ");
scanf_s("%c", &ch, 1); fflush(stdin); //清空缓冲区
if ((ch == 'Y') || (ch - 32 == 'Y')){
save_stu_new_tofile(rear1);
clear_record(head1);
exit(0);
}
else
exit(0);
}
}
void screen_clear(){
system("CLS");
}

相关文档
最新文档