11 结构体
——“我们应该换种角度看世界”
1 为什么使用结构体
思考如何表达班级中的很多学生这个问题,利用数组是常见的方法,但是目前的数组只能支持单一数据类型
假设一个学生有这些需要表达的数据,如姓名、性别和年龄,再假设有三个学生
char names[3][10]={"黎明","胡哥","白雪"};
char sexs[3]={'M','M','F'};
int ages[3]={18,19,16};
# include <stdio.h>
void main()
{
char names[3][10]={"黎明","胡哥","白雪"};
char sexs[3]={'M','M','F'};
int ages[3]={18,19,16};
int i;
for(i=0;i<3;i++)
{
printf("第%d个学生的姓名是:%s,性别是%c,年龄是%d\n",i+1,names[i],sexs[i],ages[i]);
}
}
结构体的表达方法
然而,数组是一种将事物属性割裂开来的数据表达方法
能否有一种可以完整表达学生信息的独立成员实体?
结构体表达方法:
struct student{
char name[10];
char sex;
int age;
};
struct student stus[3]={{"黎明",'M',18},{"胡哥",'M',19},{"白雪",'F',16}};
# include <stdio.h>
struct student{
char name[10];
char sex;
int age;
};
void main()
{
struct student stus[3]={{"黎明",'M',18},{"胡哥",'M',19},{"白雪",'F',16}};
int i;
for(i=0;i<3;i++)
{
struct student stu=stus[i];
printf("第%d个学生的姓名是%s,性别是%c,年龄是%d\n",i+1,stu.name,stu.sex,stu.age);
}
}
2 结构体的定义
更为完整的学生例子
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
# include <stdio.h>
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
void main()
{
struct student student1,student2;
}
三种定义方法
先声明结构体类型再定义变量名
在声明类型的同时定义变量
直接定义结构体类型变量
嵌套的定义方法
struct date
{
int year;
int month;
int day;
};
# include <stdio.h>
struct date
{
int year;
int month;
int day;
};
struct student
{
int num;
char name[20];
char sex;
int age;
struct date birthday;
float score;
char addr[30];
};
void main()
{
struct student student1;
student1.num=1001;
strcpy(student1.name,"黎明");
student1.sex='M';
student1.age=18;
student1.birthday.year=1990;
student1.birthday.month=10;
student1.birthday.day=1;
student1.score=80;
strcpy(student1.addr,"江苏");
printf("学生的姓名是%s\n",student1.name);
printf("学生的生日是%d年%d月%d日\n",student1.birthday.year,student1.birthday.month,student1.birthday.day);
}
3 例子
3.1 投票
直接从书上粘贴进行操作
#include <string.h>
#include <stdio.h>
struct person
{
char name[20];
int count;
};
void main()
{
struct person leader[3]={"Li",0, "Zhang",0, "Fun",0};
int i,j;
char leader_name[20];
for(i=1;i<=10;i++)
{
scanf("%s",leader_name);
for(j=0;j<3;j++)
if(strcmp(leader_name,leader[j].name)==0)
leader[j].count++;
}
printf("\n");
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
}
增加字符大小识别
#include <string.h>
#include <stdio.h>
struct person
{
char name[20];
int count;
};
void main()
{
struct person leader[3]={"li",0, "zhang",0, "fun",0};
int i,j;
char leader_name[20];
for(i=1;i<=10;i++)
{
scanf("%s",leader_name);
for(j=0;j<strlen(leader_name);j++)
{
leader_name[j]=tolower(leader_name[j]);
}
for(j=0;j<3;j++)
if(strcmp(leader_name,leader[j].name)==0)
leader[j].count++;
}
printf("\n");
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
}
增加提示信息
#include <string.h>
#include <stdio.h>
struct person
{
char name[20];
int count;
};
void main()
{
struct person leader[3]={"li",0, "zhang",0, "fun",0};
int i,j;
char leader_name[20];
printf("请按序号投票\n");
for(i=0;i<3;i++)
printf("%d号候选人:%s\n",i+1,leader[i].name);
for(i=1;i<=10;i++)
{
scanf("%d",&j);
leader[j-1].count++;
}
printf("\n");
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
}
增加对无效票的重新统计
#include <string.h>
#include <stdio.h>
struct person
{
char name[20];
int count;
};
void main()
{
struct person leader[3]={"li",0, "zhang",0, "fun",0};
int i,j;
char leader_name[20];
printf("请按序号投票\n");
for(i=0;i<3;i++)
printf("%d号候选人:%s\n",i+1,leader[i].name);
for(i=1;i<=4;i++)
{
scanf("%d",&j);
if(j>=1 && j<=3)
leader[j-1].count++;
else
i--;
}
printf("\n");
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
}
增加任意退出能力
#include <string.h>
#include <stdio.h>
struct person
{
char name[20];
int count;
};
void main()
{
struct person leader[3]={"li",0, "zhang",0, "fun",0};
int i,j;
char leader_name[20];
printf("请按序号投票\n");
for(i=0;i<3;i++)
printf("%d号候选人:%s\n",i+1,leader[i].name);
while(1)
{
scanf("%d",&j);
if(j==0)
break;
if(j>=1 && j<=3)
leader[j-1].count++;
else
i--;
}
printf("\n");
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
}
[此贴子已经被作者于2010-12-13 20:05:32编辑过]