C语言作业(5)

这篇博客介绍了几个C语言编程题目,涉及结构体变量操作和函数设计。其中包括计算日期在当年的位置,根据职工编号查找员工,创建并操作学生结构体数组,计算两点间距离以及按姓名排序输出用户信息。

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

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、结构体类型只有一种。请问这句话的说法是正确的吗?(B)
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 date
{
        int year;
        int month;
        int day;
}a={1998,4,1};

int days(struct date s)
{
        int i = 0;
        int sum = 0;
        int a[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

        if(s.year % 4 == 0 && s.year %4 != 0)
                a[1] = 29; 

        for( i=0 ; i<s.month-1 ;i++)
        {
                sum += a[i];
        }

        sum += s.day;

        return sum;
}


int main(void)
{
        int ret = days(a);
        printf("%d年%d月%d日是该年的第%d天\n",a.year,a.month,a.day,ret);
}                                   



9、假设有如下的关于职工信息的结构体:
struct Employee
{
long eID;
char eName[10];
struct Employee *pNext;
};
其中eID表示职工编号,请编写一个函数:
struct Employee *eIDSequence(int eID, char *sName)


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

#include<stdio.h>                                                               
#include<string.h>
struct student
{
        char sex;
        int id; 
        char name[99];
};

void func1(struct student *p,int a)
{
        printf("请输入第%d个员工的性别\n",a+1);
        scanf("%c",&p->sex);
        printf("请输入第%d个员工的ID\n",a+1);
        scanf("%d",&p->id);
        printf("请输入第%d个员工的姓名\n",a+1);
        scanf("%s",&p->name);
        getchar();      //用来吃换行符
}

void func2(struct student s[])
{
        int i = 0,max = 0;    
        for( i=1 ; i<10 ; i++)
        {
                if( s[0].id < s[i].id)
                        max = i;
        }

        printf("id最大的员工,性别为%c,id为%d,姓名为%s\n",s[max].sex,s[max].id,s[max].name);
}

int main(void)
{
        int i = 0;
        struct student s[10]; 
        
        for( i=0 ; i<10 ; i++)
        func1(&s[i],i);

        func2(s);
}                                                 


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

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

struct info
{
        int x;
        int y;
}a,b;

int main(void)
{
        printf("请输入第一个点的横,纵坐标\n");
        scanf("%d%d",&a.x,&a.y);

        printf("请输入第二个点的横,纵坐标\n");
        scanf("%d%d",&b.x,&b.y);

        double result = sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y -b.y));
        printf("两点距离为:%.2f\n",result); //编译时要加 -lm

        return 0;
}


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

#include<stdio.h>                                                          
#include<string.h>
struct user
{
        char name[20];
        char num[10];
};

void func1(struct user *p,int a)
{
        printf("请输入第%d位用户的姓名\n",a+1);
        scanf("%s",&p->name);
        getchar();

        printf("请输入第%d位用户的电话号码\n",a+1);
        scanf("%s",&p->num);
        getchar();
}

void func2(struct user arr[])
{
        int i,j;
        struct user temp;
        for( i=0 ; i<4 ; i++ )
        {
                for( j=0 ; j<4-i ; j++ )
                {                                                          
                        if(arr[j].name> arr[j+1].name)
                        {
                                temp = arr[j];
                                arr[j] = arr[j+1];
                                arr[j+1] = temp;
                        }
                }
        }

        for( i=0 ; i<5 ; i++)
        printf("%s\n%s\n",arr[i].name,arr[j].num);
}


int main(void)
{
        int i;
        struct user arr[5];
        for( i=0 ; i<5 ; i++ )
        {
                func1(&arr[i],i);
        }
        
        func2(arr);
}                                 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值