下列关于结构体变量操作中正确的是_____。
struct student
{
char num[10];
char name[20], sex;
int age;
float score[3];
float ave;
};
A、
stu2={"2008002","GaoPing",'M',18,86.3,80.5,89.4,85.4};
B、
struct student stu1={"2008001","LiNing",'M',19,84.3,82.5,89.4,85.4};
C、
if(stu1==stu2)
D、
printf("%10s%20s%c%3d%4.1f%4.1f%4.1f%4.1",stu1);
我的答案:
B
2
单选题
分值:3分
若有以下结构体定义,则选择()赋值是正确的。
struct s
{
int x;
int y;
}vs;
A、
s.x = 10
B、
s.vs.x = 10
C、
struct va; va.x = 10
D、
struct s va = {10}
我的答案:
D
3
单选题
分值:3分
已知学生记录描述:
struct student
{
int no;
char name[20];
char sex;
struct
{
int year;
int month;
int day;
}birth;
}s;
设变量s的生日为2022年11月22日,对生日赋值正确的是( )
A、
year = 2022; month = 11; day = 22;
B、
birth.year = 2022; birth.month = 11; birth.day =22;
C、
s.year = 2022; s.month = 11; s.day =22;
D、
s.birth.year = 2022; s.birth.month = 11; s.birth.day =22;
我的答案:
D
4
单选题
分值:3分
已知有如下结构体定义,且有p=&data,则对data中的成员a的正确引用是()
struct sk
{
int a;
float b;
}data,*p
A、
(*p).data
B、
(*p).a
C、
p->data.a
D、
p.data.a
我的答案:
B
5
单选题
分值:3分
若有以下说明语句:
struct student
{
int num;
char name[ ];
float score;
}stu;
则下面的叙述不正确的是()
A、
struct是结构体类型的关键字
B、
struct student 是用户定义的结构体类型
C、
num, score都是结构体成员名
D、
stu是用户定义的结构体类型名
我的答案:
D
6
单选题
分值:3分
若有以下说明语句:
struct date
{
int year;
int month;
int day;
}brithday;
则下面的叙述不正确的是()
A、
struct是声明结构体类型时用的关键字
B、
struct date 是用户定义的结构体类型名
C、
brithday是用户定义的结构体类型名
D、
year,day 都是结构体成员名
我的答案:
C
7
单选题
分值:3分
以下对结构变量stu1中成员age的非法引用是()
struct student
{
int age;
int num;
}stu1,*p;
p=&stu1;
A、
stu1.age
B、
student.age
C、
p->age
D、
(*p).age
我的答案:
B
8
单选题
分值:3分
假设有以下的C语言代码:
typedef struct
{
int id;
char name[50];
} Student;
void printInfo(Student *s)
{
printf("ID: %d, Name: %s\n", s->id, s->name);
}
int main()
{
Student s1 = {1, "Alice"};
printInfo(&s1);
return 0;
}
关于这段代码,以下说法正确的是()
A、
printInfo函数不能直接访问s1的id和name成员
B、
printInfo(&s1)调用是错误的,因为它传递了一个结构体而不是指针
C、
printInfo函数通过结构体指针s访问了s1的id和name成员
D、
如果将printInfo函数的参数改为Student s,则printInfo(s1);的调用将比printInfo(&s1);更快
我的答案:
C
9
单选题
分值:3分
下列代码中,()接收一个指向Student结构体的指针,并打印其id和name?
typedef struct {
int id;
char name[50];
} Student;
A、
void print(Student s) { /* ... */ }
B、
void print(Student* s) { printf("%d, %s\n", s->id, s->name); }
C、
void print(Student s*) { /* ... */ }
D、
void print(Student *s) { printf("%d, %s\n", s.id, s.name); }
我的答案:
B
10
单选题
分值:3分
下列代码中,()选项正确地通过指针p修改了结构体s的name成员?
typedef struct {
char name[50];
} MyStruct;
MyStruct s = {"old_name"};
MyStruct *p = &s;
A、
p->name = "new_name";
B、
*p.name = "new_name";
C、
strcpy(p->name, "new_name");
D、
p = "new_name";
我的答案:
C
11
填空题
分值:每空1.5分,共3分
已知有如下定义:
struct
{
int x;
int y;
}s[2] = {{1,2},{3,4}},*p=s;
则表达式++p->x的值为___,表达式(++p)->x的值为_____。
我的答案:
1、
2
2、
3
12
填空题
分值:3 分
设有以下说明语句:
typedef struct stu
{ int a;
float b;
} stutype;
则stutype是用户定义的结构体____。
我的答案:
1、
变量名
13
填空题
分值:3 分
假设有一个结构体类型Person,其中包含两个成员:int age和char name[50]。请填写以下代码,使其能够创建一个Person类型的变量p,并声明一个指向该变量的指针ptr,然后通过指针修改p的age成员。
typedef struct {
int age;
char name[50];
} Person;
Person p;
Person *ptr = _________; // 指向p
ptr->age = 30; // 修改p的age成员
我的答案:
1、
&p
14
填空题
分值:3 分
假设有一个结构体类型Student,现在有一个指向Student的指针stuPtr。如果要将这个指针设置为指向新分配的内存,应使用________函数?
typedef struct {
// ... 结构体成员 ...
} Student;
Student *stuPtr = ______(sizeof(Student)); // 填写代码以分配内存
我的答案:
1、
malloc
15
填空题
分值:每空1.5分,共3分
假设有一个结构体类型Data,现在有一个Data类型的数组dataArray,以及一个指向Data的指针dataPtr。要让dataPtr指向dataArray的第一个元素,应如何赋值。(只需填写表达式)
typedef struct {
// ... 结构体成员 ...
} Data;
Data dataArray[10];
Data ______ = ______; // 填写表达式
我的答案:
1、
*dataPtr
2、
&dataArray[0]
16
判断题
分值:2分
对于结构体类型的变量,我们只能通过其成员的名字直接访问它的成员,而不能通过指针访问。
我的答案:
错误
17
判断题
分值:2分
结构体指针在声明时不需要指定结构体的大小,只需要指定指针的类型。
我的答案:
正确
18
判断题
分值:2分
如果一个结构体指针被赋值为NULL,那么它就不能再被重新指向一个有效的结构体变量。
我的答案:
错误
19
判断题
分值:2分
使用malloc函数为结构体分配内存后,必须手动调用free函数来释放这块内存,否则会导致内存泄漏。
我的答案:
正确
20
判断题
分值:2分
如果一个结构体指针指向了某个结构体变量,那么修改这个指针所指向的内容也会修改该结构体变量的内容。
我的答案:
正确
21
编程题
分值:10分
设计一个程序,输入五个学生的信息,包括学号(整型)、姓名(字符串)、数学成绩(浮点型)、计算机成绩(浮点型),之间1个空格间隔。程序需要计算每个学生的平均分(取两位小数)和总分,并按照总分从高到低对学生进行排序。如果总分相同,则按照学号从小到大排序。最后需要输出排序前、后的结果。
定义结构体来存储学生信息;使用数组来存储五个学生的结构体变量;编写函数来计算每个学生的总分和平均分;使用冒泡排序或其他排序算法对学生数组进行排序,注意总分相同时要按学号排序;输出排序前、后的学生信息。
标准输入样例:
1 ZhangSan 85.5 90
2 LiSi 92 88.5
3 WangWu 88 92
4 ZhaoLiu 90 90
5 SunQi 89.5 87部分格式(直接复制,不要自己写否则会引起全半角不一致等问题)
scanf("%d %s %f %f",********************);
printf("学号: %d, 姓名: %s, 数学成绩: %.1f, 计算机成绩: %.1f, 总分: %.1f, 平均分: %.2f\n",**************************);
printf("排序前:\n");
printf("\n排序后:\n");
标准输出样例:
排序前:
学号: 1, 姓名: ZhangSan, 数学成绩: 85.5, 计算机成绩: 90.0, 总分: 175.5, 平均分: 87.75
学号: 2, 姓名: LiSi, 数学成绩: 92.0, 计算机成绩: 88.5, 总分: 180.5, 平均分: 90.25
学号: 3, 姓名: WangWu, 数学成绩: 88.0, 计算机成绩: 92.0, 总分: 180.0, 平均分: 90.00
学号: 4, 姓名: ZhaoLiu, 数学成绩: 90.0, 计算机成绩: 90.0, 总分: 180.0, 平均分: 90.00
学号: 5, 姓名: SunQi, 数学成绩: 89.5, 计算机成绩: 87.0, 总分: 176.5, 平均分: 88.25
排序后:
学号: 2, 姓名: LiSi, 数学成绩: 92.0, 计算机成绩: 88.5, 总分: 180.5, 平均分: 90.25
学号: 3, 姓名: WangWu, 数学成绩: 88.0, 计算机成绩: 92.0, 总分: 180.0, 平均分: 90.00
学号: 4, 姓名: ZhaoLiu, 数学成绩: 90.0, 计算机成绩: 90.0, 总分: 180.0, 平均分: 90.00
学号: 5, 姓名: SunQi, 数学成绩: 89.5, 计算机成绩: 87.0, 总分: 176.5, 平均分: 88.25
学号: 1, 姓名: ZhangSan, 数学成绩: 85.5, 计算机成绩: 90.0, 总分: 175.5, 平均分: 87.75
#include
struct S {
int id;
char n[20];
float m;
float c;
float t;
float a;
};
int main() {
struct S s[5];
int i = 0;
while (i < 5) {
scanf("%d %s %f %f", &s[i].id, s[i].n, &s[i].m, &s[i].c);
s[i].t = s[i].m + s[i].c;
s[i].a = s[i].t / 2;
i++;
}
printf("排序前:");
i = 0;
while (i < 5) {
printf("学号: %d, 姓名: %s, 数学成绩: %.1f, 计算机成绩: %.1f, 总分: %.1f, 平均分: %.2f ",
s[i].id, s[i].n, s[i].m, s[i].c, s[i].t, s[i].a);
i++;
}
int j = 0;
while (j < 4) {
i = 0;
while (i < 4 - j) {
if (s[i].t < s[i+1].t ||
(s[i].t == s[i+1].t && s[i].id > s[i+1].id)) {
struct S tmp = s[i];
s[i] = s[i+1];
s[i+1] = tmp;
}
i++;
}
j++;
}
printf("排序后:");
i = 0;
while (i < 5) {
printf("学号: %d, 姓名: %s, 数学成绩: %.1f, 计算机成绩: %.1f, 总分: %.1f, 平均分: %.2f ",
s[i].id, s[i].n, s[i].m, s[i].c, s[i].t, s[i].a);
i++;
}
return 0;
}
22
编程题
分值:10分
请编写程序实现以下功能:
(1):定义一个结构体类型,其中成员包括年、月、日;
(2):编写函数days(),用于计算本日是本年中的第几天。
注意闰年问题
输入格式请参考:
scanf("%d %d %d", *************);
2023 3 15
输出格式请参考:
printf("%d年%d月%d日是本年中的第%d天\n",*********************************);
2023年3月15日是本年中的第74天
本实验过程中的测试用例:
2023 3 15
2020 2 29
2022 12 31
#include
struct D {
int y;
int m;
int d;
};
int ds(struct D dd) {
int md[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int t = dd.d;
if (dd.y % 4 == 0 && (dd.y % 100 != 0 || dd.y % 400 == 0)) {
md[1] = 29;
}
for (int i = 0; i < dd.m - 1; i++) {
t += md[i];
}
return t;
}
int main() {
struct D dd;
scanf("%d %d %d", &dd.y, &dd.m, &dd.d);
int d = ds(dd);
printf("%d年%d月%d日是本年中的第%d天\n", dd.y, dd.m, dd.d, d);
return 0;
}
23
判断题
分值:2分
结构体指针和结构体变量在内存中的存储方式是一样的。
我的答案:
错误
24
单选题
分值:3分
给定以下结构体和指针的声明:
typedef struct
{
char *name;
int value;
} Item;
Item items[3] = {{"Apple", 5}, {"Banana", 10}, {"Cherry", 15}};
Item *p = items;
以下()表达式可以访问Banana的value?
A、
p[1].value
B、
p->value + 1
C、
*(p + 1)->value
D、
((p + 1)->value)
我的答案:
A
25
单选题
分值:3分
考虑以下结构体和指针的声明:
typedef struct
{
int id;
float score;
} Student;
Student students[5];
Student *ptr = students;
在以下循环中,()可以通过指针ptr遍历整个students数组?
A、
for (int i = 0; i < 5; i++) {
printf("%d %f\n", ptr->id, ptr->score);
ptr = ptr + sizeof(Student);
}
B、
for (int i = 0; i < 5; i++) {
printf("%d %f\n", ptr[i].id, ptr[i].score);
}
C、
for (int i = 0; i < 5; i++) {
printf("%d %f\n", *ptr.id, *ptr.score);
ptr++;
}
D、
for (int i = 0; i < 5; i++) {
printf("%d %f\n", *ptr->id, *ptr->score);
ptr = ptr + 1;
}
我的答案:
B
26
填空题
分值:3 分
假设有以下结构体定义:
typedef struct
{
int id;
char name[50];
float score;
} Student;
Student student1 = {1, "Alice", 90.5};
有一个指向该结构体的指针p,请填写初始化该指针的代码:
Student *p = __________。
我的答案:
1、
&student1
27
填空题
分值:3 分
给定一个结构体Person,其中包含了name(姓名)和age(年龄)两个成员。现有一个Person类型的数组people,数组长度为5。请补充下面的代码,使得程序能够遍历数组people,并输出每个人的姓名和年龄,如果某个人的年龄等于30,则输出"This person is 30 years old."。
#include
#include
typedef struct
{
char name[50];
int age;
} Person;
int main()
{
Person people[5] = {
{"Alice", 25},
{"Bob", 30},
{"Charlie", 20},
{"David", 30},
{"Eve", 35}
};
for (int i = 0; i < 5; i++) {
printf("Name: %s, Age: %d\n", people[i].name, people[i].age);
if (_______==30) { // 请在此处填写合适的条件表达式
printf("This person is 30 years old.\n");
}
}
return 0;
}
我的答案:
1、
people[i].age
28
填空题
分值:3 分
给定以下结构体指针数组的定义和初始化:
Student *studentsPtr[3];
studentsPtr[0] = &student1;// 假设student1是之前定义的Student结构体变量
// 假设studentsPtr[1]和studentsPtr[2]也被初始化为指向有效的Student结构体
现在,我们想通过遍历这个指针数组并打印出每个学生的id,请填写循环体内的代码:for (int i = 0; i < 3; i++)
{
printf("%d\n", __________->id);
}我的答案:
1、
studentsPtr[i]
29
填空题
分值:3 分
假设有一个结构体指针ptr,它指向一个包含int和char数组的结构体。现在想要通过ptr访问结构体中的int成员,并将其值设置为100。请填写相关代码:
typedef struct
{
int number;
char text[50];
} MyStruct;
MyStruct *ptr = (MyStruct * )malloc(sizeof(MyStruct));
if (ptr != NULL) {
// 填写代码来设置ptr指向的结构体中的number成员为100
__________ = 100;
// ... 其他操作 ...
free(ptr);
}我的答案:
1、
ptr->number
30
填空题
分值:3 分
假设有一个结构体Person,其中包含一个指向另一个结构体Address的指针。现在有一个指向Person结构体的指针p,我们想要通过p来修改Address结构体中的street成员。请填写相关代码:
typedef struct
{
char street[100];
int number;
} Address;
typedef struct{
char name[50];
Address *address;
} Person;
Person *p = (Person * )malloc(sizeof(Person));
if (p != NULL) {
p->address = (Address * )malloc(sizeof(Address));
if (p->address != NULL) {
// 填写代码来设置p指向的Person结构体中的address成员的street成员为"123 Main St"
strcpy(__________, "123 Main St");
// ... 其他操作 ...
free(p->address);
}
free(p);
}
31
判断题
分值:2分
判断以下代码段是否正确:
typedef struct
{
int id;
char name[50];
} Person;
void printPerson(Person *person){
printf("ID: %d, Name: %s\n", person->id, person->name);
}
int main(){
Person person1 = {1, "Alice"};
printPerson(&person1); // 调用printPerson函数并传入person1的地址
Person *ptr = &person1;
printf("ID: %d, Name: %s\n", ptr->id, ptr->name); // 直接使用ptr访问person1的成员
return 0;
}我的答案:
正确