Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Při umocnění se proměnné obrátí

Aktivity
Avatar
MadaraCZech
Tvůrce
Avatar
MadaraCZech:28.7.2014 1:49

Ahoj,
mám tu svoji kalkulačku se schopností umocňovat zvolené číslo (a nebo b). Ovšem když zadám a, umocní se b. Když zadám b, umocní se a. Zdroják :

#Zadání čísel

a = int(input("Zadejte první číslo : ")) #První číslo
b = int(input("Zadejte druhé číslo : ")) #Druhé číslo

#Volby

print("1 - Sčítání")
print("2 - Odčítání")
print("3 - Násobení")
print("4 - Dělení")
print("5 - Umocnění") #Výpis všech voleb


#Výběr volby

volba = int(input("Volba = "))

#Výpočet

if (volba == 1):
    print("Výsledek = ", a + b)
elif (volba == 2):
    print("Výsledek = ", a - b)
elif (volba == 3):
    print("Výsledek = ", a * b)
elif (volba == 4):
    print("Výsledek = ", a / b)
elif (volba == 5):
    volbadve = input("Mám umocnit číslo a(první) nebo b(druhé) ? : ")
    if (volba == a):
            print("Výsledek = ", a * a)
    else:
            print("Výsledek = ", b * b)

#Konec
 
Odpovědět
28.7.2014 1:49
Avatar
Pavel Junek
Tvůrce
Avatar
Odpovídá na MadaraCZech
Pavel Junek:28.7.2014 8:10

Nemá tam být toto

if (volbadve == a):

?

 
Nahoru Odpovědět
28.7.2014 8:10
Avatar
hanpari
Tvůrce
Avatar
hanpari:28.7.2014 8:56

Pacvel má pravdu.

Jinak závorky v Pythonu takto nemusíš (ani bys neměl podle PEP8) používat:

Správně je to takto:

elif volba == 5:
 
Nahoru Odpovědět
28.7.2014 8:56
Avatar
MadaraCZech
Tvůrce
Avatar
MadaraCZech:29.7.2014 16:03

Ahoj,
po čase jsem narazil na další problém a to s průměrem. Přesto, že je zadaná volba, program pokračuje dál.

retezec = "Výsledek = "
#Často používaná fráze
pokracovat = True
#Počáteční hodnota

while pokracovat == True:
#Pokud je hodnota pravda, spustit kalkulačku

    pokracovat = False

    #Zadání čísel

    a = int(input("Zadejte první číslo : ")) #První číslo
    b = int(input("Zadejte druhé číslo : ")) #Druhé číslo

    #Volby

    print("1 - Sčítání")
    print("2 - Odčítání")
    print("3 - Násobení")
    print("4 - Dělení")
    print("5 - Umocnění")
    print("6 - Počítání (0-x)")
    print("7 - Výpočet průměru") #Výpis všech voleb


    #Výběr volby

    volba = int(input("Volba = "))

    #Výpočet

    if volba == 1:
        print(retezec, a + b)
    elif volba == 2:
        print(retezec, a - b)
    elif volba == 3:
        print(retezec, a * b)
    elif volba == 4:
        if b == 0:
            print("Nelze dělit nulou !") #Kontrola (dělení nulou)
        else:
            print(retezec, a / b)
    elif volba == 5:
        volbadve = input("Mám umocnit číslo a(první) nebo b(druhé) ? : ") #Výběr umocněného čísla
        if volbadve == a:
            print("Výsledek = ", a * a) #Umocnění prvního čísla
        else:
            print("Výsledek = ", b * b) #Umocnění druhého čísla
    elif volba==6:
        a = a + 1
        b = b + 1
        for cislo in range(a):
            print(cislo)
        print("")
        for cislo in range(b):
            print(cislo)
    elif volba==7:
        volbaprumer = input("Použít zadaná čísla, nebo zadat jiná ? (A/N) : ")
        if (volbaprumer == "A") or (volbaprumer == "a"):
            print(retezec, (a + b) / 2)
        if (volbaprumer == "B") or (volbaprumer == "b"):
            cisla = []
            c = 1
            while(cisla[c]-1 > 0):
                print("Zakonči zadáním nuly")
                cisla[c] = input("Zadej ", c, ". číslo : ")
                c = c + 1


    volbatri = input("Vypočítat další příklad ? (A/N) :") #Pokračovat / nepokračovat v cyklu
    if (volbatri == "A") or (volbatri == "a"):
        pokracovat = True
    else:
        pokracovat = False

