原文章链接(写的相当详细)http://c.biancheng.net/cpp/biancheng/view/172.html
1.结构体的作用:结构体是用来存储多个数据变量时用到的,通过结构体可以实现数据变量在全局范围内的所有函数中的使用。
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
但现在问题来了,我们不可能只有一个学生,必定是有很多学生的,这就得使用数组,两这一组合就形成了结构体数组。
结构体数组与以前介绍过的普通数值型数组的不同之处在于:每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项。
2.有三种不同的写法,下面一一介绍:
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
Student stu[3];
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu[3];
struct
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu[3];
3.结构体的初始化
作为一个高素质的程序员,必须养成定义变量要初始化的习惯。
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu[3]={
{10101,"Li Lin", 'M', 18,87.5, "103 Beijing Road"},
{10102,"Zhang Fun",'M',19,99, "130 Shanghai Road"},
{10104,"Wang Min",'F', 20,78.5, "1010 Zhongshan Road"}
};
定义数组stu时,也可以不指定元素个数,即写成以下形式:
stu[ ]={{…},{…},{…}};
编译时,系统会根据给出初值的结构体常量的个数来确定数组元素的个数。一个结构体常量应包括结构体中全部成员的值。
当然,数组的初始化也可以用以下形式:
Student stu[ ]={{…},{…},{…}}; //已事先声明了结构体类型Student
由上可以看到,结构体数组初始化的一般形式是在所定义的数组名的后面加上 ={初值表列};
4.结构体的易错处:
cout<<stu[i].age; 这种可以,
但cout<<stu[i];这种直接输出一整个结构体的会报错,原因就是类型转换。
想要输出一整个结构体只能一个变量一个变量的输出
for(int i=0;i<3;i++){
cout<<stu[i].addr<<endl;
cout<<stu[i].age<<endl;
cout<<stu[i].name<<endl;
cout<<stu[i].num<<endl;
cout<<stu[i].score<<endl;
cout<<stu[i].sex<<endl;
}
5.结构体存储数据时string和字符数组的效率比较
例题:对候选人得票的统计程序。设有3个候选人,最终只能有1人当选为领导。今有10个人参加投票,从键盘先后输入这10个人所投的候选人的名字,要求最后输出这3个候选人的得票结果。
(i)字符数组
#include <iostream>
using namespace std;
struct Person
{
char name[20];
int count;
};
int main( )
{
Person leader[3]={"Li",0,"Zhang",0,"Fun",0};
int i,j;
char leader_name[20];
for(i=0;i<10;i++)
{
cin>>leader_name;
for(j=0;j<3;j++)
if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;
}
cout<<endl;
for(i=0;i<3;i++)
{
cout<<leader[i].name<<":"<<leader[i].count<<endl;
}
return 0;
}
(ii)string
#include <iostream>
#include <string>
using namespace std;
struct Person
{
string name;
int count;
};
int main( )
{
Person leader[3]={"Li",0,"Zhang",0,"Fun",0};
int i,j;
string leader_name;
for(i=0;i<10;i++)
{
cin>>leader_name;
for(j=0;j<3;j++)
if(leader_name==leader[j].name) leader[j].count++
}
cout<<endl;
for(i=0;i<3;i++)
{
cout<<leader[i].name<<":"<<leader[i].count<<endl;
}
return 0;
}
总结:运行情况与前相同。显然后一个程序(使用string的)更节省内存空间,使用更方便,易读性更好。但是 有些C++系统不能对包含string成员的结构体变量初始化,需要作一些修改才能运行, 读者可上机试一下。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)