结构体---C语言下篇--97-110

92 阅读4分钟

结构体

什么是结构体:

结构体(Struct)是C语言中的一种自定义数据类型,用于表示若干个不同数据类型的变量的集合。结构体的定义以关键字“struct”开头,后面紧跟着结构体的名称和一对大括号,大括号内包含若干个成员变量的定义,每个成员变量用“类型 变量名”格式表示,多个成员变量之间用逗号分隔。

上代码:

#include <stdio.h>
#include <string.h>
struct student
{
        
        char name[30];
        char addr[12];
        double score;
        int age;
};

int main()
{
        struct student stu1;
        struct student stu2 = {"smallsanke","新疆",101,24};

        strcpy(stu1.name,"smallsnack");
        strcpy(stu1.addr,"中国");
        stu1.age = 23;
        stu1.score = 100;
        printf("name =%s,age= %d,score= %lf,addr= %s\n", stu1.name, stu1.age,stu1.score,stu1.addr);
         printf("name =%s,age= %d,score= %lf,addr= %s\n", stu2.name, stu2.age,stu2.score,stu2.addr);
return 0;
}

image.png 这两种都是可以的

结构体和数组

上代码

#include <stdio.h>
#include <string.h>
struct student
{
        
        char name[30];
        char addr[12];
        double score;
        int age;
};

int main()
{
        int i;
        struct student a[3] = {
                {"hsakjdh","akjshdkjh",123,234},
                {"hjhsjdh","hjhhkjnkas",342353,2346788},
                {"hjknlzaldkj","sadsa",2645,778}
        };
     for(i = 0; i < 3; i++){
        printf("name =%s,age= %d,score= %lf,addr= %s\n", a[i].name, a[i].age, a[i].score, a[i].addr);
}
return 0;
}

image.png

结构体数组应用之选票系统

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

struct xuanpiao
{
        char name[100];
        int xaunpiao;
};
int main()
{
        //选票人
       struct xuanpiao xm[3];
       int i;
       int j;
       char maxName[100];
       int max;
       char tmpname[32];
       int make;
       for(i = 0; i < 3; i++){
        xm[i].xaunpiao = 0;
        printf("请输入选民\n");
        scanf("%s",xm[i].name);
       }
        //唱票
        
        for(i = 0; i < 5; i++){
                make = 0;
                memset(tmpname, '\0', sizeof(tmpname));
                printf("你想把票投给谁\n");
                scanf("%s",tmpname);
                for(j = 0; j < 3; j++){
                        if(strcmp(tmpname,xm[j].name) == 0){
                                xm[j].xaunpiao++; 
                                make = 1;
                        } 
                }
                if(make == 0){
                                puts("选票无效\n");
                        }
        }

        //打印选票
        for(i = 0;i < 3;i++){
                printf("名字:%s,票数:%d\n",xm[i].name,xm[i].xaunpiao);
        }
        //找出获胜者
        max = xm[0].xaunpiao;
       strcpy(maxName,xm[0].name);
        for(i = 0;i < 3;i++){
                if(max < xm[i].xaunpiao){
                        max = xm[i].xaunpiao;
                        strcpy(maxName,xm[i].name);
                }  
        }   
        printf("获胜者的名字是:%s,票数:%d\n",maxName,max); 
        
        return 0;
}

这个系统可以很好的让你掌握结构体,一定要自己写一遍

结构体的指针

常规操作不能忘,先上废话:

结构体的指针是一个指向结构体的内存地址的指针变量。它可以用于访问结构体变量中的成员,从而实现对结构体变量的操作。通过结构体的指针,我们可以动态地分配和释放结构体内存,可以在函数间传递结构体数据,还可以方便地遍历结构体数组中的所有元素等。使用结构体指针可以更加高效地操作结构体,减少内存拷贝和访问次数,提高程序性能。

上代码 :

#include<stdio.h>
struct Test
{
    int age;
    char name;
};
int main()
{
    struct Test t1;
    struct Test *pa;
    pa = &t1;
}

通过指针使用结构体(看注释)

#include<stdio.h>
#include<string.h>
struct Test
{
    int age;
    char name[32];
};
int main()
{
    struct Test t1;//这里换成a[3]也是一样的,p++记得偏移,第二次使用的时候记得使p回复到初始值。通过for循环遍历。
    struct Test *pa = &t1;
 
    pa->age = 18;
    strcpy(pa->name,"smallsnake");
    printf("我的年龄是:%d,我的名字是:%s\n",pa->age,pa->name);//当使用指针结构体的时候使用"->"作为连接运算符
    printf("我的年龄是:%d,我的名字是:%s\n",t1.age,t1.name);//使用变量名访问时,用"."运算符
    return 0;
}

