首页 > 代码库 > HDUOJ 水果

HDUOJ 水果



/*水果
夏天来了~~好开心啊,呵呵,好多好多水果~~
Joe经营着一个不大的水果店.他觉得生存之道就是经营最受顾客欢迎的水果.
如今他想要一份水果销售情况的明细表,这样Joe就能够非常easy掌握全部水果的销售情况了.
Input
第一行正整数N(0<N<=10)表示有N组測试数据.
每组測试数据的第一行是一个整数M(0<M<=100),表示工有M次成功的交易.
其后有M行数据,每行表示一次交易,由水果名称(小写字母组成,长度不超过80),
水果产地(小写字母组成,长度不超过80)和交易的水果数目(正整数,不超过100)组成.
Output
对于每一组測试数据,请你输出一份排版格式正确(请分析样本输出)的水果销售情况明细表.
这份明细表包含全部水果的产地,名称和销售数目的信息.水果先按产地分类,产地按字母顺序排列;
同一产地的水果依照名称排序,名称按字母顺序排序.
两组測试数据之间有一个空行.最后一组測试数据之后没有空行.
Sample Input
1
5
apple shandong 3
pineapple guangdong 1
sugarcane guangdong 1
pineapple guangdong 3
pineapple guangdong 1
Sample Output
guangdong
   |----pineapple(5)
   |----sugarcane(1)
shandong
   |----apple(3)*/

字符串处理

#include<stdio.h>
 #include<string.h>
 #include<stdlib.h>
 #include<algorithm>
 using namespace std;
 struct app{
     char name[81];//名称
    char add[81];//地址
    int num;//数量
}guo[100];

int cmp(const void *a,const void *b){//依照要求结构体排序
    struct app *c= (app *)a; 
     struct app *d= (app *)b; 
     if(strcmp(c->add,d->add)!=0) 
     return strcmp(c->add,d->add); 
     else  
     return strcmp(c->name,d->name); 
 }
 int main(){
     int n,m;
     scanf("%d",&n);
     while(n--){
      int j=0;
         scanf("%d\n",&m);
         for(int i=0;i<m;i++)
             scanf("%s %s %d",guo[i].name,guo[i].add,&guo[i].num);
         qsort(guo,m,sizeof(guo[0]),cmp);
         //sort(guo,guo+m,cmp);
         for(int i=1;i<m;i++)
         {
          if(strcmp(guo[i].add,guo[i-1].add)==0&&strcmp(guo[i].name,guo[i-1].name)==0)//add,name都相等相加  前边的变为0
    {guo[i].num+=guo[i-1].num;
     guo[i-1].num=0;
       }
         }
         printf("%s\n",guo[j].add);
         for(j=0;j<m;j++)
         {
          if(j!=0&&strcmp(guo[j].add,guo[j-1].add)!=0) printf("%s\n",guo[j].add);//仅仅要地址和前边的不同就是新地址  输出
         if(guo[j].num!=0) printf("   |----%s(%d)\n",guo[j].name,guo[j].num);//输出数量不为0的水果的名字
        }
         if(n) printf("\n"); //if(n!=0)居然也会错
    }
     return 0;
 }

HDUOJ 水果