为什么用结构体?整合不同数据类型在一起
定义一个结构体
1告知系统是一个结构体struct
命名习惯大写开头
大括号外面要加;
他是一个模板,一般 不被赋值
一般长这样
struct Student
{
int num;
char name[32];
char sex;
int age;
double score;
char addr[32];
};
它的每一个成员是结构体中的一个域,也称为域表
用它
#include <stdio.h>
#include <string.h>
struct Student
{
int num;
char name[32];
char sex[1];
int age;
double score;
char addr[32];
};
int main()
{
int a;
struct Student stu1;
stu1.num = 1;
stu1.age = 10;
stu1.score = 99.5;
strcpy(stu1.name,"andy");
strcpy(stu1.sex,"男");
strcpy(stu1.addr,"北京");
printf("stu1:学号:%d 姓名:%s 性别:%s 年龄:%d 成绩:%.1f 地址:%s\n"
,stu1.num,stu1.name,stu1.sex,stu1.age,stu1.score,stu1.addr);
}
或者
struct Student
{
int num;
char name[32];
char sex;
int age;
double score;
char addr[32];
};
int main()
{
struct Student stu2 = {2,"sirry",'g',12,65.3,"湖南"};
printf("stu2:学号:%d 姓名:%s 性别:%c 年龄:%d 成绩:%.1f 地址:%s\n"
,stu2.num,stu2.name,stu2.sex,stu2.age,stu2.score,stu2.addr);
}
输出成绩高的那一个
#include <stdio.h>
#include <string.h>
struct Student
{
int num;
char name[32];
char sex;
int age;
double score;
char addr[32];
};
int main()
{
int a;
struct Student stu1 = {1,"andy",'b',10,62.6,"北京"};
struct Student stu2 = {2,"sirry",'g',12,65.3,"湖南"};
struct Student max;
max = stu1;
if(stu1.score<stu2.score){
max = stu2;
}
printf("stu1:学号:%d 姓名:%s 性别:%c 年龄:%d 成绩:%.1f 地址:%s\n"
,max.num,max.name,max.sex,max.age,max.score,max.addr);
}
结构体与数组
#include <stdio.h>
#include <string.h>
struct Student
{
int num;
char name[32];
char sex;
int age;
double score;
char addr[32];
};
int main()
{
int arr[3] = {1,2,3};
int i;
int len;
struct Student arr2[3] = {
{1,"anndy",'b',12,65.3,"湖南"},
{2,"sirry",'g',13,75,"北京"},
{3,"danne",'b',15,99.5,"深圳"}};
len = sizeof(arr2)/sizeof(arr2[0]);
for(i=0;i<len;i++){
printf("stu1:学号:%d 姓名:%s 性别:%c 年龄:%d 成绩:%.1f 地址:%s\n",
arr2[i].num,arr2[i].name,arr2[i].sex,arr2[i].age,arr2[i].score,arr2[i].addr);
}
return 0;
}
选票系统
#include <stdio.h>
#include <string.h>
struct Xuanmin
{
char name[32];
int tickets;
};
int main()
{
int i;
int j;
int len;
struct Xuanmin xm[3];
struct Xuanmin Max;
char tmpName[32];
int mark = 0;
int qipiao = 0;
int total = 5;
//初始化选民信息
len = sizeof(xm)/sizeof(xm[0]);
for(i=0;i<len;i++){
xm[i].tickets = 0;
printf("请输入第%d个选民的名字:\n",i+1);
scanf("%s",xm[i].name);
}
//唱票环节
for(i=0;i<total;i++){
mark = 0;
printf("请输入你要投给谁:\n");
memset(tmpName,'\0',sizeof(tmpName));//每次清空一下
scanf("%s",tmpName);
for(j=0;j<len;j++){//拿到名字,对应候选人票数+1
if(strcmp(tmpName,xm[j].name)==0){
xm[j].tickets++;
mark = 1;
}
}
if(mark==0){
printf("没有此候选人,弃票\n");
qipiao++;
}
}
//公布结果
for(i=0;i<len;i++){
printf("候选人:%s 票数:%d\n",xm[i].name,xm[i].tickets);
}
printf("弃票数:%d\n",qipiao);
//最高票数获得者
Max = xm[0];
for(i=1;i<len;i++){
if(Max.tickets<xm[i].tickets){
Max = xm[i];
}
}
printf("%s以%d票当选!!!\n",Max.name,Max.tickets);
return 0;
}
指针变量引入
结构体也是变量,也可以通过变量名和地址访问
struct Test t1;
struct Test* ps = &t1;
通过指针访问结构体
struct Test t1 = {'c',18};//类型、名、值、地址
struct Test* ps = &t1;
printf("t1的idata值是:%d\n",t1.idata);//变量名访问
printf("t1'的idata值是:%d\n",ps->idata);//指针访问
#include <stdio.h>
#include <string.h>
struct Student
{
int num;
char name[32];
char sex;
int age;
double score;
char addr[32];
};
int main()
{
int i;
int len;
struct Student arr2[3] = {
{1,"anndy",'b',12,65.3,"湖南"},
{2,"sirry",'g',13,75,"北京"},
{3,"danne",'b',15,99.5,"深圳"}};
len = sizeof(arr2)/sizeof(arr2[0]);
struct Student* p;
p = arr2;
for(i=0;i<len;i++){
printf("stu1:学号:%d 姓名:%s 性别:%c 年龄:%d 成绩:%.1f 地址:%s\n",p->num,p->name,p->sex,p->age,p->score,p->addr);
p++;
}
return 0;
}
改写选票系统
#include <stdio.h>
#include <string.h>
struct Xuanmin
{
char name[32];
int tickets;
};
int main()
{
int i;
int j;
int len;
struct Xuanmin xm[3];
struct Xuanmin Max;
struct Xuanmin* p = xm;
char tmpName[32];
int mark = 0;
int qipiao = 0;
int total = 5;
//初始化选民信息
len = sizeof(xm)/sizeof(xm[0]);
for(i=0;i<len;i++){
p->tickets = 0;
printf("请输入第%d个选民的名字:\n",i+1);
scanf("%s",p->name);
p++;
}
p = xm;//指针归位
//唱票环节
for(i=0;i<total;i++){
mark = 0;
printf("请输入你要投给谁:\n");
memset(tmpName,'\0',sizeof(tmpName));//每次清空一下
scanf("%s",tmpName);
for(j=0;j<len;j++){//拿到名字,对应候选人票数+1
if(strcmp(tmpName,p->name)==0){
p->tickets++;
mark = 1;
}
p++;
}
if(mark==0){
printf("没有此候选人,弃票\n");
qipiao++;
}
p = xm;
}
//公布结果
for(i=0;i<len;i++){
printf("候选人:%s 票数:%d\n",p->name,p->tickets);
p++;
}
printf("弃票数:%d\n",qipiao);
//最高票数获得者
p = xm;
Max = xm[0];
for(i=1;i<len;i++){
if(Max.tickets < p->tickets){
Max = xm[i];
}
p++;
}
printf("%s以%d票当选!!!\n",Max.name,Max.tickets);
return 0;
}
当指针遍历完后下次使用之前一定记得归位
结合数组函数继续改进
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Xuanmin
{
char name[32];
int tickets;
};
struct Xuanmin* initXms(struct Xuanmin* p,int* pn)
{
int i;
if(p==NULL){
printf("请输入有几个候选人:\n");
scanf("%d",pn);
p = (struct Xuanmin*)malloc(*pn * sizeof(struct Xuanmin));
}
for(i=0;i<*pn;i++){
p->tickets = 0;
printf("请输入第%d个选民的名字:\n",i+1);
scanf("%s",p->name);
p++;
}
return p-*pn;
}
void printXms(struct Xuanmin* p,int len)
{
int i;
for(i=0;i<len;i++){
printf("候选人:%s 票数:%d\n",p->name,p->tickets);
p++;
}
}
int doVot(struct Xuanmin* p,int len)
{
int i;
int j;
int mark;
char tmpName[32];
struct Xuanmin* pbak = p;
int qipiao = 0;
for(i=0;i<5;i++){
mark = 0;
printf("请输入你要投给谁:\n");
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("没有此候选人,弃票\n");
qipiao++;
}
}
return qipiao;
}
struct Xuanmin* getMax(struct Xuanmin* p,int len)
{
int i;
struct Xuanmin* max;
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;
xm = initXms(xm,&total);
int qip = doVot(xm,total);
printf("弃票数:%d\n",qip);
printXms(xm,total);
final = getMax(xm,total);
printf("最终%s以%d票当选!!!\n",final->name,final->tickets);
return 0;
}
结构体二级指针
#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;
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个选民的名字:\n",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("候选人:%s 票数:%d\n",p->name,p->tickets);
p++;
}
}
int doVot(struct Xuanmin* p,int len)
{
int i;
int j;
int mark;
char tmpName[32];
struct Xuanmin* pbak = p;
int qipiao = 0;
for(i=0;i<5;i++){
mark = 0;
printf("请输入你要投给谁:\n");
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("没有此候选人,弃票\n");
qipiao++;
}
}
return qipiao;
}
struct Xuanmin* getMax(struct Xuanmin* p,int len)
{
int i;
struct Xuanmin* max;
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);
int qip = doVot(xm,total);
printf("弃票数:%d\n",qip);
printXms(xm,total);
final = getMax(xm,total);
printf("最终%s以%d票当选!!!\n",final->name,final->tickets);
return 0;
}
共用体
与结构体的区别:结构体的元素有各自的内存空间,共用体元素空间共享,空间大小由最大的类型确定;结构体元素互不影响,共用体赋值会被覆盖。
struct TestT
{
int idata;
char cdata;
double ddata;
};
union TestU
{
int idata;
char cdata;
double ddata;
};
int main()
{
struct TestT t1;
union TestU u1;
printf("结构体t1的大小是:%d\n",sizeof(t1));
printf("共用体u1的大小是:%d\n",sizeof(u1));
return 0;
}
结构体t1的大小是:16
共用体u1的大小是:8
应用
#include <stdio.h>
struct Person
{
char name[32];
int age;
char job;
char addr[32];
union{
int class;
char course[12];
}mes;
};
int main()
{
struct Person p[2];
int i;
for(i=0;i<2;i++){
printf("请输入职业:(t代表老师,s代表学生)\n");
scanf("%c",&(p[i].job));
if(p[i].job=='s'){
printf("请输入学生班级:\n");
scanf("%d",&(p[i].mes.class));
printf("请输入学生名字:\n");
scanf("%s",&(p[i].name));
}else{
printf("请输入老师科目:\n");
scanf("%s",&(p[i].mes.course));
printf("请输入老师名字:\n");
scanf("%s",&(p[i].name));
}
getchar();
}
for(i=0;i<2;i++){
if(p[i].job=='s'){
printf("学生的名字:%s,班级:%d\n",p[i].name,p[i].mes.class);
}else{
printf("老师的名字:%s,职业:%s\n",p[i].name,p[i].mes.course);
}
}
return 0;
}
枚举类型
一个变量只有几种可能的值,例如星期几,也称枚举常量,
enum WeekDay{sun,mon,tus,wed,tur,fri,sat};
enum WeekDay w;
w = wed;
printf("w=%d\n",w);
>>>w=3
#include <stdio.h>
enum WeekDay{sun = 7,mon,tus,wed,tur,fri,sat};
int main()
{
enum WeekDay w;
w = wed;
printf("w=%d\n",w);
return 0;
}
>>>w=10
一般不这样
typedef
给已有的变量类型重新取名
#include <stdio.h>
typedef int zhengshu;
typedef char zifu;
typedef double xiaoshu;
int main()
{
zhengshu a = 10;
printf("a=%d\n",a);
return 0;
}
struct Test
{
int data;
};
typedef struct Test T;
int main()
{
T t1;
t1.data = 1000;
printf("t1=%d\n",t1.data);
return 0;
}
简洁
typedef struct
{
int data1;
}D;
int main()
{
D d1;
d1.data1=159;
printf("d1=%d\n",d1.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;
}