Programování v C++
Úkol
- 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; }
skola/programovani-v-c.txt · Poslední úprava: 17.12.2010 21:43 autor: wladik