有关结构体的一些题目

本文包含一系列关于C语言结构体的题目,涉及结构体赋值、指针、内存分配、位字段、数组、指针操作等内容。通过解答这些题目,帮助读者深入理解C语言中的结构体使用和内存管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、设有下面的结构体和结构变量定义:

struct student
{
    int id;
    char *name;
    int math;
};

关于结构体类型变量赋值正确的是()
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是正确的,结构体内有字符指针时,直接使用结构体的引用给字符指针指向一个字符串。

2、指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向()。
//
2.1结构体类型只有一种。请问这句话的说法是正确的吗?
A. 正确
B. 错误
//错误,结构体的类型不只有一种,因为结构体的名称不同时,即为一种不同的结构体。
3、当说明一个结构体变量时系统分配给它的内存是()
A. 各成员所需内存的总和
B. 结构中第一个成员所需内存量
C. 成员中占内存量最大者所需的容量
D. 结构中最后一个成员所需内存量
//各成员变量所占的内存和,最后组成了结构体所占空间的内存。

4、在结构体中,成员的缺省存取权限是 1 有的.
//结构体中,各成员变量是公开的,所以,我们定义一个结构体时,可以随便调用。

5、在32位cpu上选择缺省对齐的情况下,有如下结构体定义:
struct A{
unsigned a : 19;
unsigned b : 11;
unsigned c : 4;
unsigned d : 29;
char index;
};
则sizeof(struct A)的值为(C)
9
• 12
• 16
• 20
//位结构,在4字节里边,a首先占用了19个字节,b又来占用剩下的32-19=13个字节,发现可以容纳,之后就占用了。c来了,发现之前4个字节的空间只剩下了两位,所以c默默地又让编译器给它分配了4个字节的空间,它就把前4位占了。d来了很吐血,c占了它要的4个字节的4位,但是剩下那么多空的,d又占不下,它也向编译器申请了4字节空间,所以d占用了它申请的4字节空间里边的29位。最后一个成员index来了,他申请了字节的空间,但是之后的编译器又来了,发现它们不齐,之后给index之后添加了3个字节的空间,最后就成了16个字节的空间占用。

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{ (50),(x) };

7、开发C代码时,经常见到如下类型的结构体定义:

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
//两个指针,两个四字节大小的内存。char data[0],编译器默认为柔性数组没有给内存。所以为8

8、定义一个结构体变量(包括年、月、日),计算该日在本年中为第几天?(注意考虑闰年问题),要求写一个函数days,实现上面的计算。由主函数将年月日传递给days函数,计算后将日子传递回主函数输出 。

#include <stdio.h>
typedef struct Time
{
    int year;
    int mouth;
    int day;
}T,*Tp;
void Set_time(Tp t);
int count_day(Tp t);
void print(int a);
int count_day(Tp t)
{
    int month[12]={31,28,31,30,31,30,31,31,30,31,30,0};
    int i,day;
    day=t->day;
    for (i=1;i<t->mouth;i++)
        day+=month[i-1];//先不判断每一天的天数,将月份减一,将平年的每一天的天数加起来。
    if((!(t->year%4)&&t->year%100||!(t->year%400))&&t->mouth>2)day++;//如果是闰年每一天的天数加一。
    return day;
}
void Set_time(Tp t)
{
    int a,b,c;
    printf("请输入年 月 日.\n");
    scanf("%d%d%d",&a,&b,&c);
    t->year = a;
    t->mouth = b;
    t->day = c;
}
void print(int a)
{   
    printf("天数为%d.\n",a);
}
int main(void)
{
    T t;
    Set_time(&t);
    print(count_day(&t));
    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>
struct Employee
{
    long eId;
    char eName[10];
    struct Employee *pNext;
};
struct  Employee *eIDSequence(int eID, char *sName);
struct  Employee *eIDSequence(int eID, char *sName)
{
    struct Employee *node = NULL;
    node = (struct Employee *)malloc(sizeof(struct Employee));
    node -> eId = eId;
    node -> eName = sName; 
    node -> pNext = NULL;//必须给,不然成为野指针。
    return node;
}
int main(void)
{
    struct Employee *node = NULL;
    node = eIDSequence(04165218, "zhangjie");
    printf(" eId:%d.\n eName:%s.\n", node->eId, node->eName);
    return 0;
}

10、请设计一个名为student的结构体类型,该类型的成员有一个名为sex的字符类型变量,有一个名为id的int类型,有个名为name的字符数组的变量,请在主函数中创建一个sruc student类型的数组,数组长度为10,然后再设计一个自定义函数实现该结构体数组的输入,再设计一个自定义函数,求出该结构体数组中id值最大的元素并显示其各成员的值。

#include <stdio.h>
#include <stdlib.h>
typedef struct sruc
{
    int id;
    char name[20];
}sruc, *sruc_p;
void set_sruc(sruc *student, int length);
void Max_id(sruc *student, int length);
void print_sruc(sruc studenth);

void set_sruc(sruc *student, int length)
{
    int i;
    for(i=0; i<length; i++)
    {
        printf("Enter the student information.\n id:\n name:");
        scanf("%d%s",&student[i].id, student[i].name);
    }
}
void Max_id(sruc *student, int length)
{
    sruc stu1;
    int i = 0;
    stu1 = student[0];
    for(i=0; i<length; i++)
    {
        if(stu1.id < (student[i].id))
        {
            stu1 = student[i];
        }
    }
    print_sruc(stu1);
}
void print_sruc(sruc student)
{
    printf(" id :%d.\n name :%s.\n", student.id, student.name);
}
int main(void)
{
    sruc student[10];
    set_sruc(student,10);
    Max_id(student,10);
    return 0;
}

11、编程计算两点间的直线距离。
要求:点坐标采用结构体类型,屏幕获取输入两点,并输出距离(小数点后保留两位)。

#include <stdio.h>
#include <math.h>
typedef struct point
{
    double x1,x2;
    double y1,y2;
}P,*P_p;
int main(void)
{
    P p;
    printf("Enter the first point.\n");
    scanf("%lf%lf",&p.x1,&p.y1);
    printf("Enter the second point.\n");
    scanf("%lf%lf",&p.x2,&p.y2);
    printf("Stright length : %.2lf.\n",sqrt((p.x1-p.x2)*(p.x1-p.x2)+(p.y1-p.y2)*(p.y1-p.y2)));
    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];
}U;
void set_user(U *user, int length);
void set_user(U *user, int length)
{
    int i;
    for (i=0; i<length; i++)
    {
        scanf("%s%s", user[i].name,user[i].num);
    }
}
void sort_user(U *user, int length);
void sort_user(U *user, int length)
{
    int i;
    U user1;
    for (i=0; i<length-1; i++)
    {
        if(strcmp(user[i].name,user[i+1].name) > 0)
        {
            user1 = user[i];
            user[i] = user[i+1];
            user[i+1] = user1; 
        }
    }
}
void print_user(U *user, int length);
void print_user(U *user, int length)
{
    int i;
    for (i=0; i<length; i++)
    {
        printf("%s.\n",user[i].name);
        printf("%s.\n",user[i].num);
    }
}
int main(void)
{
    U user[5];
    set_user(user,5);
    sort_user(user,5);
    print_user(user,5);
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值