Error with output from a variable....

P

Peter Jensen

Hi all.

I been playing around with this program, that lets you enter a student name,
his studentcard numner and his address. You can then change the data, save
it as a file, and load it again. All works except one tiny thing.

The error is in the: def udskriv_stud(studs):

def udskriv_stud(studs):
print "De studerende i gruppen er:"
for x in studs.keys():
print "Navn: ",x," \tAarskortnummer: ", studs[x], "\tAdresse:"
,adresse, #<--- Here is the error
print ""
print

When I enter more than one student the new address will overwrite the old
one. So that when I print all the students in the file out, they will all
have the address that I entered for the last student.

The code where I use the def udskriv_stud(studs): is

elif menu_choice == 2:
print "Indtast navn og aarskortnummer:"
navn = raw_input("Navn:")
aarskortnummer = raw_input("Aarskortnummer:")
adresse = raw_input("Adresse:")
tilfoej_stud(phone_list,navn,aarskortnummer,adresse)


I can see that the it just replaces the raw_input value from adresse over
and over again.
Do any of you have some good suggestions.

Thanks
 
P

Peter Jensen

The def i call in the last line of the code starting with elif menu_choice
==2 is:

def tilfoej_stud(navn,aarskortnummer,stud,adresse):
navn[aarskortnummer] = stud

Thanks
 
D

Dennis Lee Bieber

The def i call in the last line of the code starting with elif menu_choice
==2 is:

def tilfoej_stud(navn,aarskortnummer,stud,adresse):
navn[aarskortnummer] = stud

But where do you save the address?

I didn't include any file save/restore code here -- everything
is lost when you exit...

--------------------------------------------------------------------------
menu = """

1 = display student by number
2 = add student by number
3 = change student address by student number
4 = change student name by student number
5 = exit
"""

students = {}

def print_student(number, name, address):
print "\tStudent #:\t%s" % number
print "\t\tName:\t%s" % name
print "\t\tAddress:\t%s" % address
print ""

if __name__ == "__main__":
process = True
while process:
print menu
ans = int(raw_input("Enter choice> "))
if ans == 1:
number = raw_input("Enter student number> ")
try:
(n, a) = students[number]
print_student(number, n, a)
except:
print "There is no student with the number: %s" % number
elif ans == 2:
number = raw_input("Enter new student number>")
if students.has_key(number):
print "That student number is already in use"
else:
name = raw_input("Enter student name> ")
address = raw_input("Enter student address> ")
students[number] = (name, address)
elif ans == 3:
number = raw_input("Enter student number> ")
if students.has_key(number):
print_student(number, students[number](0),
students[number](1))
address = raw_input("Enter new address> ")
students[number] = (students[number](0), address)
else:
print "There is no student with the number: %s" % number
elif ans == 4:
number = raw_input("Enter student number> ")
if students.has_key(number):
print_student(number, students[number](0),
students[number](1))
name = raw_input("Enter new name> ")
students[number] = (name, students[number](1))
else:
print "There is no student with the number: %s" % number
elif ans == 5:
process = False
else:
print "That is not a valid choice"
 
P

Peter Jensen

Hi Dennis.

Thanks for your input, I will look at it now. I only put in a bit of my code
in the message i posted so that it didn't get to long.
The whole code is: I will try take a look at your suggestion now. Thanks for
your time :)


import string

true = 1
false = 0

def udskriv_stud(studs):
print "De studerende i gruppen er:"
for x in studs.keys():
print "Navn: ",x," \tAarskortnummer: ", studs[x], "\tAdresse:"
,adresse,
print ""
print

def tilfoej_stud(navn,aarskortnummer,stud,adresse):
navn[aarskortnummer] = stud

def find_stud(numbers,name):
if numbers.has_key(name):
return "Aarskortnummeret er: "+numbers[name]
else:
print name, "findes ikke:"

def slet_stud(numbers,name):
if numbers.has_key(name):
del numbers[name]
else:
print name," was not found"

def load_stud(students,filename):
in_file = open(filename,"r")
while true:
in_line = in_file.readline()
if in_line == "":
break
#remove newline
in_line = in_line[:-1]
student_list = string.split(in_line,",")
student_name = student_list[0]
int_grades = []
for grade in student_list[1:]:
int_grades.append(int(grade))
students[student_name] = int_grades
in_file.close()

def save_stud(numbers,filename):
out_file = open(filename,"w")
for x in numbers.keys():
out_file.write(x+","+numbers[x]+"\n")
out_file.close()


def print_menu():
print "1. Udskriv de studerende i gruppen:"
print "2. Tilfoej en studerende:"
print "3. Fjern en studerende:"
print "4. Find en studerendes aarskortnummer:"
print "5. Hent oplysninger om de studerende:"
print "6. Gem oplysninger om de studerende:"
print "7. Afslut:"
print

phone_list = {}
menu_choice = 0
print_menu()
while menu_choice != 7:
menu_choice = input("Type in a number (1-7):")
if menu_choice == 1:
udskriv_stud(phone_list)
elif menu_choice == 2:
print "Indtast navn og aarskortnummer:"
navn = raw_input("Navn:")
aarskortnummer = raw_input("aarskortnummer:")
adresse = raw_input("Adresse:")
tilfoej_stud(phone_list,navn,aarskortnummer,adresse)
elif menu_choice == 3:
print "Slet Navn og Aarskortnummer"
navn = raw_input("Navn:")
slet_stud(phone_list,navn)
elif menu_choice == 4:
print "Find en studerende"
navn = raw_input("Navn:")
print find_stud(phone_list,navn)
elif menu_choice == 5:
filename = raw_input("Hvilken fil skal loades:")
load_stud(phone_list,filename)
elif menu_choice == 6:
filename = raw_input("Under hvilket navn skal filen gemmes:")
save_stud(phone_list,filename)
elif menu_choice == 7:
pass
else:
print_menu()
print "Ha en fantastisk dag :D"
Dennis Lee Bieber said:
The def i call in the last line of the code starting with elif
menu_choice
==2 is:

def tilfoej_stud(navn,aarskortnummer,stud,adresse):
navn[aarskortnummer] = stud

But where do you save the address?

I didn't include any file save/restore code here -- everything
is lost when you exit...

--------------------------------------------------------------------------
menu = """

1 = display student by number
2 = add student by number
3 = change student address by student number
4 = change student name by student number
5 = exit
"""

students = {}

def print_student(number, name, address):
print "\tStudent #:\t%s" % number
print "\t\tName:\t%s" % name
print "\t\tAddress:\t%s" % address
print ""

if __name__ == "__main__":
process = True
while process:
print menu
ans = int(raw_input("Enter choice> "))
if ans == 1:
number = raw_input("Enter student number> ")
try:
(n, a) = students[number]
print_student(number, n, a)
except:
print "There is no student with the number: %s" % number
elif ans == 2:
number = raw_input("Enter new student number>")
if students.has_key(number):
print "That student number is already in use"
else:
name = raw_input("Enter student name> ")
address = raw_input("Enter student address> ")
students[number] = (name, address)
elif ans == 3:
number = raw_input("Enter student number> ")
if students.has_key(number):
print_student(number, students[number](0),
students[number](1))
address = raw_input("Enter new address> ")
students[number] = (students[number](0), address)
else:
print "There is no student with the number: %s" % number
elif ans == 4:
number = raw_input("Enter student number> ")
if students.has_key(number):
print_student(number, students[number](0),
students[number](1))
name = raw_input("Enter new name> ")
students[number] = (name, students[number](1))
else:
print "There is no student with the number: %s" % number
elif ans == 5:
process = False
else:
print "That is not a valid choice"
-----------------------------------------------------------------------------------


--
============================================================== <
(e-mail address removed) | Wulfraed Dennis Lee Bieber KD6MOG <
(e-mail address removed) | Bestiaria Support Staff <
============================================================== <
Home Page: <http://www.dm.net/~wulfraed/> <
Overflow Page: <http://wlfraed.home.netcom.com/> <
 
