Prethodna tema :: Sljedeća tema |
Kako ocjenjujete težinu zadataka za vježbu? |
Ne razumijem što zadaci hoće. |
|
0% |
[ 0 ] |
Shvaćam zadatak, ali ne znam odakle početi. |
|
10% |
[ 1 ] |
Okvirno znam što napraviti, ali ne uspijevam iskodirati. |
|
30% |
[ 3 ] |
Vrlo teško, ali ipak dobivam program koji donekle radi. |
|
10% |
[ 1 ] |
Treba truda ali mogu ih riješiti u razumnom vremenu. |
|
40% |
[ 4 ] |
Teški trivić, hoću prave stvari! |
|
0% |
[ 0 ] |
Ma kakvi zadaci, ne da mi se ni pogledati! |
|
10% |
[ 1 ] |
|
Ukupno glasova : 10 |
|
Autor/ica |
Poruka |
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
Postano: 14:58 pon, 9. 10. 2006 Naslov: Zadaci za vježbu |
|
|
Ovdje će se s vremena na vrijeme ukazati zadaci za vježbu. Njihovo rješavanje posve je na dobrovoljnoj bazi. Tu su zato da isprobate stvari koje čujete na vježbama a možda vam fali ideje što s njima napraviti.
EDIT: Dodah anketicu pa odgovorite kako bi se ustanovilo ima li ovaj topic uopce smisla...
EDIT': direktni linkovi na zadatke u topicu
[url=http://degiorgi.math.hr/forum/viewtopic.php?p=63759#63759]zadatak 0.[/url] 09.10.2006.
[url=http://degiorgi.math.hr/forum/viewtopic.php?p=64372#64372]zadatak 1.[/url] 18.10.2006.
[url=http://degiorgi.math.hr/forum/viewtopic.php?p=64470#64470]zadaca za vjezbe[/url] 20.10.2006.
[url=http://degiorgi.math.hr/forum/viewtopic.php?p=64497#64497]zadatak 2.[/url] 20.10.2006.
[url=http://degiorgi.math.hr/forum/viewtopic.php?p=64631#64631]zadatak 3.[/url] 23.10.2006.
[url=http://degiorgi.math.hr/forum/viewtopic.php?p=65711#65711]zadatak 4.[/url] 13.11.2006.
--
Zadatak 0.
Kažemo da je tekst dobro formatiran ako vrijedi:
a) Riječi su odvojene točno jednim razmakom.
b) Rečenice istog paragrafa odvojene su najviše dvama razmacima.
(Smatramo da rečenica završava interpunkcijskim znakovima . ! ? iza kojih slijede barem dva razmaka.)
c) Paragrafi su odvojeni točno jednom praznom linijom.
d) Zadan je N kao maksimalna duljina linijâ teksta. Niti jedna linija nije dulja od N i za svaku liniju vrijedi da je potpuno ispunjena.
Linija L je potpuno ispunjena ako je prazna ili joj se ne može nadopisati početna riječ (ili više njih) iz sljedeće linije, tako da je L još uvijek duljine najviše N.
Neka je 66 <= N <= 132.
Napišite program myFmt, koji prima N kao opcionalni parametar.
Validni su pozivi, dakle:
myFmt 72
myFmt 80
myFmt
Poziv "myFmt 54" nije validan jer krši dogovor o dozvoljenom rasponu od N. Ako opcionalni parametar N nije naveden, podrazumijeva se da iznosi 75.
Program učitava tekst sa standardnog ulaza, liniju po liniju, do EOF i potom ispisuje taj tekst dobro formatiran.
Ovdje će se s vremena na vrijeme ukazati zadaci za vježbu. Njihovo rješavanje posve je na dobrovoljnoj bazi. Tu su zato da isprobate stvari koje čujete na vježbama a možda vam fali ideje što s njima napraviti.
EDIT: Dodah anketicu pa odgovorite kako bi se ustanovilo ima li ovaj topic uopce smisla...
EDIT': direktni linkovi na zadatke u topicu
zadatak 0. 09.10.2006.
zadatak 1. 18.10.2006.
zadaca za vjezbe 20.10.2006.
zadatak 2. 20.10.2006.
zadatak 3. 23.10.2006.
zadatak 4. 13.11.2006.
–
Zadatak 0.
Kažemo da je tekst dobro formatiran ako vrijedi:
a) Riječi su odvojene točno jednim razmakom.
b) Rečenice istog paragrafa odvojene su najviše dvama razmacima.
(Smatramo da rečenica završava interpunkcijskim znakovima . ! ? iza kojih slijede barem dva razmaka.)
c) Paragrafi su odvojeni točno jednom praznom linijom.
d) Zadan je N kao maksimalna duljina linijâ teksta. Niti jedna linija nije dulja od N i za svaku liniju vrijedi da je potpuno ispunjena.
Linija L je potpuno ispunjena ako je prazna ili joj se ne može nadopisati početna riječ (ili više njih) iz sljedeće linije, tako da je L još uvijek duljine najviše N.
Neka je 66 ⇐ N ⇐ 132.
Napišite program myFmt, koji prima N kao opcionalni parametar.
Validni su pozivi, dakle:
myFmt 72
myFmt 80
myFmt
Poziv "myFmt 54" nije validan jer krši dogovor o dozvoljenom rasponu od N. Ako opcionalni parametar N nije naveden, podrazumijeva se da iznosi 75.
Program učitava tekst sa standardnog ulaza, liniju po liniju, do EOF i potom ispisuje taj tekst dobro formatiran.
Zadnja promjena: venovako; 23:57 pon, 13. 11. 2006; ukupno mijenjano 5 put/a.
|
|
[Vrh] |
|
GauSs_ Moderator
Pridružen/a: 28. 01. 2004. (21:01:17) Postovi: (53C)16
Spol:
Lokacija: 231
|
Postano: 18:06 pon, 9. 10. 2006 Naslov: Re: Zadaci za vježbu |
|
|
[quote="venovako"]
c) Paragrafi su odvojeni točno jednom praznom linijom.[/quote]
po cemu prepoznajemo paragrafe na unosu?
koliko korisnik moze biti glup?
venovako (napisa): |
c) Paragrafi su odvojeni točno jednom praznom linijom. |
po cemu prepoznajemo paragrafe na unosu?
koliko korisnik moze biti glup?
_________________ The purpose of life is to end
Prosle su godine kolokviji bili laksi, zar ne?
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
GauSs_ Moderator
Pridružen/a: 28. 01. 2004. (21:01:17) Postovi: (53C)16
Spol:
Lokacija: 231
|
Postano: 9:48 uto, 10. 10. 2006 Naslov: |
|
|
nije mi bas jasan ovaj [b]fmt[/b]
na primjeru:
[code:1]
ovo je zakon. ma daj. evo nesto sam tako.
prica jedna. hehe.
nije normalna! zar ne? hehehe.
??! !!?? a sta sad? .
ovo je ludnica.[/code:1]
za [code:1]# fmt -u test.txt [/code:1]
vraca:
[code:1]
ovo je zakon. ma daj. evo nesto sam tako. prica jedna. hehe.
nije normalna! zar ne? hehehe.
??! !!?? a sta sad? .
ovo je ludnica.
[/code:1]
i ocito mi ne odvoji recenice sa dva space-a.
nije mi bas jasan ovaj fmt
na primjeru:
Kod: |
ovo je zakon. ma daj. evo nesto sam tako.
prica jedna. hehe.
nije normalna! zar ne? hehehe.
??! !!?? a sta sad? .
ovo je ludnica. |
za
vraca:
Kod: |
ovo je zakon. ma daj. evo nesto sam tako. prica jedna. hehe.
nije normalna! zar ne? hehehe.
??! !!?? a sta sad? .
ovo je ludnica.
|
i ocito mi ne odvoji recenice sa dva space-a.
_________________ The purpose of life is to end
Prosle su godine kolokviji bili laksi, zar ne?
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 10:11 uto, 10. 10. 2006 Naslov: |
|
|
[code:1][vsego@degiorgi tmp]$ cat > test.txt
ovo je zakon. ma daj. evo nesto sam tako.
prica jedna. hehe.
nije normalna! zar ne? hehehe.
??! !!?? a sta sad? .
ovo je ludnica.
[vsego@degiorgi tmp]$ fmt -u test.txt
ovo je zakon. ma daj. evo nesto sam tako. prica jedna. hehe.
nije normalna! zar ne? hehehe.
??! !!?? a sta sad? .
ovo je ludnica.
[vsego@degiorgi tmp]$ fmt --version
fmt (coreutils) 5.2.1
Written by Ross Paterson.
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.[/code:1]
Cini mi se da [tt]fmt[/tt] samo mice viskove (newlineova i razmaka), ali ne dodaje nista. 8) Drugim rijecima, separator recenica mu je [tt]/[.?!] {2,}/[/tt], cime se postize da ne grijesi kod rednih brojeva, kratica, faktorijela i sl. 8)
Kod: | [vsego@degiorgi tmp]$ cat > test.txt
ovo je zakon. ma daj. evo nesto sam tako.
prica jedna. hehe.
nije normalna! zar ne? hehehe.
??! !!?? a sta sad? .
ovo je ludnica.
[vsego@degiorgi tmp]$ fmt -u test.txt
ovo je zakon. ma daj. evo nesto sam tako. prica jedna. hehe.
nije normalna! zar ne? hehehe.
??! !!?? a sta sad? .
ovo je ludnica.
[vsego@degiorgi tmp]$ fmt --version
fmt (coreutils) 5.2.1
Written by Ross Paterson.
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
Cini mi se da fmt samo mice viskove (newlineova i razmaka), ali ne dodaje nista. Drugim rijecima, separator recenica mu je /[.?!] {2,}/, cime se postize da ne grijesi kod rednih brojeva, kratica, faktorijela i sl.
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
Postano: 10:12 uto, 10. 10. 2006 Naslov: |
|
|
Pogledah [tt]info fmt[/tt] na Sistemu i za opciju [tt]-u[/tt] veli "[b]Reduce[/b] spacing between words to one space, and spacing between sentences to two spaces."
Isprobah i doista reducira bjeline ako ih ima > 2, ali ne dupla jednostruke bjeline...
Kad se malo razmisli, to cak ima smisla :)
Tako npr. prolaze skracenice i redni brojevi.
Modificirat cu zadatak tako da uvazi tu cinjenicu.
Svejedno je sto pise, ovo je ionako vjezba.
Tko je radio po starom, isto OK.
Ideja zadatka nije reimplementirati [tt]fmt[/tt] (sto bi definitivno bio overkill).
P.S. vsego je, as usual, superbrz na okidacu :)
Pogledah info fmt na Sistemu i za opciju -u veli "Reduce spacing between words to one space, and spacing between sentences to two spaces."
Isprobah i doista reducira bjeline ako ih ima > 2, ali ne dupla jednostruke bjeline...
Kad se malo razmisli, to cak ima smisla
Tako npr. prolaze skracenice i redni brojevi.
Modificirat cu zadatak tako da uvazi tu cinjenicu.
Svejedno je sto pise, ovo je ionako vjezba.
Tko je radio po starom, isto OK.
Ideja zadatka nije reimplementirati fmt (sto bi definitivno bio overkill).
P.S. vsego je, as usual, superbrz na okidacu
|
|
[Vrh] |
|
GauSs_ Moderator
Pridružen/a: 28. 01. 2004. (21:01:17) Postovi: (53C)16
Spol:
Lokacija: 231
|
Postano: 10:25 uto, 10. 10. 2006 Naslov: |
|
|
ovaj [b]fmt[/b] je stvarno malo glupast
evo za:
[code:1]
pimuf@pr1-19 ~/c_c++/rp4 0 :: fmt -u -w 98 beta.txt
The parameters index and num have default values, which means that erase() can be called with
just index to erase all characters after index or with no arguments to erase all characters.
Druga recenica. Treca recenica.
Cetvrta recenica?
pimuf@pr1-19 ~/c_c++/rp4 0 :: fmt -u -w 104 beta.txt
The parameters index and num have default values, which means that erase() can be called with
just index to erase all characters after index or with no arguments to erase all characters.
Druga recenica. Treca recenica.
Cetvrta recenica?
[/code:1]
a ocito je da just moze stati u prvu liniju kada podignemo broj znakova na 104
ovaj fmt je stvarno malo glupast
evo za:
Kod: |
pimuf@pr1-19 ~/c_c++/rp4 0 :: fmt -u -w 98 beta.txt
The parameters index and num have default values, which means that erase() can be called with
just index to erase all characters after index or with no arguments to erase all characters.
Druga recenica. Treca recenica.
Cetvrta recenica?
pimuf@pr1-19 ~/c_c++/rp4 0 :: fmt -u -w 104 beta.txt
The parameters index and num have default values, which means that erase() can be called with
just index to erase all characters after index or with no arguments to erase all characters.
Druga recenica. Treca recenica.
Cetvrta recenica?
|
a ocito je da just moze stati u prvu liniju kada podignemo broj znakova na 104
_________________ The purpose of life is to end
Prosle su godine kolokviji bili laksi, zar ne?
Zadnja promjena: GauSs_; 12:46 uto, 10. 10. 2006; ukupno mijenjano 2 put/a.
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
GauSs_ Moderator
Pridružen/a: 28. 01. 2004. (21:01:17) Postovi: (53C)16
Spol:
Lokacija: 231
|
Postano: 10:40 uto, 10. 10. 2006 Naslov: |
|
|
evo:
[code:1]
#include <iostream>
#include <string>
#include <cctype>
using std::cin;
using std::cout;
using std::endl;
using std::string;
bool kriterij_paragraf( string const &pomoc){
// provjerava da li se dani string sastoji samo
// od space-ova te da li je prazan
if( pomoc.size()==0) return true;
if( pomoc.find_first_not_of(' ')==string::npos ) return true;
return false;
}
void modificiraj( string &tekst){
// modificira string tako da mijenja:
// '. ' -> '. ' , '? ' -> '? ' , '! ' -> '! '
for( string::size_type i=0; i<tekst.size()-1; ++i){
if( tekst[i]=='.' && tekst[i+1]==' ' ){
tekst.replace( i, 1, ". ", 0, 2);
}
else if( tekst[i]=='?' && tekst[i+1]==' ' ){
tekst.replace( i, 1, "? ", 0, 2);
}
else if( tekst[i]=='!' && tekst[i+1]==' ' ){
tekst.replace( i, 1, "! ", 0, 2);
}
}
// modificira string tako da "ubija" visetruke
// uzastopne space-ove
// kod pocetka recenice ostavlja 2 inace 1
string::size_type brojac=0;
while ( ( brojac=tekst.find(" ", brojac) ) != string::npos ){
if( tekst[brojac-1]!='.' && tekst[brojac-1]!='?' && tekst[brojac-1]!='!' ){
tekst.replace( brojac, 2, " ", 0, 1);
continue;
}
++brojac;
}
// modificira string tako da mijenja ' \n\n' -> '\n\n'
brojac=0;
while ( ( brojac=tekst.find(" \n\n", brojac) ) != string::npos ){
tekst.replace( brojac, 3, "\n ", 0, 1);
++brojac;
}
// brise posljednj dva znaka u stringu koji su space-ovi
// zbog nacina stvaranja stringa "tekst"
// u main-u ( tekst+=pomoc+" " )
// i gore izvedene konverzije
tekst.erase(tekst.size()-2, 2);
}
int main( int argc, char *argv[]){
if(argc>2){
cout << "Nepravilan poziv programa!!!\n> Previse argumenata." << endl;
return 1;
}
int broj=75;
if( argc==2 ){
string pomoc(argv[1]);
for( string::size_type i=0; i<pomoc.size(); ++i){
if( !isdigit(pomoc[i]) ){
cout << "Nepravilan poziv programa!!!\n> Drugi argument nije broj." << endl;
return 2;
}
}
broj=atoi(argv[1]);
}
if( broj<66 || broj>132){
cout << "Nepravilan poziv programa!!!\n> Drugi argument mora biti broj izmedju 66 i 132." << endl;
return 3;
}
// ucitiva tekst sa standardong ulaza liniju po liniju
// te ga lijepi na vec prije uneseni tekst
string pomoc, tekst;
bool paragraf=false;
while( getline( cin, pomoc) ){
// ako zadovoljava kriterije za paragraf
// tj. sadrzi samo praznine ili je prazan
if( kriterij_paragraf( pomoc) ){
// ako je do sada uneseni tekst velicine 0, tj. na pocetku smo
// onda zanemari sve prazne linije
if( tekst.size()==0 ) continue;
else{
// inace vec postoji tekst pa je prazna
// linija oznaka za novi paragraf
paragraf=true;
continue;
}
}
// ako smo ucitali tekst (ne zadovoljava kriterije paragrafa,
// pogledati gore funkciju) i prije je bila unesena prazna
// linija (ili vise), tj. paragraf=true
// onda lijepi '\n\n' na kraj "tekst"-a
if( pomoc.size()!=0 && paragraf==true){
tekst+="\n\n";
paragraf=false;
}
// lijepi unesenu liniju na prije ucitani tekst
tekst+=pomoc+" ";
}
// pogledati opis funkcije
modificiraj( tekst);
// "kida" tekst na linije velicine varijable broj
// dodajuci '\n' character
// prethodni pamti polozaj najblizeg space-a kojeg smo prosli
// brojac broji koliko smo karaktera prosli
string::size_type brojac=0, prethodni=0;
for( string::size_type i=0; i<tekst.size(); ++i){
// ako smo prosli broj karaktera a nismo se prebacili
// u novu liniju onda se prebacujemo
// dodavanjem '\n' charactera na mjesto
// sa indeksom prethodni, tj. na najblizi prodjen space
if( brojac==broj ){
tekst.replace( prethodni, 1, "\n", 0, 1);
brojac=0;
// vracamo se na indeks prethodni+1
// jer smo na indeksu prethodni prekinuli liniju
i=prethodni+1;
continue;
}
// ako je trenutni character space postavi prethodni
if( tekst[i]==' ' ) prethodni=i;
// ako je trenutni character '\n' resetiraj brojac
// jer se tu prebacujemo u novu liniju
else if( tekst[i]=='\n' ) brojac=0;
++brojac;
}
cout << tekst << endl;
return 0;
}
[/code:1]
za pocetnika u C++ valjda nije lose
EDIT: dodani komentari u kod i modificirao [b]modificiraj[/b]
evo:
Kod: |
#include <iostream>
#include <string>
#include <cctype>
using std::cin;
using std::cout;
using std::endl;
using std::string;
bool kriterij_paragraf( string const &pomoc){
// provjerava da li se dani string sastoji samo
// od space-ova te da li je prazan
if( pomoc.size()==0) return true;
if( pomoc.find_first_not_of(' ')==string::npos ) return true;
return false;
}
void modificiraj( string &tekst){
// modificira string tako da mijenja:
// '. ' -> '. ' , '? ' -> '? ' , '! ' -> '! '
for( string::size_type i=0; i<tekst.size()-1; ++i){
if( tekst[i]=='.' && tekst[i+1]==' ' ){
tekst.replace( i, 1, ". ", 0, 2);
}
else if( tekst[i]=='?' && tekst[i+1]==' ' ){
tekst.replace( i, 1, "? ", 0, 2);
}
else if( tekst[i]=='!' && tekst[i+1]==' ' ){
tekst.replace( i, 1, "! ", 0, 2);
}
}
// modificira string tako da "ubija" visetruke
// uzastopne space-ove
// kod pocetka recenice ostavlja 2 inace 1
string::size_type brojac=0;
while ( ( brojac=tekst.find(" ", brojac) ) != string::npos ){
if( tekst[brojac-1]!='.' && tekst[brojac-1]!='?' && tekst[brojac-1]!='!' ){
tekst.replace( brojac, 2, " ", 0, 1);
continue;
}
++brojac;
}
// modificira string tako da mijenja ' \n\n' -> '\n\n'
brojac=0;
while ( ( brojac=tekst.find(" \n\n", brojac) ) != string::npos ){
tekst.replace( brojac, 3, "\n ", 0, 1);
++brojac;
}
// brise posljednj dva znaka u stringu koji su space-ovi
// zbog nacina stvaranja stringa "tekst"
// u main-u ( tekst+=pomoc+" " )
// i gore izvedene konverzije
tekst.erase(tekst.size()-2, 2);
}
int main( int argc, char *argv[]){
if(argc>2){
cout << "Nepravilan poziv programa!!!\n> Previse argumenata." << endl;
return 1;
}
int broj=75;
if( argc==2 ){
string pomoc(argv[1]);
for( string::size_type i=0; i<pomoc.size(); ++i){
if( !isdigit(pomoc[i]) ){
cout << "Nepravilan poziv programa!!!\n> Drugi argument nije broj." << endl;
return 2;
}
}
broj=atoi(argv[1]);
}
if( broj<66 || broj>132){
cout << "Nepravilan poziv programa!!!\n> Drugi argument mora biti broj izmedju 66 i 132." << endl;
return 3;
}
// ucitiva tekst sa standardong ulaza liniju po liniju
// te ga lijepi na vec prije uneseni tekst
string pomoc, tekst;
bool paragraf=false;
while( getline( cin, pomoc) ){
// ako zadovoljava kriterije za paragraf
// tj. sadrzi samo praznine ili je prazan
if( kriterij_paragraf( pomoc) ){
// ako je do sada uneseni tekst velicine 0, tj. na pocetku smo
// onda zanemari sve prazne linije
if( tekst.size()==0 ) continue;
else{
// inace vec postoji tekst pa je prazna
// linija oznaka za novi paragraf
paragraf=true;
continue;
}
}
// ako smo ucitali tekst (ne zadovoljava kriterije paragrafa,
// pogledati gore funkciju) i prije je bila unesena prazna
// linija (ili vise), tj. paragraf=true
// onda lijepi '\n\n' na kraj "tekst"-a
if( pomoc.size()!=0 && paragraf==true){
tekst+="\n\n";
paragraf=false;
}
// lijepi unesenu liniju na prije ucitani tekst
tekst+=pomoc+" ";
}
// pogledati opis funkcije
modificiraj( tekst);
// "kida" tekst na linije velicine varijable broj
// dodajuci '\n' character
// prethodni pamti polozaj najblizeg space-a kojeg smo prosli
// brojac broji koliko smo karaktera prosli
string::size_type brojac=0, prethodni=0;
for( string::size_type i=0; i<tekst.size(); ++i){
// ako smo prosli broj karaktera a nismo se prebacili
// u novu liniju onda se prebacujemo
// dodavanjem '\n' charactera na mjesto
// sa indeksom prethodni, tj. na najblizi prodjen space
if( brojac==broj ){
tekst.replace( prethodni, 1, "\n", 0, 1);
brojac=0;
// vracamo se na indeks prethodni+1
// jer smo na indeksu prethodni prekinuli liniju
i=prethodni+1;
continue;
}
// ako je trenutni character space postavi prethodni
if( tekst[i]==' ' ) prethodni=i;
// ako je trenutni character '\n' resetiraj brojac
// jer se tu prebacujemo u novu liniju
else if( tekst[i]=='\n' ) brojac=0;
++brojac;
}
cout << tekst << endl;
return 0;
}
|
za pocetnika u C++ valjda nije lose
EDIT: dodani komentari u kod i modificirao modificiraj
_________________ The purpose of life is to end
Prosle su godine kolokviji bili laksi, zar ne?
Zadnja promjena: GauSs_; 12:24 uto, 10. 10. 2006; ukupno mijenjano 5 put/a.
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
Postano: 10:46 uto, 10. 10. 2006 Naslov: |
|
|
@GauSs_:
Za C++ pocetnika ovo je, na prvi pogled, i vise nego dobro, samo mi je malo komplicirano snaci se bez ijednog komentara. Na ono sto sam dosad skuzio imam pokoju primjedbicu, ali komentari slijede kad proucim sve.
Sto se fmt-a tice, info za -w opciju veli:
"Fill output lines up to WIDTH characters (default 75). `fmt' initially tries to make lines about 7% shorter than this, to give it room to balance line lengths."
Ako to ne pise u tvom infu, moj fmt je iz coreutils-a 6.3 (da, bleeding edge, ali se isplati).
Zato i nije ideja reimplementirat fmt, jer ima toliko carolija...
Napomena: Od velike pomoci pri kodiranju mogu biti string streamovi.
@GauSs_:
Za C++ pocetnika ovo je, na prvi pogled, i vise nego dobro, samo mi je malo komplicirano snaci se bez ijednog komentara. Na ono sto sam dosad skuzio imam pokoju primjedbicu, ali komentari slijede kad proucim sve.
Sto se fmt-a tice, info za -w opciju veli:
"Fill output lines up to WIDTH characters (default 75). `fmt' initially tries to make lines about 7% shorter than this, to give it room to balance line lengths."
Ako to ne pise u tvom infu, moj fmt je iz coreutils-a 6.3 (da, bleeding edge, ali se isplati).
Zato i nije ideja reimplementirat fmt, jer ima toliko carolija...
Napomena: Od velike pomoci pri kodiranju mogu biti string streamovi.
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
GauSs_ Moderator
Pridružen/a: 28. 01. 2004. (21:01:17) Postovi: (53C)16
Spol:
Lokacija: 231
|
|
[Vrh] |
|
GauSs_ Moderator
Pridružen/a: 28. 01. 2004. (21:01:17) Postovi: (53C)16
Spol:
Lokacija: 231
|
Postano: 6:52 sri, 11. 10. 2006 Naslov: |
|
|
hmmm. nasao sam nesto sto bi sam promijenio.
[code:1]
// modificira string tako da "ubija" visetruke
// uzastopne space-ove
// kod pocetka recenice ostavlja 2 inace 1
string::size_type brojac=0;
while ( ( brojac=tekst.find(" ", brojac) ) != string::npos ){
if( tekst[brojac-1]!='.' && tekst[brojac-1]!='?' && tekst[brojac-1]!='!' ){
tekst.replace( brojac, 2, " ", 0, 1);
continue;
}
++brojac;
}
[/code:1]
sa
[code:1]
// modificira string tako da "ubija" visetruke
// uzastopne space-ove
// kod pocetka recenice ostavlja 2 inace 1
string::size_type brojac=0;
while ( ( brojac=tekst.find(" ", brojac) ) != string::npos ){
if( tekst[brojac-1]!='.' && tekst[brojac-1]!='?' && tekst[brojac-1]!='!' ){
tekst.erase( brojac, 1); // prije bijase tekst.replace( brojac, 2, " ", 0, 1);
continue;
}
++brojac;
}
[/code:1]
hmmm. nasao sam nesto sto bi sam promijenio.
Kod: |
// modificira string tako da "ubija" visetruke
// uzastopne space-ove
// kod pocetka recenice ostavlja 2 inace 1
string::size_type brojac=0;
while ( ( brojac=tekst.find(" ", brojac) ) != string::npos ){
if( tekst[brojac-1]!='.' && tekst[brojac-1]!='?' && tekst[brojac-1]!='!' ){
tekst.replace( brojac, 2, " ", 0, 1);
continue;
}
++brojac;
}
|
sa
Kod: |
// modificira string tako da "ubija" visetruke
// uzastopne space-ove
// kod pocetka recenice ostavlja 2 inace 1
string::size_type brojac=0;
while ( ( brojac=tekst.find(" ", brojac) ) != string::npos ){
if( tekst[brojac-1]!='.' && tekst[brojac-1]!='?' && tekst[brojac-1]!='!' ){
tekst.erase( brojac, 1); // prije bijase tekst.replace( brojac, 2, " ", 0, 1);
continue;
}
++brojac;
}
|
_________________ The purpose of life is to end
Prosle su godine kolokviji bili laksi, zar ne?
|
|
[Vrh] |
|
GauSs_ Moderator
Pridružen/a: 28. 01. 2004. (21:01:17) Postovi: (53C)16
Spol:
Lokacija: 231
|
Postano: 13:25 sri, 11. 10. 2006 Naslov: |
|
|
danas je profesor rekao na predavanjima da nije pametno pisati:
[code:1]
for( ... i=0; i<nesto.size() ; ++i){
...
}
[/code:1]
i u tijelu petlje mijenjati string nesto.
pa sam modificirao program prema profesorovoj primjedbi i jos ga malo preuredio.
sada imam dvije funkcije za istu stvar pri cemu je verzija1 stara a verzija2 nova (kao ispravnija).
onaj dio sam "kidanjem" teksta sam sada stavio kao funkciju razlomi.
kod te funkcije nije mi se dalo prepravljati po gornjoj (profesorovoj) primjedbi ( jer kod mene radi :) ).
evo i mala [url=http://www.iugrina.com/tmp/test.txt]datoteka[/url] za testiranje. nemojte samo kopirati tekst
iz datoteke vec ju download-ajte. ("Save Link As")
za one koji rade pod *nix-om program mogu pokrenuti ovako:
[code:1]$ cat test.txt | ime_programa [/code:1]
[code:1]
#include <iostream>
#include <string>
#include <cctype>
using std::cin;
using std::cout;
using std::endl;
using std::string;
bool kriterij_paragraf( string const &pomoc){
// provjerava da li se dani string sastoji samo
// od space-ova te da li je prazan
if( pomoc.size()==0) return true;
if( pomoc.find_first_not_of(' ')==string::npos ) return true;
return false;
}
void verzija1( string &tekst){
// modificira string tako da mijenja:
// '. ' -> '. ' , '? ' -> '? ' , '! ' -> '! '
for( string::size_type i=0; i<tekst.size()-1; ++i){
if( tekst[i]=='.' && tekst[i+1]==' ' ){
tekst.replace( i, 1, ". ", 0, 2);
}
else if( tekst[i]=='?' && tekst[i+1]==' ' ){
tekst.replace( i, 1, "? ", 0, 2);
}
else if( tekst[i]=='!' && tekst[i+1]==' ' ){
tekst.replace( i, 1, "! ", 0, 2);
}
}
}
void verzija2( string &tekst){
string novi;
// modificira string tako da mijenja:
// '. ' -> '. ' , '? ' -> '? ' , '! ' -> '! '
string::size_type prethodni=0;
string::size_type end=tekst.size()-1;
for( string::size_type i=0; i<end; ++i){
if( ( tekst[i]=='.' || tekst[i]=='!' || tekst[i]=='?' ) && tekst[i+1]==' '){
novi+=tekst.substr( prethodni, i+1 - prethodni )+" ";
prethodni=i+1;
++i;
}
}
novi+=tekst.substr( prethodni);
tekst=novi;
}
bool modificiraj( string &tekst, int verzija=2){
if( verzija!=1 && verzija!=2 ) return false;
verzija==1 ? verzija1( tekst) : verzija2( tekst);
// modificira string tako da "ubija" visetruke
// uzastopne space-ove
// kod pocetka recenice ostavlja 2 inace 1
string::size_type brojac=0;
while ( ( brojac=tekst.find(" ", brojac) ) != string::npos ){
if( tekst[brojac-1]!='.' && tekst[brojac-1]!='?' && tekst[brojac-1]!='!' ){
tekst.erase( brojac, 1);
continue;
}
++brojac;
}
// modificira string tako da mijenja ' \n\n' -> '\n\n'
brojac=0;
while ( ( brojac=tekst.find(" \n\n", brojac) ) != string::npos ){
tekst.replace( brojac, 3, "\n ", 0, 1);
++brojac;
}
// modificira string tako da mijenja '\n ' -> '\n'
brojac=0;
while ( ( brojac=tekst.find("\n ", brojac) ) != string::npos ){
tekst.replace( brojac, 2, "\n", 0, 1);
++brojac;
}
// brise posljednj dva znaka u stringu koji su space-ovi
// zbog nacina stvaranja stringa "tekst"
// u main-u ( tekst+=pomoc+" " )
// i gore izvedene konverzije
if( tekst[tekst.size()-2]==' ' ){
tekst.erase( tekst.size()-2, 2 );
}
// odnosno samo zadnji znak ako korisnik nije zavrsio s . ? !
else{
tekst.erase( tekst.size()-1, 1);
}
// brise prvi znak teksta ako je space
if( tekst[0]==' ' ){
tekst.erase( 0, 1);
}
return true;
}
void razlomi( string &tekst, int broj){
// "kida" tekst na linije velicine varijable broj
// dodajuci '\n' character
// prethodni pamti polozaj najblizeg space-a kojeg smo prosli
// brojac broji koliko smo karaktera prosli
string::size_type brojac=0, prethodni=0;
for( string::size_type i=0; i<tekst.size(); ++i){
// ako smo prosli broj karaktera a nismo se prebacili
// u novu liniju onda se prebacujemo
// dodavanjem '\n' charactera na mjesto
// sa indeksom prethodni, tj. na najblizi prodjen space
if( brojac==broj ){
tekst.replace( prethodni, 1, "\n", 0, 1);
brojac=0;
// vracamo se na indeks prethodni+1
// jer smo na indeksu prethodni prekinuli liniju
i=prethodni+1;
continue;
}
// ako je trenutni character space postavi prethodni
if( tekst[i]==' ' ) prethodni=i;
// ako je trenutni character '\n' resetiraj brojac
// jer se tu prebacujemo u novu liniju
else if( tekst[i]=='\n' ) brojac=0;
++brojac;
}
}
int main( int argc, char *argv[]){
if(argc>2){
cout << "Nepravilan poziv programa!!!\n> Previse argumenata." << endl;
return 1;
}
int broj=75;
if( argc==2 ){
string pomoc(argv[1]);
for( string::size_type i=0; i<pomoc.size(); ++i){
if( !isdigit(pomoc[i]) ){
cout << "Nepravilan poziv programa!!!\n> Drugi argument nije broj." << endl;
return 2;
}
}
broj=atoi(argv[1]);
}
if( broj<66 || broj>132){
cout << "Nepravilan poziv programa!!!\n> Drugi argument mora biti broj izmedju 66 i 132." << endl;
return 3;
}
// ucitiva tekst sa standardong ulaza liniju po liniju
// te ga lijepi na vec prije uneseni tekst
string pomoc, tekst;
bool paragraf=false;
while( getline( cin, pomoc) ){
// ako zadovoljava kriterije za paragraf
// tj. sadrzi samo praznine ili je prazan
if( kriterij_paragraf( pomoc) ){
// ako je do sada uneseni tekst velicine 0, tj. na pocetku smo
// onda zanemari sve prazne linije
if( tekst.size()==0 ) continue;
else{
// inace vec postoji tekst pa je prazna
// linija oznaka za novi paragraf
paragraf=true;
continue;
}
}
// ako smo ucitali tekst (ne zadovoljava kriterije paragrafa,
// pogledati gore funkciju) i prije je bila unesena prazna
// linija (ili vise), tj. paragraf=true
// onda lijepi '\n\n' na kraj "tekst"-a
if( pomoc.size()!=0 && paragraf==true){
tekst+="\n\n";
paragraf=false;
}
// lijepi unesenu liniju na prije ucitani tekst
tekst+=pomoc+" ";
}
modificiraj( tekst);
razlomi( tekst, broj);
cout << tekst << endl;
return 0;
}
[/code:1]
danas je profesor rekao na predavanjima da nije pametno pisati:
Kod: |
for( ... i=0; i<nesto.size() ; ++i){
...
}
|
i u tijelu petlje mijenjati string nesto.
pa sam modificirao program prema profesorovoj primjedbi i jos ga malo preuredio.
sada imam dvije funkcije za istu stvar pri cemu je verzija1 stara a verzija2 nova (kao ispravnija).
onaj dio sam "kidanjem" teksta sam sada stavio kao funkciju razlomi.
kod te funkcije nije mi se dalo prepravljati po gornjoj (profesorovoj) primjedbi ( jer kod mene radi ).
evo i mala datoteka za testiranje. nemojte samo kopirati tekst
iz datoteke vec ju download-ajte. ("Save Link As")
za one koji rade pod *nix-om program mogu pokrenuti ovako:
Kod: | $ cat test.txt | ime_programa |
Kod: |
#include <iostream>
#include <string>
#include <cctype>
using std::cin;
using std::cout;
using std::endl;
using std::string;
bool kriterij_paragraf( string const &pomoc){
// provjerava da li se dani string sastoji samo
// od space-ova te da li je prazan
if( pomoc.size()==0) return true;
if( pomoc.find_first_not_of(' ')==string::npos ) return true;
return false;
}
void verzija1( string &tekst){
// modificira string tako da mijenja:
// '. ' -> '. ' , '? ' -> '? ' , '! ' -> '! '
for( string::size_type i=0; i<tekst.size()-1; ++i){
if( tekst[i]=='.' && tekst[i+1]==' ' ){
tekst.replace( i, 1, ". ", 0, 2);
}
else if( tekst[i]=='?' && tekst[i+1]==' ' ){
tekst.replace( i, 1, "? ", 0, 2);
}
else if( tekst[i]=='!' && tekst[i+1]==' ' ){
tekst.replace( i, 1, "! ", 0, 2);
}
}
}
void verzija2( string &tekst){
string novi;
// modificira string tako da mijenja:
// '. ' -> '. ' , '? ' -> '? ' , '! ' -> '! '
string::size_type prethodni=0;
string::size_type end=tekst.size()-1;
for( string::size_type i=0; i<end; ++i){
if( ( tekst[i]=='.' || tekst[i]=='!' || tekst[i]=='?' ) && tekst[i+1]==' '){
novi+=tekst.substr( prethodni, i+1 - prethodni )+" ";
prethodni=i+1;
++i;
}
}
novi+=tekst.substr( prethodni);
tekst=novi;
}
bool modificiraj( string &tekst, int verzija=2){
if( verzija!=1 && verzija!=2 ) return false;
verzija==1 ? verzija1( tekst) : verzija2( tekst);
// modificira string tako da "ubija" visetruke
// uzastopne space-ove
// kod pocetka recenice ostavlja 2 inace 1
string::size_type brojac=0;
while ( ( brojac=tekst.find(" ", brojac) ) != string::npos ){
if( tekst[brojac-1]!='.' && tekst[brojac-1]!='?' && tekst[brojac-1]!='!' ){
tekst.erase( brojac, 1);
continue;
}
++brojac;
}
// modificira string tako da mijenja ' \n\n' -> '\n\n'
brojac=0;
while ( ( brojac=tekst.find(" \n\n", brojac) ) != string::npos ){
tekst.replace( brojac, 3, "\n ", 0, 1);
++brojac;
}
// modificira string tako da mijenja '\n ' -> '\n'
brojac=0;
while ( ( brojac=tekst.find("\n ", brojac) ) != string::npos ){
tekst.replace( brojac, 2, "\n", 0, 1);
++brojac;
}
// brise posljednj dva znaka u stringu koji su space-ovi
// zbog nacina stvaranja stringa "tekst"
// u main-u ( tekst+=pomoc+" " )
// i gore izvedene konverzije
if( tekst[tekst.size()-2]==' ' ){
tekst.erase( tekst.size()-2, 2 );
}
// odnosno samo zadnji znak ako korisnik nije zavrsio s . ? !
else{
tekst.erase( tekst.size()-1, 1);
}
// brise prvi znak teksta ako je space
if( tekst[0]==' ' ){
tekst.erase( 0, 1);
}
return true;
}
void razlomi( string &tekst, int broj){
// "kida" tekst na linije velicine varijable broj
// dodajuci '\n' character
// prethodni pamti polozaj najblizeg space-a kojeg smo prosli
// brojac broji koliko smo karaktera prosli
string::size_type brojac=0, prethodni=0;
for( string::size_type i=0; i<tekst.size(); ++i){
// ako smo prosli broj karaktera a nismo se prebacili
// u novu liniju onda se prebacujemo
// dodavanjem '\n' charactera na mjesto
// sa indeksom prethodni, tj. na najblizi prodjen space
if( brojac==broj ){
tekst.replace( prethodni, 1, "\n", 0, 1);
brojac=0;
// vracamo se na indeks prethodni+1
// jer smo na indeksu prethodni prekinuli liniju
i=prethodni+1;
continue;
}
// ako je trenutni character space postavi prethodni
if( tekst[i]==' ' ) prethodni=i;
// ako je trenutni character '\n' resetiraj brojac
// jer se tu prebacujemo u novu liniju
else if( tekst[i]=='\n' ) brojac=0;
++brojac;
}
}
int main( int argc, char *argv[]){
if(argc>2){
cout << "Nepravilan poziv programa!!!\n> Previse argumenata." << endl;
return 1;
}
int broj=75;
if( argc==2 ){
string pomoc(argv[1]);
for( string::size_type i=0; i<pomoc.size(); ++i){
if( !isdigit(pomoc[i]) ){
cout << "Nepravilan poziv programa!!!\n> Drugi argument nije broj." << endl;
return 2;
}
}
broj=atoi(argv[1]);
}
if( broj<66 || broj>132){
cout << "Nepravilan poziv programa!!!\n> Drugi argument mora biti broj izmedju 66 i 132." << endl;
return 3;
}
// ucitiva tekst sa standardong ulaza liniju po liniju
// te ga lijepi na vec prije uneseni tekst
string pomoc, tekst;
bool paragraf=false;
while( getline( cin, pomoc) ){
// ako zadovoljava kriterije za paragraf
// tj. sadrzi samo praznine ili je prazan
if( kriterij_paragraf( pomoc) ){
// ako je do sada uneseni tekst velicine 0, tj. na pocetku smo
// onda zanemari sve prazne linije
if( tekst.size()==0 ) continue;
else{
// inace vec postoji tekst pa je prazna
// linija oznaka za novi paragraf
paragraf=true;
continue;
}
}
// ako smo ucitali tekst (ne zadovoljava kriterije paragrafa,
// pogledati gore funkciju) i prije je bila unesena prazna
// linija (ili vise), tj. paragraf=true
// onda lijepi '\n\n' na kraj "tekst"-a
if( pomoc.size()!=0 && paragraf==true){
tekst+="\n\n";
paragraf=false;
}
// lijepi unesenu liniju na prije ucitani tekst
tekst+=pomoc+" ";
}
modificiraj( tekst);
razlomi( tekst, broj);
cout << tekst << endl;
return 0;
}
|
_________________ The purpose of life is to end
Prosle su godine kolokviji bili laksi, zar ne?
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
GauSs_ Moderator
Pridružen/a: 28. 01. 2004. (21:01:17) Postovi: (53C)16
Spol:
Lokacija: 231
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
|