c/c++零基础坐牢第十三天
c/c++从入门到入土(13)
开始时间2023-05-16 17:45:36
结束时间2023-05-16 20:25:20
前言:当表示复杂的数据对象时。仅用几种基本数据类型明显是不够的,根本方法就是允许用户自定义数据类型,在c语言中构造数据类型的典型代表就是结构体。c语言通过指针和类型强转,使我们可以对一块内存进行“你希望它表达什么,它就表达什么”的操作,从而实现在更深的层次上控制计算机。以下是自制思维导图参考于苏小红C语言程序设计(第四版):
作业10 结构体与共用体
【C0251】下面对结构数据类型的错误叙述是_______。
A.结构变量可以在说明结构类型后定义,也可在说明结构时定义。
B.结构可由若干个成员组成,各成员的数据类型可以不同。
C.定义一个结构类型后,编译程序要为结构的各成员分配存储空间。
D.结构变量的各成员可通过结构变量名和指向结构变量的指针引用。
答案:C
体会:结构体定义完成以后,计算机并不会给结构体分配内存空间,会在结构体定义结构体变量后,分配存储空间。
【C0252】在VC6.0下,以下程序运行的结果是_______。 #include<stdio.h> int main( ){ union U{ char st[4] ; int i ; long l ; } ; struct A{ int c ; union U u ; } a ; printf( "%d\n" , sizeof( struct A ) ) ; return 0 ; } A.6 B.8 C.10 D.12
答案:B
体会:通过输出语句可以看出,输出结构体A所占的字节数,结构体A为一个嵌套结构体,其中包含整型数据c和共同体u,共同体所占字节取决于其成员中占内存空间最多的成员变量,判断结构体的字节数需要考虑内存对齐,会在内存小的成员后加入补位。
【C0253】说明语句 enum money { Fen , Jiao ,Yuan = 100 , Tenyuan } ; 每个枚举元素所对应的实际值为_______。 A.0 ,1 ,100 ,101 B.1 ,2 ,100 ,101 C."Fen"或1 ,"Jiao"或2 ,"Yuan"或100 ,"Tenyuan"或101 D."Fen" ,"Jiao" ,"Yuan"或100 ," Tenyuan"
答案:A
体会:花括号内为枚举常量,除非特别指定,一般情况第一个枚举常量的值为0,以后依次增1。若枚举类型在定义时明确指明枚举常量的值,此后变量依次增1.
【C0254】当说明一个共用体变量时系统分配给它的内存是_______。
A.各成员所需内存量的总和
B.结构中第一个成员所需内存量
C.成员中占内存量最大者所需的容量
D.结构中最后一个成员所需内存量
答案:C
体会:共用体类型所占空间大小取决于其成员中占内存空间最多的成员变量。
【C0255】设有以下说明语句: struct stu{ int a ; float b ; } stutype ; 则下面的叙述不正确的是_______。 A.struct是结构体类型的关键字。 B.structs stu是用户定义的结构体类型。 C.stutype是用户定义的结构体类型名。 D.a和b都是结构体成员名。
答案:C
体会:struct是结构体类型的关键字;stu为结构体的名字,称为结构体标签,作为用户自定义的结构体类型的标志,用于与其他结构体类型相区别;花括号内声明的为结构体中的各信息项,构成结构体的变量成为结构体的成员,每个结构体成员都有一个名字和相应的数据类型。结构体成员的命名必须遵从变量的命名规则。stutype为结构体变量。
【C0256】以下scanf函数调用语句中对结构体变量成员的不正确引用是_______。 struct pupil{ char name[20] ; int age ; int sex ; } pup[5] , *p = pup ; A.scanf( "%s" , pup[0].name ) ; B.scanf( "%d" , &pup[0].age ) ; C.scanf( "%d" , &( p->sex ) ) ; D.scanf( "%d" , ( p->age ) ) ;
答案:D
体会:如何访问结构体指针变量所指向的结构体成员,一种是使用成员选择运算符,也成为圆点运算符;另一种是使用指向运算符,也称剪头运算符,其标准访问形式如下:指向结构体的指针变量名->成员名。
【C0257】以下对结构体变量的定义错误的是_______。 A. typedef struct student{ int num ; float age ; }STUDENT ; STUDENT std1 ; B. struct student{ int num ; float age ; } stdl ; C. struct{ int num ; float age ; } stdl ; D. struct{ int num ; float age ; }; struct student std1 ;
答案:D
体会:所定义的结构体需要有结构体名。
【C0258】根据下面的定义,能打印出字母z的语句是_______。 struct student{ char name[10] ; int age ; } ; struct student stu[3] = { "li xiang" , 17 , "zhang san" , 18 ,"wang wu" , 18 } ; A.printf( "%c\n" , stu[2].name ) ; B.printf( "%c\n" , stu[2].name[1] ) ; C.printf( "%c\n" , stu[1].name[1] ) ; D.printf( "%c\n" , stu[1].name[0] ) ;
答案:D
体会:我们可以发现"zhang san"中存在字母z,则我们要输出字母z,我们可以输出结构体数组第二个元素中name数组中的第一个字符即可。
【C0259】设有如下说明: typedef struct ST{ long a ; int b ; char c[2] ; } NEW ; 则下面叙述中正确的是_______。 A.以上的说明形式非法 B.ST是一个结构体类型 C.NEW是一个结构体类型 D.NEW是一个结构体变量
答案:C
体会:关键字typedef用于为系统已有的或程序员自定义的数据类型定义一个别名。数据类型的别名通常使用大写字母,目的是为了与已有的数据类型相区分。
【C0260】假定建立了以下链表结构,指针p、q分别指向如下图所示的结点,则以下可以将q所指结点从链表中删除并释放该结点的语句组是_______。
A.free( q ) ; p->next = q->next ; B.( *p ).next = ( *q ).next ; free( q ) ; C.q = ( *q ).next ; ( *p ).next = q ; free( q ) ; D.q = q->next ; p->next = q ; p = p->next ; free( p ) ;
答案:B
体会:链表的删除操作就是将一个待删除节点从链表中断开,不再与链表的其他节点有任何联系。很明显图中为第三种情况,若找到的待删除节点不是头节点,则将前一节点的指针域指向当前节点的下一节点,即可删除当前节点。
【C0261】typedef unsigned long LONG ; 的作用是_______。 A.定义了一种新的数据类型 B.定义了一个整型变量 C.定义了一个长整形变量 D.定义了一个新的数据类型标识符
答案:D
【C0262】在VC6.0中,若有如下定义: struct data{ char ch ; short int i ; double f ; } b ; 则结构变量b理论上占用内存的字节数是11 。
分析:注意关键字“理论上”,所以直接累加1+2+8=11.
【C0263】有定义: struct node{ int num ; struct node *next ; } *head , *p ; 假定head是一个带头结点的链表的头指针,欲将p指向的结点插入到该链表成为第一个结点,应做的操作是(设head , p都正确赋值): (1) p->next=head->next ; (2) head->next=p;
【C0264】以下函数的功能是输出链表结点中的数据,形参指针h已指向如下图所示链表,请填空。
struct slist{ char data ; struct slist *next ; } ; viod fun( struct slist *h ){ struct slist *p ; p = h ; while( p ){ printf( "%c " , p->data ) ; p = p->next; } printf( "\n" ) ; }
【C0265】下面程序的运行结果是51,60,21。 #include<stdio.h> struct stu{ int x ; int *y ; } *p ; int dt[4] = {10 , 20 , 30 , 40 } ; struct stu a[4] = { 50 , &dt[0] , 60 , &dt[1] , 70 , &dt[2] , 80 , &dt[3] } ; int main( ){ p = a ; printf( "%d," , ++p->x ) ; printf( "%d," , ( ++p )->x ) ; printf( "%d\n" , ++( *p->y ) ) ; return 0 ; }
【C0266】下面程序的运行结果是16。 #include<stdio.h> typedef struct{ int num ; double s ; }REC; void fun1( REC x ){ x.num = 23 ; x.s = 88.5 ; } int main( ){ REC a = { 16 , 90.0 } ; fun1( a ) ; printf( "%d\n" , a.num ) ; return 0 ; }
【C0266】下面程序的运行结果是16。 #include<stdio.h> typedef struct{ int num ; double s ; }REC; void fun1( REC x ){ x.num = 23 ; x.s = 88.5 ; } int main( ){ REC a = { 16 , 90.0 } ; fun1( a ) ; printf( "%d\n" , a.num ) ; return 0 ; }
【C0267】下面程序的运行结果是1001,ChangRong,1098.0。 #include<stdio.h> #include<string.h> struct A{ int a ; char b[10] ; double c ; }; void f( struct A *t ) ; int main( ){ struct A a = {1001 , "zhangDa" , 1098.0 } ; f( &a ) ; printf( "%d,%s,%6.1f\n" , a.a , a.b , a.c ) ; return 0 ; } void f( struct A *t ){ strcpy( t->b , "ChangRong" ) ; }
【C0268】下面程序的功能是用以输出结构体类型struct ps所占内存单元的字节数。请完善程序。 #include<stdio.h> struct ps{ double i ; char arr[20] ; } ; int main( ){ struct ps bt ; printf( "bt size : %d\n" , sizeof(bt)) ; return 0 ; }
【C0269】下面程序的功能是把三个NODETYPE型的变量链接成一个简单的链表,并在while循环中输出链表结点数据中的数据。请完善程序。 #include<stdio.h> struct node{ int data ; struct node *next ; } ; typedef struct node NODETYPE ; int main( ){ NODETYPE a , b , c , *h , *p ; a.data = 10 ; b.data = 20 ; c.data = 30 ; h = &a ; a.next = &b ; b.next = &c ; c.next = '\0' ; p = h ; while( p ) { printf( "%d, " , p->data ) ; p=p->next; } printf( "\n" ) ; return 0 ; }
【C0270】下面程序中,函数 fun 的功能是:统计 person 所指结构体数组中所有性别(sex)为 M 的记录的个数,存入变量 n中,并做为函数值返回。请完善程序。 #include<stdio.h> #define N 3 typedef struct{ int num ; char nam[ 10 ] ; char sex ; }SS ; int fun( SS person[ ] ){ int i , n = 0 ; for( i = 0 ; i < N ; i++ ) if(person[i].sex == 'M' ) n++ ; return n ; } int main( ){ SS W[N] = { {1 , "AA" , 'F' } , {2 , "BB" , 'M'} , { 3 , "CC" , 'M' } }; int n ; n = fun( W ) ; printf( "n=%d\n" , n ) ; return 0 ; }
编程题!!
第一题
编写一个程序,实现从键盘输入3个学生数据(每个学生的数据包括学号、姓名、2门课程的成绩),输出每个学生2门课的平均成绩,以及最高分的学生的数据(包括学号、姓名、2门课的成绩、平均分数)。 输入格式: 输入3个学生的数据,每个学生的数据占一行,格式如下: <学号> <姓名> <第一门课程成绩> <第二门课程成绩> 注意:学号/姓名中不包含空白符,学号为8位字符,姓名最多为20位字符。 输出格式: 首先在第1行中依次输出3名同学的平均成绩,平均成绩的输出格式为占10位,小数点后保留1位。 在第2行中输出最高分的学生的数据,格式如下: No=<学号>,Name=<姓名>,Score1=<第一门课程成绩>,Score2=<第二门课程成绩>,Average=<平均成绩> 注:课程成绩和平均成绩输出时保留1位小数且四舍五入处理。 输入样例: 20180001 zhangsan 70.0 80.0 20180002 lisi 95.0 89.0 20180003 wangwu 65.0 84.0 输出样例: 75.0 92.0 74.5 No=20180002,Name=lisi,Score1=95.0,Score2=89.0,Average=92.0 裁判测试程序样例: #include<stdio.h> int main( ){ /* 请在这里填写答案 */ printf("\nNo=%s,Name=%s,Score1=%.1f,Score2=%.1f,Average=%.1f",s[max].no,s[max].name,s[max].score1,s[max].score2,s[max].average); return 0 ; } 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
struct std{ char name[20]; char no[8]; float score1; float score2; float average; }s[10]; int i; int max=0; float a=0; for(i=0;i<3;i++){ scanf("%s%s%f%f",s[i].no,s[i].name,&s[i].score1,&s[i].score2); } for(i=0;i<3;i++) { s[i].average=(s[i].score1+s[i].score2)/2; printf("%10.1f",s[i].average); } for(i=0;i<3;i++) { if(s[i].average>a) { a=s[i].average; max=i; } }
----------分割线----------
第二题
已知head指向一个带头结点的单向链表,链表每个结点包含整型数据域data(注:data>0)和指针域next。请编写函数int max(struct node *head),在链表中查找数据域值最大的结点,由函数值返回找到的最大值。 在main( )函数中构建该链表,并调用max()查找最大值并输出. 输入格式: 在一行中输入5个正整数,以空格为间隔 输出格式: 以以下格式输出查找到的最大值: Max=<最大值> 输入样例: 1 2 3 4 5 输出样例: Max=5 裁判测试程序样例: #include<stdio.h> #include<stdlib.h> /* 请在这里填写答案 */ int main( ){ int i; struct node *p,*head; head=(struct node *)malloc(sizeof(struct node)); head->next=NULL; for(i=0; i<5; i++){ p=(struct node *)malloc(sizeof(struct node)); scanf("%d",&(p->data)); p->next=head->next; head->next=p; } printf("Max=%d",max(head)); return 0 ; } 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
#include<stdio.h> #include<stdlib.h> struct node { short int data ; struct node *next ; } ; typedef struct node NODE ; struct node *CreatLink( ) ; void PrintLink( NODE *head ) ; int max( NODE *head ); struct node *CreatLink( ) { NODE *head , *p , *q ; short int num ; head = ( NODE * )malloc( sizeof( NODE ) ) ; head->next = NULL ; p = head ; printf( "Please input( end of -1)!:\n" ) ; scanf( "%d" , &num ) ; while( num != -1 ) { q = ( NODE *)malloc( sizeof( NODE ) ) ; q->data = num ; p->next = q ; p = q ; scanf( "%d" , &num ) ; } p->next = NULL ; return head ; } void PrintLink( NODE *head ) { NODE *p; p = head->next ; printf( "The data is:\n" ) ; while( p != NULL ) { printf( "%4d" , p->data ) ; p = p->next ; } printf( "\n" ) ; } int max( NODE *head ) { NODE *p; short int max = -32768; p = head->next ; while( p != NULL ) { if( max < p->data ) max = p->data ; p = p->next ; } return max ; }
总结:结构体就像一个Excel表格,一行代表着一个结构体变量,而每一列则是结构体成员。结构体如同一种分类方式,可以帮助我们收集主人的所有物。
每日一mo:我超!从小到大第一次感受到下冰雹!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程