typedef
1.命名规定
习惯上常把用typedef声明的类型名的第1个字母用大写表示,以便与系統提供的标准类型标识符相区别。
2.typedef与#define区别
●与#define不同,typedef 仅限于数据类型,而不是能是表达式或具体的值。
●#define发生在预处理,typedef 发生在编译阶段。
●#define常量起别名(简单的文字替代),typedef 是给类型起别名(满足连续定义)。
3. typedef操作方法
简单地说,就是按定义变最的方式,把变量名换上新类型名,并且在最前面加“typedef' ,就声明了新类型名代表原来的类型。
归纳起来,声明一个新的类型名的方法是:
①先按定义变量的方法写出定义体(如: int i;)。
②将变量名换成新类型名(例如:将i换成Count)。
③在最前面加typedef(例如: typedef int Count)。
④然后可以用新类型名去定义变量。
//普通定义
struct shu
{
int id;
char name[20];
float score;
};
struct shu stu01={1001,"wuzhe",150},stu02;
//取别名定义(简化书写)
typedef struct shu
{
int id;
char name[20];
float score;
}Stu;
Stu stu01={1001,"wuzhe",150},stu02;
4.结构体指针嵌套
#include <stdio.h>
void test1(void)
{
typedef struct
{
int year;
int month;
int day;
}Bir;
typedef struct{
int id;
char name[20];
Bir *p;
}Stu;
Stu stu01={1001,"wuwei"};
Bir bir01={2001,2,29};
stu01.p=&bir01;
printf("%d %s %d-%d-%d\n",stu01.id,stu01.name,\
stu01.p->year,stu01.p->month,stu01.p->day);
}
int main()
{
test1();
return 0;
}
作业
1.对学员进行修改,调换位置,增加,删除
#include <stdio.h>
#include <string.h>
typedef struct
{
int id;
char name[20];
char sex;
float score;
}Stu;
void print(Stu *p,int n)
{
int i;
for(i=0;i<n;i++){
printf("第%d个学生信息为\n",i+1);
printf("%d %s %c %.2f\n",(*(p+i)).id,(*(p+i)).name,(*(p+i)).sex,(*(p+i)).score);
}
}
int fail(Stu *p,int n)
{
int i,ret=0;
for(i=0;i<n;i++){
if((*(p+i)).score<60)
ret++;
}
return ret;
}
void add(Stu *p,int n)
{
*(p+5)=*(p+4);
// num[4]={105,"ma li",'f',20};
(*(p+4)).id=105;
strcpy((*(p+4)).name,"ma li");
(*(p+4)).sex='f';
(*(p+4)).score=20;
}
void del(Stu *p,int n)
{
// num[n-1].id=0;
// strcpy(num[n-1].name," ");
// num[n-1].sex=' ';
// num[n-1].score=0;
memset((void *)(p+n-1),0,sizeof(p[n-1]));
}
int main()
{
Stu stu[6]={{101,"li ping",'m',45}, //根据题意初始化
{102,"zhang ping",'m',62.5},
{103,"he fang",'m',92.5},
{104,"cheng ling",'f',87},
{106,"wang ming",'m',58}};
int n;
Stu *p=stu;
n=fail(p,5);
printf("不及格人数为:%d\n",n);
add(p,6); //在wangming前加一个
print(p,6);
del(p,4); //cheng ling 转学,删除信息
printf("\n");
print(p,6);
return 0;
}
结果为:
2.编写一个程序,完成根据学员姓名查询成绩的功能(要求查询通过函数实现),定义一个学员结构体,包含姓名,成绩,定义一个结构体数组,保存所有学员的信息(假定有3个学生),首先录入学员信息,然后调用查询函数获得要查询学员成绩
#include <stdio.h>
#include <string.h>
typedef struct
{
char name[20];
float score;
}Stu;
void scan(Stu a[],int n)
{
int i;
for(i=0;i<n;i++){
printf("请输入第%d个学员的信息(name score)\n",i);
scanf("%s",&a[i].name);
scanf("%f",&a[i].score);
}
}
int sear(Stu a[],int n)
{
lable:
printf("请输入你要查询的学员\n");
char nam[20];
scanf("%s",&nam);
for(int i=0;i<n;i++){
if(strcmp(nam,(a[i].name))==0){
// printf("log1=%d\n",i);
return i;
}
else{
printf("不存在该学员,请确认学员信息");
goto lable;
}
}
}
void print(Stu a[],int i)
{
printf("name:%s score=%.2f",a[i].name,a[i].score);
}
int main()
{
int num;
Stu a[3];
scan(a,3);
num=sear(a,3);
// printf("log=%d\n",num);
print(a,num);
return 0;
}