编程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后) 声明这种类型的结构体变量时,我们仍然有在它的前面. (首席执行官: sinhvien看此选手SVA; -> Sai còn struct sinhvien svA; -> đúng), (不需要在C 中的关注).
  • kieuSinhVIen 声明这个类型,我们的变量时 不具有该结构 在它的前面. (首席执行官: 结构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;

随着对下列访问一个例子:
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;
}

分配SV2 = SV1后,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 我)).diemTB;
  • 如何 3: (CNPMK10A 我) ->diemTB;

两 3 方法将有机会获得DTB.

为了让我们的地址 2 从:

  • 如何 1: &CNPMK10A[在].DTB;
  • 如何 2: &(CNPMK10A 我)->diemTB