定义结构体数组:结构体数组的定义和引用



单个结构体类型变量在解决实际问题时作用不大般是以结构体类型形式出
结构体类型定义形式为:
structstu/*定义学生结构体类型*/
{
charname[20];/*学生姓名*/
charsex;/*性别*/
longnum;/*学号*/
floatscore[3];/* 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个人填写如下登记表除姓名、学号外还有 3科成绩编程实现对表格计算求解出每个人 3科平均成绩求出 4个学生单科平均并按平均成绩由高分到低分输出

题目要求问题多采用模块化编程方式将问题进行分解如下:
1)结构体类型输入
2)求解各学生 3科平均成绩
3)按学生平均成绩排序
4)按表格要求输出
5)求解组内学生单科平均成绩并输出
6)定义各子
根据具体情况定义结构体类型
structstu
{
charname[20];/*姓名*/
longnumber;/*学号*/
floatscore[4];/*依此存放English、Mathema、Physics及Average*/
};
由于该结构体类型会提供给每个子使用是共用所以将其定义为外部结构体
类型放在最前面
第 2步定义结构体类型输入模块
voidinput(arr,n)/*输入结构体类型arrn个元素*/
structstuarr;
n;
{i,j;
chartemp[30];
for(i=0;i{
prf("\\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);/*输入 3科成绩*/
arr[i].score[j]=atoi(temp);
};
}
}
第 3步求解各学生 3科平均成绩
在结构体类型中第i个元素arr[i]成员score前 3个元素为已知第 4个Average需
计算得到
voidaver(arr,n)
structstuarr;
n;
{
i,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;平/均*成绩*/
}
}



第 4步按平均成绩排序排序算法采用冒泡法
voidorder(arr,n)
structstuarr;
n;
{structstutemp;
i,j,x,y;
for(i=0;i<n-1;i)
for(j=0;j<n-1-i;j)
(arr[j].score[3]>arr[j1].score[3])
{temp=arr[j];/结*构体类型变量不允许以整体输入或输出但允许相互赋值*/
arr[j]=arr[j1];/*进行交换*/
arr[j1]=temp;
}
}
第 5步按表格要求输出
voidoutput(arr,n)/*以表格形式输出有n个元素结构体类型各成员*/
n;
structstuarr;
{i,j;
prf("********************TABLE********************\\n")打;印/表*头*/
prf("----------------------------------------------------\\n");
/*输出条水平线*/
prf("|%10s|%8s|%7s|%7s|%7s|%7s|\\n","Name","Number","English","Mathema",
"physics","average");


/*输出效果为:|Name|Number|English|Mathema|Physics|Average|*/
prf("----------------------------------------------------\\n");
for(i=0;i{
prf("|%10s|%8ld|",arr[i].name,arr[i].number);/*输出姓名、学号*/
for(j=0;j<4;j)
prf("%7.2f|",arr[i].score[j]);/*输出 3科成绩及 3科平均*/
prf("\\n");
prf("---------------------------------------------------\\n");
}
}
第 6步求解组内学生单科平均成绩并输出在输出表格最后输出单科平均成
绩及总平均
voidout_row(arr,n)/*对n个元素结构体类型求单项平均*/
n;
structstuarr;
{
floatrow[4]={0,0,0,0};/*定义存放单项平均*/
i,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;计/*算单项平均*/
}
prf("|c|",’’);按/表*格形式输出*/
for(i=0;i<4;i)
prf("%7.2f|",row[i]);
prf("\\n------------------------------------------\\n");
}
第 7步定义列出完整清单
#
#
structstu
{
charname[20];
longnumber;
floatscore[4];
};

