zap 12.2. 16:00

MIKI
Matfyz(ák|ačka) level III
Příspěvky: 186
Registrován: 10. 12. 2004 22:35
Typ studia: Informatika Bc.
Kontaktovat uživatele:

zap 12.2. 16:00

Příspěvek od MIKI »

Boli ste niekto na tomto termine? Uvital by so nejake info co mozem cakat od druheho kola.
MOTTO-1: Nieje dôležité vedieť ale pochopiť!!!
MOTTO-2: Neuč sa!!! Život ťa naučí. Mňa naučil, že sa mám učiť.
Uživatelský avatar
iNSi
Matfyz(ák|ačka) level I
Příspěvky: 6
Registrován: 1. 2. 2006 15:24
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Re: zap 12.2. 16:00

Příspěvek od iNSi »

MIKI píše:Boli ste niekto na tomto termine? Uvital by so nejake info co mozem cakat od druheho kola.
jasne ze nas tam par bylo :wink:

Zadaval Martin Trcka.
Zkusim tu napsat co si pamatuju ze zadani:

Meli sme udelat takove formatovani do sloupcu.
Dostali jsme z prikazove radky 3 argumenty:
[width=80] //to urcovalo maximalni sirku celeho textu
infile.txt //jmeno vstupniho souboru
outfile.txt //jmeno vystupniho souboru

No a ted format vstupniho souboru:

obsahoval normalne text a pak se tam nekde mohlo objevit toto

<columns>
<c>nejakej text...</c>
<c>taky nejakej text...</c>
<c>zase nejakej text...</c>
<columns>

cili parova znacka <columns> ohranicovala text kterej sem mel rozdelit do sloupcu vedle sebe a parova znacka <c> ohranicovala cast textu ktera pripadla jednomu z tech sloupcu.... v tomto pripade tedy budou tri...

zarovnavat se melo tak ze davali slova za sebe a pokud se uz dalsi neveslo tak se hodilo na dalsi radek. vyjimkou byly slova delsi nez sirka sloupce. takove slovo se melo rozdelit nasledovne: zacatek dat na aktualni radek, pak pomlcku "-" a zbytek na dalsi radek, pripadne zase pomlcku pokud se porad ani ten zbytek nevesel atd....

vsechny posloupnosti bilych znaku se meli scvrknout na jednu mezeru, jedina vyjimka byl prazdny radek. ten se mel nechat protoze oddeloval odstavce, ale to je jen takovy detail :wink:

ten text ktery byl jeste pred <columns>, pripadne za </columns> tedy slo povazovat jakoby uzavreny do tohoto:
<columns>
<c>text...</c>
<columns>

no a ted jak se zjistila pozadovana sirka sloupcu...
spocitali ste si vsechny znaky pro kazdy sloupec (po scvrknuti bilych) a v tom pomeru ste rozdelili i jejich sirku. takze napr. pokud mel prvni sloupec 280 znaku, druhy 400, treti 100 a pozadovana sirka celeho textu byla 80, tak sirka prvniho byla 28 znaku, druheho 40 a tretiho 10. Ty 2 zbyvajici znaky se pouzily na mezery mezi sloupci protoze sloupce meli mit mezi sebou mezeru jeden znak...

to ja asi tak vsechno, nic tezkyho, ale docela pracny. Cas byl jako vzdy 3h, ja odchazel po 4 a 3/4 a jeste par lidi tam bojovalo :)

a jeste rikal jednu vyhruzku ze ti kdo to napisou prasacky tak jim da za ukol aby to umelo i <columns> vnoreny do <c> :twisted:

ja sem to nastesti podle nej napsal docela hezky i kdyz par prasaren tam urcite je :)

tady prikladam co sem ze sebe dostal at mate predstavu jak se to dalo resit....

Kód: Vybrat vše

# include <iostream>
# include <fstream>
# include <string>
# include <vector>
# include <ctype.h>

using namespace std;

