C语言作业题(5)

本文提供了一组C语言结构体和指针相关的题目,涉及结构体赋值、成员访问、内存分配、位字段、数组、指针初始化、函数及排序算法等知识点。通过解答这些题目,读者可以深入理解C语言中结构体和指针的使用。

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

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

关于结构体类型变量赋值正确的是(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”;

2、指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向(结构体本身)。

2.1、结构体类型只有一种。请问这句话的说法是正确的吗?(错误
A. 正确
B. 错误

3、当说明一个结构体变量时系统分配给它的内存是(A
A. 各成员所需内存的总和
B. 结构中第一个成员所需内存量
C. 成员中占内存量最大者所需的容量
D. 结构中最后一个成员所需内存量

4、在结构体中,成员的缺省存取权限是公有 有的

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

6、下列代码的功能包括:定义一个x数组,说明一个结构体,同时对变量t进行初始化,使得t的a成员的值为50,b成员的值为x数组的首地址。
请在空白处(方框内)填入合适的内容,一完成上述功能。

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)的值为? (8byte
4byte
8byte
5byte
9byte

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

#include <stdio.h>

struct data
{
    int year;
    int month;
    int day;
}A = {2017,12,25};

int func(struct data *p)
{
    int month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//月份

    int year = p->year;
    if ((year % 400 == 0)|| (year % 4 == 0 && year % 100 != 0))//判断闰年
        month[1] = 29;

    int i = 0, ret = 0;
    for (i = 0; i < ((p->month)-1); i++)
        ret += month[i];//当月之前月份天数之和
    ret += p->day;//加上当月天数

    return ret;
}

int main(void)
{
    int ret = func(&A);

    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 = (struct Employee*)malloc(sizeof(struct Employee));
    p->eID = eID;
    strcpy(p->eName, sName);
    p->pNext = NULL;

    return p;
}

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

#include <stdio.h>
#include <stdlib.h>

#define NUM 3
struct student//设计一个名为student的结构体类型
{
    char sex;
    int id;
    char name[10];
};

void Input(struct student*p,int i)//一个自定义函数实现该结构体数组的输入
{
    printf("No.%d\nInput id,sex,name:", i);
    scanf("%d %c %s",&p->id, &p->sex, p->name);
}

void Find(struct student*p,int len)//该结构体数组中id值最大的元素并显示其各成员的值
{
    struct student*a = p;
    int max = 0;
    int ret = 0;
    int i = 0;

    for (i = 0; i < len; i++)
    {
        if (p[i].id > max)
        {
            max = p[i].id;
            ret = i;
        }
    }

    printf("id:%d\n", (a+ret)->id);
    printf("sex:%c\n", (a+ret)->sex);
    printf("name:%s\n", (a + ret)->name);
}

int main(void)
{
    struct student arr[NUM];//在主函数中创建一个sruc student类型的数组,数组长度为10

    int i = 0;
    for (i = 0; i < NUM; i++)
        Input(&arr[i], i);

    Find(arr,NUM);

    return 0;
}

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

#include <stdio.h>
#include <math.h>

struct point
{
    int x;
    int y;
}A,B;

int main(void)
{
    printf("Input A:");
    scanf("%d %d", &A.x, &A.y);

    printf("Input B:");
    scanf("%d %d", &B.x, &B.y);

    printf("d = %.3f\n", sqrt((A.x - B.x)*(A.x - B.x) + (A.y - B.y)*(A.y - B.y)));
}

12、利用结构体类型数组输入五位用户的姓名和电话号码,按姓名的字典顺序排列后(姓名相同保持原位置),输出用户的姓名和电话号码。 已知结构体类型如下: struct user { char name[20]; char num[10]; };

#include <stdio.h>

#define NUM 3
struct user 
{ 
    char name[20]; 
    char num[10]; 
};

void inti(struct user* arr,int len)
{
    int i = 0;
    for (i = 0; i < len; i++)
    {
        printf("\n");
        printf("No.%d user\n", i+1);
        printf("name: ");
        scanf("%s", arr[i].name);
        printf("number: ");
        scanf("%s", arr[i].num);
    }
}
void cmp(struct user* arr,int len)
{
    int i=0;j=0;
    struct user buf;
    for(i=0;i<len-1;i++)
        for(j=0;j<len-i;j++)
        {
            if(strcmp(arr[i],arr[j])>0)
            {
                buf=arr[i];
                arr[i]=arr[j];
                arr[j]=buf;
            }
        }
}
void pri(struct user* arr,int len)
{
    int i=0;
    for(i=0;i<len;i++)
    {
        printf("%s,%s"arr[i].name,arr[i].num);
    }
}
int main(void)
{
    struct user arr[NUM];
    inti(arr,NUM);
    cmp(arr,NUM);
    pri(arr,NUM);

    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值