结构体、共用体、枚举
最终排名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题目描述期末考试结束了,童鞋们的成绩也出来的了,可是为了排名次可忙坏了老师,因为学生太多了。
10 结构体
}
程序运行结果如下:
Number:102
Name:Zhang ping
Sex:M
Age:20
Score:78.5
本例中,对结构体变量 boy1 作了初始化赋值,然后把 boy1 的值整体赋予 boy2,最后 用 printf 函数输出 boy2 各成员的值。
10.3 结构体数组
10.3.1 结构体数组的定义 结构体数组的每一个元素都具有相同的结构体类型。在实际应用中,经常用结构体数
10.4.1 指向结构体变量的指针 指向结构体变量或结构体数组的指针称为结构体指针变量(可简称为结构指针),其
值为所指向的结构体变量或结构体数组的首地址。 定义结构体指针变量的一般形式为: struct 结构体名 *结构体指针变量名 例如: struct stu boy,*pstu; 定义了结构体变量 boy 和结构体指针变量 pstu,通过赋值语句可使 pstu 指向 boy,即: pstu=&boy; /* boy 的地址赋给 pstu */ 注意: (1) 结构体指针变量与普通指针变量的性质一样,赋值前不能使用。 (2) 编译系统不给代表结构类型的结构体名分配空间,所以下面的用法是错误的。 pstu=&stu; 利用结构体指针可以访问结构体变量的各个成员,一般形式为: 结构体指针变量->成员名 其中,运算符“->”的优先级比较高,高于算术运算符、关系运算符、逻辑运算符等。
char sex;
int age;
float score;
}boy2,boy1={102,"Zhang ping",'M',20,78.5};
boy2=boy1;
printf("Number:%d\nName:%s\n",boy2.num,);
C语言数据结构-第9章 结构体共用体与枚举
"Shang Hai","13901000003"}}; int i; for(i=0;i<3;i++) { printf("%s,%d,%s,%s,",stud[i].name,stud[i].age,stud[i].sex,stud[i].xh); printf("%d,%d,%d,",stud[i].birthday.year,stud[i].birthday.month, stud[i].birthday.day); printf("%s,%s,%s\n",stud[i].nation,stud[i].address,stud[i].tel); } }
成员运算符“.”的优先级最高,在表达式中的结构体变量成员不 需要加括号。例如:
wang.age++;
相当于
(wang.age)++;
注意
13
结构体变量的成员名可以相同,但必须处在不同的层次。 例如:
sturct student { int no;
char name[20]; struct { int no; char classname[20]; }class; struct { int no; char groupname[20]; }group; }wang;
定义结构体类型名的同时定义结构体数组,例如:
struct student{…} stud[50];
Lesson4.5_structure
注意事项
• 使用typedef只能定义各种用户定义类型名, 而不能用于定义变量 • 用户定义类型相当于原类型的别名,例如 typedef char * NAME; NAME p; 等价于 char *p; • typedef定义类型名有利于程序的移植
• typedef与# define的区别 1) typedef (int*) pINT; pINT a,b; 2) #define pINT2 int* pINT2 a,b; 1)相当于int *a, *b; 2)相当于int *a, b; typedef并不只是做简单的字符 串替换
共用体变量的特点
• 共用体变量中的所有成员共享一段公共存 储区,所以共用体变量所占内存字节数与 其成员中占字节数最多的那个成员相等 • 举例: union data { int i; char ch; float f; } 占用4字节
• 每一瞬时,共用体变量只有一个成员起作 用,其它的成员不起作用 • 共用体变量中起作用的成员是最后一次存 放的成员 • 举例: a.i = 1; a.c = 'a'; a.f = 1.5;
• 枚举元素是按常量处理的,如果没有进行 初始化,第一个枚举元素的值是0,第二个 枚举元素的值是1,依此类推 • 例如: week = Fri; printf("%d",week);
输出结果是4
• 对应的枚举变量只能取“枚举元素表”中 的某个元素,而不能取其他值,如果不能 把整数直接赋给枚举变量,例如: week = Wed; //正确 week = 2; //错误 • 若想将整数值赋给枚举变量,需要强制类 型转换,例如: week = (enum week_day)2;
程序6
• code list: 7-8-8.c • 编写一个程序,从键盘输入一行字符,调 用一个函数建立反序的单链表,然后输出 整个链表 • 链表定义如下: typedef struct node { int data; struct node *next; } NODE;
结构体公用体枚举类型习题
5.根据下面的定义,能打印出字母M的语句是 。 D struct person{ char name[9]; int age; }; struct person c[10]={"John",17,"Paul",19,"Mary",18,"Adam",1 6}; A)printf("%c\n",c[3].name); B)printf("%c\n",c[3].name[1]); C)printf("%c\n",c[2].name[1]); D)printf("%c\n",c[2].name[0]);
12.下面程序的运行结果为: word value:6b7d struct tag{ char low; low value:7d char high; }; high value:6b union word{struct tag byte; word value:567d short word; }w; main( ) { w.word=0x6b7d; printf("word value:%x\n",w.word); printf("low value:%x\n",w.byte.low); printf("high value:%x\n",w.byte.high); w.byte.high=0x56; printf("word value:%x\n",w.word); }
13.下面程序的运行结果为: 13 (提示: c[0]在低字节,c[1]在高字节) #include <stdio.h> union p{ int i; char c[2]; }x; main() { x.c[0]=13; x.c[1]=0; printf("%d\n",x.i); }
学习情境七结构体、共用体与枚举习题
学习情境七结构体、共用体与枚举习题一、选择题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的语句是。
实验9 结构体、共用体与枚举类型答案
率。 其次,结构体指针作为函数参数:可以在函数中通过该指针引用结 构体,当在函数中修改了结构体的成员变量后,指针所指向的结构体本 身也被改变了。而当结构体变量作为函数参数;在函数中可通过变量直 接使用结构体,但是,如果在函数中修改了结构体的成员变量后,结构 体本身并未发生变化,只是副本被改变。
} } average = s/5 ; printf("平均成绩:%.2f\n",average); }
4、5位职工的月收入如下表所示: 部门 月收入 工号 姓名 (char (float (int num) (char name) department) salary) 技术科 010002 张援朝 6800 生产科 020006 李明瑞 2600 检验科 030018 王国庆 4800 后勤部 040026 刘小兵 3700 经营科 050068 吴 伟 1900 试编程求这5位职工的平均月收入,并输出月收入小于3000元的职 工的部门、工号、姓名与月收入等信息。源程序以ex9_8.c命名,保存 在自己的文件夹内。
保存在自己的文件夹内。
解: #include <stdio.h> struct bookinfo { char isbn[20]; char title[50]; char author[20]; char publisher[50]; char pubdate[30]; float price; }book[5] = {{"7115177810","Java实用教程","李钟 尉","人民邮电出版社","2008年5月",32.00}, {"7113101015","汇编语言程序设计","白小明","中国铁 道出版社","2009年8月",35.00}, {"7302108535","C语言程序设计","谭浩强","清华大学 出版社","2005年7月",26.00}, {"7301123713","网络工程实用教程","汪新民","北京大 学出版社","2008年2月",34.00}, {"7111283812","软件工程概论","郑人杰","机械工业出 版社","2010年3月",28.00}}; main() { int i; float average, s=0; for(i=0; i<5; i++) { s += book[i].price; if(book[i].price<30.00) { printf("书号:%s ",book[i].isbn); printf("书名:%s ",book[i].title);
c语言中各种数据类型
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)枚举是一种用户自定义的数据类型,它可以定义一组具有名称的常量。
结构体与共用体
4、共用体类型的变量如何赋初值,含义是什么?
不能对共用体变量名赋值,也不能在定义共用体变量时初始化。但可以用一个共用体变量为 另一个变量赋值
例:union
{ int i;
char ch;
double f;
}a={1,’a’,1.5}; ()
a=1;
()
m=a;
()
例:float x; union { int i; char ch; double f; }a,b; a.i=1; a.ch=‘a’; a.f=1.5; b=a; () x=a.f; ()
二. 枚举类型的应用
• 1.枚举类型变量的定义 ◆先定义枚举类型,再定义枚举类型变量
enum week{sun,mon,tue,wed,thu,fri,
sat};
enum week weekday,workday; ◆定义枚举类型的同时定义枚举变量 enum color {red,blue,green,black}a,b,c;
共用体类型的关键字
union 联合类型名 { 数据类型 成员名1 数据类型 成员名2
...........
数据类型 成员名n };
例:
union utype {
char ch; int i; float f; };
2、如何定义共用体类型的变量
(1)先定义类型,再定义变量,例如: union data /*共用体类型定义*/ { int i;
◆直接定义枚举变量 enum {male,female}sex1,sex2;
枚举类型变量的特点
例 enum DAY {
MON=1, TUE, WED, THU, FRI, SAT, SUN };
(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
C语言第9章结构体、共用体、枚举
结构体变量.成员
struct date { int year;
int month; int day;
“.”是成员运算符, 优先级最高
printf("%d,%d,%d",birth);
printf("%d,%d,%d",birth.year,
}; struct date birth;
birth.month,birth.day);
scanf("%f",&student2.score[2])7; 8
student2
结构变量的整体赋值 student3 = student2;
02 Zhang Zi Liang 88 78
student3
02 Zhang Zi Liang 88 78
湖南工业大学计算机与通信学院
例9-1学生的基本信息包括学号、姓名、3门成绩、平均分、总分。输入一 个学生的前3项基本信息,计算平均分和总分并输出。
湖南工业大学计算机与通信学院
9.1 问题的提出
又如,在学生信息管理系统中填 加个属性:是否是中共党员,如 果不是属性的值为0(int),如
果是属性的值为入党的时间 (char)。在某一时间,属性只有 一种值,而且数据类型不同,这 种情况用什么数据类型描述呢?
对于这种应用,C语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类
C语言知识总结——宏,枚举,结构体,共用体
C语言知识总结——宏,枚举,结构体,共用体1、define宏定义以#号开头的都是编译预处理指令,它们不是C语言的成分,但是C程序离不开它们,#define用来定义一个宏,程序在预处理阶段将用define定义的来内容进行了替换。
因此在程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。
define定义的常量,预处理时只是直接进行了替换,,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
,因此在编译时它不对宏的定义进行检查,作用域不影响对常量的访问。
它的常量值只能是字符串或数字。
该命令有两种格式:一种是简单的常量宏定义, 另一种是带参数的宏定义。
不带参数的宏:#define< 名字 >< 值 > 要注意,没有结尾的分号,因为不是C的语句,名字必须是一个单词,值可以是各种东西,宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。
如有错误,只能在编译已被宏展开后的源程序时发现。
注意.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
宏定义其作用域为宏定义命令起到源程序结束。
如要终止其作用域可使用#undef命令带参数的宏:像函数的宏,一般的定义形式:带参宏定义的一般形式为:「#define 宏名」(形参表)字符串,也是没有结尾的分号,可以带多个参数,#define NB(a,b)((a)>(b)?(b):(a)), 也可以组合(嵌套)使用其他宏,注意带参数宏的原则一切都要有括号,参数出现的每个地方都要有括号。
带参数的宏在大型的程序的代码中使用非常普遍,在#和##这两个运算符的帮助下可以很复杂,如“产生函数”,但是有些宏会被inline函数代替(C++的函数)使用宏好处:“提高运行效”。
定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。