#Konec základní kalkulačky
 
Nahoru Odpovědět
29.7.2014 16:03
Avatar
hanpari
Tvůrce
Avatar
Odpovídá na MadaraCZech
hanpari:29.7.2014 18:51

Projed si to s debuggerem, ať víš, co se ti v kódu děje. Když člověk netuší, oč se snažíš, je to celkem oříšek :)

Co je třeba tohle:

while(cisla[c]-1 > 0):

Mimochodem,
i když vidím, že moji poznámku o závorkách vesele ignoruješ, dám ti gratis další tip :)

if (volbaprumer == "A") or (volbaprumer == "a"):

můžeš směle nahradit:

if volbaprumer.upper() == "A":
c = c + 1

můžeš nahradit

c += 1
Editováno 29.7.2014 18:52
 
Nahoru Odpovědět
29.7.2014 18:51
Avatar
MadaraCZech
Tvůrce
Avatar
MadaraCZech:29.7.2014 19:56

Prostě mi to tu podmínku celou vynechá.

Použít zadaná čísla, nebo zadat jiná ? (A/N) : N
Vypočítat další příklad ? (A/N) : WTF ?!

Aktuální kód :

retezec = "Výsledek = "
#Často používaná fráze
pokracovat = True
#Počáteční hodnota

while pokracovat == True:
#Pokud je hodnota pravda, spustit kalkulačku

    pokracovat = False

    #Zadání čísel

    a = int(input("Zadejte první číslo : ")) #První číslo
    b = int(input("Zadejte druhé číslo : ")) #Druhé číslo

    #Volby

    print("1 - Sčítání")
    print("2 - Odčítání")
    print("3 - Násobení")
    print("4 - Dělení")
    print("5 - Umocnění")
    print("6 - Počítání (0-x)")
    print("7 - Výpočet průměru") #Výpis všech voleb


    #Výběr volby

    volba = int(input("Volba = "))

    #Výpočet

    if volba == 1:
        print(retezec, a + b)
    elif volba == 2:
        print(retezec, a - b)
    elif volba == 3:
        print(retezec, a * b)
    elif volba == 4:
        if b == 0:
            print("Nelze dělit nulou !") #Kontrola (dělení nulou)
        else:
            print(retezec, a / b)
    elif volba == 5:
        volbadve = input("Mám umocnit číslo a(první) nebo b(druhé) ? : ") #Výběr umocněného čísla
        if volbadve == a:
            print("Výsledek = ", a * a) #Umocnění prvního čísla
        else:
            print("Výsledek = ", b * b) #Umocnění druhého čísla
    elif volba==6:
        a = a + 1
        b = b + 1
        for cislo in range(a):
            print(cislo)
        print("")
        for cislo in range(b):
            print(cislo)
    elif volba==7:
        volbaprumer = input("Použít zadaná čísla, nebo zadat jiná ? (A/N) : ")
        if volbaprumer == "A" or volbaprumer == "a":
            print(retezec, (a + b) / 2)
        if volbaprumer == "B" or volbaprumer == "b":
            print("Zadávání se ukončuje nulou : ")
            pokracovat = "true"
            cisla = []
            c = 1
            nove_cislo = 0
            while pokracovat == "true":
                nove_cislo = input("Zadej číslo : ")
                if nove_cislo == 0:
                    break
                c += 1
                cisla.append(nove_cislo)
            for cislo in cisla:
                dohromady = dohromady + cisla[cislo]
            pocet = len(cisla)
            prumer = dohromady / pocet
            print(retezec + prumer)


    volbatri = input("Vypočítat další příklad ? (A/N) :") #Pokračovat / nepokračovat v cyklu
    if volbatri == "A" or volbatri == "a":
        pokracovat = True
    else:
        pokracovat = False

