程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Demo_張仕傳_結構體考試-modify

Demo_張仕傳_結構體考試-modify

編輯:關於C語言

/*
        題目:
        //聲明一個結構體類型
        struct _AdvTeacher
        {
            char    *name;
            char    *tile;
            int        age;
            char    *addr;
            char    *p1; //系統預留成員域
            char    **p2;//系統預留成員域
        };
        要求定義一個結構體數組(6個元素),要求從鍵盤輸入數據,並按照名稱大小進行排序;打印輸出。
            1、    打印結構體數組,需要單獨封裝成函數;10
            2、    排序結構體數組,需要單獨封裝成函數(按照名稱進行排序);50
            3、    main函數中編寫業務測試模型;40

            2014-04-22 19:59:31
            wirting by zhangshichuan.
*/
#include <iostream>

using namespace std;

#define  StructArrarySize 3               // 老師數量                         
#define  StudentNum 1                     // 每位老師的學生的數量             

typedef struct _AdvTeacher
{
    char    *name;
    char    *tile;
    int        age;
    char    *addr;
    char    **student;
}AdvTeacher;
                                                          
int CreateStructArray(AdvTeacher **, int, int);            //客戶端初始化結構體數組
int FreeStructArray(AdvTeacher **, int, int);              //客戶端釋放結構體數組內存
int PrintStructArray(AdvTeacher*, int, int);              //客戶端打印結構體數組元素
int SortStructArray(AdvTeacher*, int);                    //客戶端對結構體數組元素排序

int main(void)
{
    int rv = 0;
    AdvTeacher * t = NULL;
    
    rv = CreateStructArray(&t, StructArrarySize, StudentNum);    //被調函數分配內存,甩出來
    if (rv != 0)
    {
        printf("func: CreateStructArray() _%d_error_\n ", rv);
        goto End;
    }

    for (int i = 0; i < StructArrarySize; ++i)                   // 客戶端初始化賦值
    {
        printf("請輸入第%d位老師的姓名: ", i+1);
        scanf("%s", t[i].name);
        printf("請輸入第%d位老師的年齡: ", i+1);
        scanf("%d", &(t[i].age));
        printf("請輸入第%d位老師的職務: ", i+1);
        scanf("%s", t[i].tile);
        printf("請輸入第%d位老師的地址: ", i+1);
        scanf("%s", t[i].addr);
        for (int j = 0; j < StudentNum; ++j)
        {
            printf("請輸入第%d位老師的第%d位學生的姓名: ", i+1, j+1);
            scanf("%s", t[i].student[j]);
        }
    }

    printf("排序前:\n");
    rv = PrintStructArray(t, StructArrarySize, StudentNum);     // 打印
    if (rv != 0)
    {
        printf("func: PrintStructArray() _%d_error_\n ", rv);
        goto End;
    }

    rv = SortStructArray(t, StructArrarySize);      // 排序
    if (rv != 0)
    {
        printf("func: SortStructArray() _%d_error_\n ", rv);
        goto End;
    }

    printf("排序後:\n");
    rv = PrintStructArray(t, StructArrarySize, StudentNum);     // 打印
    if (rv != 0)
    {
        printf("func: PrintStructArray() _%d_error_\n ", rv);
        goto End;
    }

End:
    rv = FreeStructArray(&t, StructArrarySize, StudentNum);
    if (rv != 0)
    {
        printf("致命錯誤: FreeStructArray()執行失敗!\n _%d_error_\n", rv);
    }


    system("pause");
    return rv;
}

// 創建結構體數組
int CreateStructArray(AdvTeacher **t, int structArrarySize, int studentNum)
{
    int rv = 0;
    if (NULL == t)
    {
        rv = -1;
        return rv;
    }
    
    AdvTeacher * temp = NULL;

    temp = (AdvTeacher *)malloc(structArrarySize * sizeof(AdvTeacher));
    if (NULL == temp)
    {
        rv = -2;
        return rv;
    }

    for (int i = 0; i < structArrarySize; ++i)
    {
        temp[i].name = (char *)malloc(256 * sizeof(char));
        temp[i].addr = (char *)malloc(256 * sizeof(char));
        temp[i].tile = (char *)malloc(256 * sizeof(char));

        if (NULL == temp[i].name || NULL ==temp[i].addr || NULL == temp[i].tile)
        {
            rv = -3;
            return rv;
        }

        temp[i].student = (char **)malloc(studentNum * sizeof(char *));
        if (NULL == temp[i].student)
        {
            rv = -4;
            return rv;
        }
        for (int j = 0; j < studentNum; ++j)                                  //創建學生內存塊
        {
            (temp[i].student)[j] = (char *)malloc(256 * sizeof(char));
            if (NULL == (temp->student)[j])
            {
                rv = -5;
                return rv;
            }
        }
    }

    *t = temp;

    return rv;
}

// 銷毀結構體數組
int FreeStructArray(AdvTeacher **t, int structArrarySize, int studentNum)
{
    int rv = 0;
    AdvTeacher *temp = *t;

    for (int i = 0; i < structArrarySize; ++i)
    {
        for (int j = 0; j < studentNum; ++j)                               // 銷毀學生內存塊
        {
            if (NULL != temp[i].student[j])
            {
                free(temp[i].student[j]);
            }
        }

        if (NULL != temp[i].addr && NULL != temp[i].name && NULL != temp[i].tile && NULL != temp[i].student)
        {
            free(temp[i].addr);
            free(temp[i].name);
            free(temp[i].tile);
            free(temp[i].student);
        }
    }

    if (NULL != temp)
    {
        free(temp);
        *t = NULL; //間接賦值  通過*(實參的地址), 去間接修改實參的值 為null
    }
    
    return rv;
}

// 打印結構體數組
int PrintStructArray(AdvTeacher*t, int structArrarySize, int studentNum)
{
    int rv = 0;
    if (NULL == t)
    {
        rv = -1;
        return rv;
    }

    AdvTeacher *temp = t;

    for (int i = 0; i < structArrarySize; ++i)
    {
        printf("第%d位老師的姓名為:%s \n", i + 1, temp[i].name);
        printf("第%d位老師的年齡為:%d \n", i + 1, (temp[i].age));
        printf("第%d位老師的職務為:%s \n", i + 1, temp[i].tile);
        printf("第%d位老師的地址為:%s \n", i + 1, temp[i].addr);
        for (int j = 0; j < studentNum; ++j)
        {
            printf("第%d位老師的第%d位學生的姓名為:%s\n", i + 1, j + 1, temp[i].student[j]);
        }
    }

    return rv;
}
// 排序結構體數組
int SortStructArray(AdvTeacher*t, int structArrarySize)
{
    int rv = 0;
    if (NULL == t)
    {
        rv = -1;
        return rv;
    }
    AdvTeacher *temp = t;

    for (int i = 0; i < structArrarySize; ++i)
    {
        for (int j = i + 1; j < structArrarySize; ++j)
        {
            if (0 > strcmp(temp[i].name, temp[j].name))
            {
                AdvTeacher tmp = temp[i];
                temp[i] = temp[j];
                 temp[j] = tmp;
            }
        }
    }

    return rv;
}

 

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