⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 是一个选课系统的主文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////////////
//头文件
#include <string.h>
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <iomanip.h>
#include <fstream.h>
#include <conio.h>

///////////////////////////////////////////////////////////////////////////
//定义课程
struct course        //某个学生所学的课程中的某一个
{
	char cname[20];  //课程名称
	float grade;    //课程成绩
	course *Next;   //指向下一个课程的指针
};
///////////////////////////////////////////////////////////////////////////
//学生类
class student
{
  public:
	    student() 
		{ 
		  root = NULL;
		  const maxcourse = 5;
		  factcourse = 0;
		}
       void readname(char N[] );			 //读入学生的姓名
	   void getname(char N[]);				 //得到学生的姓名
	   void wrecourse(char N[],float score); //要据课程名写入学生课程的成绩
	   float average();						 //学生课程的平均成绩
       void addcourse(char N[],float g);	 //给学生增加一门课
	   int findcourse(char N[]);			 //查找是否已有此课程,如果有返回1,如果没有返回0
	   int retfactcourse()
	   {
		   return factcourse;
	   }									//得到所学的课程数目
	   course *retroot()
	   {
		   return root;						//利用键表将所有的课程保存起来
	   }		
	   int retmaxcourse()
	   {
		   return 5;						//得到最多可学的课程数目
	   } 
	   void clrroot()						//清零
	   {
		   root = NULL;
		   factcourse = 0;
	   }
	   ~student()
	   {
	   
	   }

  private:
	    char sname[20];				  	 //学生的姓名
        int maxcourse;					 //学生最多可以学五门课程
        int factcourse;					 //学生实际所学的课程数目
		course *root;					 //课程的根结点指针
};

void student::readname (char N[])
{
	strcpy(sname,N);
}

void student::getname(char N[])
{
	strcpy(N,sname);
}

void student::wrecourse(char N[],float score)
{
	course *p = root;
	if(p==NULL) 
		return;
	if(p!=NULL) 
		p = p->Next;
	while(p)
	{
		if(strcmp(p->cname,N)==0)
			p->grade = score;
		
		p = p->Next;
	}
}

float student::average()
{
	float aver=0.0;
    course *p = root;

	while (p)
	{
		aver = aver+p->grade;
	}

	aver = aver/factcourse;
	return aver;
}

void student::addcourse (char N[],float g)
{
	course *s = new course;
	s->Next=NULL;
	if(root == NULL)
		root = s;
	course *p = root;
    course *newcourse = new course;
	newcourse->Next = p->Next;
	p->Next=newcourse;
	strcpy(newcourse->cname,N);
	newcourse->grade = g;
	factcourse++;

}

