Rozšíření programu s násobilkou – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Rozšíření programu s násobilkou – Python – Fórum – Programujte.comRozšíření programu s násobilkou – Python – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Ahoj30
Návštěvník
24. 5. 2010   #1
-
0
-

Vrátil jsem se ke svému programu s násobilkou a snažil se ho trochu rozšířit.
Chtěl jsem aby program při špatné odpovědi trochu zmírnil a při dobré zase přidal.
Dal jsem tam zatím 2 obtížnosti když zvolíte střední měl by program při té špatné odpovědi zmírnit.
Problém je v tom že když špatně odpovíte program ještě napíše lehčí příklad,
ale když poté odpovíte správně program vyhodí chybu.
Tady je ten program:
import random
obtiznost=raw_input('Zvol obtiznost:lehka, stredni, tezka ')
if obtiznost == 'lehka':
pocet = input('Pocet prikladu: ')
dobre = 0
spatne = 0
for x in range(pocet):
x = random.randint(2,10)
y = random.randint(2,10)
print x,' x ',y,
odpoved1 = input('= ')
if odpoved1 == x * y:
print 'DOBRE :)'
dobre = dobre + 1
else:
spatne = spatne + 1
print 'SPATNE :(',
print 'protoze', x, 'x', y,'=',x*y
print 'Pocet spravnych odpovedi:',dobre
print 'Pocet spatnych odpovedi:',spatne

if obtiznost == 'stredni':
pocet1 = input('Pocet prikladu: ')
dobre1 = 0
spatne1 = 0
for x in range (pocet1):
x = random.randint(2,10)
y = random.randint(2,10)
c = random.randint(11,50)
print x, 'x', c,
odpoved2 = input('= ')
if odpoved2 == x * c:
print 'DOBRE :)'
dobre1 = dobre1 + 1
else:
print 'SPATNE :(',
print 'protoze', x, 'x', c,'=', x*c
spatne1 = spatne1 + 1
if odpoved2 != x*c:
print x, 'x', y,
odpoved3 = input ('= ')
if odpoved3 == x * y:
print 'DOBRE :)'
dobre1 = dobre + 1
else:
print 'SPATNE :(',
print 'protoze', x,' x', y,'=',x*y
spatne1 = spatne1 + 1
print 'Pocet spravnych odpovedi:',dobre1
print 'Pocet spatnych odpovedi:',spatne1


Nevim jak udělat aby se při špatné odpovědi program vrátil zpátky na 31. řádku (print x,' x ',c)
Nemůže mi někdo poradit?

Nahlásit jako SPAM
IP: 78.102.219.–
Reklama
Reklama
Petrroll0
Stálý člen
24. 5. 2010   #2
-
0
-

V pythonu neumím, ale co takhle hodit samotný algoritmy na vypočítání do metod, pak v případě chyby u střední zavolat tu metodu lehčí.

Nahlásit jako SPAM
IP: 92.62.224.–
Ahoj30
Návštěvník
24. 5. 2010   #3
-
0
-

Já jsem v Pythonu teprve u lekce 5 jak si udělat smajlíka :) o algoritmech nic nevim.

Nahlásit jako SPAM
IP: 78.102.219.–
Ahoj30
Návštěvník
24. 5. 2010   #4
-
0
-

A asi jsem našel tu chybu na 44. řádce (dobre1=dobre + 1) má to být dobre1= dobre1+ 1
Už program chybu nevyhodí ale pokud odpovídáte pořád špatně tak se příklady střídají lehký, těžký, lehký, těžký...............
Nevíte tedy jak to udělat aby při špatné odpovědi dával program jednoduché příklady do doby dokud zas neodpoví uživatel dobře.

Nahlásit jako SPAM
IP: 78.102.219.–
Ahoj30
Návštěvník
24. 5. 2010   #5
-
0
-

Šlo by to nějak beztoho algoritmu?

Nahlásit jako SPAM
IP: 78.102.219.–
filippop0
Návštěvník
25. 5. 2010   #6
-
0
-

Ahoj, rád bych byl v Pythonu uměl :)

