c语言工程实践—— 学生选修课管理系统

​​​​

1、题目描述

(1)使用链表、文件(合理使用链表,如在插入、删除时使用合理,其它场合未必合理)。

(2)假定有n门课程,每门课程有课程编号、课程名称、课程性质、总学时、授课学时、实验或上机学时、学分、开课学期等信息,学生可按要求(总学分不得少于60)自由选课。试设计一个选修课程管理系统,使之能提供以下功能:①系统以菜单方式工作。②课程信息录入功能(课程信息用文件保存)——增加、修改、删除。③课程信息浏览功能——输出。④查询功能(至少一种查询方式)——算法:按学分查询;按课程性质查询。

(3)学生选修课程(要求:每学期选修课程不能超过80学分,只能选择在本学期开始的课程和时间不冲突的课程),给出学生的选修课表,并统计出所选总学分。

 2、方案选择

录入课程或学生信息,可以使用链表也可以使用一个结构体从键盘输入到文件,但使用结构体直接到文件一个简单的输入-输出操作,不涉及复杂的数据结构或算法,且课程信息数量可能不多,需要直接从用户处获取,因此使用结构体是最直接且高效的方法。链表适合动态地添加和删除元素,这对于管理课程和学生选课信息特别有用。课程信息链表方便我们随时添加新课程或删除旧课程;学生选课链表方便我们追踪每个学生的选课情况以便排除重复选课或者课程时间冲突的情况。当需要按照某种顺序(如学分)对课程信息进行排序时,结构体数组是一个好的选择。它允许我们直接操作数组中的元素,并且可以通过数组索引快速访问元素,虽然链表也可以用于排序,但链表排序比较麻烦,使用结构体数组可能更方便。修改课程信息时,直接修改文件中的数据可能会很复杂且容易出错。通过使用临时文件,我们可以确保在修改过程中数据的完整性和一致性。我们从原文件中读取数据到结构体中,对结构体进行修改,然后将修改后的数据写入临时文件。最后,我们删除原文件并将临时文件重命名为原文件名。也可以使用链表从文件中读到链表中再进行修改,但使用链表当课程数据量很大时要分配很多内存,修改完后又要释放内存,因此使用一个结构体与临时文件可能更好。

3、项目功能分析
功能表  

序号

功能描述

备注

1

创建课程信息(使用一个结构体直接从键盘到文件录入课程信息)

2

插入课程信息(从文件中将课程信息读到链表中,再插入新的课程信息,最后再写入文件)

3

修改课程信息(使用一个结构体,再新建一个文件,从原文件里读出课程信息到结构体,不需要修改的话直接写入新文件,需要修改的修改后再写入新文件,最后删除原文件再重新命名新文件)

4

删除课程信息(将课程信息从文件中读到链表中,然后删除)

5

查看课程信息(使用一个结构体,用fscanf从文件里读出数据到结构体再输出)

6

查询课程信息(使用一个结构体,按学分或课程性质查询并输出)

7

课程信息按学分排序(使用结构体数组,先从文件里读出数据到结构体数组中,使用选择排序法按学分从小到大排序)

8

创建学生信息(与创建课程信息一样)

9

查看学生信息及其课表(未选课之前仅输出学生信息,选课后输出其信息及其所选课程的信息,并统计其所选的总学分,使用一个结构体输出显示)

10

学生选课(课程结构体链表与学生结构体链表按要求选课)

11