int student::findcourse (char N[])
{
	course *p = root;
    if(root==NULL)
		return 0;
	p = p->Next;
	while(p)
	{
		if(strcmp(p->cname,N)==0) 
			return 1;
		p = p->Next;
	}
	return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////
struct studentdb
{
	student stu;
	studentdb *Next;
};
struct studentname
{
	char tname[20];			  	 //学生的名字
	float  result;				 //学生所得的该课程分数
	studentname *Next;
};
/////////////////////////////////////////////////////////////////////////////////////////////
//课程类
class subject
{
  public:
	   subject()
	   {
		   first = NULL; 
		   maxstudent=30; 
		   activestudnet=0;
	   }
       float readcredit();				//得到课程的学分
	   void  getcredit(float a);		//设置学分
	   float getaverage();				//得到学生的平均成绩
	   float getresult(char N[]);		//查找某个学生的成绩
	   void  getkname(char N[]);		//读出课程的名称
	   void  setkname(char N[]);		//读入课程的名称
	   studentname *retfirst()
	   {
		   return first;				//返回根结点
	   }		
	   void findstudent(studentdb *P);  //根据该课程的名称,寻找选这课程的学生
	   int retactivestudent()
	   {
		   return activestudnet;		//返回实际学生数
	   } 
	   int retmaxstudent() 
	   {
		   return 30;					//返回最多学生数30
	   } 
	   void clractivestudnet()
	   {
		   activestudnet = 0;			//从文件中读出来后将实际学生数清零
	   } 

  private:
	    int maxstudent;				//最多学生数
		int activestudnet;			//实际学生数
        studentname *first;			//学生名单
		float credit;				//该课程的学分
		float averagerusult;		//该课程的平均成绩
		char kname[20];				//该课程的名称
};

float subject::readcredit ()
{
	return credit;
}

void subject::getcredit (float a)
{
	credit=a;
}

float subject::getaverage()
{
	float k = 0.0;
	studentname *p;
	p=first->Next;
	if(p==NULL) 
		return 0;
	while(p)
	{
		k = k + p->result;
		p = p->Next ;
	}
	
	return k/activestudnet;
}

float subject::getresult (char N[])
{
	studentname *p;
	p = first;
	while(p)
	{
		if(strcpy(p->tname ,N)==0) 
			return p->result;
		p = p->Next ;
	}
	return -1;
}

void subject::getkname (char N[])
{
	strcpy(N,kname);
}

void subject::setkname (char N[])
{
	strcpy(kname,N);
}

void subject::findstudent(studentdb *P)
{
	studentname *newcode = new studentname;
	newcode->Next=NULL;
	first = newcode;
	studentname *T = first;

	studentdb *K = P->Next;
	while(K)
	{
		course *Y = K->stu.retroot();
		if(Y ==NULL)
		{
			K = K->Next;
			continue;
		}
		if(Y!=NULL) 
			Y = Y->Next;
		while(Y)
		{
			if(strcmp(Y->cname,kname)==0)
			{
				studentname *Acode = new studentname;
				char Name[20];
				K->stu.getname(Name);
				strcpy(Acode->tname,Name);
				Acode->result = Y->grade;
				Acode->Next = T->Next;
				T->Next = Acode;
				activestudnet = activestudnet + 1;
				break;
			}

			Y = Y->Next;
		}
		K = K->Next;
	}
	return ;
}
///////////////////////////////////////////////////////////////////////////////////
void tuichu()
{
	system("cls");
 cout<<"\n\n\t\t\t谢谢你使用选修课小系统\t再见\n\n"<<endl;
 cout<<"\n\t   如果你觉得此软件有修改及补充之处,请按以下方式联系我们,"
	 <<"\n\t提出你的宝贵意见.我们将不断地改进并及时的公布新版本。谢谢!!\n\n"<<endl;
 cout<<"\t\t联系方式:\n"
	 <<"\t\t        姓名:郑德锋\n\n"
	 <<"\t\t        电话:0594-2657094\n\n"
	 <<"\t\t       Email:cyan_studio@163.com\n\n"
	 <<"\t\t    学校地址:莆田学院36号0443信箱\t邮政编码:351100\n\n\n"<<endl;
  getch();
  exit(-1);
}
//////////////////////////////////////////////////////////////////////////////////
//总菜单
char menu()
{
	int k=0;
	char a[3],c,i;
	system("cls");
	cout<<endl<<endl;
    cout<<"\t\t\t\tC++课程设计课题\n\n"<<endl;
	cout<<"\t\t********************************************\n"
        <<"\t\t*                                          *\n"
	    <<"\t\t*                选修课小系统              *\n"
	    <<"\t\t*                                          *\n"
		<<"\t\t*                                          *\n"
		<<"\t\t*     操作方式:                            *\n"
		<<"\t\t*               1.选修课系统学生端         *\n"
	    <<"\t\t*                                          *\n"
		<<"\t\t*               2.选修课系统管理端         *\n"
	    <<"\t\t*                                          *\n"
        <<"\t\t********************************************\n"<<endl;
		
	while(1)
	{
		cout<<"\n\t\t请选择登入方式: ";
		cin>>a;
		if(strlen(a)==1)
		{
            for(i='1';i<='2';i++)
            {
	             c=i;
	             if(c==a[0]) 
				   return c;
             }
		}
        cerr<<"\n\n\t\t\t\t输入有误!\n"<<endl;
		k++;
	   if(k>2)
	   {
		system("cls");
	    cerr<<"\n\n\n\t\t~~提示~~:错误输入次数超过三次,你将被强制退出!!\n\n"<<endl;
		cout<<"\t\t按任意键继续"<<endl;
		getch();
		tuichu();
	   }
  }
}
///////////////////////////////////////////////////////////////////////////////////
//选修课系统端操作
char custom()
{
	char A[10];
	char b;
	char i;
	int k = 0;
	system("cls");;
	cout<<"\n\n\n"
		<<"\t\t※※※※※※※※※※※※※※※※※※※※※※※※※※※\n"
	    <<"\t\t※                                                  ※\n"
		<<"\t\t※                    选修课系统学生端              ※\n"
	   	<<"\t\t※                                                  ※\n"
		<<"\t\t※            操作方式:                             ※\n"
		<<"\t\t※                      1.学生选课                  ※\n"
        <<"\t\t※                      2.学生情况                  ※\n"
		<<"\t\t※                      3.选课情况                  ※\n"
		<<"\t\t※                      4.退出系统                  ※\n"
		<<"\t\t※                                                  ※\n"
		<<"\t\t※※※※※※※※※※※※※※※※※※※※※※※※※※※\n"<<endl;
	
    while(1)
	{
	    cout<<"\t\t\t请选择操作方式: ";
        cin>>A;
		if(strlen(A)==1)
		{
            for(i='1';i<='4';i++)
            {
	             b=i;
	             if(b==A[0]) return b;
             }
		}
        cerr<<"\n\t\t\t\t输入有误!\n"<<endl;
        k++;
		if(k>2)
		{
			system("cls");
			cerr<<"\n\n\t\t\t~~提示~~:错误输入超过三次!你将被强制退出!!\n"<<endl;
			cout<<"\t\t按任意键继续"<<endl;
			getch();
			tuichu();
		}
	}
}
char server()
{
	char A[10];
	char b;
	char i;
	int k = 0;
	system("cls");;
    cout<<"\n\n\n"
        <<"\t\t※※※※※※※※※※※※※※※※※※※※※※※※※※※\n"
	    <<"\t\t※                                                  ※\n"
	    <<"\t\t※                  选修课系统管理端                ※\n"
		<<"\t\t※                                                  ※\n"
		<<"\t\t※      操作方式:                                   ※\n"
	    <<"\t\t※               1.增加学生      2.增加课程         ※\n"
        <<"\t\t※               3.删除学生      4.删除课程         ※\n"
		<<"\t\t※               5.填写成绩      6.更改学分         ※\n"
		<<"\t\t※               7.学生情况      8.选课情况         ※\n"
		<<"\t\t※               9.保存数据      0.退出系统         ※\n"
	    <<"\t\t※                                                  ※\n"
		<<"\t\t※※※※※※※※※※※※※※※※※※※※※※※※※※※\n"<<endl;
    while(1)
	{
	    cout<<"\t\t 请选择操作方式: ";
        cin>>A;
		if(strlen(A)==1)
		{
            for(i='0';i<='9';i++)
            {
	             b=i;
	             if(b==A[0]) 
					 return b;
             }
		}
        cerr<<"\n\t\t\t\t输入有误!\n"<<endl;;
        k++;
		if(k>2)
		{
			cerr<<"错误输入超过三次!\n";
			exit(-1);
		}
	}
}
//////////////////////////////////////////////////////////////////////////////////
//密码检查
void password()
{
	int k=0,i;
	char A[]="0411200";
	char B[10];
	char a;
	system("cls");
	for(i=0;i<8;i++)
		cout<<endl;
	    
	while(k<=2)
	{

    	printf("\t\t\t请输入管理员密码:");
		i=0;
		while(1)
		{
			a=getch();
			if(a==13)
				break;
			B[i]=a;
			i++;
			printf("*");
		}
		B[i]='\0';
	    if(strcmp(A,B)==0) 
			return;
		else 
		{
			k++;
			cerr<<"\n\n\t\t\t密码输入错误!请重新输入!\n"<<endl;
		}
	    if(k>=3) 
		{
		system("cls");
			cerr<<"\n\n\t\t\t输入错误密码超过三次!请按任意键退出.."<<endl;
			getch();
			tuichu();
		}
	}
}
///////////////////////////////////////////////////////////////////////
struct subjectdb
{
	subject sub;
	subjectdb *Next;
};

int menu_2_7(studentdb *P);
int menu_2_9(studentdb *Y,subjectdb *P);
int menu_2_8(subjectdb *P);
////////////////////////////////////////////////////////////////////////
//学生端功能函数
int menu_1_1(studentdb *P,subjectdb *X)    //学生选课
{
	system("cls");
	cout<<"\n\n\t\t\t\t学生选课操作"<<endl;
	//	
	studentdb *q=P->Next;
	int i;
	char N[20],M[20];
	if(q!=NULL) 
		cout<<"\n\n\n\t\t所有学生名单如下:\n"<<endl;
	else 
	{
		cerr<<"\n\n\n\t\t对不起,暂时没有学生名单!请按任意键继续.."<<endl; 
		return 1;
	}
	while(q)
	{
		q->stu.getname(N);
		cout<<"\t\t\t\t"<<N;
		cout<<endl;
		q = q->Next ;
	}

	q = P->Next;
	if(q==NULL) 
		return 1;
	
	cout<<"\n\n\t\t 请输入学生姓名:";
	cin>>N;
	i=0;
	q=P->Next;
	while(q)
	{
		q->stu.getname(M);
		if(strcmp(N,M)==0)
			i++;
		q = q->Next;
	}
	int j=0,k=1;
	if(i==0)
	{
		cout<<"\n\n\t\t没有这个学生!! 请按任意键返回.."<<endl;
		return 1;
	} 
	else if(i>1)
	{
		cout<<"\n\n\t\t共找到"<<i<<"个姓名为"<<N<<"的学生"<<endl;
		cout<<"\t\t选择第几个:";
		cin>>k;
	}
	if(k>i||k<=0) 
	{
	
	   cerr<<"\n\t\t\t输入有误!按任意键继续"<<endl;
	   return 1;
	}
	q = P->Next;
	j=0;
	while(q)
	{
		q->stu.getname(M);
		if(strcmp(N,M)==0) 
			j++;
		if(j==k)
		{
			if(q->stu.retfactcourse()>=q->stu.retmaxcourse())
			{
		
			    cout<<"\n\t\t所选课程已满!按任意键继续"<<endl;
				return 1;
			}
			else
			{
				subjectdb *t=X->Next;
				char N1[20];
				system("cls");;
				if(t!=NULL)
				{
				 	cout<<"\n\n\n\t\t所有课程如下:"<<endl;
					cout<<"\n\t\t\t\t课程名称\t\t 学分"<<endl;
				}
				else 
				{
					cerr<<"\n\n\n\t\t对不起,暂时没有课程"<<endl; 
					return 1;
				}
				while(t)
				{
					t->sub.getkname(N1);
					cout<<"\t\t\t\t "<<N1<<setw(26-strlen(N1))<<t->sub.readcredit()<<endl;
					t = t->Next ;
				}
                char N2[20];
				cout<<"\n\t    输入你所要选的课程 : ";
				cin>>N2;
				t = X->Next;
			    while(t)
				{
					t->sub.getkname(N1);
					if(strcmp(N1,N2)==0)
					{
						if(q->stu.findcourse(N2)==1)
						{
						  cout<<"\n\t\t此课程你已选过了,不能再选.按任意键继续"<<endl;
						  return 1;
						}
						t=X->Next;
						char NA[20];
						while(t)
						{
							t->sub.getkname(NA);
							if(strcmp(NA,N2)==0)
							{	
								if(t->sub.retactivestudent()>=t->sub.retmaxstudent ())
								{
								
									cout<<"\n\t\t此课程已选满,不能选.按任意键继续"<<endl;
									return 1;
								}
							}
							t = t->Next;
						}
						q->stu.addcourse(N2,0.0);
						cout<<"\n\n\t\t选课成功!按任意键继续"<<endl;
						return 1;
					}
					t = t->Next;
				}
				cerr<<"\n\t\t没有此课程!按任意键继续"<<endl;
			}
			

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -