C语言08 结构体 下

1.选民系统3之二级指针

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct XuanMin
{
	char name[32];
	int tickets;
};

void initXms(struct XuanMin **pxm,int *pt)
{

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

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

int doVot(struct XuanMin *p,int len)
{
	int i;
	int j;
	int feiPiao=0;
	int mark;
	char tmpName[32];
	struct XuanMin *pbak=p;
	for(i=0;i<5;i++){
		
	mark=0;
	puts("input you like name:");
	memset(tmpName,'\0',sizeof(tmpName));
	scanf("%s",&tmpName);
	p=pbak;
	for(j=0;j<len;j++) {
		if(strcmp(tmpName,p->name)==0){
			p->tickets++;
			mark=1;
		}
		p++;
	}
	if(mark==0)
	{
	printf("error!\n");
	feiPiao++;
	}
	}
	return feiPiao;
}

struct XuanMin* getMax(struct XuanMin *p,int len)
{
	struct XuanMin *max;
	int i;
	
	max=p;
	
	for(i=0;i<len;i++){
		if(max->tickets<p->tickets){
			max=p;
		}
		p++;
	}
	return max;
}
int main(){
	struct XuanMin *xm=NULL;
	struct XuanMin *final;
	int total=0;
	
	
	initXms(&xm,&total);
	printXms(xm,total);
	
	int fp=doVot(xm,total);
	printf("feipiao=%d\n",fp);
	printXms(xm,total);
	
	final=getMax(xm,total);
	printf("max=%s,tickets=%d,feipiao=%d",final->name,final->tickets,fp);
	return 0;
}

2.联合体和结构体

#include<stdio.h>

struct TestT
{
	int idata;
	int cdata;
	int ddata;
};

union TestU
{
	int idata;
	int 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=%p,%d\n",&u1.idata,u1.idata);
	printf("cdata=%p,%d\n",&u1.cdata,u1.cdata);
	printf("ddata=%p,%d\n",&u1.ddata,u1.ddata);
	return 0;
} 

在这里插入图片描述

结构体每个变量都有单独的地址,联合体是多个数据功能公用一个空间,空间的大小取决于变量里数据的最大长度。
注意:联合体的数据覆盖问题。

3.联合体应用例题
在这里插入图片描述

#include<stdio.h>

struct Person
{
	char name[32];
	int age;
	char zhiYe;
	char addr[32];
	union D{
		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;
}

4.枚举类型
适用情况:如果一个变量只有几种可能的值,比如星期几son mon tus wed thu fri sat

#include<stdio.h>

enum WeekDay
{
	son,mon,tus,wed,thu,fri,sat
}w1,w2;
int main()
{
	enum WeekDay w;
	w=mon;
	printf("w=%d\n",w);
	return 0;
}

5.typedef的使用
作用:给已经有的变量类型起名字。

#include<stdio.h>

typedef int zhengshu;
typedef char zifu; 
typedef double xiaoshu;

struct Test
{
	int data;
	int data2;
};

typedef struct Test T;

typedef struct
{
	int data1;
	int data2;
}Demo;

void printInfo(T t){
	printf("%d",t.data);
}
int main()
{
	zhengshu a=10;
	printf("a=%d\n",a);
	xiaoshu b=0.0001;
	printf("b=%f\n",b);
	zifu c='c';
	printf("c=%c\n",c);
	
	T t2;
	t2.data=1000;
	printInfo(t2);
	
	Demo d;
	d.data1=999;
	printf("%d ",d.data1);
	return 0;
}

6.typedef应用

#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 printInfo2(pPerson pp)
{
	printf("%d号:%s,%c\n",pp->num,pp->name,pp->sex);
}

void printInfo2(pPerson *p)
{
	printf("%d号:%s,%c\n",p->num,p->name,p->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);
	
	pPerson *pp1=&p1;
	pPerson *pp2=&p2;
	printInfo3(pp1);
	printInfo3(pp2);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若木空灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值