#Konec základní kalkulačky
 
Nahoru Odpovědět
29.7.2014 19:56
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na MadaraCZech
gcx11:29.7.2014 20:09

Vždyť tam máš B/b jako volbu...

 
Nahoru Odpovědět
29.7.2014 20:09
Avatar
MadaraCZech
Tvůrce
Avatar
Odpovídá na gcx11
MadaraCZech:29.7.2014 20:36

Ajo. Díky, příště to nebudu dělat ve tři ráno.. :D

 
Nahoru Odpovědět
29.7.2014 20:36
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na MadaraCZech
gcx11:29.7.2014 20:47

A dej si pozor na proměnnou pokračovat, máš ji tam vícekrát a zdá se, že pokaždé ovlivňuje něco jiného. Navíc ti u uživatelem zadávaného průměru nefunguje ukončení, jelikož dostaneš vstup z input() jako řetězec a ty ho porovnáváš s číslem.
Místo:
[code python]
nove_cislo = input("Zadej číslo : ")
if nove_cislo == 0:
break
[/code]
By mělo být:
[code python]
nove_cislo = int(input("Zadej číslo : "))
if nove_cislo == 0:
break
[/code]
A můžeš zkusit ošetřit zadávání čísel.

Editováno 29.7.2014 20:50
 
Nahoru Odpovědět
29.7.2014 20:47
Avatar
MadaraCZech
Tvůrce
Avatar
MadaraCZech:29.7.2014 20:49

Co zde ? Program se nemůže z cyklu dostat, i když zadám 0.

while pokracovat == "true":
                nove_cislo = input("Zadej číslo : ")
                c += 1
                cisla.append(nove_cislo)
                if nove_cislo == 0:
                    pokracovat = "false"
                    del cisla[c]

// PSÁNO PŘED PŘEČTENÍM PŘÍSPĚVKU NAHOŘE

Editováno 29.7.2014 20:50
 
Nahoru Odpovědět
29.7.2014 20:49
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na MadaraCZech
gcx11:29.7.2014 20:55

Vždyť jsem to tam psal.
Místo:

nove_cislo = input("Zadej číslo : ")
if nove_cislo == 0:
break

By mělo být:

nove_cislo = int(input("Zadej číslo : "))
if nove_cislo == 0:
break

Jelikož funkce input() ti vrací řetězec (klidně si to zkus v interaktivní konzoli), tak porovnáváš řetězec s číslem. Takže pokud zadáš nulu, tak porovnáváš, jestli "0" == 0, což samozřejmě neplatí. Proto musíš vstup přetypovat na int.

 
Nahoru Odpovědět
29.7.2014 20:55
Avatar
hanpari
Tvůrce
Avatar
Odpovídá na MadaraCZech
hanpari:29.7.2014 21:00
for cislo in cisla:
               dohromady = dohromady + cisla[cislo]
           pocet = len(cisla)
           prumer = dohromady / pocet
           print(retezec + prumer)

můžeš nahradit:

print(sum(cisla) / len(cisla))
 
Nahoru Odpovědět
29.7.2014 21:00
Avatar
MadaraCZech
Tvůrce
Avatar
Odpovídá na hanpari
MadaraCZech:29.7.2014 21:07

Díky vám za pomoc.

 
Nahoru Odpovědět
29.7.2014 21:07
Avatar
hanpari
Tvůrce
Avatar
hanpari:29.7.2014 21:08
pokracovat = "true"

nahrad:

pokracovat = True

a zaroven:

while pokracovat == "true":

nahrad:

while pokracovat:

No a nebo se na to celé vykašli a napiš:

while True:
 
Nahoru Odpovědět
29.7.2014 21:08
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na hanpari
gcx11:29.7.2014 21:08

Anebo se to nahradit od Pythonu 3.4+ tímto:

from statistics import mean
print(mean(cisla))

