结构体、共用体、枚举
- 格式:docx
- 大小:56.53 KB
- 文档页数:29
学习情境七结构体、共用体与枚举习题一、选择题1.若有如下说明,则的叙述是正确的(已知int类型占两个字节)。
struct st{ int a;int b[2];}a;A.结构体变量a与结构体成员a同名,定义是非法的B.程序只在执行到该定义时才为结构体st分配存储单元C.程序运行时为结构体st分配6个字节的存储单元D.类型名struct st可以通过extern关键字提前引用(即引用在前,说明在后)2.设有以下说明语句:struct ex{ int x ;float y;char z ;} example;则下面的叙述中不正确的是。
A.struct是结构体类型的关键字B.example是结构体类型名C.x,y,z都是结构体成员名D.struct ex是结构体类型3.若有以下结构体定义:struct example{ int x;int y;}v2;则是正确的引用或定义。
A.example.x=10 B.example v2.x=10;C.struct v2; v2.x=10; D.struct example v2={10};4.已知:struct{ int i ;char c;float a;} ex;则sizeof(ex)的值是。
A.4B.5C.6D.75.下面程序的运行结果是main(){struct sample{int x;int y;}a[2]={1,2,3,4};printf(“%d\n”,a[0].x+a[0].y*a[1].y);}A.7B.9C.13D.166.已知:union{ int i ;float a;char c ;} ex;则sizeof(ex)的值是。
A.4B.5C.6D.77.有如下定义struct person{char name[9]; int age;};struct person class[10]={“Johu”, 17,“Paul”, 19“Mary”,18,“Adam”, 16,};根据上述定义,能输出字母M的语句是。
c语言中各种数据类型C语言中的各种数据类型在C语言中,数据类型是非常重要的概念。
它定义了变量的类型及其在内存中所占据的空间大小。
C语言中有多种数据类型,包括基本数据类型和派生数据类型。
本文将依次介绍这些数据类型,并给出一些使用示例。
1. 基本数据类型1.1 整型(int)整型是C语言中最常用的数据类型之一。
它用于表示整数,包括正整数、负整数和零。
整型的大小取决于机器的架构,但通常情况下,int类型占用4个字节的内存空间。
下面是一个整型变量的声明和赋值的示例:```int num = 10;```1.2 浮点型(float和double)浮点型用于表示实数,包括小数和指数形式的数。
C语言中提供了两种浮点型:float和double。
float类型占用4个字节的内存空间,而double类型则占用8个字节的内存空间。
下面是一个浮点型变量的声明和赋值的示例:```float pi = 3.14;double e = 2.71828;```1.3 字符型(char)字符型用于表示单个字符,它占用1个字节的内存空间。
在C语言中,字符型变量使用单引号来表示。
下面是一个字符型变量的声明和赋值的示例:```char ch = 'A';```2. 派生数据类型2.1 数组(array)数组是一种派生数据类型,它可以存储多个相同类型的元素。
数组的大小在声明时指定,并且在程序运行期间不能改变。
下面是一个整型数组的声明和赋值的示例:```int nums[5] = {1, 2, 3, 4, 5};```2.2 结构体(struct)结构体是一种可以包含多个不同类型变量的数据类型。
它可以将不同类型的变量组合在一起,形成一个逻辑上的整体。
下面是一个结构体的声明和使用的示例:```struct Student {char name[20];int age;float score;};struct Student stu;strcpy(, "Alice");stu.age = 18;stu.score = 95.5;```2.3 枚举(enum)枚举是一种用户自定义的数据类型,它可以定义一组具有名称的常量。
C语言知识总结——宏,枚举,结构体,共用体1、define宏定义以#号开头的都是编译预处理指令,它们不是C语言的成分,但是C程序离不开它们,#define用来定义一个宏,程序在预处理阶段将用define定义的来内容进行了替换。
因此在程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。
define定义的常量,预处理时只是直接进行了替换,,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
,因此在编译时它不对宏的定义进行检查,作用域不影响对常量的访问。
它的常量值只能是字符串或数字。
该命令有两种格式:一种是简单的常量宏定义, 另一种是带参数的宏定义。
不带参数的宏:#define< 名字 >< 值 > 要注意,没有结尾的分号,因为不是C的语句,名字必须是一个单词,值可以是各种东西,宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。
如有错误,只能在编译已被宏展开后的源程序时发现。
注意.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
宏定义其作用域为宏定义命令起到源程序结束。
如要终止其作用域可使用#undef命令带参数的宏:像函数的宏,一般的定义形式:带参宏定义的一般形式为:「#define 宏名」(形参表)字符串,也是没有结尾的分号,可以带多个参数,#define NB(a,b)((a)>(b)?(b):(a)), 也可以组合(嵌套)使用其他宏,注意带参数宏的原则一切都要有括号,参数出现的每个地方都要有括号。
带参数的宏在大型的程序的代码中使用非常普遍,在#和##这两个运算符的帮助下可以很复杂,如“产生函数”,但是有些宏会被inline函数代替(C++的函数)使用宏好处:“提高运行效”。
定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。
最终排名Time Limit: 1000MS Memory limit: 65536K题目描述第四届山东理工大学ACM网络编程擂台赛比赛完后需要产生一个最终排名,排名按照题数多少来决定。
但是有太多的队伍参与,手动计算排名已经不能满足比赛的需求。
现在有一份名单记录各个队伍的ID和做出的题目数,需要你写一个程序,产生最终的排名。
为了简化题目,这里的排名规则为:做出题目数量多的队伍排在前面,如果题数相等,保持输入时的相对顺序不要改变。
输入第一行包含一个正整数T( 1≤T≤15),表示有T组测试数据。
每组数据第一行有一个正整数N(1< N≤10000),表示队伍数量。
接下来N 行包含两个整数,1≤ID≤10^7, 0≤M≤100。
ID为队伍的编号,M为做出的题数。
输出每组数据输出包含N行,第i行有两个整数,ID和M表示排在第i位的队伍的ID和做出的题数。
示例输入181 216 311 220 33 526 47 122 4示例输出3 526 422 416 3 20 3 1 2 11 2 7 1#include <stdio.h>void main(){struct team{int ID;int M;}t[10000],T;int N,n,i,j,k,time=0;scanf("%d",&N);while(time!=N){scanf("%d",&n);for(i=0;i<n;i++){scanf("%d%d",&t[i].ID,&t[i].M);}for (j=1; j<n; j++){for (k=0; k<n-j; k++){if(t[k].M<t[k+1].M){T=t[k];t[k]=t[k+1] ;t[k+1]=T;}}}for(i=0;i<n;i++){printf("%d %d\n",t[i].ID,t[i].M);}time++;}}英文金曲大赛Time Limit: 1000MS Memory limit: 65536K题目描述我们在“渊子数”的题目中已经了解了渊子是个什么样的人了,他在大一的时候参加过工商学院的“英语聚乐部”。
告诉你个秘密,这个俱乐部是个好地方,不但活动精彩而且有MM。
这不,英语俱乐部举办了一个叫做“英文金曲大赛”的节目。
这个节目有好多人参加,这不,成绩出来了,渊子当是很勇敢,自告奋勇接下了算出大家的总得分的任务。
当时有7个评委,每个评委都要给选手打分,现在要求去掉一个最高分和去掉一个最低分,再算出平均分。
结果精确到小数点后两位。
输入测试数据包括多个实例。
每组数据包括7个实数,代表评委们对该选手的评分。
紧接着是选手的名字,名字的长度不超过30个字符,且没有空格。
输入直到文件结束。
输出算出每位选手名字和最终得分,结果保留两位小数。
示例输入10 10 10 10 10 10 9 xiaoyuanwang0 0 0 0 0 0 0 beast示例输出xiaoyuanwang 10.00beast 0.00#include <stdio.h>void main(){struct player{int score[7];char s;}p;int i,big,small;float sum;while(~scanf("%d",&p.score[0])){for(i=1;i<7;i++)scanf("%d",&p.score[i]);scanf("%s",&p.s);big=small=sum=p.score[0];for(i=1;i<7;i++){big=p.score[i]>p.score[i-1]?p.score[i]:p.score[i-1];small=p.score[i]<p.score[i-1]?p.score[i]:p.score[i-1];sum+=p.score[i];}sum=sum-big-small;printf("%s %.2f\n",&p.s,sum/5);}}选夫婿1Time Limit: 1000MS Memory limit: 32768K题目描述倾国倾城的大家闺秀潘小姐要选夫婿啦!武林中各门各派,武林外各大户人家,闻讯纷纷前来,强势围观。
前来参与竞选的男生藏龙卧虎,高手云集,才子遍布,帅哥纷纭,更不乏富二代,官二代,可谓声势空前。
每个人参与竞选的帅哥除了进行一段激情洋溢的求婚演讲以外,还要报上自己姓名、身高和体重,以及个人简历。
最后再进行文武选拔,最后夺魁者方能得到潘小姐的芳心。
潘小姐不爱名利,只看人,第一关就是身高和体重要合格,即必须在其要求的范围内,否则直接排除在外,不允许参加下一轮的选拔。
作为一个程序员,你没有钱也没有权,擅长的也就是编程了。
潘小姐也发现了这一点,所以把首轮根据身高体重进行选拔的任务交给了你,如果完成的好,你可以直接进入下一轮选拔,你笑了。
输入潘小姐给你了所有报名男生的信息。
输入数据的第一行是一个正整数N(0 < N < 1000)。
然后N行数据,每行包含三部分,用空格隔开。
第一部分是报名者的姓名name(长度小于20的字符串),然后是整数身高h(0 < h < 300),第三部分是整数体重w (0 < w < 200)。
最后一行是四个整数a,b,c,d.表示身高的合格范围是[a,b],体重的合格范围是[c,d](0 < a < b < 200, 0 < c < d < 300)。
输出你需要把合格的男生信息按照身高从低到高输出,格式跟输入一样,也是每行三个信息,共N行,如果身高相同则按体重从轻到重输出,若没有合格人选则输出No,具体格式见样例。
示例输入8武大郎 70 40西门庆 180 70李逵 160 150燕青 175 69鲁智深 180 100武松 180 75小泉纯一狼 30 20孙二娘 169 60165 190 60 90示例输出孙二娘 169 60燕青 175 69西门庆 180 70武松 180 75#include <stdio.h>void main(){struct boys{char s[20];int high,weight;}b[100],t[100],T;int n,i,j,k,l,low1,low2,tall1,tall2,sum=0;scanf("%d",&n);for(i=0;i<n;i++)scanf("%s%d%d",&b[i].s,&b[i].high,&b[i].weight);scanf("%d%d%d%d",&low1,&tall1,&low2,&tall2);l=0;for(i=0;i<n;i++){if((b[i].high<=tall1)&&(b[i].high>=low1)&&(b[i].weight<=tall2)&&(b[i].weight>=low2)){t[l]=b[i];l++;sum++;}}for(i=0;i<l-1;i++){k=i;for(j=i+1;j<l;j++)if(t[k].high>t[j].high)k=j;if(k!=i){T=t[i];t[i]=t[k];t[k]=T;}}for(i=0;i<l-1;i++){k=i;for(j=i+1;j<l;j++)if(t[k].high==t[j].high&&t[k].weight>t[j].weight)k=j;if(k!=i){T=t[i];t[i]=t[k];t[k]=T;}}if(sum){for(i=0;i<l;i++){printf("%s %d %d\n",&t[i].s,t[i].high,t[i].weight);}}else printf("No\n");}选夫婿2Time Limit: 1000MS Memory limit: 32768K题目描述倾国倾城的大家闺秀潘小姐要选夫婿啦!武林中各门各派,武林外各大户人家,闻讯纷纷前来,强势围观。
前来参与竞选的男生藏龙卧虎,高手云集,才子遍布,帅哥纷纭,更不乏富二代,官二代,可谓声势空前。
每个人参与竞选的帅哥除了进行一段激情洋溢的求婚演讲以外,还要报上自己姓名、身高,以及个人简历。
最后再进行文武选拔,最后夺魁者方能得到潘小姐的芳心。
潘小姐不爱名利,只看人,第一关就是身高要合格,即必须在其要求的范围内,否则直接排除在外,不允许参加下一轮的选拔。
作为一个程序员,你没有钱也没有权,擅长的也就是编程了。
潘小姐也发现了这一点,所以把首轮根据身高进行选拔的任务交给了你,如果完成的好,你可以直接进入下一轮选拔,你笑了。
输入潘小姐给你了所有报名男生的信息。
输入数据的第一行是一个正整数N(0 < N < 100)。
然后N行数据,每行包含两部分,用空格隔开。
第一部分是报名者的姓名name(长度小于20的字符串),然后是整数身高h(0 < h < 300)。
最后一行是两个整数a,b.表示身高的合格范围是[a,b]。
输出你需要把合格的男生信息按照身高从低到高输出,格式跟输入一样,也是每行两个信息,共N行,若没有合格人选则输出No,具体格式见样例。
示例输入8武大郎 70西门庆 182李逵 160燕青 175鲁智深 195武松 180小泉纯一狼 30孙二娘 169165 190示例输出孙二娘 169燕青 175武松 180西门庆 182#include <stdio.h>void main(){struct boys{char s[20];int high;}b[100],t[100],T;int n,i,j,k,l,low,tall,sum=0;scanf("%d",&n);for(i=0;i<n;i++)scanf("%s%d",&b[i].s,&b[i].high);scanf("%d%d",&low,&tall);l=0;for(i=0;i<n;i++){if((b[i].high<=tall)&&(b[i].high>=low)){t[l]=b[i];l++;sum++;}}for(i=0;i<l-1;i++){k=i;for(j=i+1;j<l;j++)if(t[k].high>t[j].high)k=j;if(k!=i){T=t[i];t[i]=t[k];t[k]=T;}}if(sum){for(i=0;i<l;i++){printf("%s %d\n",&t[i].s,t[i].high);}}else printf("No\n");}期末考试之排名次Time Limit: 1000MS Memory limit: 65536K题目描述期末考试结束了,童鞋们的成绩也出来的了,可是为了排名次可忙坏了老师,因为学生太多了。