S1E43:结构体数组和结构体指针 课后作业

测试题:
0. 请问下面代码中,book 变量占用多少内存空间呢?

struct Date
{
        int year;
        int month;
        int day;
};

struct Book
{
        char title[128];
        char author[40];
        float price;
        struct Date date;
        char publisher[40];
};

struct Book book;

答:128+40+4+12+40 = 224

答案:224。
解析:128 + 40 + 4 + (4 + 4 + 4) + 40 = 224,注意不要忘了计算内嵌结构体 Date 噢~

1. 对于上一题中的嵌套结构体,我们可以使用 book.date 来访问其内嵌的子结构体吗?

答:不能,要book.date.year这样

答案:不能。
解析:试图用 book.date 访问日期的做法是错误的,你只能使用 book.date.year,book.date.month 和 book.date.day 依次打印出年月日。

2. 请问下面代码中,stu 变量占用多少内存空间呢?

struct Date
{
        int year;
        int month;
        int day;
};

struct Student
{
        int id;
        char name[20];
        struct Date date;
};

struct Student stu[20];

答:4+20+12 = 36(错误

答案:720。
解析:(4 + 20 + (4 + 4 + 4)) * 20 = 720。

3. 为 Student 结构体定义一个叫 stu 的变量,初始化值为(ID:123;name:"FishC";year:2021;month:07;day:16;hour:18;minute:30;second:30),请使用一个语句实现。

struct Time
{
        int hour;
        int minute;
        int second;
};

struct Date
{
        int year;
        int month;
        int day;
        struct Time time;
};

struct Student
{
        int id;
        char name[20];
        struct Date date;
};

答:(错误)

struct Student
{
	int id;
	char name[20];
	struct Date date; 	
}stu = {
		123,
		FishC,
		{2021,07,{18,30,30}}
       };

答案:

struct Student stu = {123, "FishC", {2021, 07, 16, {16, 58, 00}}};

4. 定义一个指针变量 pt,指向上一题的 stu 变量,下面两种方法中,哪一种是正确的?
第一种:

struct Student *pt = &stu;

第二种:

struct Student *pt = stu;

答:第一种,结构体名不代表结构体地址,必须用取址符

答案:第一种。

5. 定义一个指针变量 pt,指向上一题的 stu 变量,并通过该指针访问其内嵌的 Time 结构体数据(打印格式:hh:mm:ss)。

答:

struct Student *pt = &stu;

printf("%d:%d:%d",(*pt).date.time.hour,(*pt).date.time.minute,(*pt).date.time.second);

答案:

struct Student *pt = &stu;
printf("%d:%d:%02d\n", pt->date.time.hour, pt->date.time.minute, pt->date.time.second);

解析:千万不要写成 pt->date->time->hour,因为 pt 指针指向的是 stu 结构体,内嵌的还是应该使用点好运算符(.)进行访问。

动动手:
0. 请编写一个程序,要求定义一个结构体(Student),用于存放 “学号”、“性别”、“邮箱” 和 “QQ号码”,在用户录入数据后打印结果。
这次要求程序支持用户录入多个数据,具体录入的数量由用户自定义。
程序实现如下:

答:

#include <stdio.h>

struct Student
{
	int ID;
	int xinbie;
	char email[32];
	char qq[16];	
};


int main()
{
	int num,i;
	
	printf("请输入需要录入的数据数量:");
	scanf("%d",&num);
	struct Student stu[num];
	
	for(i=0;i<num;i++)
	{
		printf("请录入第%d个学生的数据\n",i+1);
		
		printf("请输入学生ID:");
		scanf("%d",&(stu[i].ID));
		
		printf("请输入学生性别:");
		scanf("%d",&(stu[i].xinbie));
		
		printf("请输入qq号:");
		scanf("%s",stu[i].qq);
		
		printf("请输入email:");
		scanf("%s",stu[i].email);
	}	
	printf("\n以下是录入的所有数据");
	for(i=0;i<num;i++)
	{
		printf("ID:%d\n",stu[i].ID);
		printf("qq:%s\n",stu[i].qq);
		printf("email:%s\n",stu[i].email);	
	}
} 

答案:

#include <stdio.h>
    
struct Student
{
        int id;
        int sex;
        char qq[32];
        char email[64];
};
    
int main(void)
{
        char ch;
        int i, n;
        
        printf("请输入需要录入的数据数量:");
        scanf("%d", &n);

        struct Student stu[n];
        
        for (i = 0; i < n; i++)
        {
                printf("请录入第 %d 个学生的数据...\n", i+1);
            
                printf("请输入学生ID:");
                scanf("%d", &stu[i].id);
            
                printf("请输入学生性别(1/0):");
                scanf("%d", &stu[i].sex);
            
                printf("请输入QQ号:");
                scanf("%s", stu[i].qq);
            
                printf("请输入Email地址:");
                scanf("%s", stu[i].email);
        }
        
        printf("\n=====数据录入完毕=====\n");
        
        printf("\n以下是录入的所有男生的数据:\n");
        for (i = 0; i < n; i++)
        {
                if (stu[i].sex == 1)
                {
                        printf("ID:%d\n", stu[i].id);
                        printf("QQ号是:%s\n", stu[i].qq);
                        printf("Email是:%s\n", stu[i].email);
                }
        }
        
        printf("\n以下是录入的所有女生的数据:\n");
        for (i = 0; i < n; i++)
        {
                if (stu[i].sex == 0)
                {
                        printf("ID:%d\n", stu[i].id);
                        printf("QQ号是:%s\n", stu[i].qq);
                        printf("Email是:%s\n", stu[i].email);
                }
        }
        
        return 0;
}

1. 使用结构体声明三维立体空间中一个点的坐标(包含 x 坐标、y 坐标和 z 坐标),支持用户录入多个点的坐标(具体录入的数量由用户自定义),并计算所有点之间的距离。
程序实现如下:

答:程序没写完

#include <stdio.h>

struct Point
{
	int x;
	int y;
	int z; 	
};


int main()
{	
	int num,i;
	printf("请输入需要录入的数据是:");
	scanf("%d",&num);
	
	struct Point pt[num];
	
	for(i=0; i<num; i++)
	{
		printf("请输入第%d个点的x坐标:",i+1);
		scanf("%d",&pt[i].x);
		
		printf("请输入第%d个点的y坐标:",i+1);
		scanf("%d",&pt[i].y);
		
		printf("请输入第%d个点的z坐标:",i+1);
		scanf("%d",&pt[i].z);
		
		printf("\n");
	}
}

答案:

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

struct Point
{
    double x;
    double y;
    double z;
};

int main(void)
{
    int i, j, n;
    double result;

    printf("请输入需要录入的数据数量:");
    scanf("%d", &n);
    putchar('\n');

    struct Point pt[n];

    for (i=0; i < n; i++)
    {
        printf("请输入第 %d 个点的 x 坐标:", i+1);
        scanf("%lf", &pt[i].x);

        printf("请输入第 %d 个点的 y 坐标:", i+1);
        scanf("%lf", &pt[i].y);

        printf("请输入第 %d 个点的 z 坐标:", i+1);
        scanf("%lf", &pt[i].z);

        putchar('\n');
    }

    for (i=0; i < n; i++)
    {
        for (j=i+1; j < n; j++)
        {
            result = sqrt(pow((pt[i].x - pt[j].x), 2) + pow((pt[i].y - pt[j].y), 2) + pow((pt[i].z - pt[j].z), 2));
            printf("第 %d 个点和第 %d 个点之间的距离大约是 %.2f\n", i+1, j+1, result);
        }
    }
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值