void format( vector<string> & pole, string outfile, int max_sirka)
{
	int pocet_sloupcu = pole.size();
	vector<long> delky;
	float soucet_delek = 0;
	float nova_delka = 0; 
	max_sirka = max_sirka - pocet_sloupcu + 1;

	for (int i = 0; i < pocet_sloupcu; i++)
	{
		delky.push_back(pole[i].length());
		soucet_delek += delky[i];
	}

	long soucet_delek2 = 0;
	for (int i = 0; i < pocet_sloupcu; i++)
	{
		nova_delka = ( delky[i] / soucet_delek ) * max_sirka;
		delky[i] = nova_delka;
		soucet_delek2 += delky[i];
	}
	delky[pocet_sloupcu-1] += max_sirka-soucet_delek2;


	vector<vector<string>> hotovo;
	for (int i = 0; i < pocet_sloupcu; i++)
	{
		vector<string> dummy;
		hotovo.push_back(dummy);
	}

	// zpracovani sloupcu
	for (int i = 0; i < pocet_sloupcu; i++)
	{
		string sloupec = pole[i];
		string radek = "";
		string slovo = "";
		int delka_sloupce = sloupec.length();
		for (int j = 0; j < delka_sloupce; ++j)
		{
			if ( ! iswspace(sloupec[j]) )
			{
				slovo += sloupec[j];
			}
			else
			{
				if ( slovo.length() > delky[i] ) // dlouha slova
				{
					radek += " ";
					int x = 0;
					while ( slovo.length() - x > delky[i] )
					{
						for (int k = radek.length(); k < delky[i]-1; ++k)
						{
							radek += slovo[x];
							++x;
						}
						radek += "-";
						hotovo[i].push_back(radek);
						radek = "";
					}
					for (int k = x; k < slovo.length(); ++k)
					{
						radek += slovo[k];						
					}
					
				}
				else
				{
					if ( radek.length() + slovo.length() + 1 > delky[i] )
					{
						for (int k = radek.length(); k < delky[i]; ++k)
						{
							radek += " ";
						}
						hotovo[i].push_back(radek);
						radek = slovo;
					}
					else
					{
						if ( radek.length() != 0 )
						{
							radek += " ";
						}
						radek += slovo;						
					}
				}
				slovo = "";
			}
		}
		if ( radek != "" )
		{
			for (int k = radek.length(); k < delky[i]; ++k)
			{
				radek += " ";
			}
			hotovo[i].push_back(radek);
		}
	}

	ofstream vystup;
	vystup.open( outfile.c_str(), ios::app);

	bool konec=0;
	int now=0;

	while ( ! konec )
	{
		string radek = "";
		bool konec1 = 1;

		for (int j = 0; j < pocet_sloupcu; j++)
		{
			if ( now < hotovo[j].size() )
			{
				radek += hotovo[j][now];
				konec1 = 0;
			}
			else
			{
				for (int k = 0; k < delky[j]; ++k)
						{
							radek += " ";
						}
			}
			if ( j != pocet_sloupcu-1 )
			{
				radek += " ";
			}
		}
		if ( konec1 )
		{
			konec = 1;
		}
		cout << radek;
		vystup << radek << endl;
		++now;		
	}
	vystup.close();

}






int main (int argc,char**argv)
{
	ifstream vstup;
	string vstups;
	
	// kontrola argumentu
	if ( argc != 4 )
	{
		cout << "chybny pocet argumentu" << endl;
		return 1;
	}

	// testovaci vypis argumentu
	cout << argc << endl;
	for (int i = 0; i < argc; ++i)
	{
		cout << argv[i] << endl;
	}
	cout << endl << endl << endl;

	// parsovani argumentu [width=]
	int zadana_sirka = 0;
	int max_pozice = 0;
	int	pozice = 0;
	while ( argv[1][max_pozice] != ']' )
	{
		++max_pozice;
	}
	--max_pozice;
	pozice = max_pozice;
	int exp = 1;
	while ( ( argv[1][pozice] >= '0' ) && ( argv[1][pozice] <= '9' ) )
	{
		for (int j=0; j < max_pozice-pozice; ++j)
		{
			exp = exp*10;
		}
		zadana_sirka = zadana_sirka + exp*(argv[1][pozice]-'0');
		--pozice;
		if ( pozice < 5 ) break;
	}
	
	// jak nacist int ze stringu
/*
	stringstream s (sting);
	s << str;
	s >> i;
*/	
	// nacitani vstupniho souboru
	vstup.open(argv[2],ios::in);
	vstup>>noskipws;

	char znak;
	char predchozi = ' ';
	string znacka, sloupec;
	std::vector < string> columns;

	while ( vstup >> znak )
	{
		if ( znak == '<' )
		{
			vstup >> znak;
			
			// zpracovani <> znacek
			while ( znak != '>' )
			{
				znacka += znak;
				vstup >> znak;
				if ( vstup.fail() )
				{ return 1; }
			}
			predchozi = znak;
			vstup >> znak;			
			if ( znacka == "columns" )
			{
				// nove sloupce + vypsat to co bylo pred <columns>												
				columns.clear();
				if ( sloupec != "" )
				{
					columns.push_back(sloupec);
					format(columns, argv[3], zadana_sirka); 
				}
				columns.clear();
			}
			if ( znacka == "c" )
			{
				// novy sloupec
				sloupec = "";
			}
			if ( znacka == "/columns" )
			{
				// ulozit naformatovane sloupce do souboru a vypsat je ...
				format(columns, argv[3], zadana_sirka);
				sloupec = "";				
			}
			if ( znacka == "/c" )
			{
				// ulozit sloupec do columns
				columns.push_back(sloupec);
			}
			znacka = "";			
		}
		else
		{
			// ted vychytat bile znaky
			if ( iswspace(znak) )
			{
				if ( ! iswspace(predchozi) )
				{
					sloupec += ' ';					
				}
			}
			else
			{
				sloupec += znak;
			}
		}
		predchozi = znak;
	}

	if ( sloupec != "" )
	{
		columns.clear();
		columns.push_back(sloupec);
		format(columns, argv[3], zadana_sirka); 
	}

	return 0;
}

