null结构体结构体C语言第七章结构简介结构简介存储一个班级中 5 名学员的信息(学号、姓名、性别和成绩)问题:I. 使用数组解决
:scorenumsexnameII. 使用多维数组III. 使用结构C 语言引入了称为结构的数据存储方式“结构” 是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。定义结构2-1定义结构2-1
struct structurename
{
datatype variable1;
datatype variable2;
...
};
结构成员{};结构名structstudentint num;char name[20];char sex;定义结构float score;C 语言中的有效数据类型定义结构2-2定义结构2-2struct student
{
int num;
char name[20];
char sex;
float score;
};numnamesexstudent结构定义并不预留内存结构定义放置在程序的开始部分,位于头文件声明之后 score结构定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构变量。声明结构变量声明结构变量声明结构变量I.先定义结构,再声明结构变量II.在定义结构类型的同时声明结构变量III. 直接声明结构变量声明一个类型为 student 结构的变量,将会为该变量分配内存,大小是大于或等于其所有成员变量的大小之和。 嵌套结构嵌套结构struct date
{
int month;
int day;
int year;
};struct{
int num;
char name[20];
char sex;
struct date birthday;
float score;
}student1,student2;
示结构变量成员的一般形式是:结构变量名.成员名
例如:student1.num、student2.sex、student1.birthday.month结构变量初始化结构变量初始化struct student student3={3,"Yao Ming ",'M',90.5}; 3Yao MingM赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构成员数目少。student3.numstudent3.namestudent3.sex90.5student3.score结构变量赋值结构变量赋值student1.num=1;
student1.name="Zhang Zi Liang";
student1.sex=’M’;
printf("请输入成绩:\n");
scanf("%f",&student1.score);1Zhang Zi LiangM用输入语句或赋值语句来给结构变量的各个成员赋值7878student2 = student1; 1Zhang Zi LiangM78使用结构示例使用结构示例问题描述:
根据学员的成绩,输出不及格学员的详细信息。 #include
struct student
{
int num;//学号
char *name;//姓名
char sex;//性别
float score;//成绩
};
void main()
{
static struct student stu1={1,"李亚鹏",'M',61};
static struct student stu2={2,"周晶晶",'F',92.5};
static struct student stu3={3,"姚光明",'M',59};
printf("不及格学员的名单如下:\n");
if(stu1.score<60)
printf("%d\t%s\t%c\t%5.2f\n",stu1.num,stu1.name,stu1.sex,stu1.score);
if(stu2.score<60)
printf("%d\t%s\t%c\t%5.2f\n",stu2.num,stu2.name,stu2.sex,stu2.score);
if(stu3.score<60)
printf("%d\t%s\t%c\t%5.2f\n",stu3.num,stu3.name,stu3.sex,stu3.score);
if(stu1.score>=60 && stu2.score>=60 && stu3.score>=60)
printf("没有不及格的学员。\n");
}不及格学员的名单如下:3 姚光明 M 59.001李亚鹏M782周晶晶F923姚光明M59结构指针变量结构指针变量struct stu *pstu;
(*pstu).num 或者: pstu->num一个指针当用来指向一个结构时, 称之为结构指针变量。
结构指针变量中的值是所指向的结构变量的首地址。
结构指针变量声明的一般形式为:
struct 结构名 *结构指针变量名
通过结构指针可以访问该结构变量的成员,一般形式为:
(*结构指针变量).成员名 或者
结构指针变量->成员名 #include
struct student
{
int num;
char *name;
char sex;
float score;
}stu={1,"张宾",'F',55},*pstu;
void main()
{
pstu=&stu;
printf("学号:%d 姓名:%s\n",stu.num,stu.name);
printf("性别:%c 成绩:%5.2f\n\n",stu.sex,stu.score);
printf("学号:%d 姓名:%s\n",(*pstu).num,(*pstu).name);
printf("性别:%c 成绩:%5.2f\n\n",(*pstu).sex,(*pstu).score);
printf("学号:%d 姓名:%s\n",pstu->num,pstu->name);
printf(“性别:%c 成绩:%5.2f\n\n",pstu->sex,pstu->score);
}学号:1 姓名:张宾
性别:F 成绩:55.00
学号:1 姓名:张宾
性别:F 成绩:55.00
学号:1 姓名:张宾
性别:F 成绩:55.00
Press any key to continue结构数组结构数组struct student
{
int num;
char* name;
char sex;
float score;
}stu[30];元素为结构类型的数组称为结构数组。
在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。例如一个班的学员档案,一个公司的职工档案等。定义了一个结构数组stu1,共有30个元素,stu[0]~stu[29]。每个数组元素都具有struct student的结构形式。结构指针变量结构指针变量问题描述:
求学员的总成绩和平均成绩,并统计不及格人数。 struct student
{
int num;
char *name;
char sex;
float score;
}stu[N]={ {1,"李芳",'F',45},{2,"于红",'F',62.5},{3,"何万山",'M',92.5},
{4,"程亚丽",'M',87},{5,"王明",'M',58}};
void main()
{
int i,count=0;
float ave,sum=0;
for(i=0;i分析:
两个复数a+ib和c+id的和为:
x+iy 其中:x=a+c y=b+d#include
struct complex
{
double re;//实部
double im;//虚部
};
struct complex add(struct complex,struct complex);
void main()
{
struct complex x={6.5,8.9},y={7.1,9.4};
struct complex z;
z=add(x,y);
printf("和为:%5.2lf+i%5.2lf\n",z.re,z.im);
}struct complex add(struct complex a,struct complex b)
{
struct complex c;
c.re=a.re+b.re;
c.im=a.im+b.im;
return c;
}传递结构时不使用 “&”,所以实际上是传值调用,即,将结构变量的每个成员值逐个传送。结构指针做为参数 结构指针做为参数 问题描述:
求已知两个复数的和。
分析:
两个复数a+ib和c+id的和为:
x+iy 其中:x=a+c y=b+dstruct student
{
int num;
char *name;
char sex;
float score;
}stu[N]={{1,"李芳",'F',45},{2,"于红",'F',62.5},
{3,"何万山",'M',92.5},{4,"程亚丽",'M',87},
{5,"王明",'M',58}};
void ave(struct student *ps);
void main()
{
struct student *ps;
ps=stu;
ave(ps);
}用指针变量作函数参数进行传送时由实参传向形参的只是结构的地址。实现堆栈 5-1 实现堆栈 5-1 堆栈是一种先进后出的数据结构。
用堆栈实现简单的行编辑功能,问题描述如下:
接受用户从键盘输入的程序或数据,并存入用户的数据区。由于用户在键盘上进行输入时,不能保证不会出错,因此,需要设立一个输入缓冲区,允许用户输入出差错,并在发现有误时可以及时更正。例如,当用户发现刚刚键入的一个字符错了时,可以补进一个“#”,以表示前一个字符无效;如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符“@”,以表示当前行中的字符均无效。实现堆栈 5-2实现堆栈 5-2使用堆栈实现行编辑功能Whiewhiel##lr#e(s#*s)llre(s*s输出缓冲区(堆栈)中的所有字符,即有效字符:while(*s)outcoutcha@putchar(*s=#++);ha遇到字符@清空缓冲区(堆栈)putchar(*s=++);遇到字符#时,栈顶元素出栈输出缓冲区(堆栈)中的所有字符,即有效字符:putchar(*s++);实现堆栈 5-3实现堆栈 5-3由此可见,需要实现堆栈的以下几个操作:
入栈
出栈
清空栈
显示从栈底到栈顶所有的元素
判断栈是否为空#define m 100
struct Mystack
{
char element[m];
int top;//栈顶
};栈结构void push(struct Mystack *s,char x) /*将x的值压入栈顶*/
{
s->element[s->top]=x;
s->top++;
}入栈操作void pop(struct Mystack *s)
/*将栈顶元素删除*/
{
s->top--;
}出栈操作int IsEmpty(struct Mystack *s)
{
if(s->top==0)
return 1;
else
return 0;
}判断栈是否为空实现堆栈 5-4实现堆栈 5-4void Clearstack(struct Mystack *s
{
s->top=0;
}清空栈void Displaystack(struct Mystack *s)
{
int i;
for(i=0;itop;i++)
printf("%c",s->element[i]);
}显示从栈底到栈顶所有的元素实现堆栈 5-5实现堆栈 5-5void main() {
struct Mystack st;
char ch; int i;
for(i=0;i<100;i++)
st.element[i]='\0';
st.top=0;
printf("请输入一行字符:\n");
ch=getchar();
while(ch!=EOF && ch!='\n'){
switch(ch) {
case '#': if(!IsEmpty(&st)) pop(&st);
break;
case '@': Clearstack(&st); break;
default: push(&st,ch);
}
ch=getchar();
}
printf("有效字符为:\n");
Displaystack(&st);
printf("\n");
}声明栈初始化栈遇到#,如果栈不空,则栈顶元素出栈遇到@,则清空栈既不是#也是@,将字符入栈显示从栈底到栈顶元素,即所有的有效字符main函数