プログラミングC: 投稿 13 – 構造のタイプ – 構造体

構造体の型にアクセスするための最も簡単な方法は、生徒の一例です. クラス 100 学生は各学生は、自分の名前と受験番号が含ま. クラスのデータを入力します。. ヘヘ. あなたが使用する方法を考える 2 プレート: 1 配列名, 1 アレイ·学生コード右. 右, その方法がない間違った...しかし、それでは次の要求...完成ティ学期を見てみましょう, 各生徒のスコアを入力してください, 各学生は含まれて 10 被験者 (数学, 信じる, 化学, 物理学,...). Giờ bạn thấy sao nào… Dùng 12 ああ...しませんでした配列, hãy dùng 構造のタイプ. ちょうど型構造 1 プレートのみ.

1. 構造のタイプ

アレイの場合, 多くの情報を保存することができ、同じデータ型を持つ. しかし、このタイプの構造で、私たちは情報複数の異なるデータタイプを格納することができます.

1.1 VD開口部

//code by nguyenvanquan7826
#include <stdio.h>
#include <stdlib.h>

// khai bao struct
struct sinhvien 
{
    char MSV[20]; // ma sinh vien
    char hoten[30]; // ho ten sinh vien
    double toan, tin, anh; // cac diem toan, tin, anh
};

/* Hay thay tat ca fflush(stdin); thanh __fpurge(stdin) khi ban lam tren linux*/

int main() 
{
    /* khai bao 2 bien sv1, sv2 va 1 mang
     * CNPMK10A gom 100 sinh vien
     */
    struct sinhvien sv1, sv2, CNPMK10A[100];

    printf("Nhap du lieu cho sv1:\n");
    printf("MSV: "); fflush(stdin);
    gets(sv1.MSV);
    printf("Ho ten: "); fflush(stdin);
    gets(sv1.hoten);
    printf("Diem toan, tin, anh: "); fflush(stdin);
    scanf("%lf %lf %lf", &sv1.toan, &sv1.tin, &sv1.anh);

    printf("Nhap du lieu cho sv2:\n");
    printf("MSV: "); fflush(stdin);
    gets(sv2.MSV);
    printf("Ho ten: "); fflush(stdin);
    gets(sv2.hoten);
    printf("Diem toan, tin, anh: "); fflush(stdin);
    scanf("%lf %lf %lf", &sv2.toan, &sv2.tin, &sv2.anh);

    printf("\n --------- Thong tin sinh vien -----\n");
    printf("%-20s %-30s %-7s %-7s %-7s\n", "MSV", "Ho ten", "Toan", "Tin", "Anh");
    printf("%-20s %-30s %-7.2lf %-7.2lf %-7.2lf\n", sv1.MSV, sv1.hoten, sv1.toan, sv1.tin, sv1.anh);
    printf("%-20s %-30s %-7.2lf %-7.2lf %-7.2lf\n", sv2.MSV, sv2.hoten, sv2.toan, sv2.tin, sv2.anh);

    return 0;
}

結果:

Nhap du lieu cho sv1:
MSV: DTC1
Ho ten: Pham Thi Ha
Diem toan, tin, anh: 9 9 8
Nhap du lieu cho sv2:
MSV: DTC2
Ho ten: Nguyen Van Quan
Diem toan, tin, anh: 9 9 8

 --------- Thong tin sinh vien -----
MSV                  Ho ten                         Toan    Tin     Anh
DTC1                 Pham Thi Ha                    9.00    9.00    8.00
DTC2                 Nguyen Van Quan                9.00    9.00    8.00

この例の冒頭, chúng ta có rất nhiều điểu phải bàn 🙂

1.2 工事の種類構造, 可変構造を宣言

上記の例として、, 構築する 1 構造の種類我々は構文に従う:

struct TenKieuCauTruc
{
    Khai báo các thành phần của kiểu;
};

非常によく似たスタイルである構造のその後型の後 1 正規型 (int型, フロート, タンク,...) そして私達はちょうど別の変数が終了すると宣言. しかし、変数宣言は、前のstructキーワードに追加する必要があります: (C は必要としないために).

struct TenKieuCauTruc TenBienCauTruc;

さらに、我々はまた、次のように構成された構造と変数宣言のいくつかの種類を構築している:

struct TenKieuCauTruc
{
    Khai báo các thành phần của kiểu;
} danh sách các biến thuộc kiểu cấu trúc;

または

struct
{
    Khai báo các thành phần của kiểu;
} danh sách các biến thuộc kiểu cấu trúc ;

この宣言, とすぐに別の場所で宣言された私たちの構造への構造型名が存在しないような構造で変数を宣言するために必須のことです.
このセクションでは、言及する必要があります 1 重要なキーワード, すなわち typedefで. このキーワードを定義するために使用され 1 新しいデータ型.

