-1

thanks for taking time to read this. I have to create a program that generates 10 random maths questions based around =, - and *. I have the program working but everytime I run it after the main program it prints "none" even though that's not in my program.Any help at all would be much appreciated. Thank you.

import random 
print ("Welcome")
name=input("What's your name?")
print("Nice to meet you", name, ",you will be given 10 multiplication, addition and subtraction questions.")
Num1 = random.randint(1,12) 
Num2 = random.randint(1,12) 
sign = random.randint(1,3) 
if sign == 1: # If the random  number generated is 1
  question = Num1 + Num2 
  rightanswer1 = Num1 + Num2  
  answer1=input(print("What is", question ,"?"))
  if answer1 == rightanswer1: 
    print("Well Done!")
  if answer1 != rightanswer1: 
    print("Sorry, that's incorrect, the answer was", rightanswer1) 
if sign == 2: 
  question = Num1 - Num2 
  rightanswer2 = Num1 - Num2
  answer2=input(print("What is", Num1, "-", Num2 ,"?"))
  if answer2 == rightanswer2:
    print("Well done!")
  elif answer2 != rightanswer2:
    print("Sorry, that's incorrect, the answer was", rightanswer2)
if sign == 3:
  question = Num1 * Num2
  rightanswer3 = Num1 * Num2
  answer3=input(print("What is", Num1, "x", Num2 ,"?"))
  if answer3 == rightanswer3:
    print("Well done!")
  elif answer3 != rightanswer3:
    print("Sorry, that's incorrect, the answer was", rightanswer3)`
> Welcome
> What's your name? John
> Nice to meet you John ,you will be given 10 multiplication, addition and subtraction questions.
> What is 12 x 3 ?
> None 36
> Sorry, that's incorrect, the answer was 36
  • Can you fix the indentation in your code and verify that it is displayed how you have it written? – jedwards Mar 08 '15 at 14:00
  • I've fixed the indentation to how i imagine they have it, but they'll need to verify that. – will Mar 08 '15 at 14:03
  • try casting both answer and rightanswer to int() before comparing them – avk Mar 08 '15 at 14:05
  • The [input](https://docs.python.org/3.3/library/functions.html?highlight=input#input) functions takes a string to display as argument. What the print function does is that it prints a string or value on the standard output and returns None. Thus when you call print inside input, input receives None as the value to print. – Cilyan Mar 08 '15 at 14:05
  • BTW, your addition question isn't quite right: it prints the answer in the question itself! – PM 2Ring Mar 08 '15 at 14:15
  • If this is your GCSE exam coursework, remember that it's OK to ask specific programming questions, but not to get people to review or write your whole solution for you. – DNA Mar 08 '15 at 16:46

5 Answers5

1

I think you are using python 3. In python 3 input is like raw_input in python 2. So you get the string as input. So convert it into int

var = int(input("Enter a number: "))

So in your code make it as

print("What is", Num1, "x", Num2 ,"?")
answer3 = input()
answer3 = int(answer3) 

See this:

whats-the-difference-between-raw-input-and-input-in-python3-x

Community
  • 1
  • 1
Thiyagu
  • 17,362
  • 5
  • 42
  • 79
1

It's printing None because the print() function returns None and you're passing that value of None from print() as the prompt to your input() functions. Eg,

answer3=input(print("What is", Num1, "x", Num2 ,"?"))

So print("What is", Num1, "x", Num2 ,"?") prints its stuff, and returns None, which then gets printed as the prompt by input().

A simple way to fix this is to just move your print() function calls out of your input() functions.

Eg,

print("What is", Num1, "x", Num2 ,"?")
answer3=input()

However, there's another major problem with your program: the rightanswer variables are ints, but the inputted answers are strings. To compare them properly they need to be the same type. So you should either convert the inputted answers to int, or alternatively, convert the rightanswers to str.

PM 2Ring
  • 54,345
  • 6
  • 82
  • 182
1

There are two problems with how you use the input function:

  • You misuse the prompt argument
  • You forget to convert the result

First, have a better look at the reference of the input function

The prompt argument

input takes a string as argument that will be displayed ("prompted") to the user to indicate that the program is waiting an input. The print function also displays a string to the user, but it doesn't return anything. It does its job and that's all (and in Python a function that returns nothing, returns None). That's what input gets to display, so it displays None. You should use format instead. It will format and return the formatted string that input can display:

answer1_as_str=input("What is {} ?".format(question))))

or

answer2_as_str=input("What is {:d} - {:d} ?".format(Num1, Num2)))

The return value

input returns the user input as a string contrary to python 2 (i.e. exactly as entered). So you have to convert the input to the desired type if you need it. If you type 10 for example, the input will return "10". If you need an int, you have to convert it yourself.

answer1 = int(answer1_as_str)
Cilyan
  • 7,883
  • 1
  • 29
  • 37
1

I'm reluctant to just give you an answer that just does it for you, so instead i'll provide you with a few hints to improve things. (i.e. this isn't an answer, just too large of a comment - and more like a codereview answer)

First off, you use a structure like this:

if x == 1:
  #do something

if x == 2:
  #do something else

...

In this case, which it makes no difference, it is easier to read if you use the if syntax as intended:

if <condition>:
  #do this if the above test is true.
elif <more conditions>:
  #do this only if the first test is false and this one is true
elif <more conditions>:
  #same as above, except for the second test must be false too
else:
  #do this if all the above tests are false

So you could use this something like:

if sign == 1:
  ...
elif sign == 2:
  ...
elif sign == 3:
  ...
else:
  # something weird happened...

Which would make that section of the program easier to follow.

The same thing can be done with the if answer1 == rightanswer1: sections;

if answer1 == rightanswer1:
  #correct!
else:
  #incorrect.

That would be a clearer was to do it. You seem to have used the if...elif style in a couple of them, but not the first one.

Once you have this, it will be a little clearer.

The next way you could improve things is by removing duplicated code. You don't need separate branches for each sign, you can just roll it all into one:

number1 = randint(1,12)
number2 = randint(1,12)

op = randint(1,3)

question_string = "%d %s %d = ?" % (number1, number2, ["+", "-", "*"][op])

result = None
if op == 1:
  result = number1 + number2
elif op == 2:
  result = number1 - number2
elif op == 3:
  result = number1 * number2

This will do most of the logic for you, and generate the strings you want, without duplicating all of the other code.

Small changes like this can make things much more readable.

Community
  • 1
  • 1
will
  • 10,260
  • 6
  • 46
  • 69
0

It looks like you don't really understand how input() works. You might also want to review the different datatypes and conditional statements. Other than that, it was a very good attempt. Here's my solution:

from random import randint

print("Welcome")
name = input("What's your name?\n")
print("Nice to meet you " + name + ", you will be given 10 multiplication, addition and subtraction questions.")

for i in range(10):
    print("\nProblem " + str(i+1))

    num1 = randint(1,12)
    num2 = randint(1,12)
    sign = randint(1,3)
    if sign == 1:
        question = str(num1) + " + " + str(num2)
        answer = num1 + num2
    elif sign == 2:
        question = str(num1) + " - " + str(num2)
        answer = num1 - num2
    else:
        question = str(num1) + " x " + str(num2)
        answer = num1 * num2

    user_answer = input("What is " + question + "? ")
    if user_answer == str(answer):
        print("Well done!")
    else:
        print("Sorry, that's incorrect, the answer was", answer)
pzp
  • 6,249
  • 1
  • 26
  • 38