{
voidinput;/*声明*/
voida
ver;
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;
n;
{i,j;
chartemp[30];
for(i=0;i{
prf("\\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;计/*算单项平均*/
}
prf("|c|",’’);按/表*格形式输出*/
for(i=0;i<4;i)
prf("%7.2f|",row[i]);
prf("\\n------------------------------------------\\n");
}



第 7步定义列出完整清单
#
#
structstu
{
charname[20];
longnumber;
floatscore[4];
};

{
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;
n;
{i,j;
chartemp[30];
for(i=0;i{
prf("\\nInputName,Number,English,Mathema,Physic\\n");
gets(arr[i].name);
gets(temp);
arr[i].number=atol(temp);
for(j=0;j<4;j)
prf("%7.2f|",arr[i].score[j]);
prf("\\n");
prf("---------------------------------------------------\\n");
}
}
/*************************************/
voidout_row(arr,n)
n;
structstuarr;
{
floatrow[4]={0,0,0,0};
i,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;
}
prf("|c|",’’);
for(i=0;i<4;i)
prf("%7.2f|",row[i]);


prf("\\n------------------------------------------\\n");
}


中要谨慎处理以名作参数由于名作为首地址在形参和实参结合时传递给子就是首地址形参大小最好不定义以表示和保持在定义结构体内成员score[3]用于表示计算平均成绩也是我们
用于排序依据我们无法用元素进行相互比较而只能用元素成员score[3]进行比较在需要交换时候元素整体包括姓名、学号、 3科成绩及平均成绩进行交换order()比较采用:arr[j].score[3]>arr[j1].score[3]而交换则采用:
arr[j]arr[j1]



指针变量非常灵活方便可以指向任类型变量若定义指针变量指向结构体类型变
则可以通过指针来引用结构体类型变量
7.3.1指向结构体类型变量使用
首先让我们定义结构体:
structstu
{
charname[20];
longnumber;
floatscore[4];
};
再定义指向结构体类型变量指针变量:
structstu*p1,*p2;
定义指针变量p1、p2分别指向结构体类型变量引用形式为:指针变量→成员;
[例7-2]对指向结构体类型变量正确使用输入个结构体类型变量成员并输出
#<stdlib.h>/*使用malloc需要*/
structdata/*定义结构体*/
{
day,month,year;
};
structstu/*定义结构体*/
{
charname[20];
longnum;
structdatabirthday;/嵌*套结构体类型成员*/
};
/*定义*/
{
structstu*student;定/*义结构体类型指针*/
student=malloc((structstu));为/指*针变量分配安全地址*/
prf("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);
prf("\\nOutputname,number,year,month,day\\n");
/*打印输出各成员项值*/
prf("sldd//%d//%d\\n",student->name,student->num,
student->birthday.year,student->birthday.month,
student->birthday.day);
}
中使用结构体类型指针引用结构体变量成员需要通过C提供malloc来为
指针分配安全地址返回值是计算给定数据类型所占内存字节数指针所指
各成员形式为:
student->name
student->num
student->birthday.year
student->birthday.month
student->birthday.day

7.3.2指向结构体类型指针使用
定义个结构体类型名是首地址点前面课程介绍得很清楚
定义结构体类型指针既可以指向元素也可以指向在使用时要加以区分
[例7-3]在例7-2中定义了结构体类型根据此类型再定义结构体及指向结构体类型指针
structdata
{
day,month,year;
};
structstu/*定义结构体*/
{
charname[20];
longnum;
structdatabirthday;/嵌*套结构体类型成员*/
};
structstustudent[4],*p;定/*义结构体及指向结构体类型指针*/
作p=student此时指针p就指向了结构体student
p是指向维结构体指针元素引用可采用 3种思路方法
1)地址法
studenti和pi均表示第i个元素地址元素各成员引用形式为:
(studenti)->name、(studenti)->num和(pi)->name、(pi)->num等studenti和pi
和&student[i]意义相同



2)指针法
若p指向个元素则p就指向其后续元素
3)指针表示法
若p=student我们说指针p指向studentp[i]表示第i个元素其效果和
student[i]等同成员引用描述为:p[i].name、p[i].num等
[例7-4]指向结构体指针变量使用
structdata/*定义结构体类型*/
{
day,month,year;
};
structstu/*定义结构体类型*/
{
charname[20];
longnum;
structdatabirthday;
};

{i;
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*/
prf("\\n1----Outputname,number,year,month,day\\n");
for(i=0;i<4;i)/*采用指针法输出元素各成员*/
prf("sldd//%d//%d\\n",(pi)->name,(pi)->num,
(pi)->birthday.year,(pi)->birthday.month,
(pi)->birthday.day);
}



ay.year,student->birthday.month,


student->birthday.day);
}
中使用结构体类型指针引用结构体变量成员需要通过C提供malloc来为
指针分配安全地址返回值是计算给定数据类型所占内存字节数指针所指
各成员形式为:
student->name
student->num
student->birthday.year
student->birthday.month
student->birthday.day

7.3.2指向结构体类型指针使用
定义个结构体类型名是首地址点前面课程介绍得很清楚
定义结构体类型指针既可以指向元素也可以指向在使用时要加以区分
[例7-3]在例7-2中定义了结构体类型根据此类型再定义结构体及指向结构体类型指针
structdata
{
day,month,year;
};
structstu/*定义结构体*/
{
charname[20];
longnum;
structdatabirthday;/嵌*套结构体类型成员*/
};
structstustudent[4],*p;定/*义结构体及指向结构体类型指针*/
作p=student此时指针p就指向了结构体student
p是指向维结构体指针元素引用可采用 3种思路方法
1)地址法
studenti和pi均表示第i个元素地址元素各成员引用形式为:
(studenti)->name、(studenti)->num和(pi)->name、(pi)->num等studenti和pi
和&student[i]意义相同



2)指针法
若p指向个元素则p就指向其后续元素
3)指针表示法
若p=student我们说指针p指向studentp[i]表示第i个元素其效果和
student[i]等同成员引用描述为:p[i].name、p[i].num等
[例7-4]指向结构体指针变量使用
structdata/*定义结构体类型*/
{
day,month,year;
};
structstu/*定义结构体类型*/
{
charname[20];
longnum;
structdatabirthday;
};

{i;
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*/
prf("\\n1----Outputname,number,year,month,day\\n");
for(i=0;i<4;i)/*采用指针法输出元素各成员*/
prf("sldd//%d//%d\\n",(pi)->name,(pi)->num,
(pi)->birthday.year,(pi)->birthday.month,
(pi)->birthday.day);
}
Tags:  vc结构体数组 结构体数组初始化 结构体数组 定义结构体数组

延伸阅读

最新评论

发表评论