单个的结构体类型变量在解决实际问题时作用不大,一般是以结构体类型数组的形式出 财软联盟 fs119.net
现。结构体类型数组的定义形式为:
structstu/*定义学生结构体类型*/
{
charname[20];/*学生姓名*/
charsex;/*性别*/
longnum;/*学号*/
floatscore[3];/*三科考试成绩*/
};
structstustud[20];定/*义结构体类型数组stud,*/
/*该数组有20个结构体类型元素*/
其数组元素各成员的引用形式为:
stud[0].name、stud[0].sex、stud[0].score[i];
stud[1].name、stud[1].sex、stud[1].score[i];
...
...
stud[19].name、stud[19].sex、stud[19].score[i];
[例7-1]设某组有4个人,填写如下的登记表,除姓名、学号外,还有三科成绩,编程实现对表格的计算,求解出每个人的三科平均成绩,求出四个学生的单科平均,并按平均成绩由高分到低分输出。
题目要求的问题多,采用模块化编程方式,将问题进行分解如下: 财管家园 fs119.net
1)结构体类型数组的输入。
2)求解各学生的三科平均成绩。
3)按学生的平均成绩排序。
4)按表格要求输出。
5)求解组内学生单科平均成绩并输出。
6)定义main()函数,调用各子程序。
第一步,根据具体情况定义结构体类型。
structstu
{
charname[20];/*姓名*/
longnumber;/*学号*/
floatscore[4];/*数组依此存放English、Mathema、Physics,及Average*/
};
由于该结构体类型会提供给每个子程序使用,是共用的,所以将其定义为外部的结构体
类型,放在程序的最前面。
第二步,定义结构体类型数组的输入模块。
voidinput(arr,n)/*输入结构体类型数组arr的n个元素*/
structstuarr[];
intn;
{inti,j;
chartemp[30];
for(i=0;i
printf("\ninputname,number,English,mathema,physic\n");/*打印提示信息*/
gets(arr[i].name);/输*入姓名*/
gets(temp);/输*入学号*/
arr[i].number=atol(temp);
for(j=0;j<3;j)
{
gets(temp);/*输入三科成绩*/
arr[i].score[j]=atoi(temp);
};
}
}
第三步,求解各学生的三科平均成绩。
在结构体类型数组中第i个元素arr[i]的成员score的前三个元素为已知,第四个Average需
计算得到。
voidaver(arr,n)
structstuarr[];
intn;
{
inti,j;
for(i=0;i
arr[i].score[3]=0;
for(j=0;j<3;j)
arr[i].score[3]=arr[i].score[3]arr[i].score[j];求和/*/
arr[i].score[3]=arr[i].score[3]/3;平/均*成绩*/
}
} 财,管家园,fs119.net
财管家园,fs119.net
财软 联盟 fs119.net
财软联盟.fs119.net
第四步,按平均成绩排序,排序算法采用冒泡法。
voidorder(arr,n)
structstuarr[];
intn;
{structstutemp;
inti,j,x,y;
for(i=0;i<n-1;i)
for(j=0;j<n-1-i;j)
if(arr[j].score[3]>arr[j1].score[3])
{temp=arr[j];/结*构体类型变量不允许以整体输入或输出,但允许相互赋值*/
arr[j]=arr[j1];/*进行交换*/
arr[j1]=temp;
}
}
第五步,按表格要求输出。
voidoutput(arr,n)/*以表格形式输出有n个元素的结构体类型数组各成员*/
intn;
structstuarr[];
{inti,j;
printf("********************TABLE********************\n")打;印/表*头*/
printf("----------------------------------------------------\n");
/*输出一条水平线*/
printf("|%10s|%8s|%7s|%7s|%7s|%7s|\n","Name","Number","English","Mathema",
"physics","average");
/*输出效果为:|Name|Number|English|Mathema|Physics|Average|*/
printf("----------------------------------------------------\n");
for(i=0;i
printf("|%10s|%8ld|",arr[i].name,arr[i].number);/*输出姓名、学号*/
for(j=0;j<4;j)
printf("%7.2f|",arr[i].score[j]);/*输出三科成绩及三科的平均*/
printf("\n");
printf("---------------------------------------------------\n");
}
}
第六步,求解组内学生单科平均成绩并输出。在输出表格的最后一行,输出单科平均成
绩及总平均。
voidout_row(arr,n)/*对n个元素的结构体类型数组求单项平均*/
intn;
structstuarr[];
{
floatrow[4]={0,0,0,0};/*定义存放单项平均的一维数组*/
inti,j;
for(i=0;i<4;i)
{
for(j=0;j<n;j)
row[i]=row[i]arr[j].score[i];/*计算单项总和*/
row[i]=row[i]/n;计/*算单项平均*/
}
printf("|c|",'');按/表*格形式输出*/
for(i=0;i<4;i)
printf("%7.2f|",row[i]);
printf("\n------------------------------------------\n");
}
第七步,定义main()函数,列出完整的程序清单。
#include
#include
structstu 财,软联盟,fs119.net
{
charname[20];
longnumber;
floatscore[4];
};
main()
{
voidinput();/*函数声明*/
voidaver();
voidorder();
voidoutput();
voidout_row();
structstustud[4];/*定义结构体数组*/
floatrow[3];
input(stud,4);/*依此调用自定义函数*/
aver(stud,4);
order(stud,4);
output(stud,4);
out_row(stud,4);
}
/****************************/
voidinput(arr,n)
structstuarr[];
intn;
{inti,j;
chartemp[30];
for(i=0;i
printf("\nInputName,Number,English,Mathema,Physic\n");
gets(arr[i].name);
gets(temp);
arr[i].number=atol(temp);
for(i=0;i<4;i)
{
for(j=0;j<n;j)
row[i]=row[i]arr[j].score[i];/*计算单项总和*/
row[i]=row[i]/n;计/*算单项平均*/
}
printf("|c|",'');按/表*格形式输出*/
for(i=0;i<4;i)
printf("%7.2f|",row[i]);
printf("\n------------------------------------------\n");
}
财管,家园,fs119.net
财软.联盟.fs119.net
财.软联盟.fs119.net
财.软联盟.fs119.net财 管家园 fs119.net
第七步,定义main()函数,列出完整的程序清单。
#include
#include
structstu
{
charname[20];
longnumber;
floatscore[4];
};
main()
{
voidinput();/*函数声明*/
voidaver();
voidorder();
voidoutput();
voidout_row();
structstustud[4];/*定义结构体数组*/
floatrow[3];
input(stud,4);/*依此调用自定义函数*/
aver(stud,4);
order(stud,4);
output(stud,4);
out_row(stud,4);
}
/****************************/
voidinput(arr,n)
structstuarr[];
intn;
{inti,j;
chartemp[30];
for(i=0;i
printf("\nInputName,Number,English,Mathema,Physic\n");
gets(arr[i].name);
gets(temp);
arr[i].number=atol(temp);
for(j=0;j<4;j)
printf("%7.2f|",arr[i].score[j]);
printf("\n");
printf("---------------------------------------------------\n");
}
}
/*************************************/
voidout_row(arr,n)
intn;
structstuarr[];
{
floatrow[4]={0,0,0,0}; 财 管家园 fs119.net
inti,j;
for(i=0;i<4;i)
{
for(j=0;j<n;j)
row[i]=row[i]arr[j].score[i];
row[i]=row[i]/n;
}
printf("|c|",'');
for(i=0;i<4;i)
printf("%7.2f|",row[i]);
printf("\n------------------------------------------\n");
}
程序中要谨慎处理以数组名作函数的参数。由于数组名作为数组的首地址,在形参和实参结合时,传递给子程序的就是数组的首地址。形参数组的大小最好不定义,以表示与调用函数的数组保持一致。在定义的结构体内,成员score[3]用于表示计算的平均成绩,也是我们
用于排序的依据。我们无法用数组元素进行相互比较,而只能用数组元素的成员score[3]进行比较。在需要交换的时候,用数组元素的整体包括姓名、学号、三科成绩及平均成绩进行交换。在程序order()函数中,比较采用:arr[j].score[3]>arr[j1].score[3],而交换则采用: 财管.家园.fs119.net
arr[j]arr[j1]
财软联盟 fs119.net
财.管家园.fs119.net
财 软联盟 fs119.net
财软联,盟,fs119.net
财,管家园,fs119.net
指针变量非常灵活方便,可以指向任一类型的变量,若定义指针变量指向结构体类型变
量,则可以通过指针来引用结构体类型变量。
7.3.1指向结构体类型变量的使用
首先让我们定义结构体:
structstu
{
charname[20];
longnumber;
floatscore[4];
};
再定义指向结构体类型变量的指针变量:
structstu*p1,*p2;
定义指针变量p1、p2,分别指向结构体类型变量。引用形式为:指针变量→成员;
[例7-2]对指向结构体类型变量的正确使用。输入一个结构体类型变量的成员,并输出。
#include<stdlib.h>/*使用malloc()需要*/
structdata/*定义结构体*/
{
intday,month,year;
};
structstu/*定义结构体*/
{
charname[20];
longnum;
structdatabirthday;/嵌*套的结构体类型成员*/
};
main()/*定义main()函数*/
{
structstu*student;定/*义结构体类型指针*/
student=malloc(sizeof(structstu));为/指*针变量分配安全的地址*/
财管家 园 fs119.net
printf("Inputname,number,year,month,day:\n");
scanf("%s",student->name);输/*入学生姓名、学号、出生年月日*/
scanf("%ld",&student->num);
scanf("%d%d%d",&student->birthday.year,&student->birthday.month,
&student->birthday.day);
printf("\nOutputname,number,year,month,day\n");
/*打印输出各成员项的值*/
printf("sldd//%d//%d\n",student->name,student->num,
student->birthday.year,student->birthday.month,
student->birthday.day);
}
程序中使用结构体类型指针引用结构体变量的成员,需要通过C提供的函数malloc()来为
指针分配安全的地址。函数sizeof()返回值是计算给定数据类型所占内存的字节数。指针所指
各成员形式为:
student->name
student->num
student->birthday.year
student->birthday.month
student->birthday.day
7.3.2指向结构体类型数组的指针的使用 财软联盟 fs119.net
定义一个结构体类型数组,其数组名是数组的首地址,这一点前面的课程介绍得很清楚。
定义结构体类型的指针,既可以指向数组的元素,也可以指向数组,在使用时要加以区分。
[例7-3]在例7-2中定义了结构体类型,根据此类型再定义结构体数组及指向结构体类型的指针。
structdata
{
intday,month,year;
};
structstu/*定义结构体*/
{
charname[20];
longnum;
structdatabirthday;/嵌*套的结构体类型成员*/
};
structstustudent[4],*p;定/*义结构体数组及指向结构体类型的指针*/
作p=student,此时指针p就指向了结构体数组student。
p是指向一维结构体数组的指针,对数组元素的引用可采用三种方法。
1)地址法
studenti和pi均表示数组第i个元素的地址,数组元素各成员的引用形式为:
(studenti)->name、(studenti)->num和(pi)->name、(pi)->num等。studenti和pi
与&student[i]意义相同。
财管.家园.fs119.net
2)指针法
若p指向数组的某一个元素,则p就指向其后续元素。
3)指针的数组表示法
若p=student,我们说指针p指向数组student,p[i]表示数组的第i个元素,其效果与
student[i]等同。对数组成员的引用描述为:p[i].name、p[i].num等。
[例7-4]指向结构体数组的指针变量的使用。
structdata/*定义结构体类型*/
{
intday,month,year;
};
structstu/*定义结构体类型*/
{
charname[20];
longnum;
structdatabirthday;
};
main()
{inti;
structstu*p,student[4]={{"liying",1,1978,5,23},{"wangping",2,1979,3,14},
{"libo",3,1980,5,6},{"xuyan",4,1980,4,21}};
/*定义结构体数组并初始化*/
p=student;/*将数组的首地址赋值给指针p,p指向了一维数组student*/
printf("\n1----Outputname,number,year,month,day\n");
for(i=0;i<4;i)/*采用指针法输出数组元素的各成员*/
printf("sldd//%d//%d\n",(pi)->name,(pi)->num,
(pi)->birthday.year,(pi)->birthday.month, 财 管家园 fs119.net
(pi)->birthday.day);
}
财.软联盟.fs119.net
财管.家园.fs119.net
Google.cn搜索相关文章:
谷歌中搜索全球网 结构体数组的定义和引用
百度中搜索 结构体数组的定义和引用
谷歌中搜索www.fs119.net 结构体数组的定义和引用
下一篇:结构体类型变量的定义和引用