1、设有下面的结构体和结构变量定义:
关于结构体类型变量赋值正确的是(A)
A、 studl.id=1001;studl.name="Tom";
B、id=1001;*studl.name="Tom";
C、 studl.id=1001;studl.*name="Tom";
D、 studl.id=1001L;*studl.name="Tom";
解:答案为A,B错误很明显,id前缺少studl.;第二个先运行studl.name,然后*运算符进行运算,取出name所指向的内存空间,然而"Tom"为地址常量,不匹配。C,不存在*name的项;D、与B类似;
2、指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向(结构体成员变量)。
2.1结构体类型只有一种。请问这句话的说法是正确的吗?
正确
错误
解:错误,结构体类型是用户自己定义的,可以定义任何类型的结构体类型。
3、当说明一个结构体变量时系统分配给它的内存是(A)
各成员所需内存的总和
结构中第一个成员所需内存量
成员中占内存量最大者所需的容量
结构中最后一个成员所需内存量
解:结构体只要定义过后大小就确定了,一个结构体变量所占内存大小由结构体类型定义时确定。
4、在结构体中,成员的缺省存取权限是 1 有的.
解:结构体默认存取权限为publc,class默认的存取权限为private
5、在32位cpu上选择缺省对齐的情况下,有如下结构体定义: struct A{ unsigned a : 19; unsigned b : 11; unsigned c : 4; unsigned d : 29; char index; }; 则sizeof(struct A)的值为(16) |
9
· 12
· 16
· 20
解:前两个占4B,第三个占4B,第四个占4B,最后一个占 4B (1B+填充的3B)
6、下列代码的功能包括:定义一个x数组,说明一个结构体,同时对变量t进行初始化,使得t的a成员的值为50,b成员的值为x数组的首地址。
请在空白处(方框内)填入合适的内容,一完成上述功能。
1 2 3 4 5 | int x[5]={1,2,3,4,5}; struct { int a; int *b; }t{ (t.a=50),(t.b=x) }; |
解:题目应该改为首元素首地址;
7、开发C代码时,经常见到如下类型的结构体定义:
1 2 3 4 5 | typedef struct list_t { struct list_t *next; struct list_t *prev; char data[0]; }list_t; |
请问在32位系统中,sizeof(list_t)的值为?
4byte
· 8byte
· 5byte
· 9byte
解:8byte, 4+4+0;
8、定义一个结构体变量(包括年、月、日),计算该日在本年中为第几天?(注意考虑闰年问题),要求写一个函数days,实现上面的计算。由主函数将年月日传递给days函数,计算后将日子传递回主函数输出。
解:
#include<stdio.h>
typedef struct data
{
int year;
int month;
int day;
}DATA;
int days(DATA dat)
{
if(dat.year%100==0)
{
if(dat.year%400==0)
{
switch(dat.month)
{
case 1:
return dat.day;
case 2:
return dat.day+31;
case 3:
return dat.day+31+29;
case 4:
return dat.day+31*2+29;
case 5:
return dat.day+31*2+29+30;
case 6:
return dat.day+31*3+29+30;
case 7:
return dat.day+31*3+29+30*2;
case 8:
return dat.day+31*4+29+30*2;
case 9:
return dat.day+31*5+29+30*2;
case 10:
return dat.day+31*5+29+30*3;
case 11:
return dat.day+31*6+29+30*3;
case 12:
return dat.day+31*6+29+30*4;
default:
printf("输入错误\n");
return 0;
}
}
else
{
switch(dat.month)
{
case 1:
return dat.day;
case 2:
return dat.day+31;
case 3:
return dat.day+31+28;
case 4:
return dat.day+31*2+28;
case 5:
return dat.day+31*2+28+30;
case 6:
return dat.day+31*3+28+30;
case 7:
return dat.day+31*3+28+30*2;
case 8:
return dat.day+31*4+28+30*2;
case 9:
return dat.day+31*5+28+30*2;
case 10:
return dat.day+31*5+28+30*3;
case 11:
return dat.day+31*6+28+30*3;
case 12:
return dat.day+31*6+28+30*4;
default:
printf("输入错误\n");
return 0;
}
}
}
else
{
if(dat.year%4==0)
{
switch(dat.month)
{
case 1:
return dat.day;
case 2:
return dat.day+31;
case 3:
return dat.day+31+29;
case 4:
return dat.day+31*2+29;
case 5:
return dat.day+31*2+29+30;
case 6:
return dat.day+31*3+29+30;
case 7:
return dat.day+31*3+29+30*2;
case 8:
return dat.day+31*4+29+30*2;
case 9:
return dat.day+31*5+29+30*2;
case 10:
return dat.day+31*5+29+30*3;
case 11:
return dat.day+31*6+29+30*3;
case 12:
return dat.day+31*6+29+30*4;
default:
printf("输入错误\n");
return 0;
}
}
else
{
switch(dat.month)
{
case 1:
return dat.day;
case 2:
return dat.day+31;
case 3:
return dat.day+31+28;
case 4:
return dat.day+31*2+28;
case 5:
return dat.day+31*2+28+30;
case 6:
return dat.day+31*3+28+30;
case 7:
return dat.day+31*3+28+30*2;
case 8:
return dat.day+31*4+28+30*2;
case 9:
return dat.day+31*5+28+30*2;
case 10:
return dat.day+31*5+28+30*3;
case 11:
return dat.day+31*6+28+30*3;
case 12:
return dat.day+31*6+28+30*4;
default:
printf("输入错误\n");
return 0;
}
}
}
}
int main()
{
printf("请输入日期");
DATA dat;
scanf("%d",&dat.year);
scanf("%d",&dat.month);
scanf("%d",&dat.day);
int ret=days(dat);
printf("为第%d天\n",ret);
return 0;
}
9、假设有如下的关于职工信息的结构体:
struct Employee
{
long eID;
char eName[10];
struct Employee *pNext;
};
其中eID表示职工编号,请编写一个函数:
struct Employee *eIDSequence(int eID, char *sName)
解:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Employee
{
long eID;
char eName[10];
struct Employee *pNext;
};
struct Employee *eIDSequence(int eID, char *sName)
{
struct Employee *p=0;
p=(struct Employee *)malloc(sizeof(struct Employee));
if(p==NULL)
{
printf("error\n");
return p;
}
p->eID=eID;
strcpy(p->eName,sName);
p->pNext=NULL;
return p;
}
int main()
{
struct Employee *p=eIDSequence(1234556, "li ker");
free(p);
return 0;
}
10、请设计一个名 为student的结构体类型,该类型的成员有一个名为sex的字符类型变量,有一个名为id的int类型,有个名为name的字符数组的变量,请在主函数中创建一个sruc student类型的数组,数组长度为10,然后再设计一个自定义函数实现该结构体数组的输入,再设计一个自定义函数,求出该结构体数组中id值最大的元素并显示其各成员的值。
解:
#include<stdio.h>
typedef struct student
{
char sex;
int id;
char name[12];
}STU;
void set_struct(STU *p,int len)
{
int i=0;
for(i=0;i<len;i++)
{
printf("请输入第%d个元素\n",i+1);
scanf("%d",&(p+i)->sex);
scanf("%d",&(p+i)->id);
setbuf(stdin,NULL);
gets((p+i)->name);
}
}
void show(STU *p,int len)
{
int i=0;
int index=0;
int max=p[i].id;
for(i=0;i<len;i++)
{
if(p[i].id>max)
{
max=p[i].id;
index=i;
}
}
printf("sex=%d id=%d name=%s\n",
p[index].sex,p[index].id,p[index].name);
}
int main()
{
STU stu[10];
set_struct(stu,10);
show(stu,10);
return 0;
}
11、编程计算两点间的直线距离。
要求:点坐标采用结构体类型,屏幕获取输入两点,并输出距离(小数点后保留两位)。
解:
#include<stdio.h>
#include<math.h>
typedef struct coordinate
{
float x;
float y;
}DIN;
float get_distance(DIN a,DIN b)
{
return sqrtf((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
DIN a,b;
printf("请输入两个坐标\n");
printf("第一个坐标为:\n");
scanf("%f%f",&a.x,&a.y);
printf("第二个坐标为:\n");
scanf("%f%f",&b.x,&b.y);
float ret=get_distance(a,b);
printf("%.2f\n",ret);
return 0;
}
12、题目标题:
电话薄管理
题目描述:
利用结构体类型数组输入五位用户的姓名和电话号码,按姓名的字典顺序排列后(姓名相同保持原位置),输出用户的姓名和电话号码。 已知结构体类型如下: struct user { char name[20]; char num[10]; };
输入描述:
输入姓名字符串和电话号码字符串。
输出描述:
输出按姓名排序后的姓名字符串和电话号码字符串。
样式输入:
aa
12345
dd
23456
cc
34567
bb
21456
ee
12456
样式输出:
aa
12345
bb
21456
cc
34567
dd
23456
ee
12456
解:
#include<stdio.h>
#include<string.h>
typedef struct user
{
char name[20];
char num[10];
}USER;
void set_struct(USER *p,int len)
{
int i=0;
for(i=0;i<len;i++)
{
printf("第%d个输入为:\n",i+1);
setbuf(stdin,NULL);
gets((p+i)->name);
setbuf(stdin,NULL);
gets((p+i)->num);
}
}
void list(USER *p,int len)
{
int i=0,j=0;
USER temp;
for(i=0;i<len-1;i++)
{
for(j=i+1;j<len;j++)
{
if(strcmp(p[i].name,p[j].name)>0)
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
}
}
void show(USER *p,int len)
{
int i=0;
for(i=0;i<len;i++)
{
printf("%s %s\n",p[i].name,p[i].num);
}
}
int main()
{
USER user[5];
printf("输入姓名字符串和电话号码字符串。\n");
set_struct(user,5);
list(user,5);
printf("输出按姓名排序后的姓名字符串和电话号码字符串。\n");
show(user,5);
return 0;
}