C结构体应用全攻略——入门、进阶、提高、扩展
在学习结构体之前,你会很自然的想到使用如下的变量来描述:
name, height, weight, strong, modfile。
好了,现在来给Kula和K分别进行描述,你就需要在变量名上加以区分。对于Kula你有了
Kula_name, Kula_height, Kula_weight, Kula_strong, Kula_modfile 对于K,你有了
K_name, K_height, K_weight, K_strong, K_modfile
好,设想你现在要制作KOF2003了,我们需要一个函数根据这些信息在战斗中评价两位选手,这个函数看上去像是这样
int value(char *name, int height, int weight, int strong, char *modfile);
当然在实际测试中一个人物的信息可能不止这几个,也许他有30个之多,我相信你是不会写一个有30个参数的函数的(除非你为Microsoft工作)。更糟糕的是,如果由于版本更新发现30个参数里有15个是多余的,在修改了函数定义之后,你还要修改无数的不只位置函数调用。汗!
现在,结构体来救你了(e文:the struct comes to rescue)。看看如何用结构体定义一个拳皇人物吧。首先我们定义一个结构体类型:
struct FIGHTER {
char *name; /*元素1*/
int height; /*元素2*/
int weight; /*元素3*/
int strong; /*元素4*/
char *modfile; /*元素5*/
};
这个类型叫FIGHTER,他和你用的int在语法上是一样,他们都是类型。正如你使用int声明变量一样,你可以用FIGHTER声明变量。FIGHTER有一些比int 特殊的地方,他是结构体。所以声明变量时,你给跟TC提这件事(在FIGHTER 前加上struct关键词)。声明变量的方法如下:
struct FIGHTER Kula, K, Iori, Athena;
好了,你定义了很多FIGHTER变量。那么如何使用他们呢。对于设置一个人物我们可以这样:
Kula.height = 1.65;
Kula.weight = 49;
Kula.strong = 75;
这里,height,weight,strong是Kula内的元素。这就好像同一规格的不同书包一样。Kula是这种规格书包的一种,而height,weight,strong就是书包里袋子的名称。自然书包K里height袋子和书包Kula里height袋子是两个完全独立的袋子,他们互不干扰。
你注意到了Kula和height之间有一个点,专业一点的称呼叫成员运算符(member operator)。当然我还是叫她"点"。
现在回到value函数的问题,我们不再需要那么多参数了。我们只要
int value(struct FIGHTER fighter);
这样,在评价Kula的时候我们使用的是value(Kula)而不是什么
value(Kula_height, Kula_weight, ......, 汗!);
一定会发现结构对于描述一样带有很多属性的东西有天生的优越性。比如 struct POINT {
int x;
int y;
};
struct RECT {
int left;
int top;
int bottom;
int right;
};
.....
使用结构体编程可以让你尽快熟悉OOP(面向对象程序设计)。
不过,...嘻嘻,你没觉得每次在声明结构体时的语法中有个struct在前面很不爽
struct RECT rt;
我想让他像声明int型一样简单,打个RECT rt就行了那多好。于是你就打了一个
RECT rt;
然后编译器给了一个惊人的回答:
Declaration syntax error 定义语法错误。
希望没有破灭!现在,typedef comes to rescue(c文:typedef来帮忙了)记得我们可以用typedef定义类型别名吧,比如unsigned int太长了,不好打,我们用
typedef unsigned int UINT;
来定义和unsigned int的同义词UINT,这样一来unsigned int a 和 UINT a就是一回事了。现在来看看这个语法结构。
typedef struct POINT PT;
呵呵,看到了吧PT和struct POINT 这么长的一个东西成了同义词了。以后直接用PT就可以了比如struct POINT point就可以用PT point代替了,爽吧!
其实,还有更爽的,我们把typedef和struct定义结合在一起。
typedef struct POINT {
int x;
int y;
} PT;
更简单!这种做法是很多程序里惯用的。当然,我们用更好的方法给变量命名,国际上一般采用这样的命名方法
typedef struct tagPOINT {
int x;
int y;
} POINT;
这样我们就可以直接用 POINT pt1, pt2;定义POINT型的变量了。呵呵看起来是不是和int的语法一样了。
一、结构体入门——定义与成员
1. 结构定义
在C中,结构也是一种数据类型,可以使用结构变量,因此,像其它类型的变量一样,在使用结构变量时要先对其定义。
定义结构变量的一般格式为:
struct 结构名
{
类型变量名;
类型变量名;
...
} 结构变量;
结构名是结构的标识符不是变量名。
类型为第二节中所讲述的五种数据类型(整型、浮点型、字符型、指针型和无值型)。
构成结构的每一个类型变量称为结构成员,它象数组的元素一样,但数组中元素是以下标来访问的,而结构是按变量名字来访问成员的。
下面举一个例子来说明怎样定义结构变量。
struct string
{
char name[8];
int age;
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
} person;
这个例子定义了一个结构名为string的结构变量person,如果省略变量名person,则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义时上例变成:
struct string
{
char name[8];
int age;
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
};
struct string person;
如果需要定义多个具有相同形式的结构变量时用这种方法比较方便,它先作结构说明,再用结构名来定义变量。
例如:
struct string Tianyr, Liuqi, ...;
如果省略结构名,则称之为无名结构,这种情况常常出现在函数内部,用这种结构时前面的例子变成:
struct
{
char name[8];
int age;
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
} Tianyr, Liuqi;
2. 结构成员
结构是一个新的数据类型,因此结构变量也可以象其它类型的变量一样赋值、运算,不同的是结构变量以成员作为基本变量。
结构成员的表示方式为:
结构变量.成员名
如果将"结构变量.成员名"看成一个整体,则这个整体的数据类型与结构中该成员的数据类型相同,这样就可象前面所讲的变量那样使用。
下面这个例子定义了一个结构变量,其中每个成员都从键盘接收数据,然后对结构中的浮点数求和,并显示运算结果,同时将数据以文本方式存入一个名为wage.dat的磁盘文件中。请注意这个例子中不同结构成员的访问。
例1:
#include
main()
{
struct{ /*定义一个结构变量*/
char name[8];
int age;
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
}a;
FILE *fp;
float wage;
char c='Y';
fp=fopen("wage.dat", "w"); /*创建一个文件只写*/ while(c=='Y'||c=='y') /*判断是否继续循环*/ {
printf("\nName:");
scanf("%s", https://www.sodocs.net/doc/7716070054.html,); /*输入姓名*/
printf("Age:");
scanf("%d", &a.wage); /*输入年龄*/
printf("Sex:");
scanf("%d", a.sex);
printf("Dept:");
scanf("%s", a.depart);
printf("Wage1:");
scanf("%f", &a.wage1); /*输入工资*/
printf("Wage2:");
scanf("%f", &a.wage2);
printf("Wage3:");
scanf("%f", &a.wage3);
printf("Wage4:");
scanf("%f", &a.wage4);
printf("Wage5:");
scanf("%f", &a.wage5);
wage=a.wage1+a.wage2+a.wage3+a.wage4+a.wage5;
printf("The sum of wage is %6.2f\n", wage);/*显示结果*/
fprintf(fp, "%10s%4d%4s%30s%10.2f\n", /*结果写入文件*/
https://www.sodocs.net/doc/7716070054.html,, a.age, a.sex, a.depart, wage);
while(1)
{
printf("Continue?
c=getche();
if(c=='Y'||c=='y'||c=='N'||c=='n')
break;
}
}
fclose(fp);
}
二、结构体进阶——数组与指针
结构是一种新的数据类型,同样可以有结构数组和结构指针。
1. 结构数组
结构数组就是具有相同结构类型的变量集合。假如要定义一个班级40个同学的姓名、性别、年龄和住址,可以定义成一个结构数组。如下所示:
struct{
char name[8];
char sex[2];
int age;
char addr[40];
}student[40];
也可定义为:
struct string{
char name[8];
char sex[2];
int age;
char addr[40];
};
struct string student[40];
需要指出的是结构数组成员的访问是以数组元素为结构变量的,其形式为:结构数组元素.成员名
例如:
student[0].name
student[30].age
实际上结构数组相当于一个二维构造,第一维是结构数组元素,每个元素是一个结构变量,第二维是结构成员。
注意:
结构数组的成员也可以是数组变量。
例如:
struct a
{
int m[3][5];
float f;
char s[20];
}y[4];
为了访问结构a中结构变量y[2]的这个变量,可写成
y[2].m[1][4]
2. 结构指针
结构指针是指向结构的指针。它由一个加在结构变量名前的"*"操作符来定义,例如用前面已说明的结构定义一个结构指针如下:
struct string{
char name[8];
char sex[2];
int age;
char addr[40];
}*student;
也可省略结构指针名只作结构说明,然后再用下面的语句定义结构指针。 struct string *student;
使用结构指针对结构成员的访问,与结构变量对结构成员的访问在表达方式
上有所不同。结构指针对结构成员的访问表示为:
结构指针名->结构成员
其中"->"是两个符号"-"和">"的组合,好象一个箭头指向结构成员。例如要给上面定义的结构中name和age赋值,可以用下面语句:
strcpy(student->name, "Lu G.C");
student->age=18;
实际上,student->name就是(*student).name的缩写形式。
需要指出的是结构指针是指向结构的一个指针,即结构中第一个成员的首地址,因此在使用之前应该对结构指针初始化,即分配整个结构长度的字节空间,这可用下面函数完成,仍以上例来说明如下:
student=(struct string*)malloc(size of (struct string));
size of (struct string)自动求取string结构的字节长度,malloc()函数定义了一个大小为结构长度的内存区域,然后将其诈地址作为结构指针返回。
注意:
1. 结构作为一种数据类型,因此定义的结构变量或结构指针变量同样有局部变量和全程变量,视定义的位置而定。
2. 结构变量名不是指向该结构的地址,这与数组名的含义不同,因此若需要求结构中第一个成员的首地址应该是&[结构变量名]。
三、结构体提高——嵌套与位结构
1. 嵌套结构
嵌套结构是指在一个结构成员中可以包括其它一个结构,C 允许这种嵌套。
例如:下面是一个有嵌套的结构
struct string{
char name[8];
int age;
struct addr address;
} student;
其中:addr为另一个结构的结构名,必须要先进行说明,即
struct addr{
char city[20];
unsigned lon zipcode;
char tel[14];
}
如果要给student结构中成员address结构中的zipcode赋值,则可写成: student.address.zipcode=200001;
每个结构成员名从最外层直到最内层逐个被列出,即嵌套式结构成员的表达方式是:
结构变量名.嵌套结构变量名.结构成员名
其中:嵌套结构可以有很多,结构成员名为最内层结构中不是结构的成员名。
2. 位结构
位结构是一种特殊的结构,在需按位访问一个字节或字的多个位时,位结构比按位运算符更加方便。
位结构定义的一般形式为:
struct位结构名{
数据类型变量名: 整型常数;
数据类型变量名: 整型常数;
} 位结构变量;
其中:数据类型必须是int(unsigned或signed)。整型常数必须是非负的整数,范围是0~15,表示二进制位的个数,即表示有多少位。
变量名是选择项,可以不命名,这样规定是为了排列需要。
例如:下面定义了一个位结构。
struct{
unsigned incon: 8; /*incon占用低字节的0~7共8位*/
unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/
unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/
unsigned blink: 1; /*blink占用高字节的第7位*/
}ch;
位结构成员的访问与结构成员的访问相同。
例如:访问上例位结构中的bgcolor成员可写成:
ch.bgcolor
注意:
1. 位结构中的成员可以定义为unsigned,也可定义为signed,但当成员长度为1时,会被认为是unsigned类型。因为单个位不可能具有符号。
2. 位结构中的成员不能使用数组和指针,但位结构变量可以是数组和指针,如果是指针,其成员访问方式同结构指针。
3. 位结构总长度(位数),是各个位成员定义的位数之和,可以超过两个字节。
4. 位结构成员可以与其它结构成员一起使用。
例如:
struct info{
char name[8];
int age;
struct addr address;
float pay;
unsigned state: 1;
unsigned pay: 1;
}workers;
上例的结构定义了关于一个工从的信息。其中有两个位结构成员,每个位结构成员只有一位,因此只占一个字节但保存了两个信息,该字节中第一位表示工人的状态,第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。
四、结构体扩展——联合体
联合也是一种新的数据类型,它是一种特殊形式的变量。
联合说明和联合变量定义与结构十分相似。其形式为:
union 联合名{
数据类型成员名;
数据类型成员名;
...
} 联合变量名;
联合表示几个变量公用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。
下例表示说明一个联合a_bc:
union a_bc{
int i;
char mm;
};
再用已说明的联合可定义联合变量。
例如用上面说明的联合定义一个名为lgc的联合变量,可写成:
union a_bc lgc;
在联合变量lgc中,整型量i和字符mm公用同一内存位置。
当一个联合被说明时,编译程序自动地产生一个变量,其长度为联合中最大的变量长度。
联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,但定义为指针时,也要用"->"符号,此时联合访问成员可表示成:联合名->成员名
另外,联合既可以出现在结构内,它的成员也可以是结构。
例如:
struct{
int age;
char *addr;
union{
int i;
char *ch;
}x;
}y[10];
若要访问结构变量y[1]中联合x的成员i,可以写成:
y[1].x.i;
若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成: *y[2].x.ch;
若写成"y[2].x.*ch;"是错误的。
结构和联合有下列区别:
1. 结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员,而结构的所有成员都存在。
2. 对于联合的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值是互不影响的。
下面举一个例了来加对深联合的理解。
例2:
main()
{
union{ /*定义一个联合*/
int i;
struct{ /*在联合中定义一个结构*/
char first;
char second;
}half;
}number;
number.i=0x4241; /*联合成员赋值*/
printf("%c%c\n", number.half.first, mumber.half.second);
number.half.first='a'; /*联合中结构成员赋值*/
number.half.second='b';
printf("%x\n", number.i);
getch();
}
输出结果为:
AB
6261
从上例结果可以看出:当给i赋值后,其低八位也就是first和second的值;当给first和second赋字符后,这两个字符的ASCII码也将作为i的低八位和高八位。
有了以上的基础,下面的内容(按C++语法写的)就比较好消化吸收了!!
C/C++中的结构体
什么是结构体?
简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同。
定义结构体使用struct修饰符,例如:
struct test
{
float a;
int b;
};
上面的代码就定义了一个名为test的结构体,它的数据类型就是test,它包含两个成员a和b,成员a的数据类型为浮点型,成员b的数据类型为整型。
由于结构体本身就是自定义的数据类型,定义结构体变量的方法和定义普通变量的方法一样。
test pn1;
这样就定义了一test结构体数据类型的结构体变量pn1,结构体成员的访问通过点操作符进行,pn1.a=10就对结构体变量pn1的成员a进行了赋值操作。
注意:结构体生命的时候本身不占用任何内存空间,只有当你用你定义的结构体类型定义结构体变量的时候计算机才会分配内存。
结构体,同样是可以定义指针的,那么结构体指针就叫做结构指针。
结构指针通过->符号来访问成员,下面我们就以上所说的看一个完整的例子:
#include
#include
using namespace std;
struct test//定义一个名为test的结构体
{
int a;//定义结构体成员a
int b;//定义结构体成员b
};
void main()
{
test pn1;//定义结构体变量pn1
test pn2;//定义结构体变量pn2
pn2.a=10;//通过成员操作符.给结构体变量pn2中的成员a赋值
pn2.b=3;//通过成员操作符.给结构体变量pn2中的成员b赋值
pn1=pn2;//把pn2中所有的成员值复制给具有相同结构的结构体变量pn1
cout< cout< test *point;//定义结构指针 point=&pn2;//指针指向结构体变量pn2的内存地址 cout< point->a=99;//通过结构指针修改结构体变量pn2成员a的值 cout< cout< cin.get(); } 总之,结构体可以描述数组不能够清晰描述的结构,它具有数组所不具备的一些功能特性。 下面我们来看一下,结构体变量是如何作为函数参数进行传递的。 #include #include using namespace std; struct test { char name[10]; float socre; }; void print_score(test pn)//以结构变量进行传递{ cout< } void print_score(test *pn)//一结构指针作为形参{ cout< void main() { test a[2]={{"marry",88.5},{"jarck",98.5}}; int num =sizeof(a)/sizeof(test); for(int i=0; i { print_score(a[i]); } for(int i=0; i 《高级语言程序设计》实验报告实验序号:8 实验项目名称:结构体 附源程序清单: 1. #include for(i=1;i<=5;i++) stu[i].aver_score=((stu[i].score[1]+stu[i].score[2]+stu[i].score[3])/3); printf("平均成绩:"); for(i=1;i<6;i++) printf("第%d个同学的平均成绩%f:\n",i,stu[i].aver_score); printf("\n"); }; void max() { int i,k=0; float temp=stu[1].aver_score; for(i=2;i<=5;i++) if(stu[i].aver_score>temp) {temp=stu[i] .aver_score;k=i;}; printf("成绩最好的同学:\n"); printf("%d %s %s %4.2f %4.2f %4.2f %4.2f\n", stu[k].num,stu[k].name,stu[k].classname,stu[k].score[1],stu[k].score[2],stu[k].score[3],stu[k].aver _score); }; void main() { input(); averagescore(); max(); } 2.#include C语言结构体习题及答 案 集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289- 第9章结构体 1.定义以下结构体类型 struct s { int a; char b; float f; }; 则语句printf("%d",sizeof(struct s))的输出结果为【】。 A) 3 B) 7 C) 6 D) 4 2.当定义一个结构体变量时,系统为它分配的内存空间是【】A)结构中一个成员所需的内存容量 B)结构中第一个成员所需的内存容量 C)结构体中占内存容量最大者所需的容量 D)结构中各成员所需内存容量之和 3.定义以下结构体类型 struct s { int x; float f; }a[3]; 语句printf("%d",sizeof(a))的输出结果为【】 A) 4 B) 12 C) 18 D) 6 7.定义以下结构体类型 struct student { char name[10]; int score[50]; float average; }stud1; 则stud1占用内存的字节数是【】。 A) 64 B) 114 C) 228 D) 7 9、设有一结构体类型变量定义如下: struct date { int year; int month; int day; }; struct worklist { char name[20]; char sex; struct date birthday; } person; 若对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。。。。 《标准C语言程序设计》上机报告实验八结构体程序设计 专业:电子信息工程 班级:电信1301 学号:U201313480 姓名:秦行 完成日期:2014/6/9 一、实验目的: 1、掌握结构体类型的说明和结构体变量的定义; 2、掌握结构体变量成员的引用和对结构体变量的初始化; 3、掌握结构体数组及结构体指针变量的定义及使用。 4、理解并掌握结构体在函数间的传递; 5、进一步掌握复杂程序编译、连接和调试的技巧。 二、实验内容及要求(鼓励一题多解) ——以下均要求不得使用全局变量: 1 (1)、正确定义该表格内容要求的数据类型; (2)、分别输入各成员项数据,并打印输出(为简便起见,假设只有3名考生)。#include { struct student tester[N]; int i; for(i=0;i 1、当说明一个结构体变量时系统分配给它的内存是A A)各成员所需内存量的总和 B)结构中第一个成员所需内存量 C)成员中占内存量最大者所需的容量 D)结构中最后一个成员所需内存量 2、以下对结构体类型变量td的定义中,错误的是C A)typedef struct aa {int n; fliat m; }AA; AA td; B)struct aa {int n; fliat m; }; struct aa td; C)struct yy {int n; float m; }aa; Struct yy td; D)struct yy { int n; float m; }td; 3、下列程序的输出结果是B struct abc { int a, b, c; }; main() { struct abc s[2]={{1,2,3},{4,5,6}}; int t; t=s[0].a+s[1].b; printf("%d \n",t); } A)5 B)6 C)7 D)8 4、设有如下说明A typedef struct yy { int n; char c; double x;}STD; 则以下选项中,能正确定义结构体数组并赋初值的语句是 A)STD tt[2]={{1,'A',62},{2, 'B',75}}; B)STD tt[2]={1,"A",62},{2, "B",75}; C)struct yy tt[2]={{1,'A'},{2, 'B'}}; D)struct yy tt[2]={{1,"A",62.5},{2,"B",75.0}}; 5、在32位IBM-PC机上使用C语言,若有如下定义 struct data { int i; char ch[8]; double f; }b; 则结构变量b占用内存的字节数是C A)13 B)8 C)16 D)24 c语言结构体程序设计心得体会 C语言是在国内外广泛使用的一种计算机语言。下面是为大家准备的,希望大家喜欢! 范文1 学习C语言已经一年多,对C也算得上半个入门者,期间也写过一些自娱自乐的代码。其实个人认为无论学习什么语言,最重要的是掌握习编程思想,然而C语言一种学习编程思想的基础语言。所以,C语言的重要性不言而喻。 一、课本 无论用的是什么书,要学好C语言,把书上的每一个例题、习题的代码读懂,这是学C最基本的要求。弄懂每一章的内容是什么?在C语言中有什么用?并尝试修改每一个例题的代码,采用不同的代码来实现题目的要求。 二、课堂 在每一节课上,注意老师讲的内容,有的知识,老师稍微提点,你就能弄懂,但是自己看书,或许你几天也弄不懂。老师更能清晰地让你明白所要求掌握的知识点。在课堂上,尽可能多的在草稿纸上写下你自己的代码,让老师看或是自己上机调试。 三、笔记 无论学习什么知识,笔记是重点,俗话说:好记性不如烂笔头。一个认真学习的人,总是记了很多笔记的,想学好 编程,你的笔记本上总有课本上的每一个例题代码的核心部分。以及八大经典的算法举例,递推、递归、穷举、贪心、分治、动规、迭代、分枝。 四、交流 想学好C语言,交流是必须的,尤其是学习C语言的新手,这里,我向大家推介——百度C语言贴吧,这里有很多的学习者,也有很多高手,在这里你能学到课本以及课堂上学不到的东西。和他人交流也是很重要的。 五、上机练习 这是学习好C语言的关重要的环节,无论你编程学得多好,上机实现才是目的,所以,不怕要辛苦,把你的每一段代码都敲进计算机,让计算机来实现,这样有助于你对程序的理解,并试着修改你的代码,让你的代码更精简,效率更高。平时没事的时候,在计算机上多敲代码,一个编程厉害的高手,他的计算机上会有多代码。 想成为编程高手的军规: 1、大学生活丰富多彩,会令你一生都难忘,但难忘有很多种,你可以学了很多东西而难忘,也会因为什么都没学到而难忘! 2、编程不是技术活,而是体力活。 3、C语言是基础,很重要,如果你不学好C语言,那么什么高级语言你都学不好。 第9章结构体 1.定义以下结构体类型 struct s { int a; char b; float f; }; 则语句printf("%d",sizeof(struct s))的输出结果为【】。 A) 3 B) 7 C) 6 D) 4 # 2.当定义一个结构体变量时,系统为它分配的内存空间是【】 A)结构中一个成员所需的内存容量 B)结构中第一个成员所需的内存容量 C)结构体中占内存容量最大者所需的容量 D)结构中各成员所需内存容量之和 3.定义以下结构体类型 struct s { int x; float f; }a[3]; < 语句printf("%d",sizeof(a))的输出结果为【】 A) 4 B) 12 C) 18 D) 6 7.定义以下结构体类型 struct student { char name[10]; int score[50]; float average; }stud1; 则stud1占用内存的字节数是【】。 ( A) 64 B) 114 C) 228 D) 7 9、设有一结构体类型变量定义如下: struct date { int year; int month; int day; }; struct worklist { char name[20]; char sex; $ struct date birthday; } person; 若对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。。。。 A. year=1976 B. =1976 C. D. =1976 1、若程序中有以下的说明和定义: struct abc { int x;char y; } 花括号后少了分号。 struct abc s1,s2; 则会发生的情况是______。 A) 编译时错B) 程序将顺序编译、连接、执行C) 能顺序通过编译、连接、但不能执行D) 能顺序通过编译、但连接出错 电子科大10秋学期《C语言》在线作业一 试卷总分:100 测试时间:-- 一、单选题(共35 道试题,共70 分。) V 1. C语言中用于循环结构程序设计的三种常用控制语句是( C ) A. if、for、continue B. if、switch、break C. for、while、do-while D. 顺序结构、选择结构、循环结构 满分:2 分 2. 设有语句int a[4][10],*p=*a;则下面表达式中属于地址表达式的是( A ) A. a[1][2] B. a[1] C. *(p+1*10+2) D. *(a[1]+2) 满分:2 分 3. 若有以下定义,则对a数组元素的正确引用是( C) int a[5],*p=a; A. *&a[5] B. a+2 C. *(p+5) D. *(a+2) 满分:2 分 4. 判断字符串a和b是否相等,应当使用( A ) A. if(a= =b) B. if(a=b) C. if(strcpy(a,b)) D. if(!strcmp(a,b)) 满分:2 分 5. 若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为( A) A. *(a[i]+j) B. (a+i) C. *(a+j) D. a[i]+j 满分:2 分 6. 以下不正确的if语句形式是( C) A. if(x>y && x!=y); B. if(x= =y) x+=y; C. if(x != y) scanf("%d",&x ) else scanf("%d",&y); D. if(x C语言结构体(struct)常见使用方法 基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。 结构体定义: 第一种:只有结构体定义 [cpp]view plain copy 1.struct stuff{ 2.char job[20]; 3.int age; 4.float height; 5.}; 第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义 [cpp]view plain copy 1.//直接带变量名Huqinwei 2.struct stuff{ 3.char job[20]; 4.int age; 5.float height; 6.}Huqinwei; 也许初期看不习惯容易困惑,其实这就相当于: [cpp]view plain copy 1.struct stuff{ 2.char job[20]; 3.int age; 4.float height; 5.}; 6.struct stuff Huqinwei; 第三种:如果该结构体你只用一个变量Huqinwei,而不再需要用 [cpp]view plain copy 1.struct stuff yourname; 去定义第二个变量。 那么,附加变量初始化的结构体定义还可进一步简化出第三种: [cpp]view plain copy 1.struct{ 2.char job[20]; 3.int age; 4.float height; 5.}Huqinwei; 把结构体名称去掉,这样更简洁,不过也不能定义其他同结构体变量了——至少我现在没掌握这种方法。 结构体变量及其内部成员变量的定义及访问: 绕口吧?要分清结构体变量和结构体内部成员变量的概念。 就像刚才的第二种提到的,结构体变量的声明可以用: [cpp]view plain copy 1.struct stuff yourname; 其成员变量的定义可以随声明进行: [cpp]view plain copy 1.struct stuff Huqinwei = {"manager",30,185}; 也可以考虑结构体之间的赋值: [cpp]view plain copy 实验五结构体 一、实验目的 1.掌握结构体类型变量的定义和使用。 2.掌握结构体类型数组的概念和使用。 二、实验内容 编写一个程序实现下面的功能: A.建立一个数组用于存储学生的学号、姓名和三门课程的成绩和平均成绩 B.输入学号后输出该学生的学号、姓名和三门课程的成绩 C.输入学号后删除该学生的数据 D.插入学生的数据 E.输出平均成绩在80分及以上的记录 F.退出 要求用循环语句实现B--E的多次操作 三、实验具体实验程序代码(要有注释)、测试结果(最好截图)和实验总结 1、实验代码 建立一个数组用于存储学生的学号、姓名和三门课程的成绩和平均成绩 输入学号后输出该学生的学号、姓名和三门课程的成绩 um,&stud[i].name,&stud[i].yingyu,&stud[i].shuxue,&stud[i].cc); stud[i].avg=(stud[i].yingyu+stud[i].shuxue+stud[i].cc)/3; } for(i=0;i 1、把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。 #include <> int main() {struct Student { long int num; char name[20]; char sex; char addr[20]; }a={10101, “Li Lin ”, ‘M', “123 Beijing Road ”}; printf("NO.:%ld\nname:%s\n sex:%c\naddress:%s\n",,,,; return 0; } 2、输入两个学生的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩 #include <> int main() { struct Student { int num; char name[20]; float score; }student1,student2; scanf("%d%s%f",&,, &; scanf( “ %d%s%”f ,&,, &; printf("The higher score is:\n"); if > printf("%d %s %\n",,, ; else if < printf("%d %s %\n",,, ; else {printf("%d %s %\n",,, ; printf("%d %s %\n",,, ; } return 0; } 3、有 3 个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。 #include <> #include <> struct Person { char name[20]; 实验一C程序的运行环境及简单程序编写 一、实验目的 1.了解tc 2.0编译系统的基本操作方法,学会独立使用该系统。 2.了解在该系统上如何编辑、编译、连接和运行一个C程序。 3.通过运行简单的C程序,初步了解C源程序的特点。 二、实验内容 1.编写一个计算球体体积的程序,要求用户自行录入球体的半径。参考公式V=4/3πr3.。 2.编写一个程序,要求用户输入一个美金数量,然后显示出如何用最少的20美元、10美元、5美元和1美元来付款。 运行结果: Ener a dollar amount:93 $20 bills:4 $10 bills:1 $5 bills:0 $1 bills:3 实验二顺序结构程序设计 一、实验目的 1.熟悉C语言中的基本数据类型,掌握定义常量和变量以及对它们赋值的方法,了解数据输出时所用格式转换符。 2.掌握格式输入/输出函数的用法。 3.学会简单顺序程序的设计。 4.养成良好的程序设计习惯。 二、实验内容 1.编写一个程序,对用户录入的产品信息进行格式化。 Enter item number:583 Enter unit price:13.5 Enter purchase date(mm/dd/yyyy):3/24/2010 Item Unit Purchase Price date 583 $ 13.50 3/24/2010 2.编写一个程序,要求用户输入一个两位数,然后按数位的逆序打印出这个数。 Enter a two-digit number:28 The reversal is :82 实验三选择结构程序设计 一、实验目的 1.熟练使用if、switch编写程序。 二、实验内容 1.编写一个程序,确定一个数的位数。 Enter a number:374 The number 374 has 3 digits 假设输入的数最多不超过4位。提示:利用if语句进行数的判定。例如,如果数在0到 c语言结构体心得体会 c语言学习心得体会一c语言作为一种计算机的语言,我们学习它,有助于我们更好的了解计算机,与计算机进行交流,因此,c语言的学习对我们尤其重要。 在这个星期里,我们专业的学生在专业老师的带领下进行了c语言程序实践学习。在这之前,我们已经对c语言这门课程学习了一个学期,对其有了一定的了解,但是也仅仅是停留在了解的范围,对里面的好多东西还是很陌生的在运用起来的时候还是感到很棘手,毕竟,万事开头难嘛。 由于时间的关系,我们的这次实践课程老师并没有给我们详细的介绍,只是给我们简单的介绍了几个比较重要的实际操作。包括了程序模块处理。简单界面程序。高级界面程序。程序的添加修改。用程序做一元线性回归处理以及用c 语言程序来画粒度分布图等这几样比较重要的时间操作。 上机实验是学习程序设计语言必不可少的实践环节,特别是c语言灵活、简洁,更需要通过编程的实践来真正掌握它。对于程序设计语言的学习目的,可以概括为学习语法规定、掌握程序设计方法、提高程序开发能力,这些都必须通过充分的实际上机操作才能完成。 c语言学习心得体会二C语言是在国内外广泛使用的一种计算机语言。其语言功能丰富、表达能力强、使用灵活方便、既具有高级语言的优点,又具有低级语言的许多特 点,适合编写系统软件。其功能强大,不仅用在计算机上广泛用在电子,机械等方面上,而且,所有的windows,Unix,Linux,Mac,os/2,无一例外,哪一个不是C 语言写的?很多新型的语言如,C++,Java,C#,J#,perl... 都是衍生自C语言。掌握了C语言,可以说你就掌握了很多门语言。 学习C程序这门课一年了,这是我们学的第一门专业课,在大学里C语言不但是计算机专业的必修课程而且也是非计算机专业学习计算机基础的一门必修课程。所以作为我这个计算机专业的学生来说当然十分重要,老师在第一节课说过,C语言是计算机的基础,大多数软件都需要用C语言来编写,通过一个年的学习,使我由初步掌握简单的应试知识到完成高难度的深入编程,如我们在编写一个较大的程序时应该把它分开成几个小程序来看,这样会容易得多。同时,我觉得 C语言应该是操作和理论相结合的课程,在不断地编写中去思考,两者是不可分割的。 在学习一年C语言的过程中我也在慢慢探索怎样才能学好C语言,并总结了一点经验: 要了解C语言就要从语法基础来学习起,首先要是要了解它的结构,比如变量,首先要了解变量的定义方式(格式),其意义是什么(定义变量有什么用); 其次就是要我要怎么去运用它(我要用什么型式去应用 实验九参考程序 实验 9- 1 /**************************************************************** * 实验 9.1 * * ( 1 )为某商店的商品设计合适的结构体 (PRODUCT) 。每一种商品包含编号 (number) 、 * 名称 (name) 、价格 (price) 、折扣 (discount)4 项信息,根据表 9-1 ,为这些信 息选择合适的数据类型。 * (2)建立 2个函数,以实现对商品的操作。 input 函数实现商品的输入; * display 函数显示商品信息。要求这 2个函数都以商品的结构体 (PRODUCT) 指针为 参数。 * (3 )在主函数中为商品键盘定义一个结构体变量 (keyboard) ,利用 input 函数实现键 盘信息的输入; * 定义一个结构体数组 (elec_device[3]) ,利用 input 函数实现冰箱、 空调、电视 信息的输入; * 最后利用 display 函数显示 4 种商品的信息。 * * 表 9-1 #include 1.定义以下结构体类型 struct s { int a; char b; float f; }; 则语句printf("%d",sizeof(struct s))的输出结果为【】。 A) 3 B) 7 C) 6 D) 4 2.当定义一个结构体变量时,系统为它分配的内存空间是【】 A)结构中一个成员所需的内存容量 B)结构中第一个成员所需的内存容量 C)结构体中占内存容量最大者所需的容量 D)结构中各成员所需内存容量之和 3.定义以下结构体类型 struct s { int x; float f; }a[3]; 语句printf("%d",sizeof(a))的输出结果为【】 A) 4 B) 12 C) 18 D) 6 7.定义以下结构体类型 struct student { char name[10]; int score[50]; float average; }stud1; 则stud1占用内存的字节数是【】。 A) 64 B) 114 C) 228 D) 7 9、设有一结构体类型变量定义如下: struct date { int year; int month; int day; }; struct worklist { char name[20]; char sex; struct date birthday; } person; 若对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。。。。 A. year=1976 B. =1976 C. D. =1976 1、若程序中有以下的说明和定义: struct abc { int x;char y; } 花括号后少了分号。 struct abc s1,s2; 则会发生的情况是______。 A) 编译时错B) 程序将顺序编译、连接、执行C) 能顺序通过编译、连接、但不能执行D) 能顺序通过编译、但连接出错 c语言结构体指针初始化 今天来讨论一下C中的内存管理。 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左右孩子指针使用时难道有初始化吗 那时我不知怎么的想不出理由,虽然我还是坚信要初始化的 过了几天这位同事说他试了一下,结构体中的成员指针不经过初始化是可以用(左子树和右子树指针) 那时在忙着整理文档,没在意 今天抽空调了一下,结论是,还是需要初始化的。 而且,不写代码你是不知道原因的(也许是对着电脑久了IQ和记性严重下跌吧) 测试代码如下 1.#include 2.#include 3.#include 4. 5.struct student{ 6.char *name; 7.int score; 8.struct student* next; 9.}stu,*stu1; 10. 11.int main(){ 12. https://www.sodocs.net/doc/7716070054.html, = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/ 13. strcpy(https://www.sodocs.net/doc/7716070054.html,,"Jimy"); 14. stu.score = 99; 15. 16. stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/ 17. stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/ 18. stu.next = stu1; 19. strcpy(stu1->name,"Lucy"); 20. stu1->score = 98; 21. stu1->next = NULL; 22. printf("name %s, score %d \n ",https://www.sodocs.net/doc/7716070054.html,, stu.score); 23. printf("name %s, score %d \n ",stu1->name, stu1->score); 24. free(stu1); 25.return 0; 26.} #include #include #include struct student{ char *name; int score; struct student* next; }stu,*stu1; int main(){ https://www.sodocs.net/doc/7716070054.html, = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/ strcpy(https://www.sodocs.net/doc/7716070054.html,,"Jimy"); stu.score = 99; stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/ stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/ stu.next = stu1; strcpy(stu1->name,"Lucy"); stu1->score = 98; stu1->next = NULL; printf("name %s, score %d \n ",https://www.sodocs.net/doc/7716070054.html,, stu.score); 目录 实验1 输入输出 (2) 实验2 选择语句 (4) 实验3 循环语句 (5) 实验4 函数 (6) 实验5 指针 (8) 实验6 数组 (9) 实验7 结构体 (10) 实验1 输入输出 要求掌握: 1、VC++平台的使用; 2、C源程序的建立、保存、编译和运行; 3、变量的定义、赋值和运算; 4、printf函数的使用; 5、scanf函数的使用; 6、int、long、float、double、unsigned的含义; 7、关键字、预定义标识符和用户标识符的区别; 8、自加自减运算符的使用。 完成下列题目: 1. 键盘输入与屏幕输出练习 问题1 要使下面程序的输出语句在屏幕上显示1, 2, 34,则从键盘输入的数据格式应为以下备选答案中的。 #include 1.有以下定义和语句: struct student { int age; int num; }; struct student stu[3]={{1001,20},{1002,19},{1003,21}}; main() { struct student *p; p=stu; …… } 则以下不正确的引用是。 A) (p++)->num B) p++ C) (*p).num D) p=&stu.age 2.有以下结构体定义: struct example { int x; int y; }v1; 则正确的引用或定义是。 A) example.x=10 B) example v2; v2.x=10; C) struct v2; v2.x=10; D) struct example v2={10}; 3.对于如下结构体定义,若对变量person的出生年份进行赋值,正确的赋值是。 struct date { int year,month,day; }; struct worklist { char name[20]; char sex; struct date birth; }person; A) year=1976 B) birth.year=1976 C) person.birth.year=1976 D) person.year=1976 4.根据下述定义,可以输出字符'A'的语句是。 struct person { char name[11]; struct { char name[11]; int age; }other[10]; }; struct person man[10]={ {"Jone",{"Paul",20}},{"Paul",{"Mary",18}}, {"Mary",{"Adam",23}},{"Adam",{"Jone",22}} }; A) printf("%c",man[2].other[0].name[0]); B) printf("%c",other[0].name[0]); C) printf("%c",man[2].(* other[0])); D) printf("%c",man[3].name); 5.若有以下程序段: struct st { int n; struct st *next; }; struct st a[3]={5,&a[1],7,&a[2],9, '\0'} ,*p=a; 则值为6的表达式为。 A) p++->n B) p->n++ C) (*p).n++ D) ++p->n 6.对于以下定义,不正确的叙述是。 union data { int i; char c; float f;}a,b; A) 变量a所占的内存长度等于成员f的长度 B) 变量a的地址和它的各成员地址都是相同的 C) 不能对变量a赋初值 D) 可以在定义的时候对a初始化 7.下述程序运行结果为。 #include (1)有以下程序段 typedef struct NODE { int num; struct NODE *next; } OLD; 以下叙述中正确的是C A)以上的说明形式非法 B)NODE是一个结构体类型 C)OLD是一个结构体类型 D)OLD是一个结构体变量(2)若有以下说明和定义union dt { int a; char b; double c; }data; 以下叙述中错误的是 C A)data的每个成员起始地址都相同 B)变量data所占内存字节数与成员c所占字节数相等 C)程序段:data.a=5;printf("%f\n",data.c);输出结果为5.000000 D)data可以作为函数的实参(3)设有如下说明 typedef struct ST { long a; int b; char c[2]; } NEW; 则下面叙述中正确的是 C A)以上的说明形式非法 B)ST是一个结构体类型 C)NEW是一个结构体类型 D)NEW是一个结构体变量(4)以下对结构体类型变量td的定义中,错误的是 C A)typedef struct aa { int n; float m; }AA; AA td; B)struct aa { int n; float m; } td; struct aa td; C)struct { int n; float m; }aa; struct aa td; D)struct { int n; float m; }td; (5)设有以下语句 typedef struct S { int g; char h;} T; 则下面叙述中正确的是B A)可用S定义结构体变量 B)可以用T定义结构体变量 C)S是struct类型的变量 D)T是struct S类型的变量(6)设有如下说明 typedef struct { int n; char c; double x;}STD; 则以下选项中,能正确定义结构体数组并赋初值的语句是B A)STD tt[2]={{1,'A',62},{2, 'B',75}}; B) STD tt[2]={1,"A",62},2, "B",75}; C) struct tt[2]={{1,'A'},{2, 'B'}}; D)structtt[2]={{1,"A",62.5},{2, "B",75.0}}; (7)设有以下说明语句 typedef struct { int n; char ch[8]; }PER; 则下面叙述中正确的是B A) PER 是结构体变量名 B) PER是结构体类型名 C) typedef struct 是结构体类型 D)struct 是结构体类型名(8)设有以下说明语句 struct ex { int x ; float y; char z ;} example; 则下面的叙述中不正确的是B A) struct结构体类型的关键字 B)example是结构体类型名 C) x,y,z都是结构体成员名 D) struct ex是结构体类型(9)有如下定义 struct person{char name[9]; int age;}; strict person class[10]={“Johu”, 17, “Paul”, 19 “Mary”, 18, “Adam 16,}; 根据上述定义,能输出字母M的语句是D A) prinft(“%c\n”,class[ 3].mane); B) pfintf(“%c\n”,class[3].name[1]); C) prinft (“%c\n”,class[2].n ame[1]); D) printf(“%^c\n”,class[2].name[0]); (10)变量a 脚踏实地,心无旁骛,珍惜分分秒秒。紧跟老师,夯实基础。 什么是结构体? 简单的来说 结构体就是一个可以包含不同数据类型的一个结构 它是一种可以自己定义的数据类型 它的特点和数组主要有两点不同 首先结构体可以在一个结构中声明不同的数据类型 第二相同结构的结构体变量是可以相互赋值的 而数组是做不到的 因为数组是单一数据类型的数据集合 它本身不是数据类型(而结构体是) 数组名称是常量指针 所以不可以做为左值进行运算 所以数组之间就不能通过数组名称相互复制了 即使数据类型和数组大小完全相同 定义结构体使用struct修饰符 例如: struct test { float a; int b; }; 上面的代码就定义了一个名为test的结构体 它的数据类型就是test 它包含两个成员a和b 成员a的数据类型为浮点型 成员b的数据类型为整型 由于结构体本身就是自定义的数据类型 定义结构体变量的方法和定义普通变量的方法一样 test pn1; 这样就定义了一test结构体数据类型的结构体变量pn1 结构体成员的访问通过点操作符进行 pn1.a=10 就对结构体变量pn1的成员a进行了赋值操作 注意:结构体生命的时候本身不占用任何内存空间 只有当你用你定义的结构体类型定义结构体变量的时候计算机才会分配内存 结构体 同样是可以定义指针的 那么结构体指针就叫做结构指针 结构指针通过->符号来访问成员 下面我们就以上所说的看一个完整的例子: #include C语言结构体实验报告
C语言结构体习题及答案
C语言实验八结构体上机报告
c语言结构体作业
c语言结构体程序设计心得体会
C语言结构体习题及答案
电子科大10秋学期《C语言》在线作业答案(一,二,三)
C语言结构体(struct)常见使用方法
C语言实验5(结构体)
C语言程序设计基础-结构体习题
C语言上机实验1-18
c语言结构体心得体会
C语言结构体和共用体实验报告
C语言结构体习题及答案
c语言结构体指针初始化===
C语言实验课题目
c语言结构体单元练习
二级C语言结构体定义及应用部分练习题(十三)(精)
C语言中结构体的使用