Začnu od konce, tak to prosím neber jako rýpání. Asi jsi myslel bez té metody a ne algoritmu... Algoritmus tam máš. Ale anit o nemusíš dávat do objektu, aby se to dalo hodně zjednodušit. Pokaždé když se nějaký kód skoro identicky opakuje, dá se to zjednodušit. A pak... Který řádej je 44? Nechce se mi to počítat a nedal jsi to tady do tagů "kód" taže nevím, ale tuším /.-)
Pak se mi příliš nelíbí že máš loop for x a x v tom loopu deklaruješ pomocí random, možná to funguje, ale čekal bych, že to ude házet chyby.

A teď abych jen nekritizoval.. Nemám tady Python (zatím) tak jen nástřel:

Předně bych použil jen jeden loop a až podle obtížnsti bych měnil rozsah randomu.



import random
obtiznost=raw_input('Zvol obtiznost:lehka, stredni, tezka ')
if obtiznost == 'lehka':
obtiznost = 1
if obtiznost == 'stredni':
obtiznost = 2
if obtiznost == 'tezka':
obtiznost = 3

pocet = input('Pocet prikladu: ')
dobre = 0
spatne = 0
for kolo in range(pocet):
if obtiznost <= 1:
x = random.randint(2,10)
y = random.randint(2,10)
if obtiznost == 2:
x = random.randint(2,10)
y = random.randint(11,50)
if obtiznost >= 3:
x = random.randint(11,50)
y = random.randint(11,50)
print x,' x ',y,
odpoved = input('= ')
if odpoved == x * y:
print 'DOBRE :)'
dobre = dobre + 1
obtiznost = obtiznost + 1
else:
print 'SPATNE :(',
print 'protoze', x, 'x', y,'=',x*y
spatne = spatne + 1
obtiznost = obtiznost - 1
print 'Pocet spravnych odpovedi:',dobre
print 'Pocet spatnych odpovedi:',spatne


Takhle jak jsem to napsal, se mi moc nelíbí ta část, kdy obtížnost převádím na čísla - určitě by to šlo nějak zjednodušit, ale nechce semi tím teď ztrácet čas.
Tak jak jsem to napsal se při špatné/dobré odpovědi bude program chovat tak, že když odpovím dvakrát dobře, tak budu muset udělat tři chyby, aby se mi obtížnost snížila. Aby se snížila hned, muselo by to ještě být doplněno, že když je obtížnost méně jak jedna, tak ať jí přiřadí jedničku a pokud je více než tři, tak ať já přiřadí trojku. Nebo něco takového...
Taky by se tam dalo doplnit, v jaké obtížnosti byly otázky nejčastěji, procentuální úspěšnost při určité obtížnosti atd... :)
Vyzkoušej a dej vědět.

(Nakonec doufám, e to bude fungovat - jen jsem to napsal v poznámkovém bloku a nezkoušel).

Nahlásit jako SPAM
IP: 85.71.117.–
filippop0
Návštěvník
25. 5. 2010   #7
-
0
-

Ahoj, rád bych v Pythonu uměl :)

Začnu od konce, tak to prosím neber jako rýpání. Asi jsi myslel bez té metody a ne algoritmu... Algoritmus tam máš. Ale ani to nemusíš dávat do objektu, aby se to dalo hodně zjednodušit. Pokaždé když se nějaký kód skoro identicky opakuje, dá se to zjednodušit. A pak... Který řádek je 44? Nechce se mi to počítat a nedal jsi to do tagů "kód" taže nevím, ale tuším /.-)
Pak se mi příliš nelíbí že máš loop "for x" a x v tom loopu deklaruješ pomocí random, možná to funguje, ale čekal bych, že to bude házet chyby.

A teď abych jen nekritizoval.. Nemám tady Python (zatím) tak jen nástřel:

Předně bych použil jen jeden loop a až podle obtížnsti bych měnil rozsah randomu.



import random
obtiznost=raw_input('Zvol obtiznost:lehka, stredni, tezka ')
if obtiznost == 'lehka':
obtiznost = 1
if obtiznost == 'stredni':
obtiznost = 2
if obtiznost == 'tezka':
obtiznost = 3

