班級問題(c++)

沙雕中的沙雕雕發表於2020-10-29

無聊做了一個程式碼,給我的粉絲們瞅瞅:

#include<bits/stdc++.h>
using namespace std;
#include <time.h>
#include <conio.h> /*清屏*/
#include <stdlib.h> /*顯示目錄*/
#define MAX 888  
int now_no=0; 

//先把所有要用到的函式寫出來,下面寫特定函式的時候就不需要注意順序和函式之間的邏輯關係了 
void input(); void sort(); void sort1(); void sort2(); void sort3();  void display(); void display1(); void insert(); void del(); void average(); void find(); void find1(); void find2(); void dis_grade(); void save(); void read(); void del_file(); void modify();

struct student 
{ 
    int no,testScore; 
    char name[20],sex[4]; 
    float score1,score2,score3,sort,ave,sum; 
}stu[MAX],*p; 


void input()/*原始資料錄入模組*/ 
{ 
    int i=0; 
    char ch; 
    do 
    { 
        printf("\t\t\t\t1.錄入學員資訊\n輸入第%d個學員的資訊\n",i+1); 
        
        printf("\n輸入學生編號:"); 
        scanf("%d",&stu[i].no); 
        fflush(stdin); 
        
        printf("\n輸入學員姓名:"); 
        fflush(stdin); 
        gets(stu[i].name); 
        
        printf("\n輸入學員性別:"); 
        fflush(stdin); 
        gets(stu[i].sex); 
        
        printf("\n輸入學員成績1:"); 
        scanf("%f",&stu[i].score1); 
        printf("\n輸入學員成績2:"); 
        fflush(stdin); 
        scanf("%f",&stu[i].score2); 
        printf("\n輸入學員成績3:"); 
        fflush(stdin); 
        scanf("%f",&stu[i].score3); 
        printf("\n\n"); 
        
        i++; 
        now_no=i; 
        printf("是否繼續輸入?(Y/N)"); 
        fflush(stdin); 
        ch=getch(); 
        system("cls"); 
    } 
    while(ch!='n'&&ch!='N'); 
    system("cls"); 
} 

void average() /*求平均數*/ 
{ 
    for(int i=0;i<now_no;i++) 
    { 
        stu[i].sum=stu[i].score1+stu[i].score2+stu[i].score3; 
        stu[i].ave=stu[i].sum/3; 
    } 
} 

void sort()/*排序資料函式*/ 
{ 
    struct student temp; 
    average();
    
    for(int i=1; i<now_no; i++) 
      for(int j=1; j<=now_no-i; j++) 
        if(stu[j-1].ave<stu[j].ave)  swap(stu[j],stu[j-1]);
    
    printf("排序以完成進入功能2可進行顯示\n");
    system("pause");
    system("cls");
} 

void sort1()/*排序資料函式*/ 
{ 
    struct student temp; 
    for(int i=1; i<now_no; i++) 
      for(int j=1; j<=now_no-i; j++) 
        if(stu[j-1].score1<stu[j].score1)  swap(stu[j],stu[j-1]);
} 

void sort2()/*排序資料函式*/ 
{ 
    struct student temp; 
    for(int i=1; i<now_no; i++) 
      for(int j=1; j<=now_no-i; j++) 
        if(stu[j-1].score2<stu[j].score2)  swap(stu[j],stu[j-1]);
} 

void sort3()/*排序資料函式*/ 
{ 
    struct student temp; 
    for(int i=1;i<now_no;i++) 
      for(int j=1;j<=now_no-i;j++) 
        if(stu[j-1].score3<stu[j].score3)  swap(stu[j],stu[j-1]);
}

