Programování v C++

Úkol

  1. Program spustitelný z příkazové řádky takto: sort.exe <int x> <filename>, např. sort.exe 4 test.txt
  2. Načte tabulku slov ze vstupního souboru (řádky jsou řádky tabulky, sloupce odděleny mezerami, tabulátory)
  3. Každé slovo v tabulce obrátí
  4. Setřídí dle x-tého sloupce
  5. Vypíše tabulku tak že sloupce budou zarovnány pod sebou
  6. 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

Nástroje pro stránku