pocet = input('Pocet prikladu: ')
dobre = 0
spatne = 0
for kolo in range(pocet):
if obtiznost <= 1:
x = random.randint(2,10)
y = random.randint(2,10)
if obtiznost == 2:
x = random.randint(2,10)
y = random.randint(11,50)
if obtiznost >= 3:
x = random.randint(11,50)
y = random.randint(11,50)
print x,' x ',y,
odpoved = input('= ')
if odpoved == x * y:
print 'DOBRE :)'
dobre = dobre + 1
obtiznost = obtiznost + 1
else:
print 'SPATNE :(',
print 'protoze', x, 'x', y,'=',x*y
spatne = spatne + 1
obtiznost = obtiznost - 1
print 'Pocet spravnych odpovedi:',dobre
print 'Pocet spatnych odpovedi:',spatne


Takhle jak jsem to napsal, se mi moc nelíbí ta část, kdy obtížnost převádím na čísla - určitě by to šlo nějak zjednodušit, ale nechce semi tím teď ztrácet čas.
Tak jak jsem to napsal se při špatné/dobré odpovědi bude program chovat tak, že když odpovím dvakrát dobře, tak budu muset udělat tři chyby, aby se mi obtížnost snížila. Aby se snížila hned, muselo by to ještě být doplněno, že když je obtížnost méně jak jedna, tak ať jí přiřadí jedničku a pokud je více než tři, tak ať já přiřadí trojku. Nebo něco takového...

A taky jak je snad vidět, program bude na střední obtížnost vždy jen jako přechod mezi lehkou a těžkou obtížností - chtělo by to upravit rozsahy, ale střední bylo třeba od 5 do 10, těžké od 10 výš a lehké zase od 5 dolů.

Taky by se tam dalo doplnit, v jaké obtížnosti byly otázky nejčastěji, procentuální úspěšnost při určité obtížnosti atd... :)
Vyzkoušej a dej vědět.

(Nakonec doufám, že to bude fungovat - jen jsem to napsal v poznámkovém bloku a nezkoušel).

Nahlásit jako SPAM
IP: 85.71.117.–
filippop0
Návštěvník
25. 5. 2010   #8
-
0
-

A taky ještě bych upravil to

obtiznost=raw_input('Zvol obtiznost:lehka, stredni, tezka ')

za
obtiznost=raw_input('Zvol obtiznost:lehka, stredni, tezka ')



Když už mezery, tak všude tejně :)
Vážně byl problém v tom Tvém řádku 44? Já bych nečekal, že to bude házet chybu... Ale možné to je.
A taky jde přičítat takhle (alespoň mělo by)
spatne += 1
a dost možná i jen
spatne ++


----------------------

Dále se omlouvám za double post, ale běžný uživatel má mazání zakázáno a editace prostě nefunguje... Vždy se jen refreshne nová příspěvek, ale nikde se neprojeví.

Nahlásit jako SPAM
IP: 85.71.117.–
filippop0
Návštěvník
25. 5. 2010   #9
-
0
-

... Amozřejmě zmaěnit za

obtiznost = raw_input('Zvol obtiznost:lehka, stredni, tezka ')
:)

Nahlásit jako SPAM
IP: 85.71.117.–
Blujacker
~ Moderátor
0
Grafoman
25. 5. 2010   #10
-
0
-



import random
def nahodna_otazka(obtiznost):
obtiznost = int(obtiznost)
x = random.randint(0, 5+obtiznost)
y = random.randint(0, 5+obtiznost)
print " == Kolik je %d * %d == "%(x, y)
odpoved = input('>>> ')
if x*y == odpoved:
print u"Správně!"
return 1
print u"Špatně! Správně to je %d"%(x*y)
return 0

print 10*"=", u" Vítejte v programu Násobilka ", 10*"=", "\n\n"
print u"Vyberte obtížnost (číslo větší než nula)"
obtiznost = input()
while 1:
spravne = nahodna_otazka(obtiznost)
if spravne:
obtiznost = obtiznost + 0.5
else:
obtiznost = obtiznost + 0.5


v random.randint se k horní hranici přičítá obtížnost. Pokud uživatel odpoví dobře, tak se k obtížnosti přičte nějaké číslo (např. 0.5 nebo 0.2)
Ale pokud by uživatel odpovídal moc dlouho dobře, tak by hranice mohla být zas příliš velká a pokud by odpovídal špatně, tak by obtiznost mohla jit do zaporných čísel, takže to by se taky muselo ošetřit..