Ale to už je trochu pokročilejší :)

 
Nahoru Odpovědět
29.7.2014 21:08
Avatar
MadaraCZech
Tvůrce
Avatar
Odpovídá na gcx11
MadaraCZech:29.7.2014 21:09

To já zatím neumím, to se možná dozvím v tvých tutoriálech :)

 
Nahoru Odpovědět
29.7.2014 21:09
Avatar
coells
Tvůrce
Avatar
Odpovídá na MadaraCZech
coells:29.7.2014 21:16
;-)
c = [int(x) for x in iter(lambda: input('zadej cislo (enter ukonci zadavani):'), '')]
print('prumer =', sum(c)/len(c))
 
Nahoru Odpovědět
29.7.2014 21:16
Avatar
hanpari
Tvůrce
Avatar
Odpovídá na coells
hanpari:29.7.2014 22:01

Ty jsi srandista :) Vždyť ho odradíš. Ale jinak pěkné

 
Nahoru Odpovědět
29.7.2014 22:01
Avatar
MadaraCZech
Tvůrce
Avatar
MadaraCZech:30.7.2014 22:57

Tento problém mě trápí skoro u každého programu. Co dělám špatně ? Vždy píše "out of range", to vím, co znamená, prostě píšu do pozice pole, které není.

text = list(input("Zadej zprávu : "))
i = 0

for znak in text:
    text[i] = znak
    ord(znak[i])
    i += 1

print(text)
 
Nahoru Odpovědět
30.7.2014 22:57
Avatar
hanpari
Tvůrce
Avatar
Odpovídá na MadaraCZech
hanpari:31.7.2014 6:14

No problém je v tom, že je naprostá záhada, o co se pokoušíš :) Já to opravdu nevím. Možná jsi potřeboval tuto konstrukci:

for i, znak in enumerate(text):
    print(i, znak)
 
Nahoru Odpovědět
31.7.2014 6:14
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na MadaraCZech
gcx11:31.7.2014 8:17

A co má ten program dělat?

 
Nahoru Odpovědět
31.7.2014 8:17
Avatar
MadaraCZech
Tvůrce
Avatar
Odpovídá na gcx11
MadaraCZech:31.7.2014 16:29

Má to být šifrovač zpráv. Prostě převod písmen na čísla.

 
Nahoru Odpovědět
31.7.2014 16:29
Avatar
Odpovídá na MadaraCZech
Neaktivní uživatel:31.7.2014 16:50

V tom pripade :

#!/usr/bin/python3
text = list(input("Zadej zprávu : "))
for i, znak in enumerate(text):
    text[i] = str(ord(znak))

print(" ".join(text))
Nahoru Odpovědět
31.7.2014 16:50
Neaktivní uživatelský účet
Avatar
gcx11
Tvůrce
Avatar
gcx11:31.7.2014 16:56

Pak by to mělo být asi takhle:

text = input("Zadej zprávu: ")
vysledek = []

for znak in text:
    vysledek.append(ord(znak))

print(vysledek)

Můžeš se inspirovat tady:
http://www.itnetwork.cz/…ezce-zaklady

 
Nahoru Odpovědět
31.7.2014 16:56
Avatar
MadaraCZech
Tvůrce
Avatar
Odpovídá na gcx11
MadaraCZech:31.7.2014 19:34

Díky. Jak přemýšlet správně ? :D Protože někdy to prostě dopadá takhle.

 
Nahoru Odpovědět
31.7.2014 19:34
Avatar
hanpari
Tvůrce
Avatar
hanpari:31.7.2014 20:18

Tohle mne jen tak napadlo, ale to rozhodně není nic, nad čím by sis měl lámat hlavu. To je taková prasečina :) Jen pro zajímavost:

>>> text = list(input().encode())
Tohle děti doma nedělejte :)
>>> text
[84, 111, 104, 108, 101, 32, 100, 196, 155, 116, 105, 32, 100, 111, 109, 97, 32, 110, 101, 100, 196, 155, 108, 101, 106, 116, 101, 32, 58, 41]
 
Nahoru Odpovědět
31.7.2014 20:18
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 26 zpráv z 26.