《程序设计基础(B)II》实验1--结构体共用体和枚举
Posted ypw1131115630
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《程序设计基础(B)II》实验1--结构体共用体和枚举相关的知识,希望对你有一定的参考价值。
A [2551] - 检查宿舍卫生
Problem Description
不知道是从哪个学校开始兴起的还是哪个领导的决定,学校里每周都要检查宿舍卫生!大家发现没有,检查宿舍卫生是件很奇葩的事情,它剥削了每件物品的意义:垃圾桶里不能有垃圾,挂钩上不能挂东西,桌子上不能放东西,床上不能躺人!!假设检查卫生分为五项成绩:垃圾桶得分、挂钩得分、桌子得分、床铺得分和窗台得分。每项满分20分,总分满分为100分。按照计算机学院奇葩的规定,宿舍成绩在85分以下就要算作不合格。某天,宿管阿姨给了你一个检查完宿舍的打分表,让你帮忙统计下有多少个宿舍没有达到85分(等于85分是可以的),并且统计成绩最高分。
Input
输入包含多组测试数据. 每组数据的第一行为一个整数 T (0 < T <= 100),代表你要统计的宿舍的总数,接下来 T 行每行为 5 个整数,代表宿舍五项成绩的得分。
Output
对于每组测试数据,输出只有一行,由一个空格分隔的两个整数:总分不合格的宿舍数和宿舍总分最高分,如果最高分仍小于85分,则输出为不合格的宿舍数和“No”(不包含引号)。
Sample Input
5 1 2 3 4 5 10 20 10 20 20 20 20 20 20 20 15 15 15 20 20 10 10 10 10 10
Sample 3 100
看清题目即可。
#include <stdio.h> #define maxn 110 struct node { int sum; } a[maxn]; int main() { int i,j,k,m,n; while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); for (i=1; i<=n; i++) { j=5; while(j--) { scanf("%d",&k); a[i].sum+=k; } } k=0; m=0; for (i=1; i<=n; i++) { if (a[i].sum>m) { m=a[i].sum; } if (a[i].sum<85) { k++; } } if (m>=85) printf("%d %d ",k,m); else printf("%d No ",k); } return 0; }
Problem Description
小 I 去天津玩啦,一路上,他跟他的同学发生了许多有趣的事。
当他们路过天津外国语学院时,他发现了许多小姐姐,他眼花缭乱,甚至不知道该去找哪个小姐姐聊天。
怎么办怎么办!
于是他想到了你,他拍了一张照片给你,你发现照片里一共有 n 个小姐姐(序号从 0 到 n - 1),每个小姐姐都有自己的风格,可以按特征划分出 3 个特征值 w1 , w2 , w3 ,你知道小 I 特别喜欢 w1 特征值高的小姐姐,不太看重 w3 ,于是你对于每个特征都赋予一个权重,分别对应为0.7 0.2 0.1,你能帮小 I 找出来他发来的这张照片里他最喜欢的小姐姐吗?
Input
多组输入,对于每组输入:
- 第一行给出 n (n <= 5000) ,之后有 n 行数。
- 每行数有三个数 w1, w2, w3,表示三个特征值。
所有整数及结果都在整型范围内,不存在权值和相等的情况。
Output
n 个小姐姐中权值和最高的序号。
Sample Input
3 1 5 10 5 1 10 10 5 1
Sample Output
2
这题感觉比上面的题目还简单,emmm,没啥思维量
#include <stdio.h> #define maxn 5010 struct node { int sum; } a[maxn]; int main() { int i,j,k,m,n,w1,w2,w3; while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); for (i=0; i<n; i++) { scanf("%d%d%d",&w1,&w2,&w3); a[i].sum=w1*0.7+w2*0.2+w3*0.1; } k=-1; m=-1; for (i=0; i<n; i++) { if (a[i].sum>m) { m=a[i].sum; k=i; } } printf("%d ",k); } return 0; }
Problem Description
Input
下面依次输入每个学生所选的候选人的编号。
Output
第二行输出该候选人所得的票数。
Sample Input
3 10 1 2 3 2 3 1 2 3 1 3
Sample Output
3 4
这题感觉不用结构体也可以,但是算这个专题的,也就算麻烦一点了
#include <stdio.h> #define maxn 5010 struct node { int sum[maxn]; } a; int main() { int i,j,k,m,n,w[maxn]; scanf("%d%d",&n,&m); for (i=1; i<=m; i++) { scanf("%d",&k); a.sum[k]++; } k=-1; m=-1; for (i=1; i<=n; i++) { if (a.sum[i]>m) { m=a.sum[i]; k=i; } } printf("%d %d ",k,m); return 0; }
Problem Description
小 I 去天津玩啦,一路上,他跟他的同学发生了许多有趣的事。
到了晚上了,小 I 跟他的同学们要选一个宾馆住下了。但是形形色色的宾馆让小 I 不知所措。
对于一个宾馆来说,有许多特征,比如「价格」、「舒适度」。小I会对每个特征都有一个满意度。
小I会选择出满意度更高一些的宾馆。
其中,「价格」对于小 I 来说是最重要的,其次是「舒适度」。
如果有两个宾馆,如果对「价格」的满意度相同,那么根据「舒适度」进行选择;如果有多个宾馆条件相同,输出编号最小的宾馆。
小 I 现在处于水深火热之中,因为他们面对一堆宾馆不知所措,他想到了会编程的你,如果你不帮他选出来,他可能就会露宿街头了QAQ~
你能帮他按照他的意愿找到小I最满意的宾馆吗?
Input
多组输入,对于每组输入:
- 给出 n (n <= 5000) 代表 n 个宾馆(编号从 1 - n),随后有 n 行数据。
- 每行数据有两个整数,分别代表小I对「价格」、「舒适度」的满意程度,数值越大满意程度越高,满意度的范围从0 - 5000。
Output
输出按照描述的条件中小I最满意的宾馆编号,如果有多个宾馆条件相同,输出编号最小的宾馆。
Sample Input
4 0 1 1 0 1 1 1 0
Sample Output
3
设定第一个宾馆是最好的,不断地拿后面的宾馆和它比较,最后得出最好的宾馆。
#include <stdio.h> #define maxn 5010 struct node { int b,c,i; } a[maxn]; int main() { int i,j,k,m,n,t,b,c; while(~scanf("%d",&n)) { scanf("%d%d",&a[1].b,&a[1].c); b=a[1].b; c=a[1].c; t=1; for(i=2; i<=n; i++) { scanf("%d%d",&a[i].b,&a[i].c); if (b<a[i].b) { b=a[i].b; c=a[i].c; t=i; } else if(b==a[i].b&&a[i].c>c) { b=a[i].b; c=a[i].c; t=i; } } printf("%d ",t); } return 0; }
Problem Description
Input
Output
Sample Input
3 Dan 10 John 50 Danny 30
Sample Output
John 50 Danny 30 Dan 10
给结构体排个序
#include <stdio.h> #define maxn 5010 struct node { int score; char name[11]; } a[maxn]; int main() { int i,j,k,m,n; struct node t; scanf("%d",&n); for (i=1;i<=n;i++) { scanf("%s %d",a[i].name,&a[i].score); } for (i=1;i<=n-1;i++) { for (j=1;j<=n-i;j++) { if (a[j].score<a[j+1].score) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } for (i=1;i<=n;i++) { printf("%s %d ",a[i].name,a[i].score); } return 0; }
Problem Description
Input
第一行包含一个正整数T( 1 ≤ T ≤ 15),表示有T组测试数据。每组数据第一行有一个正整数N(1 < N ≤ 10000),表示队伍数量。接下来N 行包含两个整数,1 ≤ ID ≤ 10^7, 0 ≤ M ≤ 100。ID为队伍的编号,M为做出的题数。
Output
每组数据输出包含N行,第i行有两个整数,ID和M表示排在第i位的队伍的ID和做出的题数。
Sample Input
1 8 1 2 16 3 11 2 20 3 3 5 26 4 7 1 22 4
Sample Output
3 5 26 4 22 4 16 3 20 3 1 2 11 2 7 1
这题比前面那题的排序还要来的简单,不多数,没啥思维量
#include <stdio.h> #define maxn 5010 struct node { int score; int name; } a[maxn]; int main() { int i,j,k,m,n; struct node t; scanf("%d",&m); while(m--) { scanf("%d",&n); for (i=1; i<=n; i++) { scanf("%d%d",&a[i].name,&a[i].score); } for (i=1; i<=n-1; i++) { for (j=1; j<=n-i; j++) { if (a[j].score<a[j+1].score) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } for (i=1; i<=n; i++) { printf("%d %d ",a[i].name,a[i].score); } } return 0; }
Problem Description
潘小姐不爱名利,只看人,第一关就是身高和体重要合格,即必须在其要求的范围内,否则直接排除在外,不允许参加下一轮的选拔。
作为一个程序员,你没有钱也没有权,擅长的也就是编程了。潘小姐也发现了这一点,所以把首轮根据身高体重进行选拔的任务交给了你,如果完成的好,你可以直接进入下一轮选拔,你笑了。
Input
潘小姐给你了所有报名男生的信息。输入数据的第一行是一个正整数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)。
Output
你需要把合格的男生信息按照身高从低到高输出,格式跟输入一样,也是每行三个信息,共N行,如果身高相同则按体重从轻到重输出,若没有合格人选则输出No,具体格式见样例。
Sample Input
8 武大郎 70 40 西门庆 180 70 李逵 160 150 燕青 175 69 鲁智深 180 100 武松 180 75 小泉纯一狼 30 20 孙二娘 169 60 165 190 60 90
Sample Output
孙二娘 169 60 燕青 175 69 西门庆 180 70 武松 180 75
注意细节错误,先把符合的人选放到一个新的结构体里面,再将新的结构体按要求进行排序。
#include <stdio.h> #define maxn 1010 struct node { int h,w; int name[21]; } a[maxn],b[maxn]; int main() { int i,j,k,m,n,h1,h2,w1,w2; struct node t; scanf("%d",&m); for (i=1; i<=m; i++) { scanf("%s%d%d",a[i].name,&a[i].h,&a[i].w); } scanf("%d%d%d%d",&h1,&h2,&w1,&w2); k=0; for (i=1; i<=m; i++) { if (a[i].h>=h1&&a[i].h<=h2&&a[i].w>=w1&&a[i].w<=w2) { b[++k]=a[i]; } } for(i=1; i<=k-1; i++) { for (j=1; j<=k-i; j++) { if (b[j].h>b[j+1].h) { t=b[j]; b[j]=b[j+1]; b[j+1]=t; } } } for (j=1; j<=k-1; j++) { if (b[j].h==b[j+1].h&&b[j].w>b[j+1].w) { t=b[j]; b[j]=b[j+1]; b[j+1]=t; } } if (k==0) printf("No "); else { for (i=1; i<=k; i++) { printf("%s %d %d ",b[i].name,b[i].h,b[i].w); } } return 0; }
Problem Description
Input
Output
Sample Input
3 1 2 2 3 2 3
Sample Output
1 3 2 3 2 2
输入有点矩阵转置的感觉,第一行先输入结构体中的一个,第二行再输入另一个值,然后将其按要求排序
#include <stdio.h> #define maxn 10010 struct node { int p,w; } a[maxn]; int main() { int i,j,k,m,n,h1,h2,w1,w2; struct node t; while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); for (i=1; i<=n; i++) { scanf("%d",&a[i].w); } for (i=1; i<=n; i++) { scanf("%d",&a[i].p); } for (i=1; i<=n-1; i++) { for (j=1; j<=n-i; j++) { if (a[j].w>a[j+1].w) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } for (j=1; j<=n-1; j++) { if (a[j].w==a[j+1].w&&a[j].p<a[j+1].p) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } for (i=1; i<=n; i++) { printf("%d %d ",a[i].w,a[i].p); } } return 0; }
Problem Description
给定n和m,接下来有n个描述,每个描述包含一个类型标志和一组相应的数据。类型标志共3种:INT DOUBLE STRING,然后对应一组相应的数据。紧接着有m个询问,每个询问仅包含一个整数x,要求输出第x个描述对应的数据(STRING类型保证不含空格,每组对应STRING数据不会超过19个字符)。
Input
输入的第一行为两个整数,n和m (n<=100000, m<=100000),分别代表描述的个数和询问的个数。接下来为 n 行描述,最后为m行询问,具体格式见样例输入输出。
Output
对于每个询问,输出对应的结果,注意:浮点数保留两位小数。
Sample Input
5 4 INT 456 DOUBLE 123.56 DOUBLE 0.476 STRING welcomeToC STRING LemonTree 0 1 2 4
Sample Output
456 123.56 0.48 LemonTree
共同体和结构体的区别就在于共同体里面的每一项只能选一个,而结构体是里面的选项都要,结构体往往所占的空间比共同体要多,每种数据都是不同类型的时候用共同体更合适。题目没什么难度,就是要熟悉共同体的使用。
#include <stdio.h> #define maxn 100010 union { int b; double c; char x[50]; }a[maxn]; char s[maxn][20]; int main() { int n,t,i,j,m,h; double p; char x[50]; scanf("%d%d",&n,&m); for (i=0;i<n;i++) { scanf("%s",s[i]); if (s[i][0]==‘I‘) { scanf("%d",&h); a[i].b=h; } else if (s[i][0]==‘D‘) { scanf("%lf",&p); a[i].c=p; } else if (s[i][0]==‘S‘) { scanf("%s",&x); strcpy(a[i].x,x); } } for (i=0;i<m;i++) { scanf("%d",&t); if(s[t][0]==‘I‘) printf("%d ",a[t].b); else if (s[t][0]==‘D‘) printf("%.2f ",a[t].c); else if(s[t][0]==‘S‘) printf("%s ",a[t].x); } return 0; }
Problem Description
Input
Output
Sample Input
blue yellow purple
Sample Output
Bluebells are blue. Sunflower are yellow. I don‘t know about the color purple.
本人感觉这个枚举在这题有点多此一举,没办法,为了熟悉一下这个东西的使用
#include <stdio.h> #define maxn 100010 enum color { red,orange,yellow,green,blue,violet,no } co; char s[maxn]; int main() { while(~scanf("%s",s)) { if(strcmp(s,"red")==0) co = red; else if(strcmp(s,"orange")==0) co = orange; else if(strcmp(s,"yellow")==0) co = yellow; else if(strcmp(s,"green")==0) co = green; else if(strcmp(s,"blue")==0) co = blue; else if(strcmp(s,"violet")==0) co = violet; else co = no; switch(co) { case red: printf("Rose are red. "); break; case orange: printf("Poppies are orange. "); break; case yellow: printf("Sunflower are yellow. "); break; case green: printf("Grass are green. "); break; case blue: printf("Bluebells are blue. "); break; case violet: printf("Violets are violet. "); break; case no: printf("I don‘t know about the color %s. ",s); break; } } return 0; }
以上是关于《程序设计基础(B)II》实验1--结构体共用体和枚举的主要内容,如果未能解决你的问题,请参考以下文章