Nahlásit jako SPAM
IP: 84.42.166.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Ahoj30
Návštěvník
25. 5. 2010   #11
-
0
-

Dík za odpovědi něco z toho co jste napsali splácam. Chtěl jsem si totiž zopáknout jestli jsem něco nezapomněl, protože jsem teď dlouho neprogramoval tedy jestli se tomu mému psaní dá říkat programování :)
Už jste mi tady jednou psali ať to tady dávam to tagu, ale já to nějak nepochopil nemohl by mi to prosim ještě někdo vysvětlit?
Ať v tom mém programu nemusíte dlouho hledat např. 44. řádek :)

Nahlásit jako SPAM
IP: 78.45.113.–
filippop0
Návštěvník
25. 5. 2010   #12
-
0
-

:) Tam kde píšeš odpovědi... Tak nad tím okénkem je taková lišta. Na ní je BIU pak je tam us řetězu, obrázek, uvozovky a .... kód

Tak to tlačítko kod zmáčkni a vlož svůj kus programu mezi ty dva tagy

a

Nahlásit jako SPAM
IP: 85.71.117.–
Ahoj30
Návštěvník
26. 5. 2010   #13
-
0
-

Udělal jsem to způsobem jak tady napsal filippop. Musel jsem ho upravit no a to jsem asi neměl. Když zvolíte lehkou, těžkou obtížnost ještě to funguje správně, ale když zvolíte stredni program vám zadá jen 1 příklad bez ohledu na to kolik jste zvolili. Nějak se nemohu dopátrat chyby, tak jestli by mi to prosim někdo nezkontroloval. Chtěl bych to mít napsané tak jak mi to tady ukázal filippop. Je to sice delší ale ten program od Blujackera mi není úplně jasný.
Tady je ten program:

import random

obtiznost = raw_input('Zvol obtiznost:lehka, stredni, tezka ')
pocet = input('Pocet prikladu: ')
dobre = 0
spatne = 0
for x in range(pocet):
if obtiznost == 'lehka':
x = random.randint(1,10)
y = random.randint(1,10)
print x,' x', y,
odpoved = input('= ')
if odpoved == x * y:
print 'DOBRE :)'
dobre = dobre + 1
else:
print 'SPATNE :(',
print 'protoze:',x,' x', y,'=',x*y
spatne = spatne + 1

if obtiznost == 'stredni':
if obtiznost < 1:
obtiznost = 1
if obtiznost <= 1:
x = random.randint(1,10)
y = random.randint(1,10)
if obtiznost ==2:
x = random.randint(2,10)
y = random.randint(11,30)
if obtiznost > 3:
obtiznost = 3
if obtiznost >= 3:
x = random.randint(2,11)
y = random.randint(11,50)
print x,' x ',y,
odpoved = input('= ')
if odpoved == x * y:
print 'DOBRE :)'
dobre = dobre + 1
obtiznost = obtiznost + 1
else:
print 'SPATNE :(',
print 'protoze:',x, 'x', y,'=',x*y
spatne = spatne + 1
obtiznost = obtiznost -1

if obtiznost == 'tezka':
x = random.randint(2,11)
y = random.randint(11,100)
print x,' x', y,
odpoved = input('= ')
if odpoved == x * y:
print'DOBRE :)'
dobre = dobre + 1
else:
print 'SPATNE :(',
print 'protoze:',x,' x', y,'=',x * y
spatne = spatne + 1

print 'Mate spravne:',dobre,'prikladu'
print 'Mate spatne:',spatne,'prikladu'

Nahlásit jako SPAM
IP: 89.176.118.–
filippop0
Návštěvník
26. 5. 2010   #14
-
0
-

Ahoj Ahoj3, mě se zdá, že jsi to nějak zmastil :) A nevím proč jsi to takhle rozšířil... Když jsem na to tak koukal, tak se divím, že ti to funguje očekávatelně na jakoukoli obtížnost.
Dejme tomu, že po řádek 18 to jde, ale úplně jsi se v tom ochudil o možnost změny obtížnosti.
Ale vem si řádek 2O

