# include & ltstdlib.h & gt
int N1,N2,kk1,kk2,kk3
結構couse * head 1;
struct student * head2
structure house//課程信息結構
{
int num 1;
char name 1[20];
int分數;
int nelepeo//為該課程選擇的人數
int Melepeo//課程中的最大學生人數
struct couse * next
};
結構學生//學生信息結構
{
int num2
char name 2[20];
int nel enum[50];//選擇的課程編號
int nelen//選擇的課程數量
結構學生*下壹個;
};
無效毫秒()
{
for(kk 1 = 0;kk 1 & lt;1100;kk1++)
for(kk2 = 0;kk2 & lt1200;kk2++)
for(kk3 = 0;kk3 & lt1200;kk3++);
}
Void keyboardc()//進入課程子功能(從鍵盤)
{
結構課程*p1,* p2
n 1 = 0;
p 1 = p2 =(struct couse *)malloc(sizeof(struct couse));
Printf("課程編號\t課程名稱\t學分\t課程的最大學生人數\ n ");
scanf("%d%s%d%d ",& ampp 1->;num1,p 1->;name1。p 1->;分數& ampp 1->;mele peo);
p 1->;nele peo = 0;
head 1 = NULL;
while(p 1->;num1!=0)
{
n 1 = n 1+1;
if(n 1 = = 1)head 1 = p 1;
否則p2-& gt;next = p 1;
p2 = p 1;
p 1 =(struct couse *)malloc(sizeof(struct couse));
scanf("%d%s%d%d ",& ampp 1->;num1,p 1->;name1。p 1->;分數& ampp 1->;mele peo);
p 1->;nele peo = 0;
}
p2->;next = NULL
}
Void filec()//輸入鍵盤子函數(來自文件)
{
FILE * fp
char file path[20];
結構課程*p1,* p2
n 1 = 0;
Printf("輸入要讀入的文件路徑:");
getchar();
獲取(文件路徑);
if((fp=fopen(filepath," r))= = NULL)
{
Printf("找不到%s文件!\n ",文件路徑);
退出(0);
}
p 1 = p2 =(struct couse *)malloc(sizeof(struct couse));
fscanf(fp," %d%s%d%d%d ",& ampp 1->;num1,p 1->;name1。p 1->;分數& ampp 1->;內爾佩奧& ampp 1->;mele peo);
head 1 = NULL;
而(!feof(fp))
{
n 1 = n 1+1;
if(n 1 = = 1)head 1 = p 1;
否則p2-& gt;next = p 1;
p2 = p 1;
p 1 =(struct couse *)malloc(sizeof(struct couse));
fscanf(fp," %d%s%d%d%d ",& ampp 1->;num1,p 1->;name1。p 1->;分數& ampp 1->;內爾佩奧& ampp 1->;mele peo);
}
p2->;next = NULL
}
Void inputc()//進入課程的主函數。
{
int I;
printf(" \ t \ t \ t輸入課程信息\ n ");
Printf("\n1。從鍵盤輸入\ n ");
Printf("2。來自文件的輸入\ n ");
Printf("3。返回主菜單\ n ");
Printf("請選擇(1 ~ 3):\ n ");
scanf("%d ",& ampI);
開關(壹)
{
case(1):keyboard c();打破;
案例(2):filec();打破;
案例(3):破;
}
}
void insertrc(struct Course * in Course)//課程管理子功能(添加課程)
{
結構課程*p0,*p1,* p2
p 1 = head 1;
p0 =不壹致;
if(head1==NULL)
{
head 1 = P0;
P0->;next = NULL
}
其他
{
而((P0-& gt;num 1 & gt;p 1->;num 1);& amp(p 1->;下壹個!=NULL))
{
p2 = p 1;
p 1 = p 1->;接下來;
}
如果(P0-& gt;num 1 & lt;= p 1->;num1)
{
if(head 1 = = p 1)head 1 = P0;
否則p2-& gt;next = p0
P0->;next = p 1;
}
其他
{
p 1->;next = p0
P0->;next = NULL
}
}
n 1 = n 1+1;
}
Void delc(int num1)//課程管理子函數(刪除課程)
{
結構課程*p1,* p2
if(head1==NULL)
{
printf(" \ n沒有課程,所以不能刪除!\ n ");
轉到結尾;
}
p 1 = head 1;
while(num1!= p 1->;num1。& ampp 1->;下壹個!=空)
{
p2 = p 1;
p 1 = p 1->;接下來;
}
if(num 1 = = p 1->;num1)
{
if(p 1 = = head 1)head 1 = p 1-& gt;接下來;
否則p2-& gt;next = p 1->;接下來;
Printf("編號課程已刪除!\ n ");
n 1 = n 1-1;
}
Else printf("沒有這個號的課程!\ n ");
結束:;
}
Void managementc()//課程管理的主要功能
{
struct couse * incouse
int i,num 1;
printf(" \ t \ t \ t課程管理\ n ");
Printf("1。新課程\ n”);
Printf("2。刪除課程\ n ");
Printf("3。返回主菜單\ n ");
Printf("請選擇(1 ~ 3):\ n ");
scanf("%d ",& ampI);
開關(壹)
{
案例(1):
{
incouse =(struct couse *)malloc(sizeof(struct couse));
Printf("課程編號\t課程名稱\t學分\t課程的最大學生人數\ n ");
scanf("%d%s%d%d ",& ampincouse->;num1,incouse->name1。incouse->;分數& ampincouse->;mele peo);
incouse->;nele peo = 0;
insertc(incouse);
打破;
}
情況(2):
{
Printf("請輸入要刪除的課程編號:\ n ");
scanf("%d ",& ampnum 1);
delc(num 1);
打破;
}
案例(3):破;
}
}
Void keyboards()//用於輸入學生信息的子函數(從鍵盤)
{
int I;
struct student *p1,* p2
N2 = 0;
p1=p2=(結構學生*)malloc(sizeof(結構學生));
Printf("學生ID \學生姓名\ n ");
scanf("%d%s ",& ampp 1->;num2,p 1->;name 2);
p 1->;nelen = 0;
for(I = 0;我& lt20;i++)p 1->;nel enum[I]= 0;
head2 = NULL
while(p 1->;num2!=0)
{
N2 = N2+1;
if(N2 = = 1)head 2 = p 1;
否則p2-& gt;next = p 1;
p2 = p 1;
p1=(結構學生* )malloc(sizeof(結構學生));
scanf("%d%s ",& ampp 1->;num2,p 1->;name 2);
p 1->;nelen = 0;
for(I = 0;我& lt20;i++)p 1->;nel enum[I]= 0;
}
p2->;next = NULL
}
Void files()//輸入學生信息的子函數(從文件輸入)
{
int I = 0;
FILE * fp
char file path[20];
struct student *p1,* p2
N2 = 0;
Printf("輸入要讀入的文件路徑:");
getchar();
獲取(文件路徑);
if((fp=fopen(filepath," r))= = NULL)
{
Printf("找不到%s文件!\n ",文件路徑);
退出(0);
}
p1=p2=(結構學生*)malloc(sizeof(結構學生));
fread(p1,sizeof(struct student),1,FP);
head2 = NULL
而(!feof(fp))
{
I = 0;
N2 = N2+1;
if(N2 = = 1)head 2 = p 1;
否則p2-& gt;next = p 1;
p2 = p 1;
p1=(結構學生* )malloc(sizeof(結構學生));
fread(p1,sizeof(struct student),1,FP);
}
p2->;next = NULL
}
Void inputs()//輸入學生信息的主函數
{
int I;
printf(" \ t \ t \ t輸入學生信息\ n ");
Printf("\n1。從鍵盤輸入\ n ");
Printf("2。來自文件的輸入\ n ");
Printf("3。返回主菜單\ n ");
Printf("請選擇(1 ~ 3):\ n ");
scanf("%d ",& ampI);
開關(壹)
{
case(1):鍵盤();打破;
案例(2):files();打破;
案例(3):破;
}
}
void inserts(struct Student * in course)//學生信息管理子功能(添加學生信息)
{
結構學生*p0,*p1,* p2
p 1 = head 2;
p0 =不壹致;
if(head2==NULL)
{
head2 = p0
P0->;next = NULL
}
其他
{
而((P0-& gt;num2 & gtp 1->;num 2)& amp;& amp(p 1->;下壹個!=NULL))
{
p2 = p 1;
p 1 = p 1->;接下來;
}
如果(P0-& gt;num2 & lt= p 1->;num2)
{
if(head 2 = = p 1)head 2 = P0;
否則p2-& gt;next = p0
P0->;next = p 1;
}
其他
{
p 1->;next = p0
P0->;next = NULL
}
}
N2 = N2+1;
}
voidless(int num 2)//學生信息管理子函數(刪除學生信息)
{
struct student *p1,* p2
if(head2==NULL)
{
printf(" \ n沒有該學生的信息,不能刪除!\ n ");
轉到結尾;
}
p 1 = head 2;
而(num2!= p 1->;num2 & amp& ampp 1->;下壹個!=空)
{
p2 = p 1;
p 1 = p 1->;接下來;
}
if(num 2 = = p 1->;num2)
{
if(p 1 = = head 2)head 2 = p 1-& gt;接下來;
否則p2-& gt;next = p 1->;接下來;
Printf("學生信息已刪除!\ n ");
N2 = N2-1;
}
Else printf("沒有這個學號的同學!\ n ");
結束:;
}
void management()//學生信息管理的主要功能
{
struct student * incouse
int i,num2
printf(" \ t \ t \ t學生信息管理";
Printf("1。添加學生信息\ n”);
Printf("2。刪除學生信息\ n”);
Printf("3。返回主菜單\ n ");
Printf("請選擇(1 ~ 3):\ n ");
scanf("%d ",& ampI);
開關(壹)
{
案例(1):
{
incouse =(struct student *)malloc(sizeof(struct student));
incouse->;nelen = 0;
incouse->;nel enum[0]= 0;
Printf("學生ID \學生姓名\ n ");
scanf("%d%s ",& ampincouse->;num2,incouse-& gt;name 2);
插入物(內部);
打破;
}
情況(2):
{
Printf("請輸入要刪除的學生的學號:\ n ");
scanf("%d ",& ampnum 2);
dels(num 2);
打破;
}
案例(3):破;
}
}
Void elect(struct student * s)//課程選擇
{
結構課程* p;
int num1,I;
Printf("請輸入所選課程的編號:\ n ");
scanf("%d ",& ampnum 1);
for(I = 0;s-& gt;nelenum[i]!=0;i++);
s-& gt;nel enum[I]= num 1;
(s->;nelen)++;
p = head 1;
while(p->;num1!= num 1)p = p-& gt;接下來;
(p->;nelepeo)++;
}
Void cheak()//學生選課子函數(查詢選修課)
{
char e;
結構課程* c;
結構學生* s;
int num2,I,j=0,t = 0;
Printf("請輸入妳的學號:");
scanf("%d ",& ampnum 2);
s = head2
while(s->;num2!= num2 & amp& amps-& gt;下壹個!= NULL)s = s-& gt;接下來;
if(s-& gt;num2!=num2)
{
Printf("您的信息不存在,請在主菜單中輸入您的信息!\ n ");
轉到結尾;
}
c = head 1;
Printf("妳的可選課程號:\ n ");
而(c!=空)
{
for(t=0,I = 0;s-& gt;nelenum[i]!=0;i++)
{
if(c->;num 1 = = s-& gt;nel enum[I])t = 1;
}
if(t = = 0 & amp;& amp(c->;內爾皮歐。= c->;Melepeo))
{
printf("%d\n ",c-& gt;num 1);
j++;
}
c = c->;接下來;
}
如果(j==0)
{
Printf("您已經選擇了所有課程,不能再選擇更多!\ n ");
轉到結尾;
}
Printf("選課(y/n)?:\ n ");
getchar();
e = getchar();
I = 0;
while(e=='y ')
{
選舉人;
Printf("繼續選課(y/n)"?:\ n ");
getchar();
e = getchar();
}
結束:;
}
Void back(struct student * p)//退出類。
{
結構課程* p 1;
int num1,I,j;
Printf("請輸入您要返回的課程編號:\ n ");
scanf("%d ",& ampnum 1);
p 1 = head 1;
while(p 1->;num1!= num 1)p 1 = p 1->;接下來;
for(I = 0;p->;nelenum[i]!= num 1;i++);
for(j = I;p->;nelenum[j]!=0;j++)p-& gt;nel enum[j]= p-& gt;nel enum[j+1];
p->;nel enum[-j]= 0;
(p 1->;nele peo)-;
Printf("成功退課!\ n ");
}
Void hcheak()//學生選課子函數(查詢所選課程)
{
char c;
結構課程* p0
struct student * p;
int num2,I,f = 0;
Printf("請輸入妳的學號:\ n ");
scanf("%d ",& ampnum 2);
p = head2
while(p->;num2!= num2 & amp& ampp!= NULL)p = p-& gt;接下來;
if(p==NULL)
{
Printf("您的信息不存在,請返回主菜單輸入信息:\ n ");
轉到結尾;
}
Printf("所選課程編號:\ n ");
如果(p->;nelenum[0]==0)
{
Printf("妳還沒選課程呢!\ n ");
轉到結尾;
}
for(I = 0;p->;nelenum[i]!=0;i++)
{
printf("%d\n ",p-& gt;nel enum[I]);
P0 = head 1;
而(p0->num1!= p->;nel enum[I])P0 = P0-& gt;接下來;
f = f+P0-& gt;分數;
}
Printf("總積分:%d\n ",f);
Printf("妳想退學嗎(y/n)?");
getchar();
c = getchar();
while(c=='y ')
{
背部(p);
Printf("繼續退學(y/n)?");
getchar();
c = getchar();
(p->;nelen)-;
}
結束:;
}
void selective()//學生選課主函數
{
int I;
printf(" \ t \ t \ t學生選擇課程\ n ");
Printf("1。查詢選修課\ n ");
Printf("2。查詢所選課程\ n ");
Printf("3。返回主菜單\ n ");
Printf("請輸入(1 ~ 3):\ n ");
scanf("%d ",& ampI);
開關(壹)
{
case(1):cheak();打破;
案例(2):HCH eak();打破;
案例(3):破;
}
}
void lisc()//輸出課程信息
{
結構課程* p;
p = head 1;
Printf("課程編號,課程名稱,學分課程選學人數\ n ");
而(p!=空)
{
printf(" %-8d % 10s % 6d % 8d % 12d \ n ",p-& gt;num1,p->name1,p->得分,p-& gt;nelepeo,p-& gt;mele peo);
p = p-& gt;接下來;
}
}
Void lists()//輸出學生信息
{
struct student * p;
p = head2
Printf("按學號和學名選擇的課程數\ n ");
而(p!=空)
{
printf("%-4d %10s %6d\n ",p-& gt;num2,p-& gt;name2,p-& gt;nelen);
p = p-& gt;接下來;
}
}
Void intoc()//存儲課程信息。
{
FILE * fp
結構課程* p;
char file path[30];
Printf("輸入保存課程信息的文件路徑:");
getchar();
獲取(文件路徑);
if((fp=fopen(filepath," w))= = NULL)
{
printf(" \ n保存失敗!");
退出(0);
}
p = head 1;
而(p!=空)
{
fprintf(fp," %d %s %d %d %d\n ",p-& gt;num1,p->name1,p->得分,p-& gt;nelepeo,p-& gt;mele peo);
p = p-& gt;接下來;
}
fclose(FP);
Printf("課程信息已保存在%s!\n ",文件路徑);
}
Void intos()//存儲學生信息。
{
FILE * fp
struct student * p;
char file path[30];
Printf("輸入保存學生信息的文件路徑:");
getchar();
獲取(文件路徑);
if((fp=fopen(filepath," w))= = NULL)
{
printf(" \ n保存失敗!");
退出(0);
}
p = head2
而(p!=空)
{
fwrite(p,sizeof(struct student),1,FP);
p = p-& gt;接下來;
}
fclose(FP);
Printf("學生信息已保存在%s!\n ",文件路徑);
}
Void into()//存儲信息
{
int I;
Printf("1。存儲課程信息\ n ");
Printf("2。存儲學生信息\ n ");
Printf("3。返回主菜單\ n ");
Printf("請輸入(1 ~ 3)\ n ");
scanf("%d ",& ampI);
開關(壹)
{
case(1):intoc();打破;
情況(2):intos();打破;
案例(3):破;
}
}
Void store()//信息主函數
{
int I;
printf(" \ t \ t系統信息查看和存儲\ n ");
Printf("1。查看課程信息\ n ");
Printf("2。查看學生信息\ n ");
Printf("3。店鋪信息\ n ");
Printf("4。返回主菜單\ n ");
Printf("請輸入(1 ~ 4):\ n ");
scanf("%d ",& ampI);
開關(壹)
{
case(1):listc();打破;
情況(2):lists();打破;
情況(3):into();打破;
情況(4):破;
}
}
Int main()//主函數
{
int I;
開始:
printf(" \ n \ t \ t \ t歡迎使用學生選課系統!\ n ");
printf(" menu:\ n ");
Printf("1。輸入課程信息\ n ");
Printf("2。課程管理\ n ");
Printf("3。輸入學生信息\ n ");
Printf("4。學生信息管理\ n ");
Printf("5。學生選課\ n ");
Printf("6。系統信息查看和存儲\ n ");
Printf("7。退出系統\ n ");
printf(" \ n請輸入壹個菜單選項(1 ~ 7):\ n ");
scanf("%d ",& ampI);
如果(我& lt1 | | I & gt;7)
{
Printf("輸入錯誤,請重新輸入:\ n ");
轉到開始;
}
開關(壹)
{
案例(1):
{
系統(“cls”);
inputc();
轉到開始;
打破;
}
情況(2):
{
系統(“cls”);
management c();
轉到開始;
打破;
}
情況(3):
{
系統(“cls”);
inputs();
轉到開始;
打破;
}
案例(4):
{
系統(“cls”);
management s();
轉到開始;
打破;
}
案例(5):
{
系統(“cls”);
選修();
轉到開始;
打破;
}
案例(6):
{
系統(“cls”);
store();
轉到開始;
打破;
}
案例(7):
{
系統(“cls”);
Printf("感謝使用這個系統!\n\n再見!\ n ");
}
}
return(0);
}