追加课程信息(与创建课程信息类似,使用结构体在文件最后添加课程信息)

 4、源代码

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define MAX 30
#define N 80
#define sizelb sizeof(struct lb)
#define sizelb1 sizeof(struct lb1)
#define sizecs sizeof(struct course)
struct course
{
	char num[MAX];
	char name[MAX];
	char nature[MAX];
	float time_all;
	float time_teach;
	float time_test;
	float score;
	char term[MAX];
};
struct student
{	
	char name[MAX];
	char gender[MAX];
	char num[MAX];
	float score_all;
	char term[MAX];
	struct course ke[MAX];
	int course_amount;
};
struct lb
{
	struct course course;
	struct lb *next;
};
struct lb1
{
	struct student stu;
	struct lb1 *next;
};
void destroy_link(struct lb*head)
{
	struct lb *p;
	while(head!=NULL)
	{
		p=head;
		head=head->next;
		free(p);
	}
	head=NULL;
}
void destroy_link1(struct lb1*head1)
{
	struct lb1 *p;
	while(head1!=NULL)
	{
		p=head1;
		head1=head1->next;
		free(p);
	}
	head1=NULL;
}
struct lb* createchain()
 {  
    FILE *fp;  
    struct course cse;  
    struct lb *p, *tail = NULL,*head=NULL;  
    fp = fopen("course.txt", "r");  
    if (fp == NULL)
	 {  
        printf("File cannot be opened\n");  
        exit(0);  
    }  
    while(fscanf(fp, "%s %s %s %f %f %f %f %s",  
                   cse.num, cse.name, cse.nature, &cse.time_all, &cse.time_teach,  
                   &cse.time_test, &cse.score, cse.term)==8)
		 {  
        	p = (struct lb*)malloc(sizelb); 
        	p->course=cse;
        	p->next=NULL;
        	if(head)
        	tail->next=p;
        	else
        	head=p;
        	tail = p; 
    	}  
    fclose(fp);  
    return head;
}
struct lb1* createchain1() 
{  
    FILE *fp;  
    struct lb1 *p, *tail = NULL,*head=NULL;  
    struct student stu;  
    fp = fopen("student.txt", "r");  
    if (fp == NULL) {  
        printf("File 'student.txt' cannot be opened\n");  
        exit(0);  
    }  
     while (fscanf(fp, "%s %s %s %f %s %d", stu.name, stu.gender, stu.num, &stu.score_all, stu.term, &stu.course_amount) == 6)
	 {  
        p = (struct lb1*)malloc(sizelb1);  
        if (p == NULL) {  
            printf("Memory allocation failed\n");  
            fclose(fp);  
            exit(1);  
        }  
        p->stu = stu;  
        p->next = NULL;  
        if (head == NULL)
		 {  
            head = p;  
        } 
		else 
		{  
            tail->next = p;  
        }  
        tail = p; 
        int count = 0;  
        while (count < stu.course_amount && fscanf(fp, "%s %s %s %f %f %f %f %s", 
													   p->stu.ke[count].num,  
                                                       p->stu.ke[count].name,  
                                                       p->stu.ke[count].nature,  
                                                       &p->stu.ke[count].time_all,  
                                                       &p->stu.ke[count].time_teach,  
                                                       &p->stu.ke[count].time_test,  
                                                       &p->stu.ke[count].score,  
                                                       p->stu.ke[count].term) == 8)
                count++; 
    }  
    fclose(fp);  
    return head;  
}  
void course_file(struct lb *head)
{
	struct lb *p=head;
	FILE *fp;
	fp=fopen("course.txt","w");
	if(fp==NULL)
	{
		printf("File can not be opened\n");
		exit(0);
	}
	while(p)
	{
		fprintf(fp,"%s %s %s %.2f %.2f %.2f %.2f %s\n" , p->course.num,p->course.name,p->course.nature,p->course.time_all,
		p->course.time_teach,p->course.time_test,p->course.score,p->course.term);
	p=p->next;
	}
	fclose(fp);
	system("cls");
}
void student_file(struct lb1*head1)
{
	int i,k=0;
	struct lb1 *p=head1;
	FILE *fp;
	fp=fopen("student.txt","w");
	if(fp==NULL)
	{
		printf("File can not be opened\n");
		exit(0);
	}
	while(p)
	{
		fprintf(fp,"%s %s %s %.2f %s %d\n" , p->stu.name,p->stu.gender,p->stu.num,p->stu.score_all,
		p->stu.term,p->stu.course_amount);
		for(i=0;i<p->stu.course_amount;i++)
		{
			fprintf(fp,"%s ",p->stu.ke[i].num);
			fprintf(fp,"%s ",p->stu.ke[i].name);
			fprintf(fp,"%s ",p->stu.ke[i].nature);
			fprintf(fp,"%.2f ",p->stu.ke[i].time_all);
			fprintf(fp,"%.2f ",p->stu.ke[i].time_teach);
			fprintf(fp,"%.2f ",p->stu.ke[i].time_test);
			fprintf(fp,"%.2f ",p->stu.ke[i].score);
			fprintf(fp,"%s ",p->stu.ke[i].term);
		}
		p=p->next;
	}
	fclose(fp);
}

