[Tutor] Fwd: Checksum program

Wayne Werner waynejwerner at gmail.com
Wed Mar 23 23:19:30 CET 2011


Forwarding on to the list, as there are many other people who can also
answer the questions.

---------- Forwarded message ----------
From: Lezlie Kline <lezlie.kline at gmail.com>
Date: Wed, Mar 23, 2011 at 9:30 AM
Subject: Re: [Tutor] Checksum program
To: Wayne Werner <waynejwerner at gmail.com>


Wayne,

Thanks!  That helped tremendously.  Here's my problem with the accumulator
understanding.  I have two examples:

This one is for an empty string:

output=""
print"Please enter 4 words, one at a time."
for i in range(4):
    word=raw_input("Enter a word: ")
    output=output+" " + word
    print "\tThe accumulator so far has: ", output
print "The words you entered are: ", output

The other one is for a non-empty string:

output="*"
word=raw_input("Enter a word: ")
for letter in word:
    output=output+letter+"*"
print"The result is: ", output

These are the two that I was going off of

I'm not really getting an understanding of how this is working.  Do you mind
explaining?  Is my ord(message[i]) correct for getting the ASCII numbers in
the string?  My thinking was that "message[i]" is the length so ord(value)
is what provides the ASCII numbers therefore if I use ord(message[i]) that
would work.  My problem was that I didn't know which of the two patterns
above to follow because I don't really understand how they work.

Any further help is truly appreciated.  As you might perceive, I'm a bit
frazzled.  Thanks so much.

Lezlie


On Wed, Mar 23, 2011 at 9:50 AM, Wayne Werner <waynejwerner at gmail.com>wrote:

> On Wed, Mar 23, 2011 at 8:09 AM, Lezlie Kline <lezlie.kline at gmail.com>wrote:
>
>> Hi,
>>
>> I'm trying to work out the bugs in a program for calculating the checksum
>> (modulo 256) of an input string.  I'm testing it with my full name and I'm a
>> beginner with Python.  Here's what I have so far.
>>
>
> Welcome to the list and to Python!
>
>
>>
>> def main():
>>     print"This program creates a checksum for a message."
>>     name=raw_input("Please enter the message to encode: ")
>>     message=name
>>     output=name
>>     for i in range(len(message)):
>>
>
> Using the range in this case is superfluous twice; Range is a function that
> returns a list - in this case a list containing 0-len(message)-1. xrange is
> the preferred function, which creates an generator instead. It uses a lot
> less memory. But in *this* case, the only thing you're using i for is to
> index a string - which is already iterable. You could say:
>
> for letter in message:
>     print "The letter is: ", letter
>
>
>>         print"The value of message[i] is ", message[i]
>>         output=output+name+ord(message[i])
>>         print"The value of the message is ", output
>>     checksum=(output)%256
>>     print"The checksum is ", checksum
>>
>> main()
>>
>> I know I'm offbase somewhere, but I'm not understanding some parts of the
>> accumulator part of the program.  I need it to work with the message[i]
>> intact.  In other words, I need the pseudo code to go something like this:
>>
>> print message
>> get input
>> find length
>> using length in range function accumulate ASCII numbers
>> calculate checksum
>> print checksum
>>
>
> Actually, you could even improve your pseudo code - rather than describing
> *what* you need to do, you've described *how* you need to do it - the how
> should always be your last step, even if you're doing it just in your head.
> So in this case, you could do something like this:
>
> get a string
> display string
> get ASCII numbers for each character in the string
> add all the ascii values together
> calculate checksum
> display checksum
>
> So let's take a look at your function to see which steps you've got, and
> where you're missing:
>
> def main():
>     print"This program creates a checksum for a message."
>     # Okay, here you're getting a string. Looks good so far
>     name=raw_input("Please enter the message to encode: ")
>     # I'm not really sure what the purpose of this reassignment is.
>     # Your pseudo code doesn't mention anything that would need these
> copies for anything
>     message=name
>     output=name
>     for i in range(len(message)):
>         print"The value of message[i] is ", message[i]
>         # What is stored in output the first loop through? How about name?
>         # If this is where you *think* you're accumulating ASCII digits,
> you're definitely not.
>          output=output+name+ord(message[i])
>         print"The value of the message is ", output
>     # This certainly does %256, but it requires a number.
>     checksum=(output)%256
>     print"The checksum is ", checksum
>
> So really you're only missing the most crucial step - totalling the ASCII
> numbers.
>
> Rather than "output", a more appropriate name might be "total", since
> that's what you're really trying to store.
>
> Good luck!
> HTH,
> Wayne
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20110323/198ffacb/attachment.html>


More information about the Tutor mailing list