Zastavenie cyklu po najdeni spravnej hodnoty

Programovacie jazyky, rady, poradňa...
pato83
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3916
Registrovaný: 21 nov 2005, 22:12

Zastavenie cyklu po najdeni spravnej hodnoty

Príspevok od používateľa pato83 »

Zdravim vsetkych, uz nejaky cas sa trapim a to doslova s jednou vecou. Tu je cast kodu:

Kód: Vybrať všetko

from time import localtime, strftime
from string import split
konto=500
subor=file('Historia.txt','r')
historia=subor.read()
subor.close()
historia2=historia.splitlines()
for riadok in historia2:
      hodnota=riadok.split()
      if konto > (int(hodnota[0])):
            indexR=historia2.index(riadok)
            subor=file('Historia.txt','w')
            meno=raw_input('Zadajte svoje meno: ')
            zapis=(str(konto))+(' : ')+(meno[0:10])+(strftime("    %H:%M:%S  %d-%m-%Y",localtime()))
            historia2.insert(indexR,zapis)
if len(historia2) == 11:
      for n in historia2[0:10]:
            subor.write((n)+('\n'))
      subor.close()
else:
    print ">>>>> Lutujem, ale minimalne 10 hracov dosiahlo lepsi vysledok. Skus opat! <<<<<"    
print "Dovidenia"
Je to pisane v pythone, ale jazyk nie je mozno az tak dolezity v tomto pripade.
Rozoberiem rad radom, co to ma spravit.
1. Nacita obsah suboru Historia.txt . Su tam ulozene udaje o vyske konta, mene, case a datume v presne stanovenom tvare.
2. Obsah suboru sa nacita do pola historia.
3. Pole historia sa pomocou funkcie splitlines() rozdeli na jednotlive prvky, kazdy prvok reprezentuje jeden riadok zo suboru Historia.txt. Tieto hodnoty sa zapisu do pola historia2
4. Pre kazdy prvok v poli historia2 sa vytvori vzdy nove pole hodnota, ktore vdaka funkcii split() obsahuje rozdeleny jeden prvok z pola historia2. Tymto dosiahnem, ze sa zachova priradenie >>> vyska konta : meno cas datum
5. Podmienkou if konto > (int(hodnota[0])) dosiahnem, ze ak vyska konta bude vacsia ako prve cislo v poli hodnota, na umiestnenie urcene premennou indexR vlozime hodnotu zapis. Kedze sme nasli hodnotu, ktora vyhovuje podmienke, malo by sa to skoncit. Neskonci sa a prehladava sa dalej. Samozrejme je to kvoli tomu cyklu FOR. Je nejak mozne ukoncit takyto cyklus, alebo radsej hladat inu cestu?
6. Sa porovna pocet clenov v poli historia2, ak je vacsi ako 10, znamena to, ze podmienka bola platna, pribudol zaznam a posledny zaznam sa vymaze. Opacne sa vypise hlaska.
Moja otazka znie, je aj v popise, ale opakovanie je matkou mudrosti :) Ako dosiahnem, aby sa po najdeni spravnej hodnoty,cykklus ukoncil? Skusal som to dat cele do podmienky s premennou, ktora bude mat trebars hodnotu 0 a ak sa najde spravna hodnota, tak sa k tejto premennej pripocita jedna a teda by sa to dalej uz nemalo pocitat, ale nejako to nefunguje. Dakujem za akykolvek napad. :)
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

neviem ako sa interpretuje cyklus v phytone, ale v iných jazykoch bývajú dva spôsoby ako cyklus predčasne ukončiť. Buď je na to príkaz (napríklad break, treba pohladať či python niečo také pozná) alebo druhý spôsob je zmeniť riadiacu premennú cyklu. V tvojom prípade by som zmazal pole historia2. Tým pádom by sa v cykle už nepokračovalo (niektoré jazyky takýto postup nepodporujú, lebo sa na začiatku pozrú koľkokrát opakovať, a nie pri skončení každého kroku cyklu)

Ak nepôjde ani jedno ani druhé, for by som nahradil za while
pato83
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3916
Registrovaný: 21 nov 2005, 22:12

Príspevok od používateľa pato83 »

1. Odstranennie pola historia2 nie je riesenim. Vymazal som cele pole hned ako sa nacitalo naspat do suboru Historia.txt. Ono to sice zapisalo pekne na spravne miesto a v spravnom tvare do toho suboru, ale nasledne hodi error, lebo chce citat z pola historia2, ktore uz neexistuje. To by sa dalo oblbnut pomocou try a except, ale to mi nepride vobec nejake pekne riesenie. Idem pozriet ten druhy postup s break a potom to tu editnem.

2. Skvele. Pozitim prikazu break to krasne stopne. Uzasne, skvele, unbelievable :D Ked som si nechaval pocas behu programu vypisovat hodnoty poli a premennych, tak boli spravne, vsetko, len ten cyklus sa nezastavil, nech som vymyslal akokolvek.

