Zápočtový test 9.2.2009

JiriD at 2009-02-10 09:13:10

Ahoj.
Tak zadání mi vůbec nesedlo.

Vstupní soubor obsahuje řádky s informacemi o studentech.
Každý platný řádek musí obsahovat jméno studenta ve tvaru: Xxxx Xxxx a ID skupiny, ve tvaru: #int . dále může řádek obsahovat libovolný počet intů, floatů a textových informací, které smí být složené pouze ze znaků a-z a mezery. Sloupce můžou být v libovolném pořadí a jsou odděleny | .
př:
Jan Novák | #2 | 345 | 20.4 | tento radek je v poradku | 43 | 45.76
29|38|345.2|Honza Novák|take platny radek|#3

úkolem je:

  1. načíst vstup do datových struktur

  2. setřídít podle abecedy (podle jména)

  3. vypsat deset jmen těch, u nichž je součet všech intů a floatů největší
    4 rozdělit řádky vstupu podle ID skupiny a uložit do jednotilivých souborů (na pořadí sloupců opět nezáleží)

Mohl by mi někdo poradit, jak načíst ten vstupní soubor? Nešlo mi rozparsovat ty řádky..

Díky

charlieMonroe at 2009-02-10 11:34:17

Vezmes tu radku (string), najdes prvni svislitko atd:

int pos = str.find('|');
string part;
if (pos!=string::npos){
   //neni to NotFound
   part = str.substr(0,pos+1?);
   str = str.substr(pos+1?); //s tema jednickama si musis vyhrat
}else{
  part = str;
  str = "";
}

A ted zjistis, co je to za druh vstupu. Pokud je prvni pismeno upper case (udelej si jednoduchy makro #define isUpperCase(a) (a>='a' && a<='z') , stejne tak pro uppercase), tak projdi cely text, jestli kazdej znak je lowercase nebo mezera. Pokud je to upper case, melo by to byt jmeno. Pokud to je jmeno, musi tam byt presne jedna mezera. Tak to projedes. Pak to hodis do stringstreamu, pres nej do floatu a jen zjistis, jestli tam puvodne byla nekde (opet find) desetinna tecka. Pokud ne, hodis to mezi inty (i kdyz tohle je uplne naprd, cely to mohlo byt ve vectoru floatu). Jeste to muze zacinat '#'... No a cely to mas ve while(str!=""). Jo a asi jsem zapomnel na osekavani mezer na zacatku a konci toho part...

mhb at 2009-02-10 21:31:13

Já jsem to řešil prostě načtením ( z proudu) prvního znaku, který rozhodl, co by to eventuelně mohlo být za typ položky, a pak trochu delší if podle toho, co to konkrétně bylo. Využil jsem hlavně toho, že v C máme krásnou relaci uspořádání na znacích, dále klasické triky se streamy jako putback() znaku, co jsem si právě načetl, abych se nemusel trápit s inty a spol. Jak říkal kolega správně, řešit co to bylo za čísla vůbec nebylo potřeba - prostě se to nasázelo do sumy. Jinak - ve jméně nemusela být nutně právě jedna mezera, pokud vím :-) FrantisekRingo Cech by se zlobil :-)

Jinak zadání mi přišlo naprosto férové - algoritmicky nebylo moc co vymýšlet, ale procvičil se I/O a trošku to STLko, což je víceméně to, co jsem od zápočtového testu čekal :-) Navíc dost času :-)

Anonymous at 2009-02-10 22:04:21

A ta jmena mohla obsahovat diakritiku ?

mhb at 2009-02-10 22:08:03

Návštěvník wrote:A ta jmena mohla obsahovat diakritiku ?

Nene, tak moc nás netrápil. Mohli jsme předpokládat, že to jsou znaky z [a-zA-Z] (ve formátu Velké Prvni Jinak Mala).

Mimochodem, jaká byla nakonec statistika úspěšnosti?

_V_ at 2009-02-11 00:31:23

uspesnost bola v pohode presla viac nez 1/2

kaja at 2009-02-11 01:15:05

ale, nakonec jsme tam byli asi 3 a dovolil nám ten čas přetáhnout o hodinu

nebylo to až tak těžké, ale já jsem s Mapem nikdy nedělal tak jsem se tam s nim tak hodinu trápil :/

seby at 2009-02-17 12:44:04

Ještě dodám, že platily následující pravidla (ze začátku byl vypnutý switch, ale potom ho zapnul):
Zakázáno:

  • předepsaný kód => nechtěl vidět žádnou flešku

  • komunikace s jinou osobou

  • elektronické materiály (nejsem si jistý)

  • později zakázány všechny stránky kromě těch povolených

Povoleno:

  • offline MSDN

  • jakékoliv tištěné materiály

  • později povolena také online dokumentace - MSDN a http://www.cplusplus.com