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;
}