Takze takto to nakoniec vyzera:

Kód: Vybrať všetko

from time import localtime, strftime
from string import split
konto=500
subor=file('Historia.txt','r')
historia=subor.read()
subor.close()
historia2=historia.splitlines()
for riadok in historia2:
	hodnota=riadok.split()
	print hodnota
	if konto > (int(hodnota[0])):
		indexR=historia2.index(riadok)
		print indexR
		subor=file('Historia.txt','w')
		meno=raw_input('Zadajte svoje meno: ')
		zapis=(str(konto))+(' : ')+(meno[0:10])+(strftime("    %H:%M:%S  %d-%m-%Y",localtime()))
		historia2.insert(indexR,zapis)
		for n in historia2[0:10]:
			subor.write((n)+('\n'))
		subor.close()
		break
else:
	print ">>>>> Lutujem, ale minimalne 10 hracov dosiahlo lepsi vysledok. Skus opat! <<<<<"    
print "Dovidenia"
Takze obrovska vdaka audiotrack. :smt003
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

audiotrack napísal:..niektoré jazyky takýto postup nepodporujú, lebo sa na začiatku pozrú koľkokrát opakovať, a nie pri skončení každého kroku cyklu...
pato83 napísal:...ale nasledne hodi error, lebo chce citat z pola historia2, ktore uz neexistuje. ...
ok, tak aj python je z tej skupiny kde to nejde, dobre vedieť :) ale tuším že v pascale ak mám cyklus for i:=1 to 10 do .. môžem i prepísať na 10 aby som ukončil cyklus. Nie som si úplne istý, ale tuším to bol pascal kde som to skúšal a šlo to.
zaggi
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 314
Registrovaný: 04 feb 2007, 19:32

Príspevok od používateľa zaggi »

audiotrack napísal:ok, tak aj python je z tej skupiny kde to nejde, dobre vedieť :) ale tuším že v pascale ak mám cyklus for i:=1 to 10 do .. môžem i prepísať na 10 aby som ukončil cyklus. Nie som si úplne istý, ale tuším to bol pascal kde som to skúšal a šlo to.
mozno zalezi od kompilatora, ale ja si zase pamatam ze na strednej som mal program kompilovany v starom turbo pascale s pouzitim for N:=1 to 10, v cykle som N menil jak sa mi chcelo aj tak to zbehlo 10 krat ako keby som menil uplne inu premennu ... pamatam si to preto lebo som to napisal na papier tak na pisomke, ucitelka mi to neuznala a musel som jej to ukazovat na pocitaci ze to naozaj zbehne :)
pato83
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3916
Registrovaný: 21 nov 2005, 22:12

Príspevok od používateľa pato83 »

audiotrack napísal:ok, tak aj python je z tej skupiny kde to nejde, dobre vedieť :) ale tuším že v pascale ak mám cyklus for i:=1 to 10 do .. môžem i prepísať na 10 aby som ukončil cyklus. Nie som si úplne istý, ale tuším to bol pascal kde som to skúšal a šlo to.
Zial, uz to tak vyzera :) Tu som prichystal taky maly dokaz, snad si to takto myslel:

Kód: Vybrať všetko

from random import random, sample
pole=sample(xrange(0,100), 20)
cislo=input('Zadaj cislo ')
for i in xrange(0,(len(pole))):
    if cislo > pole[i]:
        print 'OK'
        i=len(pole)
    else:
        print 'zle'
Vygeneruje sa nahodne pole, potom si vypyta cislo na vstupe a porovna s kazdym prvkom v poli. Ak je vacsie, vypise OK, ak je mensie ZLE. Ak je cislo vacsie, tak sa premennej i priradi hodnota reprezentujuca pocet clenov, co je zaroven aj najvyssia hodnota, aku moze i dosiahnut a program by sa mal teda ukoncit s vypisom OK, ak sa cislo bude vacsie ako dany prvok v poli. Ale, nestane sa tak. Pridavam aj screenshoty z debuggeru. Pred.png ukazuje hodnotu i pred vykonanim prikazu i=len(pole) a po.png ukazuje hodnotu i po vykonani prikazu i=len(pole). Ci tam ten prikaz je alebo nie, nema vplyv na chod programu.

Edit: Chybicka se vloudila aj do tychto par riadkov. Opravene.
Prílohy
po.png
pred.png
piton
King
King
Používateľov profilový obrázok
Príspevky: 1902
Registrovaný: 02 aug 2005, 0:31
Bydlisko: Hnojisko

Príspevok od používateľa piton »

audiotrack napísal:ok, tak aj python je z tej skupiny kde to nejde, dobre vedieť :) ale tuším že v pascale ak mám cyklus for i:=1 to 10 do .. môžem i prepísať na 10 aby som ukončil cyklus. Nie som si úplne istý, ale tuším to bol pascal kde som to skúšal a šlo to.
V pascale to myslim nejde, ale napr. v C v pohode...
Napísať odpoveď