C语言循序渐进之结构体

结构体的定义方式

#include <stdio.h>
#include <string.h>
struct Student        
{
    char name[32];
    int age;
    int score;    
};        //注意添加分号,不加要出问题
int main()
{
    struct Student list;
    struct Student list2 = {"老默",43,89};
    list.age = 12;
    list.score = 88;
    strcpy(list.name,"牛");
    printf("name:%s;age = %d;score = %d\n",list.name,list.age,list.score);
    printf("name:%s;age = %d;score = %d\n",list2.name,list2.age,list2.score);
    return 0;
}    
#include <stdio.h>
#include <string.h>
struct Student        
{
    char name[32];
    int age;
    int score;    
};        //注意添加分号,不加要出问题
int main()
{
    struct Student list;
    struct Student list2 = {"老默",43,89};
    struct Student max;
    list.age = 12;
    list.score = 88;
    strcpy(list.name,"牛");
    max = list;
    if(list.score < list2.score){
        max = list2;
    }
    printf("name:%s;age = %d;score = %d\n",max.name,max.age,max.score);
    return 0;
}    

结构体与数组

#include <stdio.h>
#include <string.h>
struct Student        
{
    char name[32];
    int age;
    float score;    
};        //注意添加分号,不加要出问题
int main()
{
    int i;
    struct Student arr[3] = {{"老默",43,89.6},{"高启强",40,88.8},{"高启盛",38,99.5}};
    int len ;
    len = sizeof(arr) / sizeof(arr[0]);
    for(i = 0; i < len; i++){
        printf("name:%s;age = %d;score = %.2f\n",arr[i].name,arr[i].age,arr[i].score);
    }
    return 0;
}    

选民小练习

#include <stdio.h>
#include <string.h>
struct Student        
{
    char name[32];    //姓名
    int votes;    //得票
};        //注意添加分号,不加要出问题
int main()
{
    int i;
    int j;
    struct Student arr[3];
    struct Student max;
    int len;    //参选人数
    len = sizeof(arr) / sizeof(arr[0]);
    int invalidTicket = 0; //废票
    int mark = 0; //标记
    char name[32] = {'\0'}; //群众想投票给谁
    
    int totalVotes = 5;
    //选民信息登记
    for(i = 0;i < len; i++){
        printf("输入第%d个选民姓名\n",i+1);
        scanf("%s",arr[i].name);
        arr[i].votes = 0;
        //puts('\n');
    }
    //输出竞选信息
    for(i = 0;i < len; i++){
        printf("姓名:%s,票数:%d\n",arr[i].name,arr[i].votes);
    }
    //投票环节
    for(i = 0;i < totalVotes; i++){
        memset(name,'\0',sizeof(name));     //清空姓名
        puts("你心中的人选是:");
        scanf("%s",name);
        mark = 0;
        for(j = 0; j < len;j++){
            if(strcmp(name,arr[j].name) == 0){
                arr[j].votes++;
                mark = 1;
            }
        }
        if(mark == 0){
            puts("输入无效姓名,弃票!");
            //printf("%d\n",invalidTicket);
            invalidTicket++;
        }
     
    }
    //输出结果
    for(i = 0;i < len; i++){
        printf("姓名:%s,票数:%d\n",arr[i].name,arr[i].votes);
    }
    //选出票数最多的
    max = arr[0]; 
    for(i = 0; i < len; i++){
        if(max.votes < arr[i].votes){
            max = arr[i];
        }
    }

    printf("%s以%d票数当选!废票:%d张\n",max.name,max.votes,invalidTicket);

    return 0;
}        

结构体与指针

#include <stdio.h>
#include <string.h>
struct Student        
{
    int data;
    char cdata;
};        //注意添加分号,不加要出问题
int main()
{
    struct Student str1 = {10,'a'};
    struct Student *p;
    p = &str1;
    
    printf("data:%d,cdata:%c\n",str1.data,str1.cdata);
    printf("data:%d,cdata:%c\n",p->data,p->cdata); //指针变量通过"->",来访问
    return 0;
}        

选民--结构体指针

#include <stdio.h>
#include <string.h>
struct Student        
{
    char name[32];    //姓名
    int votes;    //得票
};        //注意添加分号,不加要出问题
int main()
{
    int i;
    int j;
    struct Student arr[3];
    struct Student *p;
    p = arr;
    struct Student max;
    int len;    //参选人数
    len = sizeof(arr) / sizeof(arr[0]);
    int invalidTicket = 0; //废票
    int mark = 0; //标记
    char name[32] = {'\0'}; //群众想投票给谁
    
    int totalVotes = 5;
    //选民信息登记
    for(i = 0;i < len; i++){
        printf("输入第%d个选民姓名\n",i+1);
        scanf("%s",p->name);
        p->votes = 0;
        //puts('\n');
        p++;
    }
    p = arr;
    //输出竞选信息
    for(i = 0;i < len; i++){
        printf("姓名:%s,票数:%d\n",p->name,p->votes);
        p++;
    }
    //投票环节
    p = arr;
    for(i = 0;i < totalVotes; i++){
        memset(name,'\0',sizeof(name));     //清空姓名
        puts("你心中的人选是:");
        scanf("%s",name);
        mark = 0;
        p =arr;
        for(j = 0; j < len;j++){
            if(strcmp(name,p->name) == 0){
                p->votes++;
                mark = 1;
            
            }
            p++;
        }
            
        if(mark == 0){
            puts("输入无效姓名,弃票!");
            //printf("%d\n",invalidTicket);
            invalidTicket++;
        }
     
    }
    //输出结果
    p = arr;
    for(i = 0;i < len; i++){
        printf("姓名:%s,票数:%d\n",p->name,p->votes);
        p++;
    }
    //选出票数最多的
    p = arr;
    max = arr[0]; 
    for(i = 0; i < len; i++){
        if(max.votes < arr[i].votes){
            max = arr[i];
            //p++;
        }
    }

    printf("%s以%d票数当选!废票:%d张\n",max.name,max.votes,invalidTicket);

    return 0;
}        

