domaca uloha

Uživatelský avatar
lavor
Matfyz(ák|ačka) level III
Příspěvky: 121
Registrován: 1. 2. 2005 20:39
Typ studia: Informatika Bc.
Bydliště: kolej 17.11., A1105
Kontaktovat uživatele:

domaca uloha

Příspěvek od lavor »

mam problem s jednou ulohou nie a nie ju dotiahnut do konca...
Vytvořte skript pro sed nebo ed (můžete si vybrat), který převede ve vstupním souboru komentáře ve stylu C (tj. /* */) do stylu C++ (tj. //). Upozorňuji předem na následující skutečnosti:

* Některé C komentáře jsou jednořádkové a některé víceřádkové.
* Pokud za komentářem ještě něco je, musíte to přesunout na nový řádek.
* Na řádku může být více komentářů.
teda ja som to riesil sedom, povoleny je cisty sedovsky skript

Kód: Vybrat vše

## nahradim vsetky komentare ktore zacinaju a koncia najednom riadku
##vstup: slovo1/*kom1*/slovo2/*kom2*/slovo3/*kom3*/
##vystup: slovo1//kom1
##           slovo2//kom2
##           slovo3//kom3
 
:loop
/\/\*.*\*\// s;\(.*\)\/\*\(.*\)\(\*/\)\(.*\);\1\/\/\2
\4;
t loop

## teraz posuniem vsetko co je na riadku za komentarom na novy riadok
##vstup: kom*/slovo
##vystup: kom*/
##          slovo
/\*\// s%\(.*\*\/\)\(.*\)%\1
\2%;
## obdobne upravim ak je nieco na riadku pred komentarom
##vstup: slovo/*kom
##vystup: slovo
##           /*kom
/\/\*/ s%\(.*\)\(\/\*.*\)%\1
\2%;
## a teraz pred vsetky zakomentovane riadky pridam //
/\/\*/,/\*\// s%\(.*\)%\/\/\1%;
## a nakoniec este vymazem stare komentare
s%\*\/%%
s%\/\*%%

no a problem je v tom ze to takto nefunguje, co sa tyka tych komentarov na jednom riadku s tymi problem nie je, horsie to je s tym zakomentovanim viacriadkoveho komentara, ukazem kde to robi zle:
vstup:
slovo/* kom1
kom2
*/
vystup:
//slovo
kom1
//kom2
//

a spravne by malo byt:
slovo
//kom1
//kom2
//

pomozte prosim lebo ja si uz neviem rady :roll:
Milujeme tých, čo nás odmietajú, odmietame tých, čo nás milujú.
Uživatelský avatar
Oscar
Donátor
Donátor
Příspěvky: 26
Registrován: 13. 11. 2004 13:52
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Riesenie?

Příspěvek od Oscar »

Ahoj, som sa s tym drbal do 3 do rana ... ale vyzera ze je to funkcne, tak to este dotestuj.

Kód: Vybrat vše

# Prerobi komentare /* ... */ na // ...

# pred /* pridam newline
s;\/\*;
\/\*;g
# za */ pridam newline
s;\*\/;\*\/
;g
# ked nemam komentar
T end;

# ked najdem zaciatok /*
:start
        s;\/\*;\/\/ ;
        t endcomment;

# ked najdem koniec */
:endcomment
        s;\*\/;end;
        T longstart

# ked mam este dalsi zaciatok
s;\/\*;\/\*;
t start;

# ked uz nemam ani */ tak koncim
s;\*\/;\*\/;
T end;

# sa nachadzam vo vnutri komentara
:longstart
        # nalezenie konca
        s;\*\/;\*\/;
        t endcomment;
        # nacitam novy riadok viacriadkoveho komentara
        n
        # pridanie // na zaciatok riadka
        s;^\(.*\)$;\/\/ \1;
        # pred /* pridam newline
        s;\/\*;
\/\*;g
        # za */ pridam newline
        s;\*\/;\*\/
;g
        b longstart

:end
Je to dost hnusne ... ale inak sa to tusim neda (aspon ja to neviem vymysliet) ... nechapem, ze sa radsej neuci poriadne awk ... to je ovela viacej user friendly.
Inak keby si mohol pouzit viacej tych sedov, tak by to mozno slo lepsie. V prvom pouzijes to rozdelenie na viacej riadkov (prve dva prikazy) a v dalsich to budes pojednom nahradzovat ... ono ten sed si ten cely riadok drzi v tom pattern space, teda nahradenie za
prida len znak konca riadku, nic viac.

Tak vela stastia s debugom, moj testovaci subor je zhruba toto:

Kód: Vybrat vše

void main() {
/* bla
  bla
  bla */ cint i; /* nejake
  bla */ cint i; /* nejake
  bla */ cint i; /* nejake
icko */ cint a,b; /* dalsie premenne */
casd    /* inicializacia */ ci = 10; /* icko na 10 */ ca = b = 0; /* ostatne
na 0 */c int AAA;/* astala
vista */cint XXX; /* baby
baby */c int BBB /* hehe */

        cuz nic/*este nieco*/ caha /*vajhsdghasj*/cnic /*ujujuj*/cdaco /*sdf*/

}
Sem-tam cviciaci povedia na haluzne riesenie, ze sme pouzili "kanon na vrabca" ... a sem-tam by sme im mozno mali povedat mi, ze pouzit "vrabca na kanon" nieje vzdy rozumne (ale takto nas to mozno lepsie naucia, mozno - a co ja viem, mozno je aj jedno trivialne riesenie ... ako napr.: sed -convertcommentsfromctocplusplus file.c :lol: ).
Odpovědět

Zpět na „2005“