D

Dennis Lee Bieber

Thanks for your input, I will look at it now. I only put in a bit of my code
in the message i posted so that it didn't get to long.
The whole code is: I will try take a look at your suggestion now. Thanks for
your time :)
Okay... Quick look (and guessing at purpose since I don't read
the language you use)... I only handled a dictionary keyed by "number"
(which I left as a string so almost anything could be used as a key) --
it looks like you are trying to key on both name and number at different
places...

def udskriv_stud(studs):
print "De studerende i gruppen er:"
for x in studs.keys():
print "Navn: ",x," \tAarskortnummer: ", studs[x], "\tAdresse:"
,adresse,

How do you intend to print an "adresse" when you don't have on
in the function? Assuming "Navn" is "name", and the next item is the
number, "studs" is a dictionary keyed by name, containing the number.
You need to do the same with the addresses; either save a tuple of
(number, address) as the data

studs["a-name"] = (number, address)

or have a second structure holding the addresses only, keyed by either
name or number

addresses["a-name"] = adresse

def tilfoej_stud(navn,aarskortnummer,stud,adresse):
navn[aarskortnummer] = stud
Here you seem to be saving a structure keyed by number
containing names. But again, you aren't saving the "adresse" anywhere.


I'll have to look at the rest later -- need to go to work.

However, ignoring all the code for the moment, what is the data
you are working with:

