测试题:
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;
}