我们把前面的选票系统重新用指针数组做一遍(看注释啊,太™重要啦)

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

    struct xuanpiao
    {
            char name[100];
            int xaunpiao;
    };
    int main()
    {
            //选票人
           struct xuanpiao xm[3];
           struct xuanpiao *p;//定义结构体指针
           p = xm;
           int i;
           int j;
           char maxName[100];
           int max;
           char tmpname[32];
           int make;
           for(i = 0; i < 3; i++){
            p->xaunpiao = 0;
            printf("请输入选民\n");
            scanf("%s",p->name);
            p++; //不要忘记++
           }
            //唱票
           
            for(i = 0; i < 5; i++){
                 p = xm;//指向初始值的位置很重要
                    make = 0;
                    memset(tmpname, '\0', sizeof(tmpname));
                    printf("你想把票投给谁\n");
                    scanf("%s",tmpname);
                    for(j = 0; j < 3; j++){
                            if(strcmp(tmpname,p->name) == 0){
                                    p->xaunpiao++; 
                                    make = 1;
                            } 
                             p++; 
                    }
                    if(make == 0){
                                    puts("选票无效\n");
                            }
            }
            //打印选票
            p = xm;
            for(i = 0;i < 3;i++){
                    printf("名字:%s,票数:%d\n",p->name,p->xaunpiao);
                    p++;
            }
            //找出获胜者
            p =xm;
            max = p->xaunpiao;
           strcpy(maxName,p->name);
            for(i = 0;i < 3;i++){
                    if(max < p->xaunpiao){
                            max = p->xaunpiao;
                            strcpy(maxName,p->name);
                    }  
                    p++;
            }   
            printf("获胜者的名字是:%s,票数:%d\n",maxName,max); 
            
            return 0;
    }

结构体的指针数组函数总和应用--改写头票系统(牛掰)

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

struct xuanpiao
{
        char name[32];
        int piao;
};

void xuanmin(struct xuanpiao *p,int pl)
{
//初始化选民
        int i;
        for(i = 0; i < pl; i++) {
                puts("请输入参选人姓名\n");
                scanf("%s",p[i].name);
               p[i].piao = 0;
        }
}
void changpiao(struct xuanpiao *p,int pl)
{
//投票环节
        int i;
        int j;
        for(i = 0; i < 5; i++){
                    int make = 0;
                    char tmpname[32];
                    memset(tmpname, '\0', sizeof(tmpname));
                    printf("你想把票投给谁\n");
                    scanf("%s",tmpname);
                    for(j = 0; j < pl; j++){
                            if(strcmp(tmpname,p[j].name) == 0){
                                p[j].piao++; 
                                make = 1;
                            } 
                             
                    }
                    if(make == 0){
                                    puts("选票无效\n");
                            }
            }
}
void shengchu(struct xuanpiao *p,int pl)
{
        //挑选出胜利者
       
            int max;
            int i;
            char maxName[32];
            max = p[0].piao;
           strcpy(maxName,p[0].name);
            for(i = 0;i < pl;i++){
                    if(max < p[i].piao){
                            max = p[i].piao;
                            strcpy(maxName, p[i].name);
                    }  
                   
            }   
            printf("获胜者的名字是:%s,票数:%d\n",maxName,max); 
            
}

int main()
{
        int pl;
        puts("请输入参与选票的人数\n");
        scanf("%d",&pl);

        struct xuanpiao t1[pl];//定义一个变量z
        struct  xuanpiao *pc;//定义一个结构体指针pc指向t1
        pc = t1;
       
       
       
        xuanmin(pc,pl);//初始化选民
        changpiao(pc,pl);//唱票环节
        shengchu(pc,pl); //胜出选手   
            return 0;
    }

联合体

讲解

C语言中的联合体(Union)是一种特殊的数据类型,可以在同一个内存空间中存储不同的数据类型。与结构体类似,但联合体的所有成员都共享同一个内存空间。使用联合体可以方便地处理多种数据类型的变量,但需要注意不同类型的变量共享同一个内存空间可能会导致数据不稳定。 大小取决于联合体内最大的数的

代码

#include <stdio.h>
union TestU
{
    char name;
    float mu;
    int age;
};
struct TestT
{
    char name;
    float mu;
    int age;
};
int main()
{
    struct TestT t1;
    union  TestU u1;
    printf("结构体t1的大小是%d\n",sizeof(t1));
    printf("联合体u1的大小是%d\n",sizeof(u1));
    
    printf("name的地址是%p\n",&t1.name);
    printf("mu的地址是  %p\n",&t1.mu);
    printf("age的地址是%p\n",&t1.age);
    puts("\n");
    printf("name的地址是%p\n",&u1.name);
    printf("mu的地址是  %p\n",&u1.mu);
    printf("age的地址是%p\n",&u1.age);
    return 0;
}

image.png

覆盖问题

9970cb451c0eafd78d36c6ef90cbe13.jpg

038f79f3c5fedbedee6937b04fa52e5.jpg

开发案例

af0a4e42b99359173b261039b3b62d9.jpg

#include <stdio.h>
struct Person {
	char name[32];
	int age;
	char zhiye;
	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));
		getchar();
		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].name);
			printf("请输入的老师所教科目\n");
			scanf("%s",&(p[i].mes.keMu));
			
		}
		
	}
		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;
}

总结

C语言跟新完了 但当中还是有一些 难点 ,总的来说 常回来看看