number (I'm confused, is this an ID number, or a phone number?)
name
address

You have code retrieving numbers keyed by name, but you also
have a name lookup keyed by number. But no where have you created a
keyed structure for address -- is it tied to the number, or to the name?

--
 
D

Dennis Lee Bieber

Okay... Quick look (and guessing at purpose since I don't read

Maybe not quite what you want, and done in english (I couldn't
even find translations on Babelfish). A few extra functions, and never
enter a "," for the data <G> I ran out of time to implement a few other
functions, and I haven't tested out all the functions. (I'm afraid I got
a bit carried away)

I used an old style class declaration, and deprecated string
exceptions.

A short test did have the data save and load working.

-=-=-=-=-=-=-=-=-=-=-

students_by_name = {}
students_by_number = {}

class Student:
def __init__(self, Name, Number=None, Address=None):

self.name = Name
self.number = Number
self.address = Address

self.grade_list = []

if not self.name:
raise "Missing_Name"
else:
if students_by_name.has_key(self.name):
raise "Name_In_Use"
else:
students_by_name[self.name] = self

if self.number:
if students_by_number.has_key(self.number):
raise "Number_In_Use"
else:
students_by_number[self.number] = self

def display(self, grades = False):
print ""
print "Name: %s" % self.name
print "Number: %s" % self.number
print "Address: %s" % self.address
if grades:
print "Grades: ",
for grade in self.grade_list:
print grade,
print "\n"

def change_name(self, name):
if not name:
raise "Missing_Name"
else:
if students_by_name.has_key(name):
raise "Name_In_Use"
else:
del students_by_name[self.name]
self.name = name
students_by_name[self.name] = self

def change_number(self, number):
if students_by_number.has_key(number):
raise "Number_In_Use"
else:
if self.number:
del students_by_number[self.number]
self.number = number
if self.number:
students_by_number[self.number] = self

def change_address(self, address):
self.address = address

def delete(self):
print "Deleting:"
self.display()
ans = raw_input("Confirm deletion (y/N)> ")
if ans == "Y" or ans == "y":
del students_by_name[self.name]
if self.number:
del students_by_number[self.number]
del self

def List_by_Name():
print "\n***\tStudents, numbers, addresses\n"
names = students_by_name.keys()
names.sort()
for name in names:
students_by_name[name].display()

def List_by_Number():
print "\n***\tNumbers, students, addresses\n"
numbers = students_by_number.keys()
numbers.sort()
for number in numbers:
students_by_number[number].display()

def Find_by_Name(name):
try:
student_by_name[name].display()
except:
print "\n*** Name not in use: %s\n" % name

def Find_by_Number(number):
try:
student_by_number[number].display()
except:
print "\n*** Number not in use: %s\n" % number

def Delete_by_Name(name):
try:
student_by_name[name].delete()
except:
print "\n*** Name not in use: %s\n" % name

def Delete_by_Number(number):
try:
student_by_number[number].delete()
except:
print "\n*** Number not in use: %s\n" % number

def Load_Students(filename):
fin = open(filename, "r")
for ln in fin:
ln = ln[:-1]
ln_data = ln.split(",")

name = ln_data[0]

if ln_data[1] == "" or ln_data[1] == " ":
number = None
else:
number = ln_data[1]

if ln_data[2] == "" or ln_data[2] == " ":
address = None
else:
address = ln_data[2]

try:
student = Student(name, number, address)
for grade in ln_data[3:]:
student.grade_list.append(int(grade))
except "Missing_Name":
print "No name in record:"
print ln
print ""
except "Name_In_Use":
print "Duplicate name in record:"
print ln
print ""
except "Number_In_Use":
print "Duplicate number in record:"
print ln
print ""

fin.close()

def Save_Students(filename):
fout = open(filename, "w")
for student in students_by_name.values():
fout.write("%s" % student.name)

if student.number:
fout.write(",%s" % student.number)
else:
fout.write(",")

if student.address:
fout.write(",%s" % student.address)
else:
fout.write(",")

for grade in student.grade_list:
fout.write(",%s" % grade)

fout.write("\n")

fout.close()

if __name__ == "__main__":
while True:
print """
1. Display directory by name
2. Display directory by number*
3. Add a new student
4. Delete a student by name
5. Delete a student by number*
6. Find a student by name
7. Find a student by number*
8. Load student data file
9. Save student data file
10. Add grade to student by name*
11. Change student name by name*
12. Change student number by name*
13. Change student address by name*
14. Display student grades by name*
0. EXIT

"""

choice = int(raw_input("Enter a selection (1 - 14, 0)> "))

if choice == 1:
List_by_Name()

elif choice == 2:
List_by_Number()

elif choice == 3:
print "Adding a new student"
name = raw_input("Student name> ")
number = raw_input("Number> ")
address = raw_input("Address> ")

if number == "" or number == " ":
number = None

if address == "" or address == " ":
address = None

try:
student = Student(name, number, address)
except "Missing_Name":
print "No name supplied: %s" % name
print ""
except "Name_In_Use":
print "Duplicate name: %s" % name
students_by_name[name].display()
except "Number_In_Use":
print "Duplicate number: %s" % number
students_by_number[number].display()

elif choice == 4:
print "Deleting student by name"
name = raw_input("Student name> ")
try:
students_by_name[name].delete()
except:
print "No student found for %s" % name
print ""

elif choice == 5:
print "Deleting student by number"
number = raw_input("Number> ")
try:
students_by_number[number].delete()
except:
print "No student found for %s" % number
print ""

elif choice == 6:
print "Display student by name"
name = raw_input("Student name> ")
try:
students_by_name[name].display()
except:
print "No student found for %s" % name
print ""

elif choice == 7:
print "Display student by number"
number = raw_input("Number")
try:
students_by_number[number].display()
except:
print "No student found for %s" % number
print ""

elif choice == 8:
fid = raw_input("Enter the name of the student data file to
load> ")
Load_Students(fid)

elif choice == 9:
fid = raw_input("Enter the name of the student data file to
be saved> ")
Save_Students(fid)

elif choice == 10:
print "Adding a grade to student record"
name = raw_input("Student name> ")
try:
students_by_name[name].grade_list.append(
int(raw_input("Enter the grade to be added> ")))
except:
print "No student found for %s" % name
print ""

elif choice == 14:
print "Display student grades by name"
name = raw_input("Student name> ")
try:
students_by_name[name].display(True)
except:
print "No student found for %s" % name
print ""

elif choice == 0:
break

else:
print "Menu option %s has not been implemented yet"

--
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,206
Messages
2,571,069
Members
47,678
Latest member
Aniruddha Das

Latest Threads

Top