Do-while loop and returning different results if string or integer?

• 04-01-2014, 12:22 PM
mrjane
Do-while loop and returning different results if string or integer?
I'm learning about do-while statements in my javascript class right now. I have this jumbled mess at the moment:

PHP Code:

``` //declare and initialize the finalTotal variable and input tally var finalTotal = 0; var inputTotal = 0; do { //take input from the user (will happen at least once) var input = parseInt(prompt("Let's add numbers! Enter a Number to Add. When you're done, type 'quit'.", "Enter A Number")); if (isNaN(input)) { //give a message to user if input is invalid document.writeln("<p>Try again! We are looking for numbers to add. Type 'quit' if you're finished.</p>"); } else {     var finalTotal = (input + finalTotal);     inputTotal++;     } } while (input != "quit"); document.writeln("<p>You've finished! You're final tally is: " + finalTotal + ". You inputed " + inputTotal + " numbers. You can do more than that, can't you?</p>");  ```
Now, I know I have a couple problems here. One, I have the parseInt on the prompt, so they can't enter anything but a number. But, I need them to be able to type "quit" and have the sequence end. So, somehow I need to be able to have them put in numbers and the "do" cycle keeps going, but if they type any word except quit, it returns as NaN and goes back to the start. Then, once they type "quit", the sequence ends and prints the results.

I'd appreciate any help on this. Thanks!
• 04-01-2014, 01:01 PM
Sup3rkirby
That sure is a nasty little loop. It seems like simply moving your parseInt() down to the line where you make your addition calculation is the easiest solution.
Code:

```//declare and initialize the finalTotal variable and input tally var finalTotal = 0; var inputTotal = 0; do { //take input from the user (will happen at least once) var input = prompt("Let's add numbers! Enter a Number to Add. When you're done, type 'quit'.", "Enter A Number");         if(isNaN(input)) {                 //give a message to user if input is invalid                 document.writeln("<p>Try again! We are looking for numbers to add. Type 'quit' if you're finished.</p>");         } else {                         var finalTotal = (parseInt(input) + finalTotal);                         inputTotal++;         } } while (input.toLowerCase() != "quit"); document.writeln("<p>You've finished! You're final tally is: " + finalTotal + ". You input " + inputTotal + " numbers. You can do more than that, can't you?</p>");```
I also added a toLowerCase() on the check for 'quit' as a precaution. In all reality though you'd probably want to use something else like
while(input.toLowerCase().indexOf("quit") >= 0);
as this would catch any weird variations or statements with the word 'quit' in them.
• 04-01-2014, 01:30 PM
mrjane
That works wonders for making sure the calculation works! However, I'm actually running into a totally different problem now. I run the page, input a couple of numbers, and then type quit. The bottom equation works well, but no matter what I do, it prints the "Try Again! We are looking..." portion. Even if I just put in "1" and "2" and then type "quit", it always writes the error message (for NaN(input)) on the final page.

Anyone know why that is?
• 04-01-2014, 01:41 PM
Sup3rkirby
My guess is the do() part of the loop runs one full time with each new input, and is only evaluated at the very end when deciding if the loop should continue. Thus typing 'quit' still runs through the loop, prints the message and finally gets evaluated by while() (which tells it to exit).

So the solution would be to add a check to see if it matches the exit criteria and then force a break. Something like:
Code:

```//declare and initialize the finalTotal variable and input tally var finalTotal = 0; var inputTotal = 0; do {         //take input from the user (will happen at least once)         var input = prompt("Let's add numbers! Enter a Number to Add. When you're done, type 'quit'.", "Enter A Number");         if(input.toLowerCase().indexOf("quit") >= 0) break;                 if(isNaN(input)) {                 //give a message to user if input is invalid                 document.writeln("<p>Try again! We are looking for numbers to add. Type 'quit' if you're finished.</p>");         } else {                         var finalTotal = (parseInt(input) + finalTotal);                         inputTotal++;         } } while(input.toLowerCase().indexOf("quit") >= 0); document.writeln("<p>You've finished! You're final tally is: " + finalTotal + ". You input " + inputTotal + " numbers. You can do more than that, can't you?</p>");```
This should prevent it from displaying the message as the loop will exit the current instance right after the value is input.
• 04-01-2014, 01:52 PM
mrjane
That worked famously! Thank you so much!
• 04-01-2014, 02:10 PM
daam
Looks like tis sorted. Well done :-)

X vBulletin 4.2.2 Debug Information

• Page Generation 0.14157 seconds
• Memory Usage 2,372KB
• Queries Executed 11 (?)
Template Usage (21):
• (2)bbcode_code_printable
• (1)bbcode_php_printable
• (1)footer
• (1)gobutton
• (1)navbar_moderation
• (1)navbar_noticebit
• (2)option
• (1)spacer_close
• (1)spacer_open

Phrase Groups Available (3):
• global
• postbit
Included Files (19):
• ./global.php
• ./includes/class_bootstrap.php
• ./includes/init.php
• ./includes/class_core.php
• ./includes/config.php
• ./includes/functions.php
• ./includes/class_friendly_url.php
• ./includes/class_hook.php
• ./includes/class_bootstrap_framework.php
• ./vb/vb.php
• ./vb/phrase.php
• ./includes/functions_calendar.php
• ./includes/class_bbcode_alt.php
• ./includes/class_bbcode.php
• ./includes/functions_bigthree.php
• ./includes/functions_notice.php

Hooks Called (41):
• init_startup
• init_startup_session_setup_start
• database_pre_fetch_array
• database_post_fetch_array
• init_startup_session_setup_complete
• global_bootstrap_init_start
• global_bootstrap_init_complete
• cache_permissions
• fetch_foruminfo
• global_state_check
• global_bootstrap_complete
• global_start
• style_fetch
• global_setup_complete
• bbcode_fetch_tags
• bbcode_create
• bbcode_parse_start
• cache_templates
• cache_templates_process
• template_register_var
• template_render_output
• fetch_template_start
• fetch_template_complete
• parse_templates