2、题目描述:
Description
夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样Joe就可以很容易掌握所有水果的销售情况了.
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)
4、题目分析及知识点[重点]:
多层排序,以前还没有遇见过。。。
5、AC源代码:
#include<stdio.h>
#include<string.h>
int main()
{
struct out{
char name[90];
char prod[90];
int num; }fru[120];
int T;
scanf("%d",&T);
while(T--)
{
int M,i,j=0,k,sign,num,temp3; char name[90],prod[90],temp1[90],temp2[90];
scanf("%d",&M);
for(i=0;i<M;i++){
scanf("%s%s%d",name,prod,&num);
sign=0;
for(k=0;k<j;k++)
if(strcmp(fru[k].name,name)==0&&strcmp(fru[k].prod,prod)==0){
fru[k].num+=num;
sign=1;
}
if(sign==0){
strcpy(fru[j].name,name);
strcpy(fru[j].prod,prod);
fru[j].num=num;
j++;
} }
k=j;
for(j=0;j<k-1;j++)
for(i=0;i<k-j-1;i++){
if(strcmp(fru[i].prod,fru[i+1].prod)>0){
strcpy(temp1,fru[i+1].prod);
strcpy(temp2,fru[i+1].name);
temp3=fru[i+1].num;
strcpy(fru[i+1].prod,fru[i].prod);
strcpy(fru[i+1].name,fru[i].name);
fru[i+1].num=fru[i].num;
strcpy(fru[i].prod,temp1);
strcpy(fru[i].name,temp2);
fru[i].num=temp3;
}
else if(strcmp(fru[i].prod,fru[i+1].prod)==0&&strcmp(fru[i].name,fru[i+1].name)>0){
strcpy(temp2,fru[i+1].name);
temp3=fru[i+1].num;
strcpy(fru[i+1].name,fru[i].name);
fru[i+1].num=fru[i].num;
strcpy(fru[i].name,temp2);
fru[i].num=temp3;
} } //实现字符串的交换。。。
for(i=0;i<k;i++){
if(i==0){
printf("%s\n",fru[i].prod);
printf(" |----%s(%d)\n",fru[i].name,fru[i].num);
}
else if(strcmp(fru[i].prod,fru[i-1].prod)==0)
printf(" |----%s(%d)\n",fru[i].name,fru[i].num);
else
{
printf("%s\n",fru[i].prod);
printf(" |----%s(%d)\n",fru[i].name,fru[i].num);
} }
if(T!=0)
printf("\n");
}
return 0;
}
6、做题心得:
主要是两方面:
A、题复杂,可以分解成若干简单的题来做
B、控制格式,让人头疼啊。。。。