void out_course() {  
    struct course cse;  
    FILE *fp;  
    int items_read;  
    fp = fopen("course.txt", "r");  
    if (fp == NULL) 
	{  
        printf("File can not be opened\n");  
        exit(0);
    }  
    printf("课程编号\t课程名称\t课程性质\t 课程总学时\t 授课学时\t实验或上机学时\t  学分\t开课学期\t\n");
    while (1) {  
        items_read = fscanf(fp, "%s %s %s %f %f %f %f %s",  
                            cse.num, cse.name, cse.nature, &cse.time_all, &cse.time_teach,  
                            &cse.time_test, &cse.score, cse.term);  
        if (items_read != 8)
		 {  
            if (feof(fp))//文件中的数据已读完 
			 {  
                break;  
            }
		    else//文件读取错误非0退出 
		    {  
                printf("Error reading course information\n");  
                fclose(fp);  
                exit(1);  
            }  
        }  
  
        printf("  %-10s\t%-10s\t%-10s\t%8.2f\t%8.2f\t%8.2f\t%7.2f\t  %-10s\t\n",  
               cse.num, cse.name, cse.nature, cse.time_all, cse.time_teach,  
               cse.time_test, cse.score, cse.term);  
    }  
  
    fclose(fp);  
    getch();
    system("cls");
}
void out_student() 
{  
    struct student stu;  
    FILE *fp;  
    int items_read;  
    fp = fopen("student.txt", "r");  
    if (fp == NULL) {  
        printf("File can not be opened\n");  
        exit(0); 
    }  
    printf("学生姓名\t学生性别\t学生学号\t学生总学分\t学生学业阶段\t\n");
    while(fscanf(fp, "%s %s %s %f %s %d", stu.name, stu.gender,stu.num, &stu.score_all, stu.term,&stu.course_amount)==6)
    {
    	printf("%-10s\t  %-10s\t   %-10s\t%8.2f\t    %-10s\t\n",stu.name,stu.gender,stu.num,stu.score_all,stu.term); 
    	if(stu.course_amount>0)
    	{
    		printf("%s所选课程信息如下:\n",stu.name);
    		printf("课程编号\t课程名称\t课程性质\t 课程总学时\t 授课学时\t实验或上机学时\t  学分\t开课学期\t\n");
		}
		else
			printf("%s还未选任何课程!\n",stu.name);
    	int count=0;
    	while(count<stu.course_amount&&fscanf(fp,"%s %s %s %f %f %f %f %s",stu.ke[count].num,
		stu.ke[count].name,stu.ke[count].nature,&stu.ke[count].time_all,&stu.ke[count].time_teach,
		&stu.ke[count].time_test,&stu.ke[count].score,stu.ke[count].term)==8)
		{
			printf("  %-10s\t%-10s\t%-10s\t%8.2f\t%8.2f\t%8.2f\t%7.2f\t  %-10s\t\n",  
         	stu.ke[count].num,stu.ke[count].name,stu.ke[count].nature,stu.ke[count].time_all,
			stu.ke[count].time_teach,stu.ke[count].time_test,stu.ke[count].score,stu.ke[count].term);
			count++;
		}
		printf("\n");
	}
    fclose(fp);  
    getch();
    system("cls");
}
void insert_course()//插入课程信息 
{
	int flag=1,n;
	struct lb *p,*head=NULL,*add;
	head=createchain();
	add=(struct lb*)malloc(sizelb);
	add->next=NULL;
	printf("请输入课程编号:\n");
	scanf("%s",add->course.num);
	p=head;
	while(p)
	{
		if(strcmp(p->course.num,add->course.num))
		p=p->next;
		else
		{
			flag=0;
			printf("添加课程已经存在!\n");
			break;
		}
	}
	if(flag==0)
	return;
	else
	{
	printf("请输入课程名称:\n");
	scanf("%s",add->course.name);
	printf("请输入课程性质:\n");
	scanf("%s",add->course.nature);
	printf("请输入课程总学时:\n");
	scanf("%f",&add->course.time_all);
	printf("请输入课程上课学时:\n");
	scanf("%f",&add->course.time_teach);
	printf("请输入课程实验或上机学时:\n");
	scanf("%f",&add->course.time_test);
	printf("请输入学分:\n");
	scanf("%f",&add->course.score);
	printf("请输入开课学期:\n");
	scanf("%s",add->course.term);
	printf("在第几门课程前插入该课程?\n"); 
	scanf("%d",&n);
	if(head)
	{
		p=head;
		int i=1;
		if(n==1)
		{
			add->next=p;
			head=add;
		} 
		else
		{
			while(i<n-1)
			{	
				p=p->next;
				i++;
				if(p->next==NULL)
				break;
			}
			add->next=p->next;
			p->next=add; 
		}
	}
	else
	head=add;
	course_file(head); //将课程信息写入文件 
	destroy_link(head);
	}
}
void del_course() //删除课程信息 
{
	char number[MAX];
	printf("请输入要删除课程的编号:\n");
	scanf("%s",number);
	struct lb*p,*head=NULL;
	head=createchain();
	p=head;
	if(strcmp(number,p->course.num)==0)
	head=p->next;
	else
	{
		while(p)
		{
			if(p->next&&strcmp(number,p->next->course.num)==0)
			{
				p->next=p->next->next;
			}
			p=p->next;
		}
	}
	course_file(head);
	destroy_link(head);
}
void modify_course() //修改课程信息 
{
	struct course cse;
	int flag=1,i,xg;
	char number[MAX];
	FILE *fp;
	FILE *fp1;
	fp1=fopen("course1.txt","w+");//创建并打开新文件 
	if((fp=fopen("course.txt","r+"))==NULL) //打开原文件 
	{
		printf("File cannot be opened\n");
		exit(0);
	}
	printf("请输入要修改的课程编号:\n");
	scanf("%s",number);
	while(1)
	{
		i=fscanf(fp, "%s %s %s %f %f  %f  %f  %s",cse.num, cse.name, cse.nature, &cse.time_all, 
		&cse.time_teach,&cse.time_test, &cse.score, cse.term); 
		if(i!=8)
		{
			if (feof(fp))
			 {  
                break;  
            } 
			else 
			{  
                printf("Error reading course information\n");  
                fclose(fp);  
                exit(1);  
            }  
		}
		if(strcmp(number,cse.num)==0) //若是需要修改的文件 
		{
			fprintf(fp1,"%s ",number);
			while(flag)
			{
				printf("您将修改(从1—7中选择输入):\n");
				printf("-----1.课程名称-----\n"); 
				printf("-----2.课程性质-----\n"); 
				printf("-----3.课程总学时-----\n");
				printf("-----4.课程的授课学时-----\n"); 
				printf("-----5.课程的实验或上机学时-----\n"); 
				printf("-----6.课程的学分-----\n"); 
				printf("-----7.课程的开课学期-----\n"); 
				scanf("%d",&xg);
				switch(xg)
				{
					case 1:
						printf("请输入要修改课程名称为:\n");
						scanf("%s",cse.name);
						break;
					case 2:
						printf("请输入要修改课程性质为:\n");
						scanf("%s",cse.nature);
						break;
					case 3:
						printf("请输入要修改课程总学时为:\n");
						scanf("%f",&cse.time_all);
						break;
					case 4:
						printf("请输入要修改课程授课学时为:\n");
						scanf("%f",&cse.time_teach);
						break;
					case 5:
						printf("请输入要修改课程的实验或上机学时为:\n");
						scanf("%f",&cse.time_test);
						break;
					case 6:
						printf("请输入要修改课程学分为:\n");
						scanf("%f",&cse.score);
						break;
					case 7:
						printf("请输入要修改课程开课信息为:\n");
						scanf("%s",cse.term);
						break;
				
				}
					printf("是否继续修改该课程的其他信息:\n");
					printf("0、否\n1、继续\n");
					scanf("%d",&flag);
			}
			fprintf(fp1, "%s %s %.2f %.2f  %.2f  %.2f  %s\n", cse.name, cse.nature, cse.time_all, 
			cse.time_teach,cse.time_test, cse.score, cse.term); 
			//修改后再写入新文件 
		}
		else //不需要修改的课程直接从结构体里写到新文件里 
		{
		 fprintf(fp1, "%s %s %s %.2f %.2f  %.2f  %.2f  %s\n",cse.num, cse.name, cse.nature, cse.time_all, 
		 cse.time_teach,cse.time_test, cse.score, cse.term); 
		}
	}
	fclose(fp);
	fclose(fp1);
	remove("course.txt"); //删除原文件 
	rename("course1.txt","course.txt"); //重新命名新文件 
}
void create_course(int n)
{
    struct course course;
	int i;
	FILE *fp;
	fp=fopen("course.txt","w");
	if(fp==NULL)
	{
		printf("File can not be opened\n");
		exit(0);
	}
	for(i=0;i<n;i++)
	{
		printf("请输入第%d门课程的相关信息:\n",i+1);
		printf("请输入课程编号:\n",i);
		scanf("%s",course.num);
		printf("请输入课程名称:\n");
		scanf("%s",course.name);
		printf("请输入课程性质:\n");
		scanf("%s",course.nature);
		printf("请输入课程总学时:\n");
		scanf("%f",&course.time_all);
		printf("请输入课程上课学时:\n");
		scanf("%f",&course.time_teach);
		printf("请输入课程实验或上机学时:\n");
		scanf("%f",&course.time_test);
		printf("请输入学分:\n");
		scanf("%f",&course.score);
		printf("请输入开课学期:\n");
		scanf("%s",course.term);
		fprintf(fp,"%s %s %s %.2f %.2f %.2f %.2f %s\n" , course.num,course.name,course.nature,course.time_all,
		course.time_teach,course.time_test,course.score,course.term); 
		system("cls");
	}
	fclose(fp);
}
void add_course(int n)
{
	struct course course;
	int i;
	FILE *fp;
	fp=fopen("course.txt","a");
	if(fp==NULL)
	{
		printf("File can not be opened\n");
		exit(0);
	}
	for(i=0;i<n;i++)
	{
		printf("请输入要追加的第%d门课程的相关信息:\n",i+1);
		printf("请输入课程编号:\n",i);
		scanf("%s",course.num);
		printf("请输入课程名称:\n");
		scanf("%s",course.name);
		printf("请输入课程性质:\n");
		scanf("%s",course.nature);
		printf("请输入课程总学时:\n");
		scanf("%f",&course.time_all);
		printf("请输入课程上课学时:\n");
		scanf("%f",&course.time_teach);
		printf("请输入课程实验或上机学时:\n");
		scanf("%f",&course.time_test);
		printf("请输入学分:\n");
		scanf("%f",&course.score);
		printf("请输入开课学期:\n");
		scanf("%s",course.term);
		fprintf(fp,"%s %s %s %.2f %.2f %.2f %.2f %s\n" , course.num,course.name,course.nature,course.time_all,
		course.time_teach,course.time_test,course.score,course.term); 
		system("cls");
	}
	fclose(fp);
}
void chaxun_course()
{
	int n,i,flag=1;
	float sc;
	char xz[MAX];
	struct course cse;
	FILE *fp;
	if((fp=fopen("course.txt","r+"))==NULL)
	{
		printf("File cannot be opened\n");
		exit(0);
	}
	printf("请输入你想查询课程信息的方式(从1-2中选择输入):\n");
	printf("1、按学分查询\n2、按课程性质查询\n");
	scanf("%d",&n);
	system("cls");
	switch(n)
	{
		case 1:
			printf("请输入该课程学分:");
			scanf("%f",&sc);
			printf("课程编号\t课程名称\t课程性质\t 课程总学时\t 授课学时\t实验或上机学时\t  学分\t开课学期\t\n");
			while(1)
			{
				i=fscanf(fp, "%s %s %s %f %f  %f  %f  %s",cse.num, cse.name, cse.nature, &cse.time_all, &cse.time_teach,&cse.time_test, &cse.score, cse.term); 
				if(i!=8)
					{
						if (feof(fp))
			 			{   
               				 break;  
            			} 
						else 
						{  
                			// 读取失败,可能是文件格式错误或其他原因  
               				printf("Error reading course information\n");  
                			fclose(fp);  
                			exit(1);  
            			}  
					}	
			
				if(sc==cse.score)
				{
					flag=0;
					printf("  %-10s\t%-10s\t%-10s\t%8.2f\t%8.2f\t%8.2f\t%7.2f\t  %-10s\t\n",  
               		cse.num, cse.name, cse.nature, cse.time_all, cse.time_teach,  
               		cse.time_test, cse.score, cse.term);  
				}
			}
			if(flag)
			printf("该课程查无信息!\n");
			break;
		case 2:
			printf("请输入该课程性质:");
			scanf("%s",xz);
			printf("课程编号\t课程名称\t课程性质\t 课程总学时\t 授课学时\t实验或上机学时\t  学分\t开课学期\t\n");
			while(1)
			{
				i=fscanf(fp, "%s %s %s %f %f  %f  %f  %s",cse.num, cse.name, cse.nature, &cse.time_all, &cse.time_teach,&cse.time_test, &cse.score, cse.term); 
				if(i!=8)
					{
						if (feof(fp))
			 			{   
               				 break;  
            			} 
						else 
						{  
                			// 读取失败,可能是文件格式错误或其他原因  
               				printf("Error reading course information\n");  
                			fclose(fp);  
                			exit(1);  
            			}  
					}	
			
				if(strcmp(xz,cse.nature)==0)
				{
					flag=0;
					printf("  %-10s\t%-10s\t%-10s\t%8.2f\t%8.2f\t%8.2f\t%7.2f\t  %-10s\t\n",  
               		cse.num, cse.name, cse.nature, cse.time_all, cse.time_teach,  
               		cse.time_test, cse.score, cse.term);  
				}
			}
			if(flag)
			printf("该课程查无信息!");
			break;
	};
	getch();
	system("cls");
}
void sort_course()
{
	FILE *fp,*fp1;
	struct course cse[N];
	struct course t;
	int i,count=0,j,min;
	if((fp=fopen("course.txt","r+"))==NULL)
	{
		printf("File cannot be opened\n");
		exit(0);
	}
	if((fp1=fopen("course_sort.txt","w+"))==NULL)
	{
		printf("File cannot be opened\n");
		exit(0);
	}
	while(count<N&&fscanf(fp,"%s %s %s %f %f  %f  %f  %s",cse[count].num, cse[count].name, 
	cse[count].nature, &cse[count].time_all, &cse[count].time_teach,&cse[count].time_test,
	 &cse[count].score, cse[count].term)==8)
	 {
	 		count++;
	 }

	for(i=0;i<count;i++)
	{
		min=i;
		for(j=i+1;j<count;j++)
		{
			if(cse[min].score>cse[j].score)
			min=j;
		}
		if(min!=i)
		{
			t=cse[i];
			cse[i]=cse[min];
			cse[min]=t; 
		}
	}
	printf("课程编号\t课程名称\t课程性质\t 课程总学时\t 授课学时\t实验或上机学时\t  学分\t开课学期\t\n");
	for(i=0;i<count;i++)
	{
		fprintf(fp1,"%s %s %s %.2f %.2f  %.2f  %.2f  %s\n",cse[i].num, cse[i].name, cse[i].nature, cse[i].time_all, cse[i].time_teach,cse[i].time_test, cse[i].score, cse[i].term);
		printf("  %-10s\t%-10s\t%-10s\t%8.2f\t%8.2f\t%8.2f\t%7.2f\t  %-10s\t\n",  
               cse[i].num, cse[i].name, cse[i].nature, cse[i].time_all, cse[i].time_teach,  
               cse[i].time_test, cse[i].score, cse[i].term);
	}
	fclose(fp);
	fclose(fp1);
	getch();
	system("cls");
}
void create_student(int n)
{
    struct student stu;
	int i;
	FILE *fp;
	fp=fopen("student.txt","w");
	if(fp==NULL)
	{
		printf("File can not be opened\n");
		exit(0);
	}
	for(i=0;i<n;i++)
	{
		printf("请输入第%d名学生的相关信息:\n",i+1);
		printf("请输入学生姓名:\n");
		scanf("%s",stu.name);
		printf("请输入学生性别:\n");
		scanf("%s",stu.gender);
		printf("请输入学生学号:\n");
		scanf("%s",stu.num);
		stu.score_all=0;
		printf("请输入学生学业阶段:\n");
		scanf("%s",stu.term);
		stu.course_amount=0;
		fprintf(fp,"%s %s %s %.2f %s %d\n",stu.name,stu.gender,stu.num,stu.score_all,stu.term,stu.course_amount); 
		system("cls");
	}
	fclose(fp);
	system("cls");
}
void choose_course(struct lb1 *head1)//学生选课 
{
	int i,k=1;
	char number[MAX],number1[MAX];
	struct lb *head=NULL,*q;
	head=createchain();
	struct lb1 *p1,*q1;
	printf("请输入选课学生的学号:\n");
	scanf("%s",number);
	while(k)
	{
		q=head,p1=q1=head1;
		int flagtime=1,flag=0,f=0;
		while(q1)
		{
			if(strcmp(q1->stu.num,number)==0)
			{
				flag=1;
				break;
			}
			q1=q1->next;
		}
		if(flag)//该学生存在 
		{
			p1=q1;
			printf("请输入课程编号:\n");
			scanf("%s",number1);
			while(q)
			{
				if(strcmp(q->course.num,number1)==0)
				{
					f=1;
					break;
				}
				q=q->next;
			}
			if(f)//该学生存在且要选的课程存在 
			{
				if((p1->stu.score_all+q->course.score)<=80)
				{
				
					for(i=0;i<p1->stu.course_amount;i++)
					{
						if(strcmp(p1->stu.ke[i].term,q->course.term)==0)
						{
							flagtime=0;
							printf("该课程与已选课程时间冲突!\n");
							break;
						}
					}
					if(flagtime)//要选课程与已选课程时间不冲突 
					{
						if(p1->stu.term[1]==q->course.term[1]&&p1->stu.term[2]==q->course.term[2])
						{
							p1->stu.ke[p1->stu.course_amount]=q->course;
							p1->stu.course_amount++;
							p1->stu.score_all+=q->course.score;
							printf("选课成功!\n");
						}
						else
						printf("该课程未在本学期开设!\n");
					}
				}
				else
				{
					printf("选课失败!目前已有学分为:%.2f,再选该课程则所修学分为:%.2f\n",p1->stu.score_all,p1->stu.score_all+q->course.score); 
					printf("每学期选修课程不能超过80学分!\n");
				}
				
			}
			else
			printf("该选修课程不存在!\n");
		}	
		else
		printf("该学生不存在!\n");
		printf("是否继续选课?\n1:继续\n0:退出\n");
		scanf("%d",&k);
		system("cls");
	}	
	student_file(head1);	
	destroy_link(head);
}
void menu()
{
	printf("-----欢迎使用学生选修课管理系统-----\n");
	printf("-----1.创建课程信息-----\n");
	printf("-----2.插入课程信息-----\n");
	printf("-----3.修改课程信息-----\n");
	printf("-----4.删除课程信息-----\n");
	printf("-----5.查看课程信息-----\n");
	printf("-----6.查询课程信息-----\n");
	printf("-----7.课程信息按学分排序-----\n");
	printf("-----8.创建学生信息-----\n");
	printf("-----9.查看学生信息及课表-----\n");
	printf("-----10.学生选课-----\n");
	printf("-----11.追加课程信息-----\n");
	printf("-----12.退出程序-----\n");
	printf("请在上述目录中选择: \n");
}
int main()
{
	int com,n;
	while(1)
	{
		menu();
		scanf("%d",&com);
		if(com==1)
		{
			system("cls");
			printf("请输入要创建课程的个数:\n");
			scanf("%d",&n);
			create_course(n);
			system("cls");
		}
		else if(com==2)
		{
			system("cls");
			insert_course();
		}
		else if(com==3)
		{
			system("cls");
			modify_course();
			system("cls");
		}
		else if(com==4)
		{
			system("cls");
			del_course();
		} 
		else if(com==5)
		{
			system("cls");
			out_course();
		}
		else if(com==6)
		{
			system("cls");
			chaxun_course();
		}
		else if(com==7)
		{
			system("cls");
			sort_course();
		}
		else if(com==8)
		{
			system("cls");
			printf("请输入要创建学生信息的个数:\n");
			scanf("%d",&n);
			create_student(n);
			system("cls");
		}
		else if(com==9)
		{
			system("cls");
			out_student();
		}
		else if(com==10)
		{
			system("cls");
			int n=1;
			struct lb1 *head1=NULL;
			head1=createchain1();	
			while(n)
			{
				choose_course(head1);
				system("cls");
				printf("是否继续选课?\n1:继续\n0:退出\n");
				scanf("%d",&n);
			}
			destroy_link1(head1);
			system("cls");
		}
		else if(com==11)
		{
			system("cls");
			printf("请输入要追加课程的个数:\n");
			scanf("%d",&n);
			add_course(n);
			system("cls");
		}
		else if(com==12)
		{
			break;
		}
		else
		{
			printf("输入不符合要求,请重新输入:\n");
		}
	}
	return 0;
}

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一份C语言学生选修课管理系统的代码,如下所示: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义结构体,存储学生信息 struct student { char id[20]; // 学号 char name[20]; // 姓名 int course_num; // 选修课程数目 char courses[10][20]; // 选修课程名称 }; // 定义全局变量,存储学生信息 struct student students[100]; int student_count = 0; // 打印菜单 void print_menu() { printf("1. 添加学生\n"); printf("2. 删除学生\n"); printf("3. 查询学生\n"); printf("4. 显示所有学生\n"); printf("5. 退出\n"); } // 添加学生 void add_student() { struct student new_student; printf("请输入学生学号:"); scanf("%s", new_student.id); printf("请输入学生姓名:"); scanf("%s", new_student.name); printf("请输入选修课程数目:"); scanf("%d", &new_student.course_num); printf("请输入选修课程名称(用空格分隔):"); for (int i = 0; i < new_student.course_num; i++) { scanf("%s", new_student.courses[i]); } students[student_count] = new_student; student_count++; printf("添加学生成功!\n"); } // 删除学生 void delete_student() { char delete_id[20]; printf("请输入要删除的学生学号:"); scanf("%s", delete_id); for (int i = 0; i < student_count; i++) { if (strcmp(students[i].id, delete_id) == 0) { // 将该学生之后的学生向前移动一个位置 for (int j = i; j < student_count - 1; j++) { students[j] = students[j + 1]; } student_count--; printf("删除学生成功!\n"); return; } } printf("未找到该学生!\n"); } // 查询学生 void query_student() { char query_id[20]; printf("请输入要查询的学生学号:"); scanf("%s", query_id); for (int i = 0; i < student_count; i++) { if (strcmp(students[i].id, query_id) == 0) { printf("学号:%s\n", students[i].id); printf("姓名:%s\n", students[i].name); printf("选修课程数目:%d\n", students[i].course_num); printf("选修课程名称:"); for (int j = 0; j < students[i].course_num; j++) { printf("%s ", students[i].courses[j]); } printf("\n"); return; } } printf("未找到该学生!\n"); } // 显示所有学生 void show_all_students() { for (int i = 0; i < student_count; i++) { printf("学号:%s\n", students[i].id); printf("姓名:%s\n", students[i].name); printf("选修课程数目:%d\n", students[i].course_num); printf("选修课程名称:"); for (int j = 0; j < students[i].course_num; j++) { printf("%s ", students[i].courses[j]); } printf("\n"); } } int main() { // 循环显示菜单 while (1) { print_menu(); int choice; printf("请选择操作:"); scanf("%d", &choice); switch (choice) { case 1: add_student(); break; case 2: delete_student(); break; case 3: query_student(); break; case 4: show_all_students(); break; case 5: exit(0); default: printf("无效操作,请重新选择!\n"); } } } ``` 这是一个简单的学生选修课管理系统,可以通过菜单实现添加学生、删除学生、查询学生、显示所有学生等功能。当然,这只是一个简单的示例,具体的实现取决于您的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值