?? 學生課程選修系統.c
字號:
/*學生選修課程系統設計
假定有n門課程,每門課程有課程編號,課程名稱,課程性質,總學時,授課學時,實驗或上機學時,
學分,開課學期等信息,學生可按要求(如總學分不得少于60)自由選課。試設計一選修課程系統,
使之能提供如下功能:
課程信息錄入功能(課程信息用文件保存)--輸入
課程信息瀏覽功能--輸出
查詢功能:(至少一種查詢方式)--算法
按學分查詢
按課程性質查詢
學生選修課程(可選項)
*/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "process.h"
typedef struct subjects
{
int num; //課程編號
char name[20]; //課程名稱
char kind[10]; //課程性質
int stime; //總學時
int ttime; //授課學時
int etime; //實驗或上機學時
int score; //學分
int term; //開課學期
struct subjects *next;
}SUB;
SUB *create_form() //創建鏈表
{
SUB *head,*tail,*p;
int num,stime,ttime;
int etime,score,term;
char name[20],kind[10];
int size=sizeof(SUB);
head=tail=NULL;
printf("輸入選修課程信息:\n");
scanf("%d%s%s%d%d%d%d%d",&num,name,kind,&stime,&ttime,&etime,&score,&term);
while(num!=0){
p=(SUB *)malloc(size);
p->num=num;
strcpy(p->name,name);
strcpy(p->kind,kind);
p->stime=stime;
p->ttime=ttime;
p->etime=etime;
p->score=score;
p->term=term;
if(head==NULL)
head=p;
else
tail->next=p;
tail=p;
scanf("%d%s%s%d%d%d%d%d",&num,name,kind,&stime,&ttime,&etime,&score,&term);
}
tail->next=NULL;
return head;
}
void savefile(SUB *head) //將建立的鏈表存入文件
{
SUB *p;
FILE *fp;
if((fp=fopen("e:\\subjects.txt","w"))==NULL){
printf("open fail!\n");
exit(0);
}
fprintf(fp,"課程編號 課程名稱 課程性質 總學時 授課學時 實驗或上機學時 學分 開課學期\n");
for(p=head;p;p=p->next)
fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",p->num,p->name,p->kind,p->stime,p->ttime,p->etime,p->score,p->term);
if(fclose(fp)){
printf("close fail!\n");
exit(0);
}
printf("創建后的信息已放入E盤根目錄的“subjects.txt”文件中\n");
}
void savefileadd(SUB *head) //將修改后的信息存入新文件
{
SUB *p;
FILE *fp;
if((fp=fopen("e:\\subjectsadd.txt","w"))==NULL){
printf("open fail!\n");
exit(0);
}
fprintf(fp,"課程編號 課程名稱 課程性質 總學時 授課學時 實驗或上機學時 學分 開課學期\n");
for(p=head;p;p=p->next)
fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",p->num,p->name,p->kind,p->stime,p->ttime,p->etime,p->score,p->term);
if(fclose(fp)){
printf("close fail!\n");
exit(0);
}
printf("修改后的信息已放入E盤根目錄的“subjectsadd.txt”文件中\n");
}
void savefiledel(SUB *head) // 將再次修改的信息存入新文件
{
SUB *p;
FILE *fp;
if((fp=fopen("e:\\subjectsdel.txt","w"))==NULL){
printf("open fail\n");
exit(0);
}
fprintf(fp,"課程編號 課程名稱 課程性質 總學時 授課學時 實驗或上機學時 學分 開課學期\n");
for(p=head;p;p=p->next)
fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",p->num,p->name,p->kind,p->stime,p->ttime,p->etime,p->score,p->term);
if(fclose(fp)){
printf("close fail!\n");
exit(0);
}
printf("修改后的信息已放入E盤根目錄的“subjectsdel.txt”文件中\n");
}
void prin(SUB *head) //輸出信息
{
SUB *ptr;
if(head==NULL){
printf("NO RECORDS!\n");
return;
}
printf("課程編號 課程名稱 課程性質 總學時 授課學時 實踐或上機學時 學分 開課學期\n");
for(ptr=head;ptr;ptr=ptr->next)
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);
}
void search(SUB *head) //查詢信息
{
int a,num;
int t=1;
char type[10];
char ch='a',ch1;
SUB *ptr;
while(ch!=' '){
printf("若要按課程性質查找請輸入1,若要按學分查找請輸入2:\n");
scanf("%d",&a);
switch(a){
case 1:printf("請輸入要查找的課程的性質:\n");
scanf("%s",type);
printf("課程編號 課程名稱 課程性質 總學時 授課學時 實踐或上機學時 學分 開課學期\n");
for(ptr=head;ptr;ptr=ptr->next)
if(strcmp(type,ptr->kind)==0){
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);
t=0;
}
if(t) printf("未找到!\n");
t=1;
break;
case 2:printf("輸入要查找的課程的學分\n");
scanf("%d",&num);
printf("課程編號 課程名稱 課程性質 總學時 授課學時 實踐或上機學時 學分 開課學期\n");
for(ptr=head;ptr;ptr=ptr->next)
if(ptr->score==num){
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);
t=0;
}
if(t) printf("未找到!\n");
t=1;
}
printf("繼續查找請按回車鍵,結束請按空格鍵:\n");
ch1=getchar(); //將回車鍵賦給CH1,否則CASE里面最后輸入的回車鍵會賦給CH,因此用CH1填補。
ch=getchar();
}
}
SUB *insert(SUB *head) //插入信息
{
SUB *ptr,*ptr2,*subj;
int size=sizeof(SUB);
char ch='a',ch1;
while(ch!=' '){
subj=(SUB *)malloc(size);
ptr=subj;
printf("輸入要插入的課程信息:\n");
scanf("%d%s%s%d%d%d%d%d",&subj->num,subj->name,subj->kind,&subj->stime,&subj->ttime,&subj->etime,&subj->score,&subj->term);
if(head==NULL){
head=ptr;
head->next=NULL;
}
else{
for(ptr2=head;ptr2;ptr2=ptr2->next)
if(ptr2->next==NULL){
ptr2->next=subj;
subj->next=NULL;
break;
}
}
printf("繼續插入請按回車,結束請按空格:\n");
ch1=getchar(); //將回車鍵賦給CH1,否則subj->term輸完后輸入的回車鍵會賦給CH,因此用CH1填補。
ch=getchar();
}
return head;
}
SUB *del(SUB *head) //刪除信息
{
SUB *p1,*p2;
char ch='a',ch1;
int num;
while(ch!=' '){
printf("輸入想要刪除的課程編號:\n");
scanf("%d",&num);
if(head->num==num){
p2=head;
head=head->next;
free(p2);
}
if(head==NULL)
return NULL;
p1=head;
p2=head->next;
while(p2){
if(p2->num==num){
p1->next=p2->next;
free(p2);
}
else p1=p2;
p2=p1->next;
}
printf("繼續刪除請按回車,結束請按空格:\n");
ch1=getchar(); //將回車鍵賦給CH1,否則num輸完后再輸入的回車鍵會賦給CH,因此用CH1填補。
ch=getchar();
}
return head;
}
void choose(SUB *head) //學生選課
{
SUB *p,*q;
int a[5];
int num,total=0,i=0,j;
printf("輸入要選修的課程的編號,編號之間以空格分開,輸完后以0結束\n");
scanf("%d",&num);
while(num!=0){
for(p=head;p;p=p->next)
if(p->num==num){
total=total+p->score;
a[i]=num;
i++;
}
scanf("%d",&num);
}
if(total<60) printf("選修總學分未達到60,選修失敗!\n");
else {
printf("選修成功!\n");
printf("您選修的課程為:\n");
for(j=0;j<i;j++)
for(q=head;q;q=q->next)
if(q->num==a[j])
printf("%s ",q->name);
printf("\n");
}
}
void readfile() //將第一次建立的文件重新讀出
{
int num,stime,ttime,etime;
int score,term;
char c,name[20],kind[10];
FILE *fp=fopen("e:\\subjects.txt","r");
while(!feof(fp))
{
if((c=fgetc(fp))=='\n')
break;
}
printf("課程編號 課程名稱 課程性質 總學時 授課學時 實驗或上機學時 學分 開課學期\n");
while(!feof(fp))
{
fscanf(fp,"%d%s%s%d%d%d%d%d\n",&num,name,kind,&stime,&ttime,&etime,&score,&term);
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",num,name,kind,stime,ttime,etime,score,term);
}
fclose(fp);
}
void main()
{
SUB *head;
int i;
char c;
printf("\n\n");
for(i=0;i<34;i++)
printf("*");
printf("課程信息錄入");
for(i=0;i<34;i++)
printf("*");
printf("\n\n");
head=create_form();
savefile(head);
printf("\n\n");
for(i=0;i<34;i++)
printf("*");
printf("課程信息輸出");
for(i=0;i<34;i++)
printf("*");
printf("\n\n");
prin(head);
printf("\n\n");
for(i=0;i<34;i++)
printf("*");
printf("課程信息查找");
for(i=0;i<34;i++)
printf("*");
printf("\n\n");
search(head);
printf("\n\n");
for(i=0;i<34;i++)
printf("*");
printf("課程信息插入");
for(i=0;i<34;i++)
printf("*");
printf("\n\n");
head=insert(head); //注意此處的必要性,函數insert的的返回值重新賦給head!
savefileadd(head);
printf("修改后的信息為:\n");
prin(head);
printf("\n\n");
for(i=0;i<34;i++)
printf("*");
printf("課程信息刪除");
for(i=0;i<34;i++)
printf("*");
printf("\n\n");
head=del(head); //注意此處的必要性,函數del的的返回值重新賦給head!
savefiledel(head);
printf("修改后的課程信息為:\n");
prin(head);
printf("\n\n");
for(i=0;i<34;i++)
printf("*");
printf("課程選修");
for(i=0;i<34;i++)
printf("*");
printf("\n\n");
choose(head);
printf("是否再次顯示文件“subjects.txt”的內容(Y/N)?\n");
getchar(); //接收choose函數中最后輸入的回車字符
c=getchar();
if(c=='y'||c=='Y'){
printf("\n");
printf("“subjects.txt”文件的信息為:\n");
readfile();
}
else printf("程序結束!\n");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -