结构体、共用体和枚举

来源:互联网 发布:实体店想在淘宝进货 编辑:程序博客网 时间:2024/05/21 08:55

结构体的基本定义,简单的说就是把一些共有的特征变量整合在一起,通过一定的方法访问变量。

结构体详细解说可参考:http://blog.csdn.net/huqinwei987/article/details/23625823(作者:秦伟H)

山理工ACM题中

2446最终排名——即用到了结构体,其中有共用属性队伍ID、队伍做出的题数。

本题的结构体定义如下: struct node{
    int id,m,shunxu;
}team[10001];

本题的要求:按做题从多到少排出顺序。

基本思路:for循环每次输入一个队伍的ID和做出的题数,同时记录下队伍出场的顺序,因为题设中有这么一句话规定:

做出题目数量多的队伍排在前面,如果题数相等,保持输入时的相对顺序不要改变。之后再进行排序,排序的要求如下:int cmp(const node a,const node b)  
{  
    if(a.m==b.m)return a.shunxu<b.shunxu;  
    return a.m>b.m;  
}  排序之后输出即可。

2055来淄博旅游——其中共用属性有姓名、来自哪个地方、要去哪个地方。
本题的结构体定义如下: struct peop{
char name[21],from[21],to[21];
       }s[101];
本题的要求:输出 从哪里来的地名:从这里来的人名 和 要去哪里的地名:要去找个地方的人名。
基本思路:用结构体表示每一个人的名字,归属地和去向,然后根据输入的归属地判断是否已有该地,有就跳过,否则就记录一个新的属地,然后根据属地的数组,遍历所有人,输出,再遍历所有人,输出去向相同的即可。(参考网上)

1211英文金曲大赛——其中共用属性有7个评委的打分和选手名字。
但本题我没有采用结构体来做,本题的要求就是7个评委打分之后去掉最高分和最低分,之后5个分数加和取平均数。
其中的重点就是对7个数排序。
附上代码:for(i=0;i<=5;i++){
 for(j=0;j<=5-1;j++){
if(xuanshou[j]>xuanshou[j+1]){
t=xuanshou[i];
xuanshou[i]=xuanshou[j];
xuanshou[j]=t;
}
}
}

1569/1595选夫婿1/2——其中共用属性有名字、身高和体重,(1595题中没有考虑体重)。
以1569题为例,1595就是一个翻版,稍微改动一下即可。
本题的结构体定义如下: struct node{
char name[21];
int h;
int w;
}a[1005];
本题输出的要求:把要求合格的男生以身高从高到低排序,如果身高相同以体重从轻到重排序。
基本思路:循环输入姓名、身高和体重,判断数名选手是否在要求范围内,如果在范围内就输出,不在就输出No。
本题重点就在排序方面:int cmp(node a,node b)  
  {  
    if(a.h==b.h)  
    return a.w<b.w;  
    return a.h<b.h;  
  }  

1294选票统计——本题共用的属性是每个选手得票的数量。
结构体定义如下:struct peop{
int num;
}s[1001];
输出要求:输出这个竞选者的编号和得票数。
基本思路:10个人投票,循环输入每个投票人的投票的竞选者的编号。随后该竞选者所得票数加1,然后比较出一个最大值即可。
附基本代码:int main(){
int m,n,p,max,flag;
int i;
scanf("%d%d",&m,&n);
for(i=1;i<=n;i++){
scanf("%d",&p);
s[p].num++;
}
max=s[1].num;
flag=1;
for(i=1;i<=m;i++){
if(s[i].num>max){
max=s[i].num;
flag=i;
}
}
printf("%d\n%d\n",flag,max);
return 0;
}

2873老质价比——本题共用的属性有价格和质量。
结构体定义:struct node{
int w,p;
    }s[100];
输出要求:按质量升序排序,如果质量相同则按价格降序排序输出。
基本思路:分别循环输入质量和价格,之后把各个质量和价格赋值给结构体中的w、p。随后按要求排序输出即可。
本题重点:int cmp(node a,node b)  
{  
    if(a.w!=b.w)  
    return a.w<b.w;  
      return a.p>b.p;  

共用体:能力有限,以前接触不多,所以对共用体的讲解不能太过全面,可参考:http://blog.csdn.net/jiangnanyouzi/article/details/3158702(作者:jiangnanyouzi)和百度上的。
其中山东理工ACM中的1960题共用体的练习,必用共用体解答。
附代码:#include<stdio.h>
#include<string.h>
union node{
int a;
double b;
char c[25];
}s[100007];
int main(){
int n,m;
int i,k;
char t[100005][10];
scanf("%d %d",&n,&m);
for(i=0;i<n;i++){
scanf("%s",t[i]);
if(strcmp(t[i],"INT")==0)
scanf("%d",&s[i].a);
if(strcmp(t[i],"DOUBLE")==0)
scanf("%lf",&s[i].b);
if(strcmp(t[i],"STRING")==0)
scanf("%s",s[i].c);
}
for(i=0;i<m;i++){
scanf("%d",&k);
if(strcmp(t[k],"INT")==0)
printf("%d\n",s[k].a);
if(strcmp(t[k],"DOUBLE")==0)
printf("%.2lf\n",s[k].b);
if(strcmp(t[k],"STRING")==0)
printf("%s\n",s[k].c);
}
}

枚举:可参考http://www.cnblogs.com/JCSU/articles/1299051.html(作者:jcsu)
在山东理工ACM中1959简单枚举类型,会用到枚举。
当然我没有用,好像百度上的大部分解题的也没有用到,在此附上代码。
#include<stdio.h>
#include<string.h>
int main(){
char a[100];
while(gets(a)!=NULL){
if(strcmp(a,"red")==0)
printf("Rose are red.\n");
else if(strcmp(a,"orange")==0)
printf("Poppies are orange.\n");
else if(strcmp(a,"yellow")==0)
printf("Sunflower are yellow.\n");
else if(strcmp(a,"green")==0)
printf("Grass are green.\n");
else if(strcmp(a,"blue")==0)
printf("Bluebells are blue.\n");
else if(strcmp(a,"violet")==0)
printf("Violets are violet.\n");
else
printf("I don't know about the color %s.\n",a);
}
}

原创粉丝点击