Program spustitelný z příkazové řádky takto: sort.exe <int x> <filename>, např. sort.exe 4 test.txt
Načte tabulku slov ze vstupního souboru (řádky jsou řádky tabulky, sloupce odděleny mezerami, tabulátory)
Každé slovo v tabulce obrátí
Setřídí dle x-tého sloupce
Vypíše tabulku tak že sloupce budou zarovnány pod sebou
Kód bude co nejelegantnější (využijte to co jsme probírali)
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <algorithm>
#include <vector>
#include <iomanip>
using namespace std;
typedef vector<string> Radek;
int Sloupec;
//setridi dva stringy
bool porovnani(const string &a, const string &b) {
for(string::const_iterator ait = a.begin(), bit = b.begin(); ait != a.end() && bit != b.end(); ++ait, ++bit) {
if(*ait < *bit) {
return true;
} else {
if(*ait > *bit) {
return false;
}
}
}
if( a.size() < b.size() )
return true;
return false;
}
//setridi podle sloupce Sloupec
class trideni {
public:
bool operator () (Radek const& a, Radek const& b) {
return porovnani(a[Sloupec], b[Sloupec]);
}
};
int main(int argc, char* argv[])
{
if(argc != 3) {
cout << "Usage:" << endl;
cout << "sort.exe <int x> <filename>" << endl;
}
ifstream soubor(argv[2]);
Sloupec = atoi(argv[1]) - 1; //indexujeme sloupce od nuly
string radek;
vector<Radek> radky;
if(soubor.is_open()) {
while(soubor.good()) {
getline(soubor, radek);
istringstream radekstream(radek);
vector<string> sloupce;
while (radekstream)
{
string slovo;
radekstream >> slovo;
if(slovo.size() != 0) {
reverse(slovo.begin(), slovo.end());
sloupce.push_back(slovo);
}
}
radky.push_back(sloupce);
}
soubor.close();
}
else
{
return -2;
}
// pripravit vektor sirek
// (predpoklad, ze kazdy radek tabulky ma stejny pocet sloupcu)
vector<int> sirky;
for(int i = 0; i < radky[0].size(); i++) {
sirky.push_back(0);
}
// overime, ze sloupec podle ktereho mame tridit vubec ma existovat
if(sirky.size() <= Sloupec) {
cout << "Column " << (Sloupec + 1) << " does not exists." << endl;
return -3;
}
// trideni
sort(radky.begin(), radky.end(), trideni());
// zjistit nejsirsi slova z kazdeho radku
for (int i = 0; i < radky.size(); i++) {
for(int j = 0; j < radky[i].size(); j++) {
if(radky[i][j].size() > sirky[j])
sirky[j] = radky[i][j].size();
}
}
// vypis
for (int i = 0; i < radky.size(); i++) {
for(int j = 0; j < radky[i].size(); j++) {
cout << setiosflags(ios::left) << setw(sirky[j] + 2) << radky[i][j];
}
cout << endl;
}
//////////////////////////////////////
int i;cin >> i;
return 0;
}