程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 我的C/C++之路-010課(結構體使用的簡單實例(學生成績管理))

我的C/C++之路-010課(結構體使用的簡單實例(學生成績管理))

編輯:關於C語言

最近比較忙,幾天沒寫了。今天做的是結構體的應用(學生的成績管理),相信很多朋友都做過,我這裡獻丑下,C比較難控制,所以在裡面有很多不是很好的功能,大家可以自己完善下。

 

[cpp]
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
/**
    結構體使用的簡單實例:
    1.創建學生成績結構體(包含學號,姓名,語文,數學,英語成績)
    使用鏈表指向下一個學生(由於輸入學生個數未知,使用數組方式不怎麼好)
 
    2.提供學生成績插入,查詢,更改,刪除
*/ 
typedef struct Student 

    char no[4];//3位數的學號,輸入多的會出錯 
    char name[10]; 
    int chinese; 
    int math; 
    int english; 
    struct Student *next;//指向下一個學生 
 
}StudentList; 
void init(StudentList *&); 
void select(StudentList *);    //查詢成績 
void insert(StudentList *&);   //錄入成績 
void update(StudentList *&);   //更新成績 
void deleteData(StudentList *);//刪除數據 
 
void studentScoreManege() 

    StudentList *stuList = NULL; 
    int oprate; 
    init(stuList);//初始化 
    do{ 
        system("cls"); 
        fflush(stdin); 
        puts("************* Student Data Oprate *******************"); 
        puts("*    1. select student score                        *"); 
        puts("*    2. insert student score                        *"); 
        puts("*    3. update student score                        *"); 
        puts("*    4. delete student data                         *");//刪除全部數據,雖然實際不能這樣做,這裡為了簡便設計 
        puts("*    0. exit                                        *"); 
        puts("*****************************************************"); 
        printf("please select a number: "); 
         
        scanf("%d",&oprate); 
        switch(oprate)//根據不同選擇執行不同操作 
        { 
        case 1: 
            select(stuList); 
            break; 
        case 2: 
            insert(stuList); 
            break; 
        case 3: 
            update(stuList); 
            break; 
        case 4: 
            deleteData(stuList); 
            break; 
        case 0: 
        default: 
            break; 
        } 
    }while(oprate!=0); 

//初始化表頭 
void init(StudentList *&stuList) 

    stuList = (StudentList *)malloc(sizeof(StudentList)); 
    stuList->next = NULL; 

 
//查詢成績 
void select(StudentList *stuList) 

    StudentList *p = stuList->next; 
    if(p==NULL) 
    { 
        puts("there is no data,please insert!!"); 
        puts("press any key to return!!!"); 
        getchar(); 
    } 
    puts("**************  student score insert *********************"); 
    puts("No\tName\tChinese\tMath\tEnglish"); 
    while(p!=NULL) 
    { 
        printf("%s\t%s\t%d\t%d\t%d\n",p->no,p->name,p->chinese,p->math,p->english); 
        p = p->next; 
    } 
    fflush(stdin); 
    puts("press any key to return!!!"); 
    getchar(); 

//錄入成績 www.2cto.com  
void insert(StudentList *&stuList) 

    StudentList *p ,*s; 
    p = stuList; 
    while(p->next != NULL) 
    { 
            p = p->next; 
    } 
    do{ 
        s = (StudentList *)malloc(sizeof(StudentList)); 
         
        puts("please insert student data(NO,Name,Chinese,Math,English):"); 
        scanf("%3s%10s",&s->no,&s->name); 
        scanf("%d%d%d",&s->chinese,&s->math,&s->english); 
        //判斷數據合法性,關於學號的重復性大家自己寫校驗 
        if(s->chinese<0||s->chinese>100||s->math<0||s->math>100||s->english<0||s->english>100) 
        { 
            puts("input data error !!!"); 
            return; 
        } 
        s->next = NULL; 
        p->next = s; 
        p = p->next;//為下一次循環錄入准備 
        fflush(stdin);//清除緩沖區的 '\n' 不然下面的getchar()不起作用 
        puts("Continue?ENTER to yes or input no to exit");//是否繼續錄入 
    }while(getchar()=='\n'); 
 

//更新 
void update(StudentList *&stuList) 

    StudentList *p = stuList->next; 
    char no[4];//3位學號,如用戶輸入4~位學號,這裡關於越界的問題,大家自己處理 
    fflush(stdin);//還是先清空緩沖區 
    puts("please input student No: "); 
    gets(no); 
    //顯示當前學號的學生數據 
    if(p==NULL) 
    { 
        puts("there is no record,please insert!!"); 
        puts("press any key to return!!!"); 
        getchar(); 
        return; 
    } 
    else 
    { 
        while(p!=NULL) 
        { 
            if(!strcmp(p->no,no)){//如果查找到,則進行顯示 
                puts("NO\tNAME\tChinese\tMath\tEnglish"); 
                printf("%s\t%s\t%d\t%d\t%d\n",p->no,p->name,p->chinese,p->math,p->english); 
                break; 
            } 
            else{ 
                p = p->next; 
            } 
        } 
        if(p==NULL)//未找到 
        { 
            puts("can't find this student's record!!!"); 
            puts("press any key to return!!!"); 
            getchar(); 
            return; 
        } 
    } 
    //只能這樣簡單的更新了,喜歡的自己改進 
    puts("please update student data(Name,Chinese,Math,English):"); 
    scanf("%10s",&p->name); 
    scanf("%d%d%d",&p->chinese,&p->math,&p->english); 
    fflush(stdin); 
    puts("update successful,press any key to return!!!"); 
    getchar(); 

//刪除數據 
void deleteData(StudentList *stuList) 

    /* 前面這個部分和更新差不多,只是指針有變化,因為需要刪除,
        比如 a->b->c,要刪除b,則需要a->c後,才free(b),
        操作就是a->next=b->next
    */ 
    StudentList *p = stuList,*q; 
    char no[4];//3位學號,如用戶輸入4~位學號,這裡關於越界的問題,大家自己處理 
    fflush(stdin);//還是先清空緩沖區 
    puts("please input student No: "); 
    gets(no); 
    //顯示當前學號的學生數據 
    if(p->next==NULL) 
    { 
        puts("there is no record !!!"); 
        puts("press any key to return!!!"); 
        getchar(); 
        return; 
    } 
    else 
    { 
        while(p->next!=NULL) 
        { 
            if(!strcmp(p->next->no,no)){//如果查找到,則進行顯示 
                puts("NO\tNAME\tChinese\tMath\tEnglish"); 
                printf("%s\t%s\t%d\t%d\t%d\n",p->next->no,p->next->name,p->next->chinese,p->next->math,p->next->english); 
                break; 
            } 
            else{ 
                p = p->next; 
            } 
        } 
        if(p->next==NULL)//未找到 
        { 
            puts("can't find this student's record!!!"); 
            puts("press any key to return!!!"); 
            getchar(); 
            return; 
        } 
    } 
    puts("Are you sure delete this record? press ENTER to confirm or other key to cancel!!!"); 
    if(getchar()=='\n')//刪除操作,如果這步不懂,大家可以去GOOGLE OR BAIDU鏈表的刪除操作 
    { 
        q = p->next; 
        p->next = q->next; 
        free(q);//釋放內存 
    } 
    puts("delete successful,press any key to return!!!"); 
    getchar(); 


摘自 mzlqh的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved