学习C语言的第八天

发布时间 2023-04-19 22:47:43作者: 林奇老师

由于个人的拖拉原因,时隔一周继续更新博客,记录学习。

一.结构体

1.1为什么要用结构体

1.2定义一个结构体

  编程习惯要求大写开头

struct Student
    {
        int num;
        char name[32];
        char sex;
        int age;
        double score;
        char addr[32];
    };

1.3成员列表

  也称为域表,每个成员都是结构体中的一个域。

1.4结构体案例

  注意:在声明的同时,定义变量,尽量少用

#include<stdio.h>
#include <string.h> struct Student { int num; char name[32]; char sex; int age; double score; char addr[32]; }; int main() { struct Student stu1; stu1.num = 1; stu1.age = 18; stu1.score = 99.9; strcpy(stu1.name,"zhangchaobo"); strcpy(stu1.addr,"内蒙古"); printf("学号:%d,年龄:%d,分数:%.2f,姓名:%s,地址为:%s",stu1.num,stu1.age,stu1.score,stu1.name,stu1.addr); return 0; }

二.结构体数组

  相当于二维数组,但是数组里的结构类型可以不一样

#include<stdio.h>
#include <string.h>

struct Student
{
    int num;
    char name[32];
    char sex;
    int age;
    double score;
    char addr[32];
};

int main()
{    
    int len;
    int i;
    
    struct Student arr[3] = {
        {2,"张三",'y',18,34,"北京"},
        {3,"李四",'y',15,45,"南京"},
        {4,"王五",'n',17,65,"上海"}
    };
    
    len = sizeof(arr)/sizeof(arr[0]);
    
    for(i=0;i<len;i++){
        printf("学号:%d,年龄:%d,分数:%.2f,姓名:%s,地址为:%s,性别:%c\n",arr[i].num,arr[i].age,arr[i].score,arr[i].name,arr[i].addr,arr[i].sex);    
    }

    return 0;
}

练习题:选票系统

#include<stdio.h>
#include<string.h>

struct XuanMin
{
    char name[32];
    int tickets;
};

int main()
{
    struct XuanMin xm[3];
    int i;
    int len;
    int j;
    
    int total = 5;
    char tmpName[32];
    int mark = 0;
    int qTickets = 0;
    
    len = sizeof(xm)/sizeof(xm[0]);
    for(i=0;i<len;i++){
        xm[i].tickets = 0;
        printf("请输入选民的名字:\n");
        scanf("%s",xm[i].name);
    }
    
    for(i=0;i<total;i++){
        mark = 0;
        printf("请输入你投给谁:\n");
        memset(tmpName,'\0',sizeof(tmpName));
        scanf("%s",tmpName);
        for(j=0;j<len;j++){
            if(strcmp(tmpName,xm[j].name) == 0){
                xm[j].tickets++;
                mark = 1;
            }
        }
        if(mark == 0){
            printf("没有此人,弃票");
            qTickets++;
        }
        
    }
    
    for(i=0;i<len;i++){
        printf("名字:%s,票数:%d \n",xm[i].name,xm[i].tickets);
    }
    
    printf("弃票为:%d",qTickets);
    
    return 0;
}

三.结构体指针

  通过结构体变量地址来访问该结构体需要一个变量来保持这个地址,这和之前说的指针,其实是一样的,只是指针类型的结构体

#include<stdio.h>

struct Test
{
    int idata;
    char cdata;
};

//通过结构体指针访问结构体

int main()
{    
    int a = 5;
    int *pa = &a;
    
    char b = 'b';
    char *pb = &b;
    
    struct Test c = {10,'a'};
    struct Test *pc = &c;
    
    printf("c的idata为:%d\n",c.idata);
    
    printf("pc的idata为:%d\n",pc->idata);

    return 0;
}

引入结构体指针的选票系统

#include<stdio.h>
#include<string.h>

struct XuanMin
{
    char name[32];
    int tickets;
};

int main()
{
    struct XuanMin xm[3];
    struct XuanMin *p = xm;
    int i;
    int len;
    int j;
    
    int total = 5;
    char tmpName[32];
    int mark = 0;
    int qTickets = 0;
    
    len = sizeof(xm)/sizeof(xm[0]);
    for(i=0;i<len;i++){
        p->tickets = 0;
        printf("请输入选民的名字:\n");
        scanf("%s",p->name);
        p++;
    }
    p = xm;
    for(i=0;i<total;i++){
        mark = 0;
        printf("请输入你投给谁:\n");
        memset(tmpName,'\0',sizeof(tmpName));
        scanf("%s",tmpName);
        for(j=0;j<len;j++){
            if(strcmp(tmpName,p->name) == 0){
                p->tickets++;
                mark = 1;
            }
            p++;
        }
        if(mark == 0){
            printf("没有此人,弃票\n");
            qTickets++;
        }
        
        p = xm;
        
    }
    p = xm;
    for(i=0;i<len;i++){
        printf("名字:%s,票数:%d \n",p->name,p->tickets);
        p++;
    }
    
    printf("弃票为:%d",qTickets);
    
    return 0;
}

四.综合函数、结构体、结构体指针的选票系统

#include<stdio.h>
#include<string.h>
#include <stdlib.h>

struct XuanMin
{
    char name[32];
    int tickets;
};

struct XuanMin* initXms(struct XuanMin *p,int *pn)
{
    int i;
    if(p == NULL){
        printf("请输入有几个人参选: \n");
        scanf("%d",pn);
        p = (struct XuanMin*)malloc(*pn*sizeof(struct XuanMin));
    }
    for(i=0;i<*pn;i++){
        p->tickets = 0;
        printf("请输入选民的名字:\n");
        scanf("%s",p->name);
        p++;
    }
    
    return p-*pn;
}

void printXms(struct XuanMin *p,int len)
{
    int i;
    for(i=0;i<len;i++){
        printf("名字:%s,票数:%d \n",p->name,p->tickets);
        p++;
    }
}

int doVot(struct XuanMin *p,int len)
{
    int i;
    int j;
    int mark;
    char tmpName[32];
    struct XuanMin *pbak = p;
    int qTickets = 0;
    
    for(i=0;i<len;i++){
        mark = 0;
        printf("请输入你投给谁:\n");
        memset(tmpName,'\0',sizeof(tmpName));
        scanf("%s",tmpName);
        for(j=0;j<len;j++){
            if(strcmp(tmpName,p->name) == 0){
                p->tickets++;
                mark = 1;
            }
            p++;
        }
        if(mark == 0){
            printf("没有此人,弃票\n");
            qTickets++;
        }
        
        p = pbak;
        
    }
    return qTickets;
}

int main()
{
    struct XuanMin *xm =NULL;
    int total = 0;
    xm = initXms(xm,&total);
    printf("sizeof xms = %d\n",total);
    printXms(xm,total);
    
    int qTickets = doVot(xm,total);
    printf("弃牌数为:%d\n",qTickets);
    printXms(xm,total);
    
    return 0;
}

五.联合体/共用体

5.1定义

  同一个内存空间存放类型不同,不同类型的变量共享一块空间

5.2和结构体的区别  

  结构体元素有各自单独空间,共用体元素共享空间,空间大小由最大类型确定

  结构体元素互不影响 共用体赋值会导致覆盖

#include<stdio.h>
#include<string.h>

struct TestS
{
    int idata;
    char cdata;
    double ddata;
};

union TestU
{
    int idata;
    char cdata;
    double ddata;
};

int main()
{
    struct TestS s1;
    union TestU u1;
    printf("结构体s1的大小是:%d\n",sizeof(s1));
    printf("联合体u1的大小是:%d\n",sizeof(u1));
    return 0;
}

六.枚举类型

6.1什么是枚举类型

  如果一个变量只有集中可能的值
6.2怎么定义枚举类型

  列表中的名字,可以自己定义,无需像变量一样去申请 c编译器把它当成常量处理,也称枚举常量

七.typedef