C语言:结构体

目录

什么是结构体?

结构体和数组的区别

结构体的使用

先定义结构体类型,再定义结构体变量

结构体的初始化及访问

结构体综合应用:选票系统

什么是结构体?

    首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在我们实际应用中,每一种变量进行一次声明,再结合起来显然是不太实际的,类如一位学生的信息管理,他可能有,姓名(char),学号(int)成绩(float)等多种数据。如果把这些数据分别单独定义,就会特别松散、复杂,难以规划,因此我们需要把一些相关的变量组合起来,以一个整体形式对对象进行描述,这就是结构体的好处。

结构体和数组的区别

    数组是存储同一类型的数据(都是int,都是char),结构体是存储不同类型的数据,比如定义一个结构体struct student,学生包含名字,学号,分数等不同类型的数据

结构体的使用

先定义结构体类型,再定义结构体变量

 struct   student //结构体类型 或 结构体名
{       
 int num;
 char  name[20];     //结构体成员
 int age; 
 };


int main()
{
    struct student stu1,stu2;       //结构体变量

    return 0;
};

结构体的初始化及访问

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


//定义结构体
struct Student
{
	char name[32];
	int num;
};



int main()
{
	//struct Student stu1 = {"xiaowang", 20};		//结构体赋值方法一
	
	
	struct Student stu1; 			//结构体赋值方法二
	strcpy(stu1.name,"xioazhou");
	stu1.num = 16;
	
	
	/*
	//结构体赋值方法三
	struct Student stu1;
	stu1 = (struct Student){"xiaowang", 20};
	*/
	
	printf("名字:%s,学号:%d \n",stu1.name, stu1.num);		//结构体的访问
}


注意:

▶只有结构体变量才分配地址,而结构体的定义是不分配空间的

▶结构体中各成员的定义和之前的变量定义一样,但在定义时也不分配空间

▶结构体变量的声明需要在主函数之上或者主函数中声明,如果在主函数之下则会报错

结构体综合应用:选票系统

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


//定义结构体
struct Xuanmin
{
	char name[32];
	int tickets;
};

//初始化选民,函数指针,返回一个指针
 struct Xuanmin* initXm(struct Xuanmin *p, int *pn)	
{
	
	int i = 0;
	
	if(p == NULL)
	{
		printf("请输入有几个人参选\n");
		scanf("%d", pn);
		p =(struct Xuanmin *) malloc(*pn * sizeof(struct Xuanmin));	//开辟空间选民个数 * 结构体
	}
	
	for(i; i <* pn; i++)
	{
		printf("请输入第%d个选民的名字:\n",i+1);
		scanf("%s",p->name);
		p->tickets = 0;
		p++;	//地址递加偏移
	}
	return p-*pn;	//操作的事是首地址,所以返回首地址,减去偏移量
	
}


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




int doVot(struct Xuanmin *p,int len)
{
	int i;
	int j;
	char tmpname[32];
	int feiPiao = 0;
	
	struct Xuanmin * pbak = p;

	for(i=0;i<5;i++)			//5个投票人投票
	{
		int mark = 0;
		printf("请输入你投给谁: \n");
		memset(tmpname, '\0', sizeof(tmpname));

		scanf("%s",tmpname);

		p = pbak;

		for(j=0;j<len;j++)		//拿到名字对应候选人加票
		{
			//printf("%s,%s \n",tmpname,p->name);
			if(strcmp(tmpname, p->name) == 0)
			{
				p->tickets++;
				mark++;
			}
			
			p++;
		}
		
		if(mark == 0)
		{
			printf("没有此候选人,放弃\n");
			feiPiao++;
		}


	
	}
	
	return feiPiao;
}


int main()
{
	struct Xuanmin *pxm = NULL;
	int total = 0;
	pxm = initXm(pxm, &total);		//初始选民
	
	printf("选民个数%d \n",total);
	print(pxm,total);		//打印

	
	int feiPiao = doVot(pxm, total);	//选民开始选票
	printf("废票数是:%d \n",feiPiao);
	
	print(pxm,total);
	
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值