Zapocet 20.1.2006

Uživatelský avatar
MyS
Donátor
Donátor
Příspěvky: 178
Registrován: 22. 9. 2004 00:13
Typ studia: Informatika Bc.
Bydliště: The city of Dobříš
Kontaktovat uživatele:

Zapocet 20.1.2006

Příspěvek od MyS »

Neeseem vaam nooviiiiinyy, poslooucheejte. Dnesnim ukolem bylo naprogramovat unixovsky CUT. parametry:
-b N = sloupce jsou retezce delky N znaku
-d ZNAK = sloupce jsou oddeleny ZNAKem, znak muze byt i "\t"
(mozna je jen jedna volba z -b/-d)
-f SLOUPCE = ktere sloupce vypsat (v pripade -d budou na vypise oddeleny delimiterem)
-o SOUBOR = output nebo stdout
SOUBOR = input nebo stdin

SLOUPCE maji nekolik moznosti, "a", "a-", "-b", "a-b" ... samozrejme jich muze bejt vic za sebou oddelenych carkou a vse se muze opakovat a tak ... cili napr. "5-,1,-3,3" je platne.

jo, a pokud je treba delimiter mezera a mam "a b", tak budou dva sloupce prazdny...

tot asi vse, na dve a pul hodky je to akorat :wink: .
We don't need no education!
Uživatelský avatar
random
Matfyz(ák|ačka) level II
Příspěvky: 63
Registrován: 30. 5. 2005 11:40
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Příspěvek od random »

Přikládám trošku zprasený zdroják

Kód: Vybrat vše

#include "stdafx.h"

#include <string>
#include <vector>
#include <utility>
#include <iostream>
#include <fstream>

using namespace std;

class parametry 
{
public:
        void setByte (int by) {b=by;}
        int getByte () {return b;}
        void setTyp (int typ) {t=typ;}
        int getTyp () {return t;}
        enum typ {neurceno, byte, znak};
        vector<int> sloupce;//kdyz je cislo zaporne, znamena to ze jedem az do konce sloupce...
        int b,t;
        char odd;
};

vector<string> krajej(parametry p, string s)
{
        vector<string> res;
        if(p.t==parametry::byte)
        {
                while(s!="") {
                        res.push_back(s.substr(0, p.b));
                        if(s.length()>p.b)
                                s=s.substr(p.b, s.length());
                        else
                                s="";
                }
        } else {
                int pos;
                while( (pos=s.find(p.odd)) != s.npos)
                {
                        res.push_back(s.substr(0, pos));

                        if(s.length()>pos+1)
                                s=s.substr(pos+1, s.length());
                        else
                                s="";
                }
                res.push_back(s);
        }
        return res;
}

