Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Mutare sediu PFA

Recomandare clinica/medic pentru ...

Imbatranire prematura

"Am facut locuri de parcare&#...
 Ranjetul la oameni

recomandare AC 2 dormitoare mici

Ce femeie are si zahar si miere

Vas wc care nu inchide
 De ce este greu pentru microintre...

Intrebari despre carucior electric

Tester pH-ul apei

Achizitionarea unui subwoofer auto
 Aparat foto zoom mare

Smecheri vs populime

La multi ani @Lieutenant!

La multi ani @xmanyacs77!
 

[PY] meniu si optiune de raspuns

- - - - -
  • Please log in to reply
11 replies to this topic

#1
colombo2003

colombo2003

    Senior Member

  • Grup: Senior Members
  • Posts: 6,312
  • Înscris: 16.07.2008
Am urmatorul cod:
# MENIU
def menu():
	print "1. intro"
	print "2. cauta"
	print "3. Exit \n"
	opt = input("Optiunea Dvs: ")
	return "%d" % opt

# Optiuni
def choix(opt):
	if opt == 1:
		a = 11
		return a
		#print "vom continua"
	if opt == 2:
		a = 12
		return a
		#print "altadata"
	else:
		#opt == 3:
		a = 13
		return a
		print "bye"
	#else:
	 #   pass

# program principal
meniu = menu()
print meniu

optiune = choix(meniu)   # am incercat direct si cu choix(meniu)
print optiune

Ce doresc sa fac este un meniu, si in functie de optiunea aleasa, sa se intample ceva.

Problema mea este ca mereu intra pe ultima optiune (scrie mereu bye sau 13), desi optiunea aleasa (care printandu-o, vad ca este tinuta minte correct) este alta. Practic nu intra pe ramura corespunzatoare in functia choix.
Si nu inteleg de ce. Ce gresesc? Ce nu este bine?

Multumesc

#2
TorchMan

TorchMan

    Junior Member

  • Grup: Members
  • Posts: 226
  • Înscris: 21.10.2012
Ce face linia asta ?
return "%d" % opt


#3
bobo666

bobo666

    Active Member

  • Grup: Members
  • Posts: 1,100
  • Înscris: 05.06.2015

View Postcolombo2003, on 05 iunie 2015 - 20:05, said:

Problema mea este ca mereu intra pe ultima optiune (scrie mereu bye sau 13), desi optiunea aleasa (care printandu-o, vad ca este tinuta minte correct) este alta. Practic nu intra pe ramura corespunzatoare in functia choix.
Si nu inteleg de ce. Ce gresesc? Ce nu este bine?

Ia verifica tipul variabilei. Nu cumva compari 1 cu "1", adica int cu str? ;)

De asemenea, fara legatura cu problema curenta, in loc de
if opt == 2:
scrie
elif opt == 2:


#4
colombo2003

colombo2003

    Senior Member

  • Grup: Senior Members
  • Posts: 6,312
  • Înscris: 16.07.2008
Pai... ziceam sa imi afiseze textul "Optiunea Dvs: " (la sfarsitul meniului), si ca sa imi tina minte valoarea pe care o introduc. Pentru ca in fct de aceasta valoare (numar), sa faca ceva.

Intre timp am rezolvat (tot incercand in fel si chip). Trebuia sa pun asa:
if (opt ==' 1')

adica:
- sa pun conditia in paranteze rotunde
- sa pun numarul optiunii intre apostroafe

Si aici e aici, de ce trebuie pus '1'? Ca am crezut (si vroiam) ca valoarea optiunii este integer.
In fine, important este ca "merge"... Posted Image

LE: bobo, am postat in acelasi timp. Asta era, dar acum nu inteleg de ce (in if vrea string, cand, la verificarea cu print mi-l afiseaza ca integer si in functia meniu, e pus %d

Edited by colombo2003, 05 June 2015 - 20:48.


#5
bobo666

bobo666

    Active Member

  • Grup: Members
  • Posts: 1,100
  • Înscris: 05.06.2015
Pai functia ta menu() ce iti intoarce? Un int sau un str?

meniu = menu()
print meniu

ia pune si:

print type(meniu)

#6
TorchMan

TorchMan

    Junior Member

  • Grup: Members
  • Posts: 226
  • Înscris: 21.10.2012
Atenție când faci citirea de la tastatură. Este de preferat să folosești raw_input().

Quote

raw_input() takes exactly what the user typed and passes it back as a string. input() takes the raw_input() and performs an eval() on it as well. The main difference is that input() expects a syntactically correct python statement where raw_input() does not.
Deci
def menu():
	 print "1. intro"
	 print "2. cauta"
	 print "3. Exit \n"
	 opt = raw_input("Optiunea Dvs: ") # Ceea ce introduci de la tastatură, se salveaza sub forma unui string în variabila opt
return int(opt) #Faci apoi un cast la int și returnezi un int in loc de un string. 

Ar fi ok să faci și niște verificări înainte de return. (Dacă pun o literă, programul are comportamentul așteptat?)

Datorită faptului ca python e foarte "cool", nu trebuie sa precizezi și tipul variabilelor când le declari, ceea ce duce la ambiguități (ca și în cazul de față). De aceea folosește funcția type() împreună cu print ca să știi exact cu ce tipuri de date ai de-a face.

Succes! Posted Image

Edited by TorchMan, 05 June 2015 - 21:05.


#7
colombo2003

colombo2003

    Senior Member

  • Grup: Senior Members
  • Posts: 6,312
  • Înscris: 16.07.2008
Pus. Mda, intr-adevar intoarce str, dar aici e aici, ca nu inteleg de ce... As putea insa sa il convertesc la int (si atunci ar fi mers si if opt == 1).

Important este ca acum functioneaza. Ma concentrez mai departe la ce am de facut la  tema. Este posibil sa mai apelez la ajutorul vostru.
Multumesc SP! :)