je to bohuzel bez komentaru pac ty sem nestihal psat :)
a nejaky veci sou tam udelany hnusne, jako treba ziskani toho cisla z argumentu [width=80] :twisted:

jo a jeste prikladam vzorovy vstupy a vystupy co nam dal...
ten druhej obsahuje i ty vnoreny <columns>...
Přílohy
example1-in.txt
(3.07 KiB) Staženo 156 x
example1-out.txt
(3.6 KiB) Staženo 171 x
example2-in.txt
(880 bajtů) Staženo 157 x
Až mi bude tak sto deset,
přijde Bůh a zmáčkne RESET.
Uživatelský avatar
iNSi
Matfyz(ák|ačka) level I
Příspěvky: 6
Registrován: 1. 2. 2006 15:24
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Příspěvek od iNSi »

jeste ten out2
Přílohy
example2-out.txt
(1.03 KiB) Staženo 159 x
Až mi bude tak sto deset,
přijde Bůh a zmáčkne RESET.
mk
Matfyz(ák|ačka) level I
Příspěvky: 22
Registrován: 15. 6. 2006 10:20

Příspěvek od mk »

Tak dnesne zadanie bolo nasledovne:

Na vstupe program dostane textovy subor, plain text, ktory je obohateny tagmi <c>, </c>, <columns>, </columns>, popripade inymi nezmyslenymi tagmi (<ahoj>,<bla bla bla>).
Mozeme predpokladat, ze tagy columns a c su spravne oparovane a tagy c sa nachadzaju iba vo vnutri tagov columns. V texte uzavretom tagmi columns sa okrem textu uzavreteho tagmi <c> nenachadza uz ziadny iny text. Cize nestane <columns>hello <c>world</c></columns>.

program.exe 80 vstup.txt vystup.txt , ma za ulohu spravit nasledovne:
vstup.txt, ktory ma vyssie uvedene vlastnosti zarovname dolava na sirku 80, pricom dodrzujeme nasledovna pravidla:
1.predpokladajme napriklad, ze mame text:
...text0...<columns><c>...text1...</c><c>...text2</c><c>..text3...</c>...text4...
- text0 len zarovname dolava na sirku 80
- text1, text2 a text3 zarovname dolava do vedla seba stojacich stlpcov, pricom kazdemu stlpcu vyhradime sirku p(texti)/p(text1+text2+text3)*80, pricom p(text) urcuje pocet znakov textu. Inak povedane, ak text1 obsahuje 700 znakov, text2 100 a text3 200 znakov, tak text1 bude zarovnany do stlpca o sirke 7/10*78, text2 1/10*78, text3 2/10*78. (80-pocet medzier medzi stlpcami=80-2=78).
2.nezmyselne tagy nevypisujeme
3. kto to ma velmi prasacky napisane, musi implementovat aj vnorene columnsy.

Po troch hodinach, ktore sme na to mali, to z nas nemal nikto. Tak nam este par hodin prihodil. Ja som odchadzal ako stvrty po tri a pol hodinach, pricom bilancia bola taka, ze trom nam to dal a jeden kolega vzdal. Neviem, ako dopadlo zvysnych 20 ludi.

Pripajam vzor vstupu a vystupu.

pozn:
Ja som parsovanie vstupu riesil pomocou getline(f,str,'<').
Přílohy
example1-in.txt
vstupny subor1
(3.07 KiB) Staženo 169 x
example1-out.txt
vystupny subor1
(3.6 KiB) Staženo 154 x
Odpovědět

Zpět na „2006“