if obtiznost == 'stredni':

a řádek 21
 if obtiznost < 1:

To ti prostě nemůže fungovat, protože jak může mít variable hodnotu "střední" a zároveň hodnotu 1?

Proč jsi to vlastně musel takhle seskládat dohromady?
Teď musím jít pryč, ale klidně napiš proč jsi to udělal, jak jsi udělal a nějak se s tím poperem :)

Jinak Blujackerovo řešení je hezké, využívá objektu který si na začátku nadefinoval - ten provádí zadávání otázky, její vyhodnocení a posun obtížnosti. No a pak už jen v loopu volá ten objekt s příslušným atributem obtížnosti.

Nahlásit jako SPAM
IP: 85.71.117.–
Ahoj30
Návštěvník
26. 5. 2010   #15
-
0
-

No já to potřeboval takhle zmastit :), to co jsi mi tady napsal je střední obtížnost lehká obtížnost dává
příklady x= 1 až 10
y= 1 až 10

Střední obtížnost má při špatné odpovědi zmírnit a při správné přitížit a to je to co si mi tady napsal.

no a těžká obtížnost x = 1 až 11
y = 11 až 100

Já to zkusim nějak opravit. To bych nemyslel že program s násobilkou bude tak těžký.
Jsem zvědav jak pro mě bude těžký naprogramování hada.

Nahlásit jako SPAM
IP: 89.176.118.–
Ahoj30
Návštěvník
26. 5. 2010   #16
-
0
-

Jest-li se vůbec k pygame dostanu :). Zatim to vypadá že zůstanu v lekci 2.

Nahlásit jako SPAM
IP: 89.176.118.–
Ahoj30
Návštěvník
27. 5. 2010   #17
-
0
-

Konečně je to dobře, alespoň když jsem program zkoušel.
Ale více už tady:

import random

obtiznost = raw_input('Zvol obtiznost:lehka, stredni, tezka ')
pocet = input('Pocet prikladu: ')
if obtiznost == 'stredni':
obtiznost = 2
dobre = 0
spatne = 0
for x in range(pocet):
if obtiznost == 'lehka':
x = random.randint(1,10)
y = random.randint(1,10)
print x,' x', y,
odpoved = input('= ')
if odpoved == x * y:
print 'DOBRE :)'
dobre = dobre + 1
else:
print 'SPATNE :(',
print 'protoze:',x,' x', y,'=',x*y
spatne = spatne + 1

if obtiznost < 1:
obtiznost = 1
if obtiznost <= 1:
x = random.randint(1,10)
y = random.randint(1,10)
if obtiznost ==2:
x = random.randint(2,10)
y = random.randint(11,30)
if obtiznost > 3:
obtiznost = 3
if obtiznost >= 3:
x = random.randint(2,11)
y = random.randint(11,50)
print x,' x ',y,
odpoved = input('= ')
if odpoved == x * y:
print 'DOBRE :)'
dobre = dobre + 1
obtiznost = obtiznost + 1
else:
print 'SPATNE :(',
print 'protoze:',x, 'x', y,'=',x*y
spatne = spatne + 1
obtiznost = obtiznost -1

if obtiznost == 'tezka':
x = random.randint(2,11)
y = random.randint(11,100)
print x,' x', y,
odpoved = input('= ')
if odpoved == x * y:
print'DOBRE :)'
dobre = dobre + 1
else:
print 'SPATNE :(',
print 'protoze:',x,' x', y,'=',x * y
spatne = spatne + 1

print 'Mate spravne:',dobre,'prikladu'
print 'Mate spatne:',spatne,'prikladu'




Program má tedy při střední obtížnosti po špatné odpovědi zmírnit a po správné stížit. Lehká obtížnost jsou pouze lehké příklady a těžká obtížnost je ty těžké :). Udělal jsem to tím způsobem jako má tady filippop, ale jestli by jste to tímto způsobem udělali nějak lépe nebo se vám na tom něco nelíbí tak se k té mé spatlanině vyjádřete :)

Nahlásit jako SPAM
IP: 84.42.171.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 23 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý