Forum » Programiranje » [C++] - Tolmačenje povedi in izvedba operacij nad števkami
[C++] - Tolmačenje povedi in izvedba operacij nad števkami
Volk| ::
Ima kdo idejo kako napisat program(v c++), ki bo iz enega stavka kjer so not stevke in operator , sestel stevke?
Primer: jutri je 5+5 dan po formuli ki je bila 10+6 dan tega meseca.
Program pa mora napisat: jutri je 10 dan po formuli ki je bila 16 tega meseca.
Moja ideja je da v besedilu poiščeš operator, samo nato ne vem kako naj povem da naj vzame stevko pred in po operatorju.
Ideas?
Primer: jutri je 5+5 dan po formuli ki je bila 10+6 dan tega meseca.
Program pa mora napisat: jutri je 10 dan po formuli ki je bila 16 tega meseca.
Moja ideja je da v besedilu poiščeš operator, samo nato ne vem kako naj povem da naj vzame stevko pred in po operatorju.
Ideas?
- spremenilo: CCfly ()
HairyFotr ::
Greš nazaj od operatorja in najdeš prvi znak, ki ni cifra in imaš prvo število. Enako za številko pred operatorjem.
matejv ::
sam to ti bo samo eno cifro pogledalo. dodaj še to, da če je cifra naj pogleda še eno nazaj, dkoler ne bo prišlo do ne cifre.
kihc ::
#include <iostream> #include <string> using namespace std; void IzpisiStevke(string stavek) { int i = -2; for(;;) // neskončna zanka { if(i == -1) { break; } else if(i == -2) { i = 0; } else { cout << stavek[i-1] << endl << stavek[i+1]; } i = stavek.find('+',i+1); } }
Naprej pa probej sam ...
//edit pozabu zaklepaj :S
x
Zgodovina sprememb…
- spremenil: kihc ()
muzičar ::
Čakaj a to mora zgledati tako na ekranu:
Blabla 5+5 blabla 10+6
Blabla 10 blabla 16
Če ja potem se da to narediti simpel ko pasulj. Deklariraš šest spremenljivke, jih vneseš (cin če delaš s string) in izpišeš prvi stavek v katerem daš prvi dve za 5+5 in drugi dve za 10+6, potem pa prvi dve sešteješ in daš v peto spremnljivko, drugi dve sešteješ in daš v šesto spremenljivko in spet izpišeš stavek tokrat z zadnjima dvema spremenljivkama. Razumeš? Če ne ti napišem.
Blabla 5+5 blabla 10+6
Blabla 10 blabla 16
Če ja potem se da to narediti simpel ko pasulj. Deklariraš šest spremenljivke, jih vneseš (cin če delaš s string) in izpišeš prvi stavek v katerem daš prvi dve za 5+5 in drugi dve za 10+6, potem pa prvi dve sešteješ in daš v peto spremnljivko, drugi dve sešteješ in daš v šesto spremenljivko in spet izpišeš stavek tokrat z zadnjima dvema spremenljivkama. Razumeš? Če ne ti napišem.
Volk| ::
Ne, ne...stavek je dan za primer...drugace je lahko stavek nedoločene dolzine in ima vec ali manj stevk...program pa ti mora najt vse stevke in jih sestet po tistem operatorju kot je dolocen med stevkama.
Ni ravno tako preprosto kot se vidi na prvi pogled.
Ni ravno tako preprosto kot se vidi na prvi pogled.
Roadkill ::
Je, ampak ti še vedno čakaš, da nekdo tole napiše namesto tebe. Malo pomisli.
kihc: Lepo, da začetniku Predlagaš, da uporabi neskončno zanko kot samo osnovo njegovega programčka. :)
kihc: Lepo, da začetniku Predlagaš, da uporabi neskončno zanko kot samo osnovo njegovega programčka. :)
Ü
Volk| ::
Roadkill:
Mogoce mas prav da cakam,toda verjemi mi da bi ga rad sam napisal...ali pa sem prevec butast da bi napisal tak program, ki ga vsi drugi strosite iz rokava.
V tem primeru lahko odpikam fax...trenutno pa se nisem v fazi tega priznanja...
Grem se j...t se tem programom...
Mogoce mas prav da cakam,toda verjemi mi da bi ga rad sam napisal...ali pa sem prevec butast da bi napisal tak program, ki ga vsi drugi strosite iz rokava.
V tem primeru lahko odpikam fax...trenutno pa se nisem v fazi tega priznanja...
Grem se j...t se tem programom...
Vesoljc ::
edini pravi nacin (afaik) za lotevanje takega problema je drevesna strukutra, kjer potem po nivojih resujes izraze. z if-i se bos... kako ze recejo, ustrelil v nogo?
Abnormal behavior of abnormal brain makes me normal...
bozjak ::
ok jst sm zdle na hitrco napisov neki v Cju... Zdj zadeva ne deluje čist, ma mal probleme z izpisom ampak žal zdle nimam cajta da bi stvar spolirov... Upam da ti bo vsaj mal pomagal da bos pol znov konct...
btw: Prosm ne komentirat kode pa tega, napisan je blo v 10ih minutah, lih tok da ti dam idejo kako zadevo cist na simpl narest... Ce ti tole ne bo cist nc pomagal bom mogoce jutr napisov tko da bo res delal, zdle zov nimam cajta... lp
Edit: st.koda c ti c kodo veliko lepše sformatira kot le st.koda - Gundolf
#include <stdio.h> #include <string.h> #include <conio.h> int main(int argc, char *argv[]) { char tab[500]; int i=0, j, k, l, st, pr, ste, cif[10]; do { tab[i] = getch(); printf("%c", tab[i]); i++; } while (tab[i-1]!= '.'); for (st = 0; st < i; st++) { pr = st; if ((tab[st] >= 48) && (tab[st] <= 57)) { ste = tab[st] - 48; st+=2; switch(tab[st-1]) { case 42: ste *= tab[st] - 48; break; case 43: ste += tab[st] - 48; break; case 45: ste -= tab[st] - 48; break; case 47: ste /= tab[st] - 48; break; } if (ste > 9) { for(j=0; ((ste%10) > 0); j++) { cif[j] = ste%10; ste = ste/10; } for(k=0; k<(j-1); k++) tab[pr+k] = cif[j-k-1] + 48; for(l=j+pr+1; l < i; l++) tab[l] = tab[l+1]; tab[i-(1+j)]= '\0'; } else { tab[pr] = ste + 48; for(j=pr+1; j < i; j++) tab[j] = tab[j+1]; tab[i-1]= '\0'; } } } printf("\n"); puts(tab); printf("Pritisni katerokoli tipko za izhod!"); getch(); return 0; }
btw: Prosm ne komentirat kode pa tega, napisan je blo v 10ih minutah, lih tok da ti dam idejo kako zadevo cist na simpl narest... Ce ti tole ne bo cist nc pomagal bom mogoce jutr napisov tko da bo res delal, zdle zov nimam cajta... lp
Edit: st.koda c ti c kodo veliko lepše sformatira kot le st.koda - Gundolf
Zgodovina sprememb…
- spremenil: Gundolf ()
BigWhale ::
Ce vsaj st.koda c tag uporabil...
On the subject...
Vesoljec,
Drevesna struktura? Eh... Saj dela v c++. Input string tokeniziras do nezavesti. Ma se to ne nucas, z FindFirst isces operaterje. ;)
On the subject...
Vesoljec,
Drevesna struktura? Eh... Saj dela v c++. Input string tokeniziras do nezavesti. Ma se to ne nucas, z FindFirst isces operaterje. ;)
BigWhale ::
Eh, ma ne! String stokeniziras po vseh moznih operaterjih +,-,*,/. Zetone v parih zmeces v eno strukturo, potem nad zetoni 1,3,5,7,9,... uporabis kako findlast() metodo in zavrzes vse kar je pred zadnjim presledkom, vkljucno z njim. Na sodih uporabis findfirst() in se znebis vsega kar je za presledkom.
Potem pa samo se operaterje ven poisces in jih uporabis nad pari stevil. In si tam.
PS: Naloga za bralce pa je, da pogruntajo kako bi to naredil, ce bi imel v input stringu 4+4-23+4 recimo... :)
Potem pa samo se operaterje ven poisces in jih uporabis nad pari stevil. In si tam.
PS: Naloga za bralce pa je, da pogruntajo kako bi to naredil, ce bi imel v input stringu 4+4-23+4 recimo... :)
Gundolf ::
Volk|, divide & conquer.
Prvi problem najdi stavke (če jih je več). Potem delaš na vsakem stavku posebej (en stavek je lepo obvladljiva enota).
Drugi problem, najti matematične izraze znotraj enega stavka (cel stavek imaš lepo v pospravljen v eni spremenljivki recimo v enem stringu).
Tretji problem: poračunat najdene izraze.
Četrti problem, izpisat spremenjeni stavek.
Pa še mal pseudo-implementacije:
Kako prebrati en stavek?
std::string stavek;
std::ifstream fajl;
std::getline(fajl, stavek, '.');
Kako razdeliti stavek recimo na besede (enote ločene s presledkom - lahko si izbereš tudi drugačno delitev)?
std::string beseda;
std::istringstream stavekStream(stavek);
while (stavekStream >> beseda) {
// procesiraj besedo
}
Kako pogledat če je beseda matematični izraz?
std::istringstream besedaStream(beseda);
double stevilka;
besedaStream >> stevilka;
if (besedaStream.fail()) {
// če začetek besede ni številka potem ta beseda ni mat. izraz
} else {
// številka na začetku, to bi znal biti izraz, lahko parsaš dalje za operatorjem in še eno številko
}
Kako dalje izpisat popravljen stavek?
Vsako besedo, ki ni izraz takoj ko jo pregledaš izpišeš v nek drug stream (lahko kar cout). Vsako besedo, ki je izraz takoj predelaš in izpišeš.
Zdej kar rabiš naredit je, da si pogledaš malo string-e, stringstream-e, getline in podobno kramo, ki sem jo tule naštel. Potem pa samo sestavljaš, kot kocke. Pa lepo počasi, po korakih.
Prvi problem najdi stavke (če jih je več). Potem delaš na vsakem stavku posebej (en stavek je lepo obvladljiva enota).
Drugi problem, najti matematične izraze znotraj enega stavka (cel stavek imaš lepo v pospravljen v eni spremenljivki recimo v enem stringu).
Tretji problem: poračunat najdene izraze.
Četrti problem, izpisat spremenjeni stavek.
Pa še mal pseudo-implementacije:
Kako prebrati en stavek?
std::string stavek;
std::ifstream fajl;
std::getline(fajl, stavek, '.');
Kako razdeliti stavek recimo na besede (enote ločene s presledkom - lahko si izbereš tudi drugačno delitev)?
std::string beseda;
std::istringstream stavekStream(stavek);
while (stavekStream >> beseda) {
// procesiraj besedo
}
Kako pogledat če je beseda matematični izraz?
std::istringstream besedaStream(beseda);
double stevilka;
besedaStream >> stevilka;
if (besedaStream.fail()) {
// če začetek besede ni številka potem ta beseda ni mat. izraz
} else {
// številka na začetku, to bi znal biti izraz, lahko parsaš dalje za operatorjem in še eno številko
}
Kako dalje izpisat popravljen stavek?
Vsako besedo, ki ni izraz takoj ko jo pregledaš izpišeš v nek drug stream (lahko kar cout). Vsako besedo, ki je izraz takoj predelaš in izpišeš.
Zdej kar rabiš naredit je, da si pogledaš malo string-e, stringstream-e, getline in podobno kramo, ki sem jo tule naštel. Potem pa samo sestavljaš, kot kocke. Pa lepo počasi, po korakih.
Volk| ::
Danes sem se malo igral...
no, ocitno premalo ker ne dela...
upam da sem na dobri poti...za ostale operacije bi dodal samo se naslednje 'if'
za izpisi pa bi pol napisal posebej funkcijo.
no, ocitno premalo ker ne dela...
void Iskanje(char ime[]) { char znak; int znak1,znak2,sesevek; char besedilo[500]; ifstream datoteka(ime); //do konca datoteke while(!datoteka.eof()) { //da se lahko premikam po besedilo levo in desno. for(int i=0;;) { //berem posamezen znak znak=datoteka.get(); //ce naletim na ta znak if(znak == '+') { //spremeni znak pred + v stevilo znak1=atoi(znak[i-1]); //spremeni znak po + v stevilo znak2=atoi(znak[i+1]); //sestej obe stevili sesevek=znak1+znak2; } } } }
upam da sem na dobri poti...za ostale operacije bi dodal samo se naslednje 'if'
za izpisi pa bi pol napisal posebej funkcijo.
Zgodovina sprememb…
- spremenilo: CCfly ()
nevone ::
Za rešitev te naloge moraš najprej definirati nekaj stvari:
- kateri znaki so ločila
- kateri znaki so operatorji
- kateri znaki tvorijo števila
- kateri znaki tvorijo besede, ki niso števila
Potem moraš določiti še nekaj relacij (presekov) med temi definicijami:
- operator je tudi ločilo (poleg tega da je operator)
- znaki, ki tvorijo števila se lahko pojavijo tudi v besedah
- samo nekateri znaki, ki tvorijo besede, se lahko pojavljajo v številu.
Iz teh določil, lahko potem ločiš števila od besed in razločiš operatorje, kar omogoči pokrajšanje izrazov v povedi.
Kako pa to sprogramirat? Jah nč, mau se matri.
o+ nevone
- kateri znaki so ločila
- kateri znaki so operatorji
- kateri znaki tvorijo števila
- kateri znaki tvorijo besede, ki niso števila
Potem moraš določiti še nekaj relacij (presekov) med temi definicijami:
- operator je tudi ločilo (poleg tega da je operator)
- znaki, ki tvorijo števila se lahko pojavijo tudi v besedah
- samo nekateri znaki, ki tvorijo besede, se lahko pojavljajo v številu.
Iz teh določil, lahko potem ločiš števila od besed in razločiš operatorje, kar omogoči pokrajšanje izrazov v povedi.
Kako pa to sprogramirat? Jah nč, mau se matri.
o+ nevone
Either we will eat the Space or Space will eat us.
Gundolf ::
Takole je Volk|:
for(int i=0;;) <- Vsaj še i++ manjka.
znak2=atoi(znak[i+1]); <- prebral si le znake od 0 do i, kaj računaš da ti bo program uganil naslednji znak?
atoi(znak[i+1]) <- atoi pričakuje, da mu podaš kot parameter niz znakov (kot pointer na prvi znak v nizu) zaključen z 0. Kaj si mu ti podal? En znak (niti ne pointer na znak).
Še enkrat isti nasvet. Razdeli si zadevo. Ne vsega delat v eni veliki zanki.
Najprej preberi iz datoteke v neko strukturo (zanimivo kako je ravno med novinci v jeziku za obdelovanje znakov najbolj priljubljen najtežji za obvladat - char*). Med branjem ne nič obdelovat, nič seštevat, 0! V naslednjem koraku pa pojdi čez prebrano in išči operatorje in potem seštevaj tnake okoli njih.
Pri tem pa pazi, da 1+2 ni edina možna kombinacija. Upoštevati moraš še:
12+13
1+2+3
1 +3
1+ 3
-1+ -3
Morda ti vseh teh kombinacij ni treba upoštevat, ti veš kaj točno moraš naredit, samo ne delat preveč na pamet, naštej si vse možnosti ki jih moraš pokriti in si zamisli algoritem ki to zmore. Šele potem zapiši ta algoritem v c++. Ne nekaj na pamet pisat.
for(int i=0;;) <- Vsaj še i++ manjka.
znak2=atoi(znak[i+1]); <- prebral si le znake od 0 do i, kaj računaš da ti bo program uganil naslednji znak?
atoi(znak[i+1]) <- atoi pričakuje, da mu podaš kot parameter niz znakov (kot pointer na prvi znak v nizu) zaključen z 0. Kaj si mu ti podal? En znak (niti ne pointer na znak).
Še enkrat isti nasvet. Razdeli si zadevo. Ne vsega delat v eni veliki zanki.
Najprej preberi iz datoteke v neko strukturo (zanimivo kako je ravno med novinci v jeziku za obdelovanje znakov najbolj priljubljen najtežji za obvladat - char*). Med branjem ne nič obdelovat, nič seštevat, 0! V naslednjem koraku pa pojdi čez prebrano in išči operatorje in potem seštevaj tnake okoli njih.
Pri tem pa pazi, da 1+2 ni edina možna kombinacija. Upoštevati moraš še:
12+13
1+2+3
1 +3
1+ 3
-1+ -3
Morda ti vseh teh kombinacij ni treba upoštevat, ti veš kaj točno moraš naredit, samo ne delat preveč na pamet, naštej si vse možnosti ki jih moraš pokriti in si zamisli algoritem ki to zmore. Šele potem zapiši ta algoritem v c++. Ne nekaj na pamet pisat.
Volk| ::
Helo.
Mam napisan program pa ga ne morem prilepit ker mi javi da sem pozabil zaključit html oznako. Lahko kako to prelisičim? Če spreminjam kodo zaradi tega pol ne bo isto.
Mam napisan program pa ga ne morem prilepit ker mi javi da sem pozabil zaključit html oznako. Lahko kako to prelisičim? Če spreminjam kodo zaradi tega pol ne bo isto.
Volk| ::
Hvala Gundolf!
evo...
imel sem pomoč da sem to naredil. Verjamem pa da je to samo ena od možnih rešitev. Še ima kdo kako drugo?
evo...
int OvrednotiStevila(char beseda[]) { int dolzinaBesede=strlen(beseda); char prva[3],druga[3]; char operat; int stevilo1,stevilo2; int i=0; int j =0; while((beseda[i]!='+')&&(beseda[i]!='-')&&(beseda[i]!='*')&&(beseda[i]!='/')) { prva[i]=beseda[i]; i++; } operat=beseda[i]; i++; while(i<dolzinaBesede) { druga[j]=beseda[i]; j++; i++; } stevilo1=atoi(prva); stevilo2=atoi(druga); if(operat=='+') return stevilo1+stevilo2; if(operat=='-') return stevilo1-stevilo2; if(operat=='*') return stevilo1*stevilo2; if(operat=='/') return stevilo1/stevilo2; return 0; } bool PreveriAliJeStevilo(char beseda[]) { if(isdigit(beseda[0])) return true; else return false; } void PreberiInOvrednoti(char ime[]) { char besedilo[500]; char *beseda; ifstream datoteka(ime); while(!datoteka.eof()) { datoteka.getline(besedilo,500); beseda=strtok(besedilo," "); while(beseda !=NULL) { if(PreveriAliJeStevilo(beseda)) { cout<<OvrednotiStevila(beseda); } else { cout<<" "<<beseda<<" "; } beseda=strtok(NULL," "); } } datoteka.close(); }
imel sem pomoč da sem to naredil. Verjamem pa da je to samo ena od možnih rešitev. Še ima kdo kako drugo?
Gundolf ::
A ti smem malo zagreniti življenje? :P
No samo takole komentaji:
- tole ti še dodatno spremeni besedilo (več kot bi bilo treba) - če si kaj sprobaval že sam veš kaj imam v mislih. Ampak očitno si bolj malo sprobaval (hint: najbolj preprostih primerov nisi sprobal). Zanimiv efekt je tudi če imaš vrstico daljšo od 500 znakov in 500ti znak ni ravno začetek nove besede
- beseda=strtok(NULL," "); - take stvari kjer imaš komplicirano kodo namesto direktnega izraza so mi nadvse zanimive :)
- negativna števila so drugorazredni državljani :(
Drugače pa rešitev tega problema je neskončno. Tvoja ima pa po moje še preveč zelo očitnih napak.
No samo takole komentaji:
- tole ti še dodatno spremeni besedilo (več kot bi bilo treba) - če si kaj sprobaval že sam veš kaj imam v mislih. Ampak očitno si bolj malo sprobaval (hint: najbolj preprostih primerov nisi sprobal). Zanimiv efekt je tudi če imaš vrstico daljšo od 500 znakov in 500ti znak ni ravno začetek nove besede
- beseda=strtok(NULL," "); - take stvari kjer imaš komplicirano kodo namesto direktnega izraza so mi nadvse zanimive :)
- negativna števila so drugorazredni državljani :(
Drugače pa rešitev tega problema je neskončno. Tvoja ima pa po moje še preveč zelo očitnih napak.
Gundolf ::
Se mi ne ljubi.
BTW, vsaj to si ugotovil, da kadar ti program najde le eno število (in ne izraza), ti to število na izhodu spremeni v 0?
BTW, vsaj to si ugotovil, da kadar ti program najde le eno število (in ne izraza), ti to število na izhodu spremeni v 0?
Volk| ::
Naloga je bila zastavljena tako kot sem napisal v prvem postu. To da bi samo pri enem stevilo bil izhod '0' ni bilo mišljeno da treba dodatno sprogramirat. Sicer ce bi hotel to dodat tudi ni noben problem. En 'if' stavek in zadeva rešena.
Skoda da se ti ne ljubi napisat. Bi bilo zanimivo videt tvoj način.
Skoda da se ti ne ljubi napisat. Bi bilo zanimivo videt tvoj način.
Gundolf ::
Eh jaz tega programa ne rabim in ta čas ko bi ga pisal raje tu na slo-techu zabluzim pa je :P
Kar se pa tiče tvojih bugov: specifikacija naloge tudi ne pravi, da se program ne sme sesuti, če je v tekstu en šumnik ali pa če se začne z veliko začetnico. Ampak a bi bil ti s takim programom zadovoljen? Tvoja naloga ne pravi izrecno, da ti program ne sme uničiti števil v tekstu, da ti ne sme zbluzit presledkov, ko naleti na več kot enega v kompletu, da ti ne sme na začetku teksta dodati presledka, da ti ne sme uničiti strukture vrstic, da mora delati za tekst daljči od 500 znakov. Ampak jaz ti le povem, da če bi bil jaz prfox (ne vem za kaj točno ti rabiš tole nalogo, ugibam da je šolsko usmerjena) bi ti dal eno oceno dol za vsakega od teh bugov.
> En 'if' stavek in zadeva rešena.
Meni je povsem nerazumljivo zakaj potem nimaš tega if stavka. Verjetno gledava malo različno na tole nalogo. Jaz v njej vidim dva dela, prvi je prepisat večino vhoda na izhod (dobesedno, brez vmesne transformacije), drugi je pa poračunat izraze. Ti si se zapičil le v drugi del. Upaj da tudi tvoji ocenjevalci tako razmišljajo.
Popravek: Vsak samostojni presledek ti nadomesti z dvema. Ojej ojej.
Kar se pa tiče tvojih bugov: specifikacija naloge tudi ne pravi, da se program ne sme sesuti, če je v tekstu en šumnik ali pa če se začne z veliko začetnico. Ampak a bi bil ti s takim programom zadovoljen? Tvoja naloga ne pravi izrecno, da ti program ne sme uničiti števil v tekstu, da ti ne sme zbluzit presledkov, ko naleti na več kot enega v kompletu, da ti ne sme na začetku teksta dodati presledka, da ti ne sme uničiti strukture vrstic, da mora delati za tekst daljči od 500 znakov. Ampak jaz ti le povem, da če bi bil jaz prfox (ne vem za kaj točno ti rabiš tole nalogo, ugibam da je šolsko usmerjena) bi ti dal eno oceno dol za vsakega od teh bugov.
> En 'if' stavek in zadeva rešena.
Meni je povsem nerazumljivo zakaj potem nimaš tega if stavka. Verjetno gledava malo različno na tole nalogo. Jaz v njej vidim dva dela, prvi je prepisat večino vhoda na izhod (dobesedno, brez vmesne transformacije), drugi je pa poračunat izraze. Ti si se zapičil le v drugi del. Upaj da tudi tvoji ocenjevalci tako razmišljajo.
Popravek: Vsak samostojni presledek ti nadomesti z dvema. Ojej ojej.
Zgodovina sprememb…
- spremenil: Gundolf ()
Volk| ::
Gundolf:
Točno!
Naloga predvsem zahteva poračunat izraze. Glede na to da druga ne zahteva se z drugim ne ukvarjam. Zakaj ne? Ker nimam časa(kot verjetno ti ne). Imam se druge naloge za rešit. Neke za vajo, neke za oceno.
Prfoksi razmišljajo tako, če znaš rešit nalogo to kaj zahteva od tebe bi (verjetno) moral rešit tudi ostale buge, ki jih omenjaš.
Imaš točno prav. Če bi bil smisel programa da dela brez napake bi takega pol tudi moral napisat. Vendar to ni smisel naloge. Smisel je v tem da se vidi ali znaš naredit to kar naloga zahteva od tebe.
Ne vem koliko si seznanjen s tem kaj se zahteva pri nalogah,toda povem ti, da ko imas pol ure za tako nalogo se ne bos še ukvarjal s bugi(ki jih se seveda zavedam).
Pedvsem pa se učim. Naloge jaz ne znam rešit v pol ure. Se jo reševal nekaj časa(poleg drugih), samo s tem namenom da se učim. So kolegi ze imeli naloge...pa jih nisem hotel..le namige sem potreboval kako rešit problem.
KO je pa rešen...pa želim tudi videt naloge od drugih kako so rešili da vidim kako so drugi rešili ta problem.
Nekje na slo-techu sem zasledil da je en spraseval o programu evidence smučarkih skokih. Zdaj jo delam...verjetno bo dost bugov(če vneseš črko namesto številke se bo sesul) ampak se ne bom ukvarjal s tem, saj je smisel naloge rešit problem v osnovi. Programa tako noben ne bo uporabljal. Le za vajo. Če pa bi...pa bi dodal preverjanje(v tem primeru številk)
No, upam da sem ti pojasnil vsaj malo. Pa ne misli da sem sarkasičen ali žaljiv - nasprotno. Vidim da veliko obvladaš in spoštujem tebe in tvoje znanje. Moram rečt da mi je ta forum ze veliko pametnih nasvetov dal. Tudi od tebe.
Vesel sem vsakega debatiranja. Predvsem pa nasvetov.
Točno!
Naloga predvsem zahteva poračunat izraze. Glede na to da druga ne zahteva se z drugim ne ukvarjam. Zakaj ne? Ker nimam časa(kot verjetno ti ne). Imam se druge naloge za rešit. Neke za vajo, neke za oceno.
Prfoksi razmišljajo tako, če znaš rešit nalogo to kaj zahteva od tebe bi (verjetno) moral rešit tudi ostale buge, ki jih omenjaš.
Imaš točno prav. Če bi bil smisel programa da dela brez napake bi takega pol tudi moral napisat. Vendar to ni smisel naloge. Smisel je v tem da se vidi ali znaš naredit to kar naloga zahteva od tebe.
Ne vem koliko si seznanjen s tem kaj se zahteva pri nalogah,toda povem ti, da ko imas pol ure za tako nalogo se ne bos še ukvarjal s bugi(ki jih se seveda zavedam).
Pedvsem pa se učim. Naloge jaz ne znam rešit v pol ure. Se jo reševal nekaj časa(poleg drugih), samo s tem namenom da se učim. So kolegi ze imeli naloge...pa jih nisem hotel..le namige sem potreboval kako rešit problem.
KO je pa rešen...pa želim tudi videt naloge od drugih kako so rešili da vidim kako so drugi rešili ta problem.
Nekje na slo-techu sem zasledil da je en spraseval o programu evidence smučarkih skokih. Zdaj jo delam...verjetno bo dost bugov(če vneseš črko namesto številke se bo sesul) ampak se ne bom ukvarjal s tem, saj je smisel naloge rešit problem v osnovi. Programa tako noben ne bo uporabljal. Le za vajo. Če pa bi...pa bi dodal preverjanje(v tem primeru številk)
No, upam da sem ti pojasnil vsaj malo. Pa ne misli da sem sarkasičen ali žaljiv - nasprotno. Vidim da veliko obvladaš in spoštujem tebe in tvoje znanje. Moram rečt da mi je ta forum ze veliko pametnih nasvetov dal. Tudi od tebe.
Vesel sem vsakega debatiranja. Predvsem pa nasvetov.
Gundolf ::
Ne moreš verjet koliko sem tudi jaz vesel, da nisi enostavno podal besedila naloge in rekel da rabiš rešitev. Če primerjaš odziv na tvojo temo in na nekatere, ki prosijo za pomoč po prej opisanem principu lahko sklepaš, da je bilo to večini všeč.
Glede na to da veš, da se ti bo program sesul ob recimo napačno pritisnjeni tipki, sem ti sicer hotel še en spis napisat, kako je morda naloga teh tvojih vaj tudi da se naučiš sprejemat uporabnikov input in naredit ne preveč neprijazen vmesnik, ampak se bom vzdržal. Bom le rekel, da je opazna razlika v tem koliko se naučiš, če vsaj malo stremiš k popolnosti (se izogibaš vsaj očitnim napakam), ali pa če se držiš strogo le jedra problema. Zdaj je pa vse odvisno od tvoje ambicioznosti.
Glede na to da veš, da se ti bo program sesul ob recimo napačno pritisnjeni tipki, sem ti sicer hotel še en spis napisat, kako je morda naloga teh tvojih vaj tudi da se naučiš sprejemat uporabnikov input in naredit ne preveč neprijazen vmesnik, ampak se bom vzdržal. Bom le rekel, da je opazna razlika v tem koliko se naučiš, če vsaj malo stremiš k popolnosti (se izogibaš vsaj očitnim napakam), ali pa če se držiš strogo le jedra problema. Zdaj je pa vse odvisno od tvoje ambicioznosti.
OwcA ::
Prfoksi razmišljajo tako, če znaš rešit nalogo to kaj zahteva od tebe bi (verjetno) moral rešit tudi ostale buge, ki jih omenjaš.
Če bi jaz kaj takšnega popravljal (brez skrbi, razen na kakšnem tekmovanju, tega ne počnem), bi z načeloma delujočim a hroščastim programom težko dobil kaj več kot 80 %, pa še to le za elegantno rešitev, kjer je odprava vseh teh napak trivijalna in kratka (da je kaj takšnega redek primer je upam jasno).
Otroška radovednost - gonilo napredka.
Volk| ::
NO, pa se dodatno vprasanje:
delam program kjer imam tri "ocene".
Izbrati moram dve najvišji in ju nato sestet. Problem je kako najt med tremi, dve največji. Ne bi rad primerjal vsko z vsakim saj mam pol 6 primerjav. Verjetno se da kako resit bolj elegantno.
Če bi imel dvoje ocen pol ne bi blo problema saj samo dve primerjas. Pri treh pa se malo zakoplicira(ali pa jaz kompliciram).
V mislih imam mehurčno urejanje..toda to je bolj za polja. Jaz pa mam samo tri stevila.
Mogoče sprašujem nemunosti...sicer pa ste ze opazli da se učim...
lp
delam program kjer imam tri "ocene".
Izbrati moram dve najvišji in ju nato sestet. Problem je kako najt med tremi, dve največji. Ne bi rad primerjal vsko z vsakim saj mam pol 6 primerjav. Verjetno se da kako resit bolj elegantno.
Če bi imel dvoje ocen pol ne bi blo problema saj samo dve primerjas. Pri treh pa se malo zakoplicira(ali pa jaz kompliciram).
V mislih imam mehurčno urejanje..toda to je bolj za polja. Jaz pa mam samo tri stevila.
Mogoče sprašujem nemunosti...sicer pa ste ze opazli da se učim...
lp
Zvedavec ::
Čisto enostavno - poiščeš najmanjšo, za kar potrebuješ le dve primerjavi.
Primerjaš prvi dve števili: v vsoto daš večjo število, manjše pa primerjaš s tretjim: če je večje od njega, ga dodaš k vsoti, če pa manjše, pa dodaš vsoti tretje število.
Pri trej številih stvar še nekako gre, za kaj več je pa potem že bolje uporabiti polje.
Primerjaš prvi dve števili: v vsoto daš večjo število, manjše pa primerjaš s tretjim: če je večje od njega, ga dodaš k vsoti, če pa manjše, pa dodaš vsoti tretje število.
Pri trej številih stvar še nekako gre, za kaj več je pa potem že bolje uporabiti polje.
Volk| ::
Thanks!
takole sem resil:
takole sem resil:
if(ocena1>ocena2) { if(ocena2>ocena3) return ocena1+ocena2; else return ocena1+ocena3; } else { if(ocena1>ocena3) return ocena2+ocena1; else return ocena2+ocena3; }
Zgodovina sprememb…
- spremenil: Volk| ()
Roadkill ::
Spet si premalo pozornosti posvetil robustnosti. Tvoja trenutna koda bi imela precejšne probleme, če bi bile vrednost:
ocena1=6
ocena2=6
ocena3=6
Torej če bi ocene bile enake.
ocena1=6
ocena2=6
ocena3=6
Torej če bi ocene bile enake.
Ü
Volk| ::
To imas res prav, toda po drugi strani ne. Jaz rabim samo dve najvecji oceni.Ce so enake je pol itak vseeno kero vzame, tretja j nepomembna.
V tem primeru pac je program tako zastavljen tako da je vseeno. V drugem primeru pa res ne bi bilo zato ti dam prav.
V tem primeru pac je program tako zastavljen tako da je vseeno. V drugem primeru pa res ne bi bilo zato ti dam prav.
jernejl ::
Jaz bi se še malo vrnil na prvo nalogo, računanje matematičnih izrazov, zato ker v splošnem nihče ni objavil rešitve oz. pravilne ideje.
Rešitve z linearnim preiskovanjem izraza seveda ne dajo pravilnih rešitev za izraze, če izraz vsebuje operatorje z različnimi prioritetami, npr:
3+5*7
Z linearnim preiskovanjem najdemo prvi operator + ter seštejemo 3+5, nato pa to vsoto zmnožimo z 7... rezultat je seveda napačen, zaradi tega, ker ima pri reševanju mat. izrazov operator * višjo prioriteto od operatorja +.
Ideja reševanja matematičnih izrazov je skladovni stroj. Operande po vrsti dajemo na sklad operandov, operatorje pa dajemo na sklad operatorjev. Če ima operator, ki ga dajemo na sklad, nižjo prioriteto od vrhnjega operatorja na skladu, lahko vrhnji operator s sklada uporabimo nad vrhnjima operandoma iz sklada operandov. Če ima operator, ki ga dajemo na sklad, višjo prioriteto od vrhnjega, pa ga samo dodamo na vrh sklada.
Tak princip reševanja je s stališča pisanja kode morda malce daljši in zahtevnejši, vendar se pri reševanju matematičnih izrazov največ uporablja (na tem principu delujejo tudi kalkulatorji).
Primer za zgornji enostavni izraz bi bil tak:
1. korak: naletimo na operand 3, ter ga damo na sklad operandov:
SKLAD OPERANDOV: 3
SKLAD OPERATORJEV: NULL
2. korak: naletimo na operator +, ter ga damo na sklad operatorjev:
SKLAD OPERANDOV: 3
SKLAD OPERATORJEV: +
3.korak: naletimo na operand 5 ter ga damo na sklad operandov:
SKLAD OPERANDOV: 3, 5
SKLAD OPERATORJEV: +
4. korak: naletimo na operator *. Preden ga damo na sklad, preverimo prioriteto operatorjev * in +. Ker ima operator * višjo prioriteto od +, ga dodamo na sklad:
SKLAD OPERANDOV: 3, 5
SKLAD OPERATORJEV: +, *
5. korak: naletimo na operand 7 in ga damo na sklad operandov:
SKLAD OPERANDOV: 3, 5, 7
SKLAD OPERATORJEV: +, *
Sedaj, ko izraza zmanjka, razrešimo izraz. Z vrha sklada vzamemo operator * ter ga uporabimo nad vrhnjima operandoma s sklada operandov. Operanda 5 in 7 odstranimo, prav tako operator *. Rezultat 5*7=35 damo nazaj na sklad operandov.
SKLAD OPERANDOV: 3, 35
SKLAD OPERATORJEV: +
V naslednjem koraku uporabimo (po istem principu) še operator + nad operandoma 3 in 35, ter rezultat damo na sklad:
SKLAD OPERANDOV: 38
SKLAD OPERATORJEV: NULL
Na koncu postopka imamo na skladu operandov en element, ki je rezultat matematičnega izraza.
Seveda pa ne potrebuješ skladovnega stroja, če v nalogi nastopajo samo izrazi z dvema operandoma in eno operacijo vmes, npr. 3*6 ali 5-2 ipd.
Rešitve z linearnim preiskovanjem izraza seveda ne dajo pravilnih rešitev za izraze, če izraz vsebuje operatorje z različnimi prioritetami, npr:
3+5*7
Z linearnim preiskovanjem najdemo prvi operator + ter seštejemo 3+5, nato pa to vsoto zmnožimo z 7... rezultat je seveda napačen, zaradi tega, ker ima pri reševanju mat. izrazov operator * višjo prioriteto od operatorja +.
Ideja reševanja matematičnih izrazov je skladovni stroj. Operande po vrsti dajemo na sklad operandov, operatorje pa dajemo na sklad operatorjev. Če ima operator, ki ga dajemo na sklad, nižjo prioriteto od vrhnjega operatorja na skladu, lahko vrhnji operator s sklada uporabimo nad vrhnjima operandoma iz sklada operandov. Če ima operator, ki ga dajemo na sklad, višjo prioriteto od vrhnjega, pa ga samo dodamo na vrh sklada.
Tak princip reševanja je s stališča pisanja kode morda malce daljši in zahtevnejši, vendar se pri reševanju matematičnih izrazov največ uporablja (na tem principu delujejo tudi kalkulatorji).
Primer za zgornji enostavni izraz bi bil tak:
1. korak: naletimo na operand 3, ter ga damo na sklad operandov:
SKLAD OPERANDOV: 3
SKLAD OPERATORJEV: NULL
2. korak: naletimo na operator +, ter ga damo na sklad operatorjev:
SKLAD OPERANDOV: 3
SKLAD OPERATORJEV: +
3.korak: naletimo na operand 5 ter ga damo na sklad operandov:
SKLAD OPERANDOV: 3, 5
SKLAD OPERATORJEV: +
4. korak: naletimo na operator *. Preden ga damo na sklad, preverimo prioriteto operatorjev * in +. Ker ima operator * višjo prioriteto od +, ga dodamo na sklad:
SKLAD OPERANDOV: 3, 5
SKLAD OPERATORJEV: +, *
5. korak: naletimo na operand 7 in ga damo na sklad operandov:
SKLAD OPERANDOV: 3, 5, 7
SKLAD OPERATORJEV: +, *
Sedaj, ko izraza zmanjka, razrešimo izraz. Z vrha sklada vzamemo operator * ter ga uporabimo nad vrhnjima operandoma s sklada operandov. Operanda 5 in 7 odstranimo, prav tako operator *. Rezultat 5*7=35 damo nazaj na sklad operandov.
SKLAD OPERANDOV: 3, 35
SKLAD OPERATORJEV: +
V naslednjem koraku uporabimo (po istem principu) še operator + nad operandoma 3 in 35, ter rezultat damo na sklad:
SKLAD OPERANDOV: 38
SKLAD OPERATORJEV: NULL
Na koncu postopka imamo na skladu operandov en element, ki je rezultat matematičnega izraza.
Seveda pa ne potrebuješ skladovnega stroja, če v nalogi nastopajo samo izrazi z dvema operandoma in eno operacijo vmes, npr. 3*6 ali 5-2 ipd.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | c# programOddelek: Pomoč in nasveti | 1094 (919) | ZeleniJure |
» | KalkulatorOddelek: Programiranje | 1326 (1093) | lebdim |
» | c# težava delo z niziOddelek: Programiranje | 1535 (1386) | Tutankhamun |
» | [c++] Zacetnisko programiranje v c++, problem: vpis besedOddelek: Programiranje | 1916 (1654) | zos |
» | [C/C++] pointerji in referenceOddelek: Programiranje | 2043 (1867) | Matako |