选民--结构体指针数组函数

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Student        
{
    char name[32];    //姓名
    int votes;    //得票
};        //注意添加分号,不加要出问题
struct Student *initXms(struct Student *p,int *pnumber)
{
    int i;
    struct Student *pback = p;
    if(p == NULL){
        puts("请输入有几个参选人员:");
        scanf("%d",pnumber);
        p = (struct Student *)malloc(*pnumber*sizeof(struct Student));
    }
    for(i = 0;i < *pnumber; i++){
        printf("输入第%d个选民姓名\n",i+1);
        scanf("%s",p->name);
        p->votes = 0;
        //puts('\n');
        p++;
    }
    //p = pback;
    return p-*pnumber;
}
void printfInit(struct Student *p,int number)
{
    int i;
    for(i = 0; i < number; i++){
        printf("姓名:%s,票数:%d\n",p->name,p->votes);
        p++;
    }
    
}
void peopleVots(struct Student *p,int number,int totalVotes,int *invalidTicket )// 选举信息  选举人数  投票人数  废票数量
{
    char name[32] = {'\0'};
    int mark = 0;
    struct Student *pback = p;
    int i;
    int j;
    for(i = 0;i < totalVotes; i++){
        memset(name,'\0',sizeof(name));     //清空姓名
        puts("你心中的人选是:");
        scanf("%s",name);
        mark = 0;
        p =pback;
        for(j = 0; j < number;j++){
            if(strcmp(name,p->name) == 0){
                p->votes++;
                mark = 1;
            
            }
            p++;
        }
            
        if(mark == 0){
            puts("输入无效姓名,弃票!");

            *invalidTicket = *invalidTicket + 1;
            //*invalidTicket++;  //???????????????
            //printf("%d\n",*invalidTicket);
        }
     
    }
    printf("废票:%d\n",*invalidTicket);
    
}
void theElect(struct Student *p,int number,int *invalidTicket)
{
    int i;
    struct Student *max = p;
        struct Student *pback = p;
    for(i = 0; i < number; i++){
        if(max->votes < p->votes){
            max = p;
        }
        p++;
    }
    printf("%s以%d票数当选!废票:%d张\n",max->name,max->votes,*invalidTicket);  
}
int main()
{
    //选民信息登记
    struct Student *xm = NULL;
    int number = 0;
    xm = initXms(xm,&number);
    printfInit(xm,number); //输出信息
    //投票环节
    int totalVotes = 5;
    int invalidTicket = 0;
    peopleVots(xm,number,totalVotes,&invalidTicket);
    printfInit(xm,number); //输出信息
    theElect(xm,number,&invalidTicket);
    return 0;
}        

结构体二级指针

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Student        
{
    char name[32];    //姓名
    int votes;    //得票
};        //注意添加分号,不加要出问题
void initXms(struct Student **p,int *pnumber) //二级指针
{
    int i;
    //struct Student *pback = p;
    if(*p == NULL){
        puts("请输入有几个参选人员:");
        scanf("%d",pnumber);
        *p = (struct Student *)malloc(*pnumber*sizeof(struct Student));
    }
    for(i = 0;i < *pnumber; i++){
        printf("输入第%d个选民姓名\n",i+1);
        scanf("%s",(*p)->name);
        (*p)->votes = 0;
        //puts('\n');
        (*p)++;
    }
    *p = *p - *pnumber;
}
void printfInit(struct Student *p,int number)
{
    int i;
    for(i = 0; i < number; i++){
        printf("姓名:%s,票数:%d\n",p->name,p->votes);
        p++;
    }
    
}
void peopleVots(struct Student *p,int number,int totalVotes,int *invalidTicket )// 选举信息  选举人数  投票人数  废票数量
{
    char name[32] = {'\0'};
    int mark = 0;
    struct Student *pback = p;
    int i;
    int j;
    for(i = 0;i < totalVotes; i++){
        memset(name,'\0',sizeof(name));     //清空姓名
        puts("你心中的人选是:");
        scanf("%s",name);
        mark = 0;
        p =pback;
        for(j = 0; j < number;j++){
            if(strcmp(name,p->name) == 0){
                p->votes++;
                mark = 1;
            
            }
            p++;
        }
            
        if(mark == 0){
            puts("输入无效姓名,弃票!");

            *invalidTicket = *invalidTicket + 1;
            //*invalidTicket++;  //???????????????
            //printf("%d\n",*invalidTicket);
        }
     
    }
    printf("废票:%d\n",*invalidTicket);
    
}
void theElect(struct Student *p,int number,int *invalidTicket)
{
    int i;
    struct Student *max = p;
        struct Student *pback = p;
    for(i = 0; i < number; i++){
        if(max->votes < p->votes){
            max = p;
        }
        p++;
    }
    printf("%s以%d票数当选!废票:%d张\n",max->name,max->votes,*invalidTicket);
    
}
int main()
{
    //选民信息登记
    struct Student *xm = NULL;
    struct Student **pxm = &xm;
    int number = 0;
    initXms(&xm,&number);
    printfInit(xm,number); //输出信息
    //投票环节
    int totalVotes = 5;
    int invalidTicket = 0;
    peopleVots(xm,number,totalVotes,&invalidTicket);
    printfInit(xm,number); //输出信息
    theElect(xm,number,&invalidTicket);
    return 0;
}        