#8
colombo2003

colombo2003

    Senior Member

  • Grup: Senior Members
  • Posts: 6,312
  • Înscris: 16.07.2008
Hmm... cu viteza melcului inainte! Posted Image

Codul acum arata asa:
# MENIU
def menu():
print "1. Introducere carte"
print "2. Cautare carte"
print "3. Iesire program\n"
opt = input("Optiunea Dvs (1/2/3): ")
return str(opt)
choix(opt) # am adaugat linia asta

# Optiuni
def choix(opt):
if (opt == '1'):
	 autor = raw_input("Autor: ")
	 anul = input("An: ")
	 editura = raw_input("Editura: ")
	 obj = Book(autor, anul, editura)
	 print obj
	 Book().cont()
elif (opt == '2'):
	 print "altadata"
elif (opt == '3'):
	 print "bye"
else:
	 print "\nOptiune invalida!!!\n"
	 menu()

# program principal
meniu = menu()

Intrebarea e de ce, in cazul in care introduc o optiune invalida, imi apare din nou meniul, dar la reintroducerea unei optiuni valide de data asta, nu mai face nimic (deci nu se mai reapeleaza choix). De ce...? Posted Image

PS. acolo apare clasa book(), caci introduc de la tastatura ceva (o carte, cu informatile: autor, an, editura) (ulterior astra vreau sa le scriu intr-un fisier... sa pot face si cautare, si stergere etc...).

Edited by colombo2003, 05 June 2015 - 21:45.


#9
TorchMan

TorchMan

    Junior Member

  • Grup: Members
  • Posts: 226
  • Înscris: 21.10.2012
Codul nu mai este identat corect.(Probabil din cauză că ai dat EDIT).
Tu unde vrei să apelezi funcția menu() ? Dacă ai la fel și în cod, tu apelezi funcția meniu() doar când te afli pe ultima ramură else; presupun că tu vrei sa faci apelul indiferent de ce valoare are opt, deci apelul trebuie să fie identat cu funcția, nu cu else-ul.

#10
colombo2003

colombo2003

    Senior Member

  • Grup: Senior Members
  • Posts: 6,312
  • Înscris: 16.07.2008
Hmmm, pentru ca tot nu-mi iesea (desi sunt convins ca se poate si asa, cu doua functii separate, care, cumva sa se apeleze una pe alta)... am schimat si am pus totul intr-o singura functie.
Acum face cum vroiam! Posted Image

PS. Am observant ca parca, la enter, nu mi se mai face identarea cum trebuie si chiar nu intelgeam de ce... Care ar putea fi cauza?
PS.2. Mergem mai departe...

LE: apelul functiei menu() (de pe ramura de else) l-am indentat cu functia, nu cu else (ceea ce e logic), dar nu stiu ce se intampla, ca tot nu functioneaza correct... :D :(

Edited by colombo2003, 05 June 2015 - 22:33.


#11
bobo666

bobo666

    Active Member

  • Grup: Members
  • Posts: 1,100
  • Înscris: 05.06.2015
Pai gandeste-te oleaca cum functioneaza ce-ai facut tu acolo.

Intai intri in menu() [1], apoi choix() [1], apoi alt menu() [2], apoi alt choix() [2].... si tot asa. Tot adaugi, recursiv, la stiva. Daca utilizatorul ar avea ambitie sa foloseasca acel meniu pentru mult timp, cred ca ar reusi sa consumi tot RAM-ul calculatorului Posted Image


Scoate acel apel la "menu()" din "choix".

Edit: De asemenea, ia verifica ce faci tu aici:
return str(opt)
choix(opt) # am adaugat linia asta


Edited by bobo666, 06 June 2015 - 10:09.


#12
colombo2003

colombo2003

    Senior Member

  • Grup: Senior Members
  • Posts: 6,312
  • Înscris: 16.07.2008
1) Am gandit asa: prima oara intri in meniul principal si alegi o optiune. Si face ce faci acolo in aceas optiune (sa zicem ca ai introdus 10 carti) si vrei sa revii la meniul principal sa faci altceva. Si apoi alegi alta optiune (de exemplu cauti o carte, sau vrei sa modifici o carte etc).
Si tot asa, pana cand se alege optiunea de iesire din meniul principal.

De ce s-ar ocupa ram-ul? Cum s-ar face atunci chestia de mai sus?


2) Acel return l-am scos (il pusesem ca sa convertesc optiunea din integer (nr optiunii) in string. M-am gandit ca poate utilizatorul in loc sa introduca doar cifre (chiar daca nu corespund vreo unei optiuni), introduce si litere... (si atunci imi dadea eroare).

Intre timp am mai avansat nitel, dar m-am impotmolit in altele (la functia de cautare dupa o carte in fisierul book.txt)

Anunturi

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate