c语言第九次练习题

结构体练习题

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

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

};
struct student studl;  //定义了一个结构体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.各成员所需内存的总和
B.结构中第一个成员所需内存量
C.成员中占内存量最大者所需的容量
D.结构中最后一个成员所需内存量


4、在结构体中,成员的缺省存取权限是 公有的.
在c++的类里面,成员的缺省存取权限是 私有的,只有在这个类里面才可以调用结构体以及当中的各个成员。


5、在32位cpu上选择缺省对齐的情况下,有如下结构体定义:

struct A{
    unsigned a : 19;
    unsigned b : 11; //4个字节
    unsigned c : 4;  //4个字节
    unsigned d : 29;
    char index;      //4个字节
};

则sizeof(struct A)的值为(12)
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)的值为(8)?
4byte
8byte
5byte
9byte
//两个指针占8个字节,最后一个弹性数组不占空间。只是一个标识。


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

#include<stdio.h>
typedef struct day
{
    int year;
    int month;
    int day;
}D;
//计算第多少天的函数(最后一个月已经经过的天数+前面月份的天数总和) 
int fun_days(struct day*p)
{   
    //定义一个12月份的数组 
    int arr_month_day[12]={31,28,31,30,31,30,31,31,30,31,30,31},sum=0,i=0;

    //判断是不是闰年 
    if ((p->year % 4 == 0)&&(p->year % 100 != 0) ||(p->year % 400 == 0))//如果是闰年的话 
    {
        arr_month_day[1] = 29;  //闰年的话二月份更新为29天 
    } 

    //计算总的天数
    for(i=0;i<p->month-1;i++)
    {
        sum +=arr_month_day[i];
    }
    return sum+p->day; //返回总共的天数 

}
int main(void)
{
    D d;
    printf("请输入年月日\n");
    scanf("%d %d %d",&d.year,&d.month,&d.day);
    int sum =fun_days(&d);
    printf("该天是这一年的第%d天\n",sum);    
    return 0;
 } 

函数运行结果如下:
这里写图片描述


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

//eID用来输入id name是名字
pnext难道是用来保存下一个员工信息的,指向下一个结构体么??


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

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

 //结构体数组赋值函数
void set_value_func(struct student arr[],int lenth)
  {
    int i=0;
    printf("请输入sex id name:\n"); 
    for(i=0;i<lenth;i++)
    {   

        scanf("%d",&arr[i].sex);
        scanf("%d",&arr[i].id);
        scanf("%s",&arr[i].name);
    }
   } 

//找最大id并显示其各成员的值的函数
void find_max_id(struct student arr[],int lenth, int *p)
{
    int i=0;
    int max = arr[i].id;//假设第一个id最大 
    for(i=1;i<lenth;i++)
    {
        if(arr[i].id > max)
        {
            max = arr[i].id;//更新最大值 
            *p = i;//输出型参数保存下标值 
        }
    }
    printf("最大的id值是:%d\n",max);//输出最大的id值 
} 

 int main(void)
 {  
    //创建结构体数组,里面有10个结构体 
    struct student arr[10];
    //调用赋值函数 
    set_value_func(arr,10);
    int index=0; 
    int*p = &index;
    //调用查找函数 
    find_max_id(arr,10,p);
    printf("%d %d %s\n",arr[index].sex,arr[index].id,arr[index].name);//输出最大id值的结构体的各个成员 
    return 0;
 }

程序实现如下:
为了简单,只测试了三组结构体。
这里写图片描述

修改优化之后的程序:

#include<stdio.h>
#include<string.h>
typedef struct student
{
    char sex;
    int id;
    char name[10];
 }stu;
 //结构体数组赋值函数
void set_value_func(struct student arr[],int lenth)
  {
    int i=0;
    printf("请输入sex id name:\n"); 
    for(i=0;i<lenth;i++)
    {   

        scanf("%d",&arr[i].sex);
        scanf("%d",&arr[i].id);
        scanf("%s",arr[i].name);//此时传递的已经是地址了 
    }
   } 
//找最大id并显示其各成员的值的函数
void find_max_id(struct student*p,int lenth)
{
    int i=0;
    stu max = p[0];//假设p[0]是最大的id下标值,把他赋值给max 
    for(i=1;i<lenth;i++)//判断max是否需要更新 
    {
        if(p[i].id > max.id)
        {
            max = p[i];//更新最大值 
        }
    }
    printf("最大的id值是:%d 其他成员的值是:%d %s \n",max.id,max.sex,max.name);//输出最大的id值 
} 
 int main(void)
 {  
    //创建结构体数组,里面有3个结构体 
    struct student arr[3];
    //调用赋值函数 
    set_value_func(arr,3);
    //调用查找函数 
    find_max_id(arr,3);
    return 0;
 }

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

#include<stdio.h>
#include<math.h>
typedef float(*p_fun_c)(float a,float b,float c,float d);//函数指针类型重命名 

//计算两点之间直线距离的函数 
float fun_c(float a,float b,float c,float d)
{
    return sqrt(((a-c)*(a-c))+((b-d)*(b-d)));
}

//结构体类型 
struct date
{
    float a;
    float b;
    float c;
    float d;
    p_fun_c p;//函数指针(结构体里面不可以放函数) 
}s;

//结构体的赋值
void set_value(struct date*p_str)
{
    printf("请输入x1,y1, x2, y2\n");
    scanf("%f %f %f %f",&p_str->a,&p_str->b,&p_str->c,&p_str->d);//给a,b,c,d赋值 
    p_str->p = fun_c;//函数指针与函数绑定 
}
//返回两点之间的直线距离
float cnt_func(struct date *p_str)
{
        return p_str->p(p_str->a, p_str->b,p_str->c, p_str->d);
}

int main(void)
{   
    //输入
    set_value(&s);
    float ret = cnt_func(&s);
    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_value_func(struct user arr[],int lenth)
  {
    int i=0;
    printf("请输入name number:\n"); 
    for(i=0;i<lenth;i++)
    {       
        scanf("%s",&arr[i].name);
        scanf("%d",&arr[i].num);
    }
   }  

//排序函数 
void fun_c(struct user *p,int lenth)
{
    int i=0;
    struct user temp;//定义一个结构体来保存临时的值 
    for(i=0;i<lenth;i++)
    {
        if(strcmp(p->name,(p+1)->name))//比较前后两个结构体的name的大小 如果前面比后面大 交换 
        {
            temp =*p;       
            p = (p+1);
            *(p+1) = temp;  
        }
        p++;    //指针++指向下一个结构体 
    }
} 

//遍历结构体数组的函数
void show_infor(struct user arr[],int lenth)
{
    int i=0;
    for(i=0;i<lenth;i++)
    {
        printf("%s \n",arr[i].name);
        printf("%d \n",arr[i].num);
    }
 }

 int main(void)
 {  
    //创建结构体数组,里面有5个结构体 
    struct user arr[3];
    //调用赋值函数 
    set_value_func(arr,3);
    //调用排序函数 
    fun_c(&arr[0],3);
    //调用遍历函数 
    show_infor(arr,3);
    return 0;
 }

老师 我这个程序的赋值函数没有问题 但是是错的
如图:
这里写图片描述
可能是这个函数出了问题 但是具体问题在哪不知道 因为相同类型的结构体可以直接赋值,所以我就直接是结构体赋值。
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值