共同体/联合体

#include <stdio.h>
                //注意数据覆盖 
struct TestT
{
    int idata;
    char cdata;
    int ddata;
};


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

int main()
{
    struct TestT t1;
    union  TestU u1;
    
    printf("结构体t1的大小是:%d\n",sizeof(t1));
    printf("联合体u1的大小是:%d\n",sizeof(u1));
    
    t1.idata = 10;
    t1.cdata = 'a';
    t1.ddata = 20;
    
    printf("idata:%p,%d\n",&t1.idata,t1.idata);
    printf("cdata:%p,%d\n",&t1.cdata,t1.cdata);
    printf("ddata:%p,%d\n",&t1.ddata,t1.ddata);
    
    u1.idata = 10;
    u1.ddata = 20;
    u1.cdata = 'a';
    printf("idata = %d\n",u1.idata);
    printf("idata:%p\n",&u1.idata);
    printf("cdata:%p\n",&u1.cdata);
    printf("ddata:%p\n",&u1.ddata);
    
    return 0;
}
#include <stdio.h>

struct Person
{
    char name[32];
    int age;
    char zhiYe;
    char addr[32];
    union {
        int class;
        char keMu[12];
    }mes;
};

int main()
{
    struct Person p[2];
    int i;
    for(i=0;i<2;i++){
        printf("请输入职业:t代表老师,s代表学生\n");
        scanf("%c",&(p[i].zhiYe));
        if(p[i].zhiYe == 's'){
            printf("请输入学生班级:\n");
            scanf("%d",&(p[i].mes.class));
            printf("请输入学生名字:\n");
            scanf("%s",p[i].name);
        }
        else{
            printf("请输入老师的科目:\n");
            scanf("%s",p[i].mes.keMu);
            printf("请输入老师名字:\n");
            scanf("%s",p[i].name);
        }
        getchar();
    }
    for(i=0;i<2;i++){
    
        if(p[i].zhiYe == 's'){
            printf("学生的名字是:%s,班级是%d\n",p[i].name,p[i].mes.class);    
        }
        else{
            printf("老师的名字是:%s,职业是%s\n",p[i].name,p[i].mes.keMu);
        }
    }
    return 0;
}

typedef

#include <stdio.h>
typedef unsigned int u8;    //将已有的名新增一个名字
typedef int u16 ;
typedef int arr[10];

struct Test
{
    int data;
    int data2;
};

typedef struct Test T; 

typedef struct
{
    int data1;
    int data;   
}Demo;
void printInfo(T t)
{
    printf("%d ",t.data);
}
int main()
{
    arr a;
    a[0] = 10;
    printf("%d\n",a[0]);
    
    struct Test t1;
    t1.data = 100;
    printf("%d ",t1.data);
    
    T t2;
    t2.data = 1000;
    printInfo(t2);
    
    Demo d;
    d.data1 = 999;
    printf("%d ",d.data1);
    return 0;
}
#include <stdio.h>

typedef struct
{
    int num;
    char name[32];
    char sex;
}Person,*pPerson;

void printInfo(Person p)
{
    printf("%d号姐姐:%s %c\n",p.num,p.name,p.sex);
}

void printInfo3(Person *p)
{
    printf("%d号姐姐:%s %c\n",p->num,p->name,p->sex);
}
void printInfo2(pPerson pp)
{
    printf("%d号姐姐:%s %c\n",pp->num,pp->name,pp->sex);
}

int main()
{
    Person p1 = {1,"高启强",'g'};
    Person p2 = {2,"高启盛",'g'};
    printInfo(p1);
    printInfo(p2);
    
    pPerson pp1 = &p1;
    pPerson pp2 = &p2;
    printInfo2(pp1);
    printInfo2(pp2);
    
    
    Person *pp3 = &p1;
    Person *pp4 = &p2;
    printInfo3(pp3);
    printInfo3(pp4);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值