string nactiRadek(istream& str)
{
        string buf;
        getline(str, buf, '
');
        return string(buf);
}

string outFile;

typedef pair<int, string> isp;

isp prvniCislo(string s)
{
        int res=0;
        int last=s.find_first_not_of("0123456789");
        if(last==0)
                throw "argument nezacina cislem";
        res=atoi(s.substr(0, last).c_str());
        if(last==s.npos)
                return isp(res, "");
        else
                return isp(res, s.substr(last, s.length()));
}

bool dosouboru=false;
bool zesouboru=false;
ofstream ofs;
ostream& soubor=ofs;
ostream& console=cout;
ifstream ifs;
istream& isoubor=ifs;
istream& iconsole=cin;


int main(int argc, char* argv[])
{
        parametry par;//=rozparsuj(argc, argv);

        par.t=parametry::neurceno;

        for(int i=1;i<argc;i++)
        {
                string p(argv[i]);
                if(p=="-o"){
                        if(i+1>=argc){
                                cout << "malo parametru" << endl;
                                return 1;
                        }
                        ofs.open(argv[++i]);
                        dosouboru = true;
                        if (!ofs.is_open()){ cout << "nelze otevrit vstupni soubor";
                        return 1; }

                } else if(p=="-b"){
                        if(i+1>=argc){
                                cout << "malo parametru";
                                return 1; }
                        if (par.t == parametry::neurceno) par.t = parametry::byte;
                        else { cout << "Moc parametru";
                        return 1;
                        }
                        par.b=atoi(argv[i+1]);
                        i++;
                } else if(p=="-d"){
                        if(i+1>=argc) {
                                cout << "malo parametru";
                                return 1; }
                        if (par.t == parametry::neurceno) par.t = parametry::znak;
                        else { cout << "Moc parametru";
                        return 1;
                        }
                        if (argv[i+1]=="\t") par.odd= '\t';
                        else par.odd = argv[i+1][0]; //berem prvni znak parametru za oddelovac
                        i++;
                } else if(p=="-f") {
                        if(i+1>=argc){
                                cout << "malo parametru";
                                return 1; }
                        string v=argv[i+1];
                        while(v!="") {
                                                if (v[0]=='-'){ v=v.substr(1,v.length());
                                                                isp vminus=prvniCislo(v);
                                                                for (int i=1; i<=vminus.first; i++) par.sloupce.push_back(i);
                                                                v = vminus.second;
                                                                v=v.substr(1,v.length());
                                                                continue;
                                                        }
                                isp vp=prvniCislo(v);
                                v=vp.second;
                                if(v==""){
                                        par.sloupce.push_back(vp.first);
                                } else if(v[0]==',')
                                {
                                        par.sloupce.push_back(vp.first);
                                        v=v.substr(1, v.length());
                                } else if(v[0]=='-')
                                {
                                        v=v.substr(1, v.length());
                                        if(v!="" && isdigit(v[0])){
                                                isp nvp=prvniCislo(v);
                                                if(vp.first<=nvp.first)
                                                        for(int i=vp.first; i<=nvp.first; i++)
                                                                par.sloupce.push_back(i);
                                                else
                                                        for(int i=vp.first;
                                                                i>=nvp.first; i--)
                                                                par.sloupce.push_back(i);
                                                v=nvp.second;
                                        } else {
                                                par.sloupce.push_back(-vp.first);
                                        }
                                        if(v!="")
                                        {
                                                if(v[0]!=',')
                                                        throw "invalid field-string";
                                                v=v.substr(1, v.length());
                                        }
                                } else
                                        throw "invalid field-string";
                        }

                        i++;
                } else if (i==(argc - 1)) {
                        ifs.open(argv[i]);
                        zesouboru = true;
                        if(!ifs.is_open()) {
                                cout << "Nepodarilo se otevrit vstupni soubor";
                                return 1; }
                }
                else { cout << "Spatny argument"; return 1; }
        }
        if (par.t == parametry::neurceno) { cout << "malo parametru"; return 1; }


        ostream& myout=dosouboru?soubor:console;
        istream& myin=zesouboru?isoubor:iconsole;

        while(!myin.eof())
        {
                string radek=nactiRadek(myin);
                vector<string> kousky=krajej(par, radek);
                bool prvni=true;
                for(int i=0;i<par.sloupce.size(); i++)
                {
                        int n=par.sloupce[i];
                        if(n==0) continue;
                        if(n<0)
                        {
                                for(int j=-n-1;j<kousky.size(); j++)
                                {
                                        if(par.t==parametry::znak && !prvni)
                                                                                        myout<<par.odd;
                                        myout<<kousky[j];
                                        prvni=false;
                                }
                        } else {
                                if( (n-1) < (int)kousky.size() ) {
                                        if(par.t==parametry::znak && !prvni)
                                                                                        myout<<par.odd;
                                        myout<<kousky[n-1];
                                        prvni=false;

                                }
                        }
                }
                if(!myin.eof())
                        myout<<endl;

        }
        return 0;
}
qk
Matfyz(ák|ačka) level III
Příspěvky: 181
Registrován: 24. 2. 2005 10:03
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Příspěvek od qk »

Nevim co je to za strasnou uchylku ze kazdej includuje stdafx.h??? (je mi jasny jak se to tam dostalo, ale to nic nemeni na tom, ze je to zvrhly)
Don't worry, be dead
Uživatelský avatar
tutchek
Site Admin
Příspěvky: 795
Registrován: 21. 9. 2004 00:40
Typ studia: Informatika Mgr.
Bydliště: Praha, Bohnice
Kontaktovat uživatele:

Příspěvek od tutchek »

qk píše:Nevim co je to za strasnou uchylku ze kazdej includuje stdafx.h??? (je mi jasny jak se to tam dostalo, ale to nic nemeni na tom, ze je to zvrhly)
uchylka je vetsinou dana lenosti odskrtnout ze nechces predkompilovany hlavicky
exAdmin. Magistr přes umělou inteligenci. Právník přes daně.
qk
Matfyz(ák|ačka) level III
Příspěvky: 181
Registrován: 24. 2. 2005 10:03
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Příspěvek od qk »

tutchek píše:
qk píše:Nevim co je to za strasnou uchylku ze kazdej includuje stdafx.h??? (je mi jasny jak se to tam dostalo, ale to nic nemeni na tom, ze je to zvrhly)
uchylka je vetsinou dana lenosti odskrtnout ze nechces predkompilovany hlavicky
to je mi jasny :wink:
dalsi vec kde se da neco zkazit a pak jak o zivot ladit :lol:
Don't worry, be dead
Uživatelský avatar
Almer
Site Admin
Příspěvky: 686
Registrován: 12. 10. 2004 10:58
Typ studia: Informatika Ph.D.
Bydliště: Mala Strana - 203
Kontaktovat uživatele:

Příspěvek od Almer »

qk píše:Nevim co je to za strasnou uchylku ze kazdej includuje stdafx.h??? (je mi jasny jak se to tam dostalo, ale to nic nemeni na tom, ze je to zvrhly)
Matfyzakus paranoikus....
Zakládající člen klubu Ortodoxních Matfyzáků :-D

Jsem LAMER ale neumim se ani podepsat ]:-)
Odpovědět

Zpět na „2005“