typedef struct sinhvien 
{
    char MSV[20]; // ma sinh vien
    char hoten[30]; // ho ten sinh vien
    double toan, tin, anh; // cac diem toan, tin, anh
} kieuSinhVien;

我々はこれを持っている場合 kieuSinhVien た 1 データ型 (int型として, ダブル, ...) 私たちはその構造を通して、変数を宣言することができます. この中で、あなたが注意を払う必要があることがいくつかあります:

  • ととも​​に sinhvien (構造体のタイプは、キーワードstructの後に配置され) このタイプの構造体の変数を宣言するときに我々はまだそれの前に持っている. (最高経営責任者(CEO: SVA sinhvien; -> Sai còn struct sinhvien svA; -> đúng), (C での注意が必要とされていません).
  • ととも​​に kieuSinhVIen このタイプの私達の変数を宣言するとき 構造体を持っていない その前に. (最高経営責任者(CEO: 構造体kieuSinhVIenすべて; -> sai, kieuSinhVIenすべて; -> đúng).

さらに、我々はまた、構造ネストされた宣言を入力することができます: 例えばのように 1 学生の誕生日, 日中の生年月日, 月, 生年.

struct ngaysinh 
{
    int ngay, thang, nam;
}

typedef struct sinhvien 
{
    char MSV[20]; // ma sinh vien
    char hoten[30]; // ho ten sinh vien
    double toan, tin, anh; // cac diem toan, tin, anh
    struct ngaysinh ns;
} kieuSinhVien;

それとも構造内で宣言:

typedef struct sinhvien 
{
    char MSV[20]; // ma sinh vien
    char hoten[30]; // ho ten sinh vien
    double toan, tin, anh; // cac diem toan, tin, anh
    struct ngaysinh 
    {
        int ngay, thang, nam;
    } ns;
} kieuSinhVien;

1.3 構造のコンポーネントへのアクセス

構造のコンポーネントへのアクセスのために我々は、ドットを使用 (.).

TenBienCauTruc.TenThanhPhan;

以下のアクセス上の1例として、:
sv1.hoten; sv1.toan; // 自分の名前へのアクセス, 数学のスコア
sv1.ns.ngay; sv1.ns.thang; // 生年月日と出生の月へのアクセス.
...

アクセス構造体の構成要素になると、各成分は 1 これは、通常の変数で、値を割り当てるか、通常のように、それらに値を入力しますが、我々はまだやる.

また、特定の要素に長い場合は、キーワードを定義し使用して長い行を避けることができます.
たとえば、代わりに書き込み:

sv1.ns.thang;
sv1.ns.nam;

私たちは書く:

#define p sv1.ns
p.thang;
p.nam;

1.4 変数は構造の同じタイプの割り当て

//code by nguyenvanquan7826
#include <stdio.h>
#include <stdlib.h>

struct sinhvien 
{
    char MSV[20]; // ma sinh vien
    char hoten[30]; // ho ten sinh vien
    double toan, tin, anh; // cac diem toan, tin, anh
};

/* Hay thay tat ca fflush(stdin); thanh __fpurge(stdin) khi ban lam tren linux*/

int main() 
{
    /* khai bao 2 bien sv1, sv2 va 1 mang
     * CNPMK10A gom 100 sinh vien
     */
    struct sinhvien sv1, sv2, CNPMK10A[100];

    printf("Nhap du lieu cho sv1:\n");
    printf("MSV: "); fflush(stdin);
    gets(sv1.MSV);
    printf("Ho ten: "); fflush(stdin);
    gets(sv1.hoten);
    printf("Diem toan, tin, anh: "); fflush(stdin);
    scanf("%lf %lf %lf", &sv1.toan, &sv1.tin, &sv1.anh);

    sv2 = sv1; // gan gia tri cua sv1 cho sv2

    printf("\n --------- Thong tin sinh vien -----\n");
    printf("%-20s %-30s %-7s %-7s %-7s\n", "MSV", "Ho ten", "Toan", "Tin", "Anh");
    printf("%-20s %-30s %-7.2lf %-7.2lf %-7.2lf\n", sv2.MSV, sv2.hoten, sv2.toan, sv2.tin, sv2.anh);

    return 0;
}

= SV1 SV2を割り当てた後、SV2 SV1のすべての情報もあります. 加えて、構造の初期値を割り当てることも可能である.

struct sinhvien sv1 = {"ABC", "Nguyen Van Quan", 9, 9, 8, {4, 5, 1992}};

その後、我々は元のデータがSV1である持っている:

MSV: ABC
hoten: Nguyen Van Quan
toan: 9
tin: 9
anh: 8
ngày sinh: 4/5/1992.

2. 配列構造

我々は構造型の基礎や構造のいくつかの例を学ぶ必要が上記のsinhvien. 今、私たちは実行する方法を学ぶ 1 プレート 50 学生 1 クラス構造は、上記のように入力する. 例を考えてみましょう:

//code by nguyenvanquan7826
#include <stdio.h>
#include <stdlib.h>

struct sinhvien 
{
    char MSV[20]; // ma sinh vien
    char hoten[30]; // ho ten sinh vien
    double diemTB; // diem trung binh
    struct ngaysinh 
    {
        int ngay, thang, nam;
    } ns;
};

int main() 
{
    int n = 2, i;
    struct sinhvien CNPMK10A[n];

    for (i = 0; i < n; i++) 
    {
        #define sv CNPMK10A[i]
        printf("Nhap du lieu cho sinh vien thu %d:\n", i + 1);
        printf("MSV: "); fflush(stdin)
        gets(sv.MSV);
        printf("Ho ten: "); fflush(stdin);
        gets(sv.hoten);
        printf("Diem TB: "); fflush(stdin)
        scanf("%lf", &sv.diemTB);
        printf("Ngay sinh: ");
        scanf("%d/%d/%d", &sv.ns.ngay, &sv.ns.thang, &sv.ns.nam);
    }   

    printf("\n --------- Thong tin sinh vien -----\n");
    printf("%-20s %-30s %-7s %-10s\n", "MSV", "Ho ten", "Diem Tb", "Ngay sinh");
    for (i = 0; i < n; i++) 
    {
        #define sv CNPMK10A[i]
        printf("%-20s %-30s %-7.2lf %02d/%02d/%4d\n", sv.MSV, sv.hoten, sv.diemTB, sv.ns.ngay, sv.ns.thang, sv.ns.nam);
    }
    return 0;
}

結果:

Nhap du lieu cho sinh vien thu 1:
MSV: DTC1
Ho ten: Pham Thi Ha
Diem TB: 9.2
Ngay sinh: 21/01/1993
Nhap du lieu cho sinh vien thu 2:
MSV: DTC2
Ho ten: Nguyen Van Quan
Diem TB: 9.2
Ngay sinh: 31/12/1992

 --------- Thong tin sinh vien -----
MSV                  Ho ten                         Diem Tb Ngay sinh
DTC1                 Pham Thi Ha                    9.20    21/01/1993
DTC2                 Nguyen Van Quan                9.20    31/12/1992

3. 構造体ポインタ

//code by nguyenvanquan7826
#include <stdio.h>
#include <stdlib.h>

struct sinhvien 
{
    char MSV[20]; // ma sinh vien
    char hoten[30]; // ho ten sinh vien
    double diemTB; // diem trung binh
    struct ngaysinh 
    {
        int ngay, thang, nam;
    } ns;
};

int main() 
{
    int n = 2, i;
    // cap phat bo nho
    struct sinhvien *CNPMK10A = (struct sinhvien*) malloc(n * sizeof(struct sinhvien));

    for (i = 0; i < n; i++) 
    {
        printf("Nhap du lieu cho sinh vien thu %d:\n", i + 1);
        printf("MSV: "); fflush(stdin);
        gets(CNPMK10A[i].MSV);
        printf("Ho ten: "); fflush(stdin);
        gets(CNPMK10A[i].hoten);
        printf("Diem TB: "); fflush(stdin);
        scanf("%lf", &(CNPMK10A+i)->diemTB);
        printf("Ngay sinh: ");
        scanf("%d/%d/%d", &(CNPMK10A+i)->ns.ngay, &(CNPMK10A+i)->ns.thang, &(CNPMK10A+i)->ns.nam);
    }   

    printf("\n --------- Thong tin sinh vien -----\n");
    printf("%-20s %-30s %-7s %-10s\n", "MSV", "Ho ten", "Diem Tb", "Ngay sinh");
    for (i = 0; i < n; i++) 
    {
        #define ns CNPMK10A[i].ns
        printf("%-20s %-30s %-7.2lf %02d/%02d/%4d\n", CNPMK10A[i].MSV, (*(CNPMK10A+i)).hoten, (CNPMK10A+i)->diemTB, ns.ngay, ns.thang, ns.nam);
    }
    return 0;
}

構造上のコンポーネントにアクセス

ポインタ構造を持つデータアクセスコンポーネントを得るために 3 以下:

  • 方法 1: CNPMK10A[で].diemTB;
  • 方法 2: (*(CNPMK10A I)).diemTB;
  • 方法 3: (CNPMK10A I) ->diemTB;

両方 3 方法はDTBにアクセスする必要があります.

我々が持っているアドレスを取得するには 2 から:

  • 方法 1: &CNPMK10A[で].DTB;
  • 方法 2: &(CNPMK10A I)->diemTB