基础题,首先创建交易的结构体数组,将每行交易依次读入,然后按照产地和水果名称排序,最后循环判断输出即可,详细见注释。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int MAXM = 105;
struct deal //交易
{
string fruit; //水果名称
string place; //产地
int num; //数量
}d[MAXM];
//排序规则
bool cmp(deal d1, deal d2)
{
if (d1.place != d2.place) //如果产地不同,按照产地从小到大排序
return d1.place < d2.place;
else //如果产地相同,按照水果名称从小到大排序
return d1.fruit < d2.fruit;
}
int main()
{
int N;
cin >> N;
while (N--)
{
int M;
cin >> M;
for (int i = 0; i < M; i++) //输入结构体数组
{
cin >> d[i].fruit >> d[i].place >> d[i].num;
}
sort(d, d + M, cmp); //排序
string nowPlace = d[0].place; //当前产地
string nowFruit = d[0].fruit; //当前水果名称
int nowNum = 0; //当前数量
cout << d[0].place << endl;
for (int i = 0; i < M; i++)
{
if (d[i].place == nowPlace) //本次交易和上次交易产地相同
{
if (d[i].fruit == nowFruit) //本次交易和上次交易水果名称相同
{
nowNum += d[i].num;
}
else //本次交易和上次交易水果名称不同
{
cout << " |----" << nowFruit << "(" << nowNum << ")" << endl;
nowFruit = d[i].fruit; //新交易的水果名称
nowNum = d[i].num; //新交易的数量
}
}
else //本次交易和上次交易产地不同
{
cout << " |----" << nowFruit << "(" << nowNum << ")" << endl;
cout << d[i].place << endl;
nowPlace = d[i].place; //新交易的产地
nowFruit = d[i].fruit; //新交易的水果名称
nowNum = d[i].num; //新交易的数量
}
}
cout << " |----" << nowFruit << "(" << nowNum << ")" << endl; //最后一个交易
if (N > 0)
cout << endl;
}
return 0;
}
继续加油。