void display()/*顯示資料函式*/ 
{ 
    char as; 
    average();    
    do 
    { 
        printf("\t\t\t班級學員資訊列表\n"); 
        printf("\t編號\t姓名\t性別\t成績1\t成績2\t成績3\t平均值\n");
	   
        for(int i=0;i<now_no&&stu[i].name[0];i++) 
            printf("\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave); 
        printf("\t\t按任意鍵返回主選單."); 
      
        fflush(stdin); 
        as=getch(); 
    } 
    while(!as); 
    system("cls"); 
}

void display1()/*顯示資料函式*/
{
    char as;   
    do 
    { 
        printf("\t\t\t班級學員score1成績排序\n"); 
        printf("\t編號\t姓名\t性別\t成績1\n");
        sort1();
        for(int i=0;i<now_no&&stu[i].name[0];i++)
            printf("\t%d\t%s\t%s\t%.2f\t\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score1); 
            
        printf("\t\t\t班級學員score2成績排序\n"); 
        printf("\t編號\t姓名\t性別\t成績2\n");
        sort2();
        for(int i=0; i<now_no&&stu[i].name[0]; i++)
            printf("\t%d\t%s\t%s\t%.2f\t\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score2); 
			 
        printf("\t\t\t班級學員score3成績排序\n"); 
        printf("\t編號\t姓名\t性別\t成績3\n");
        sort3();
        for(int i=0; i<now_no&&stu[i].name[0]; i++)
            printf("\t%d\t%s\t%s\t%.2f\t\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score3); 
			 
        printf("\t\t按任意鍵返回主選單."); 
        fflush(stdin); 
        as=getch(); 
    } 
    while(!as); 
    system("cls"); 
}

void dis_grade()
{
	char as;
	do 
    { 
	    printf("________________________________________________________\n");
	    printf("     |90分以上:A | 80~89分:B | 70~79分:C | 60~69分:D | 60分以下:E \n");
	    printf("--------------------------------------------------------\n");
	  
        for(int i=0; i<now_no&&stu[i].name[0]; i++) 
        {
      	    printf("\t%d\t%s\t%s",stu[i].no,stu[i].name,stu[i].sex);
      	    if(stu[i].ave>=90) printf("\t等級:A");
      	    else if(stu[i].ave>=80&&stu[i].ave<=89) printf("\t等級:B");
      	    else if(stu[i].ave>=70&&stu[i].ave<=79) printf("\t等級:C");
      	    else if(stu[i].ave>=60&&stu[i].ave<=69) printf("\t等級:D");
      	    else if(stu[i].ave<60) printf("\t等級:E");
	    }
	    
	    printf("--------------------------------------------------------\n");
        printf("\t\t按任意鍵返回主選單."); 
        
        fflush(stdin); 
        as=getch(); 
    } 
	while(!as); 
    system("cls"); 
}

void insert()/*插入資料函式*/ 
{ 
    char ch; 
    do 
    { 
        printf("\n\t\t輸入新插入學員隊資訊\n"); 
        
        printf("\n輸入學生編號:"); 
        scanf("%d",&stu[now_no].no); 
        fflush(stdin); 
        
        printf("\n輸入學員姓名:"); 
        fflush(stdin); 
        gets(stu[now_no].name); 
        
        printf("\n輸入學員性別:"); 
        fflush(stdin); 
        gets(stu[now_no].sex); 
        
        printf("\n輸入學員成績1:"); 
        fflush(stdin); 
        scanf("%f",&stu[now_no].score1); 
        printf("\n輸入學員成績2:"); 
        fflush(stdin); 
        scanf("%f",&stu[now_no].score2); 
        printf("\n輸入學員成績3:"); 
        fflush(stdin); 
        scanf("%f",&stu[now_no].score3); 
        printf("\n\n"); 
        
        now_no=now_no+1; 
        sort(); 
        printf("是否繼續輸入?(Y/N)"); 
        fflush(stdin); 
        ch=getch(); 
        system("cls"); 
    } 
    while(ch!='n'&&ch!='N'); 
} 

void del()/*刪除資料函式*/ 
{ 
    int k; 
    printf("輸入要刪除學員的編號:"); 
    fflush(stdin); 
    scanf("%d",&k); 
    for(int i=0; i<now_no; i++) 
    { 
        if(stu[i].no==k) 
        { 
            if(i==now_no)  now_no-=1; 
            else 
            { 
                stu[i]=stu[now_no-1]; 
                now_no-=1; 
            } 
            sort(); 
            break; 
        } 
    }
    system("cls"); 
} 

void save()/*儲存資料函式*/ 
{ 
    FILE *fp; 
    char filepath[20]; 
    printf("輸入要儲存的檔案路徑:"); 
    fflush(stdin); 
    gets(filepath); 
    
    if( (fp=fopen(filepath,"w"))==NULL ) 
    { 
        printf("\n儲存失敗!"); 
        exit(0); 
    } 
    
    for(int i=0;i<now_no;i++) 
    { 
        stu[i].sum=stu[i].score1+stu[i].score2+stu[i].score3; 
        stu[i].ave=stu[i].sum/3; 
        fprintf(fp,"\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave); 
    } 
    fclose(fp); 
    
    printf("學生資訊已儲存在%s中!\n",filepath); 
    system("pause"); 
    system("cls"); 
} 

void find()/*查詢函式*/ 
{ 
    char str[20],as; 
    do 
    { 
        printf("輸入要查詢的學生姓名:"); 
        fflush(stdin); 
        gets(str); 
        
        for(int i=0;i<now_no;i++) 
            if(!strcmp(stu[i].name,str)) 
            { 
                printf("\t編號\t姓名\t性別\t成績1\t成績2\t成績3\t平均值\n"); 
                printf("\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave); 
            } 
            
        printf("\t\t按任意鍵返回主選單."); 
        fflush(stdin); 
        as=getch(); 
    } 
    while(!as); 
    system("cls"); 
} 

void modify()/*修改資料函式*/ 
{ 
    char str[20]; 
    printf("輸入要修改的學生姓名:"); 
    fflush(stdin); 
    gets(str); 
    
    for(int i=0; i<now_no; i++) 
    {
        if(!strcmp(stu[i].name,str)) 
        { 
            system("cls"); 
            printf("\n\t\t輸入新插入學員隊資訊\n"); 
            printf("\n輸入學生編號:"); 
            fflush(stdin); 
            scanf("%d",&stu[i].no); 
            
            printf("\n輸入學員性別:"); 
            fflush(stdin); 
            gets(stu[i].sex); 
            
            printf("\n輸入學員成績1:"); 
            fflush(stdin); 
            scanf("%f",&stu[i].score1); 
            printf("\n輸入學員成績2:"); 
            fflush(stdin); 
            scanf("%f",&stu[i].score2); 
            printf("\n輸入學員成績3:"); 
            fflush(stdin); 
            scanf("%f",&stu[i].score3); 
            
            printf("\n\n"); 
            sort(); 
            break; 
       }
    }
    system("cls"); 
} 

void read() 
{ 
    FILE *fp; 
    char filepath[20]; 
    printf("輸入要讀入的檔案路徑:"); 
    fflush(stdin); 
    gets(filepath); 
    
    if( (fp=fopen(filepath,"r"))==NULL ) 
    { 
       printf("找不到%s檔案!\n",filepath); 
       system("pause"); 
       exit(0); 
    } 
    
    now_no=0; 
    for(int i=0; i<MAX&&!feof(fp); i++) 
    { 
       fscanf(fp,"\t%d\t%s\t%s\t%f\t%f\t%f\t%f\n",&stu[i].no,stu[i].name,stu[i].sex,&stu[i].score1,&stu[i].score2,&stu[i].score3,&stu[i].ave); 
       now_no++; 
    } 
    
    fclose(fp); 
    printf("儲存的在檔案%s中的所有資訊已經讀入!\n",filepath); 
    system("pause"); /*按任意鍵繼續*/
    system("cls"); 
} 

void del_file() 
{ 
    FILE *fp; 
    char filepath[20]; 
    printf("輸入要刪除的檔案路徑:"); 
    
    fflush(stdin); 
    gets(filepath); 
    fp=fopen(filepath,"w"); 
    fclose(fp); 
    printf("儲存的在檔案%s中的所有資訊已經刪除!\n",filepath); 
    
    system("pause"); 
    system("cls"); 
}


int main()/*主函式*/ 
{ 
    int as;
    char ch;
    do
	{
       start: printf("\n\n\n\t\t\t歡迎使用 XX 的學生成績管理系統\n"); 
       printf("\n\n\n\n\n\n\t\t******************按任意鍵繼續********************");
       ch=getch();
    }
    while(!ch); 
    system("cls");
    
    /*以下為功能選擇模組*/ 
    do 
    { 
        printf("\n\t\t\t\t1.錄入學員資訊\n\t\t\t\t2.顯示學員總成績資訊\n\t\t\t\t3.對總成績排序\n\t\t\t\t4.顯示學員單科成績排序\n\t\t\t\t5.新增學員資訊\n\t\t\t\t6.刪除學員資訊\n\t\t\t\t7.修改學員資訊\n\t\t\t\t8.查詢學員資訊\n\t\t\t\t9.從檔案讀入學員資訊\n\t\t\t\t10.刪除檔案中學員資訊\n\t\t\t\t11.儲存學員資訊\n\t\t\t\t12.各學員學科平均成績等級評定\n\t\t\t\t13.退出\n"); 
        printf("\t\t\t\t選擇功能選項(輸入所選功能前的數字):"); 
        fflush(stdin);
        /*可用可不用,用於清除快取防止下次用scanf輸入是出現錯誤*/ 
        scanf("%d",&as); 
        switch(as) 
        { 
            case 1:system("cls");    input();    break; 
            case 2:system("cls");    display();    break;
            case 3:system("cls");    sort();    break;
            case 4:system("cls");    display1();    break;
            case 5:system("cls");    insert();    break;
            case 6:system("cls");    del();    break; 
            case 7:system("cls");    modify();    break; 
            case 8:system("cls");    find();    break; 
            case 9:system("cls");    read();    break; 
            case 10:system("cls");    del_file();    break; 
       
            case 11:system("cls");    save();    break; 
       
	        case 12:system("cls");    dis_grade();    break; 
            case 13:system("exit");    exit(0);       
	        default:system("cls");    goto start; 
        } 
        
    }while(1);/*while(1),1表示真,所以while(1)表示永遠迴圈下去,一般在while(1)的迴圈體內都有break 或者return 跳出迴圈*/ 
    /*至此功能選擇結束*/ 
} 

相關文章