Решение задачи №1016 «Ученики» с ACMP
Условие задачи
Однажды, неловкая секретарша перепутала личные дела учащихся. Теперь их снова необходимо упорядочить сначала по классам, а внутри класса по фамилиям.
Входные данные
Первая строка входного файла INPUT.TXT содержит натуральное число N – количество учеников (N ≤ 100). Далее, для каждого ученика определены 4 строки, содержащие фамилию, имя, класс и дату рождения соответственно. Фамилия и имя – строки, не превышающие 20 символов английского алфавита: первая буква заглавная, остальные – строчные. Класс – строка, состоящая из числа (от 1 до 11) и заглавной английской буквы (от «A» до «Z»). Дата рождения – строка в формате «ДД.ММ.ГГ». Гарантируется, что внутри одного класса нет однофамильцев.
Выходные данные
В выходной файл OUTPUT.TXT выведите список учеников, отсортированный сначала по классам (классы сравниваются по номеру, а потом по букве), а потом по фамилии. Данные об ученике выводятся в отдельной строке: класс, фамилия, имя и дата рождения через пробел.
Решение на C++
#include <iostream>
#include <string>
using namespace std;
struct pup{ string f; string n; int c; char b;string d; };
main(){
int i,n,j;
cin>>n;
pup a[n],e;
for(i=0; i<n; ++i){
cin>>a[i].f>>a[i].n>>a[i].c>>a[i].b>>a[i].d;
if(i&&(a[i].c<a[i-1].c||a[i].c==a[i-1].c&&a[i].b<a[i-1].b||
a[i].c==a[i-1].c&&a[i].b==a[i-1].b&&a[i].f<a[i-1].f)){
e=a[i];j=i;
while(j&&(e.c<a[j-1].c||e.c==a[j-1].c&&e.b<a[j-1].b||e.c==a[j-1].c&&
e.b==a[j-1].b&&e.f<a[j-1].f)){
a[j]=a[j-1]; j--; }
a[j]=e;
}
}
for(auto x:a) cout<<x.c<<x.b<<' '<<x.f<<' '<<x.n<<' '<<x.d<<endl;
}
Условия задач взяты с сайта acmp.ru