Stránka 1 z 1

Zápočet 24.1.

Napsal: 24. 1. 2014 13:02
od Oracions
Argumenty příkazové řádky:
program.exe -i vstup.txt -o vystup.txt -t[jednoznakovy oddelovac] S1 I2 S1...
Argumenty -i,-o,-t jsou nepovinné. Pokud nejsou, použije se standartní vstup, výstup a mezera. Na konci příkazové řádky je nějaký počet dvouznakových dvojic typ,index, kde typ je buď S (string) nebo I (integer).
Na každé řádce vstupu jsou oddělovačem oddělené položky.
Úkolem je na výstup vypsat součet pro každou definovanou dvojici přes všechny řádky. Pokud na příkazové řádce tedy bylo "S1 I2 S1", je třeba vypsat součet prvního sloupce jako string, pak součet druhého sloupce jako integer, pak znovu součet prvního sloupce jako string.
Pro vstup:
AHOJ 2 NIC
HI 5 NIC
a "S1 I2 S1" by tedy výstup byl "AHOJHI 7 AHOJHI"

Důležitý byl dodatek, že není vhodné provádět switch podle typu na každé řádce. Místo toho jsme měli "předefinovat nějaké operátory nebo navrhnout objektový model, vytvořit nějakou funkci, která by sama poznala, jakým způsobem má sčítat." Switch jsme stále potřebovali použít při parsování argumentů z příkazové řádky.

Re: Zápočet 24.1.

Napsal: 24. 1. 2014 19:00
od petrbel
jenom doplním - byly povolené vlastní počítače, síť byla připojena, ale prý jsme směli jenom cplusplus.com a nějaký mrkvosoftí zdroj. Bylo explicitně zakázáno používat jakékoli zdrojové kódy (např ze cvik). Času bylo oficielně 3 hodiny - já odcházel asi jako čtvrtý po 3:15 a nevypadalo by to, že se bude čas hrotit.

Chtělo to použít nějaké šablony a dědičnost (asi i dynamic_cast - já ho aspoň použil a chválil mě, že tak to mělo být). Můj zdroják je tady, ale rovnou podotýkám, že tam jsou hrozné chyby a nedoladěnosti a na některých vstupech to segfaultuje https://github.com/petrbel/cpp_zap/tree ... a-scitacka

Re: Zápočet 24.1.

Napsal: 24. 1. 2014 22:45
od Oracions
Také jsem použil dědičnost, můj kód vypadal takhle:

Kód: Vybrat vše

class ValueType
{
  protected:
    ValueType() { }
  public:
     virtual void PrintSum(ostream & vystup) = 0;
     virtual bool Add(string newItem) = 0;
}
class IntegerType : public ValueType
{
   private:
     int Sum;
   public:
      IntegerType() : Sum(0) { }
      void PrintSum(ostream & vystup) { vystup << Sum; }
      bool Add(string newItem) { try { Sum += std::stoi(newItem); return true; } catch (out_of_range) { return false; } catch(argument_error) { return false; } }
}
class StringType : public ValueType
{
   private:
     string Sum;
   public:
      void PrintSum(ostream & vystup) { vystup << Sum; }
      bool Add(string newItem) { Sum += newItem;}
}
struct Column
{
  int Index;
  ValueType * Type;
}

... zbytek ...