十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。
成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都网站制作、网站建设、外贸网站建设、衡水网络推广、小程序制作、衡水网络营销、衡水企业策划、衡水品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供衡水建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明。
扩展资料:
一、结构体作用:
结构体和其他类型基础数据类型一样,例如int类型,char类型,只不过结构体可以做成你想要的数据类型,以方便日后的使用。
在实际项目中,结构体是大量存在的,研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言内部程序比较简单,研发人员通常使用结构体创造新的“属性”,其目的是简化运算。
结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。
二、结构体的大小与内存对齐:
结构体的大小不是结构体元素单纯相加就行的,因为我们主流的计算机使用的都是32bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。
所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。
程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
三、结构体的规则:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
参考资料来源:百度百科-结构体
分析题意:
一、要定义两个结构体,一个是日期年月日,一个是员工。
二、程序包含三个功能:1、结构数组的输入。2、结构数组的输出。3、统计平均工资。根据编程习惯,三功能要写成独立函数,方便扩展和调用。
ps:员工数量定义成常量,也为编程习惯,便于修改。另外,日期验证我只写了月份检测给你参考。需扩展,自行编写函数验证。
#include stdio.h
#define M 3//最大员工数量
typedef struct date
{
int year;
int month;
int day;
}YMD;
typedef struct employee
{
int id;//工号
char name[20];//姓名
YMD date;//日期
int wage;
}EME;
void inputInfo(EME emes[]);//输入
void outputInfo(EME emes[]);//输出
float getAvg(EME emes[]);//求平均工资
int main()
{
EME emes[M];//员工结构体数组
inputInfo(emes);
outputInfo(emes);
printf("平均工资:%f",getAvg(emes));
return 0;
}
void inputInfo(EME emes[])
{
int i;
for(i=0;iM;i++)
{
printf("请输入员工%d的信息:\n",i+1);
printf("工号:"),scanf("%d",emes[i].id);
printf("姓名:"),scanf("%s",emes[i].name);
printf("日期(分别输入年月日,空格分割):"),scanf("%d%d%d",emes[i].date.year,emes[i].date.month,emes[i].date.day);
if(emes[i].date.month12 || emes[i].date.month=0)//日期输入的验证不通过时,重新输入,验证可单独写函数,这里只做参考!
{
printf("输入日期不符合,请重新输入!\n\n"),i--;
continue;
}
printf("工资:"),scanf("%d",emes[i].wage);
printf("\n");
}
}
void outputInfo(EME emes[])
{
int i;
printf("所有员工的信息为:----------------------------\n");
for(i=0,printf("员工%d的信息:\n",i+1);iM;i++)
{
printf("工号:%d\n",emes[i].id);
printf("姓名:%s\n",emes[i].name);
printf("日期:%04d-%02d-%02d\n",emes[i].date.year,emes[i].date.month,emes[i].date.day);
printf("工资:%d\n",emes[i].wage);
printf("\n");
}
}
float getAvg(EME emes[])
{
int i;
float sum=0;
for(i=0;iM;i++)
sum+=emes[i].wage;
return sum/M;
}
在另外一个函数里面使用的源代码如下:
#include"stdio.h"
#include "conio.h" //-------添加这个头文件,因为getch()函数来自它,否则编译会有警告
struct student /*定义结构体*/
{
void main()
{
void data_in(struct student putin[]);
void data_out(struct student *p);
void data_pout(struct student *s1);
data_in(pers); /*调用指针输入函数*/
data_out(sp); /*调用指针输出函数*/
data_pout(sp); /*调用函数名输出函数*/
getch();
}
扩展资料
1、函数是C语言的基本组成元素,当我们调用一个函数时,需要明确函数名和实参列表。实参列表中的参数可以是常量、变量、表达式或者空,并且各参数之间要使用英文逗号分隔开来。
2、在C语言中,函数的定义是独立的,一个函数不能定义在另一个函数内部。但在调用函数时,可以在一个函数中调用另一个函数,这就是函数的嵌套调用。接下来我们通过一个案例来演示函数的嵌套调用。
# includestdio.h
# includemalloc.h
struct stu //结构体
{
int age;
float score;
char name[100];
};
void shuru (int len, stu * pArr)
{
int i;
for(i = 0; ilen; i++)
{
printf("请输入第%d个学生的信息\n",i+1);
printf("name = ");
scanf("%s",pArr[i].name);
printf("age = ");
scanf("%d", pArr[i].age);
printf("score = ");
scanf("%f", pArr[i].score);
}
return;
}
int main(void)
{
int len ,i;
struct stu * pArr,t;
printf("请输入学生的个数:\n");
printf("人数= ");
scanf("%d",len);
pArr = (struct stu *)malloc(len * sizeof(struct stu));
shuru(len, pArr);
for(i=0; ilen; i++)
{
if(pArr[i].score pArr[i+1].score)
{
t = pArr[i+1];
pArr[i+1] = pArr[i];
pArr[i] = t;
}
}
i =0;
printf("\n\n排序后的学生信息为\n\n");
for(i=0; ilen; i++)
{
printf("name = %s\n",pArr[i].name);
printf("age = %d\n",pArr[i].age);
printf("score = %f\n",pArr[i].score);
printf("\n\n");
}
return 0;
}
这样就行了,你的排序还没实现, 仿照输入的函数实现就OK
以前没考虑过,刚才试了一下可以。不过不知道你说的是哪种定义,是定义一种结构体的类型,还是定义一个结构体的变量。反正下面这个函数是可以用的
void
abc()
{
struct
{
int
a;
int
b;
}dd;
struct
dd;
dd.a=10;
dd.b=20;
}
#include stdio.h
char *SubjectName[] = {"数学","物理","化学","生物","语文","外语","政治","历史","体育","美术","音乐"}; //科目名称列表 可调整顺序
#define SUBJECT 2 //科目数 可设定 1 - 11门,超过11门时得添加上行科目名称列表
#define STUDENTS_MAX 100 //最大可输入的学生数量 根据实际情况调整
typedef struct student{char name[12]; float core[SUBJECT+1];} Student;//最长姓名只许有五个汉字长度,超长会出错 改一下这个名字长度或规定名字最长5个字多余的不输入也成
Student Stu[STUDENTS_MAX]; //结构体数组 全局变量 虽可以不用全局的,要是你自己写了很多函数,都要访问它们,不如就让它们做全局变量的好
void main()
{
int total,i,j,k;
printf("请输入学生总数[1-%d]:",STUDENTS_MAX);
scanf("%d",total);
if(totalSTUDENTS_MAX){printf("超出设计总数了");exit(-1);}
else if(total1){printf("没有学生统计个屁呀"); exit(-1);}
printf("请输入学生成绩,格式:\n\t姓名 ");
for(j=0;jSUBJECT;j++) printf("%s ",SubjectName[j]);
printf("\n");
for(i=0;itotal;i++)
{
Stu[i].core[SUBJECT]=0.0;//平均分
printf("No.%-3d ",i+1);
fflush(stdin); //清输入缓冲区
scanf("%s %f",Stu[i].name,Stu[i].core[0]); //至少有一门科目的
for(j=1;jSUBJECT;j++) //其它科目 定义了多少就输入多少
{
scanf("%f",Stu[i].core[j]);
Stu[i].core[SUBJECT] += Stu[i].core[j];
}
Stu[i].core[SUBJECT] /= SUBJECT; //平均分 只是求了没有输出
}
printf("\n不及格情况统计:\n");
for(k=0,i=0;itotal;i++)
{
char putbuf[128],buf1[5];
int flag = 0;
strcpy(putbuf,Stu[i].name); //记下名字
for(j=0;jSUBJECT;j++)
if(Stu[i].core[j]60)
{
flag++;
strcat(putbuf," ");
strcat(putbuf,SubjectName[j]);//不及格的科目名称
strcat(putbuf,":");
sprintf(buf1,"%4.1f",Stu[i].core[j]);strcat(putbuf,buf1);//分数
}
if(flag)
{
printf("%s %d门不及格\n",putbuf,flag); //有不及格则输出
k++; //统计不及格人数
}
}
if(!k)
printf("没有不及格的学生");
else
printf("有不及格科目的学生个数:%d",k);
}
//常看到有要这类程序的,今天写一个,给大家参考,别天天上来要程序啊,仿照这个自己编吧
//程序在VC7.1下编译通过,测试运行正常