From eb93adb4a8b71ddf2272c6c13f645784497add9f Mon Sep 17 00:00:00 2001
From: Martin
Date: Mon, 21 Sep 2015 15:54:27 +0200
Subject: Added problem "Competition" Revised problem "Buy five"
---
python/problems/while_and_if/buy_five/common.py | 44 +++++++++------
python/problems/while_and_if/buy_five/sl.py | 72 +++++++++++++------------
2 files changed, 66 insertions(+), 50 deletions(-)
(limited to 'python/problems/while_and_if/buy_five')
diff --git a/python/problems/while_and_if/buy_five/common.py b/python/problems/while_and_if/buy_five/common.py
index 586e50a..c7081c2 100644
--- a/python/problems/while_and_if/buy_five/common.py
+++ b/python/problems/while_and_if/buy_five/common.py
@@ -1,7 +1,7 @@
# coding=utf-8
from python.util import has_token_sequence, string_almost_equal, \
- string_contains_number, get_tokens
+ string_contains_number, get_tokens, get_numbers, get_exception_desc
from server.hints import Hint, HintSequence
id = 185
@@ -20,10 +20,11 @@ print('Vsota:', vsota)
hint_type = {
'plan': HintSequence('plan', 5),
- 'name_error': Hint('name_error'),
- 'type_error': Hint('name'),
- 'error': Hint('error'),
'printing': Hint('printing'),
+ 'while_clause': Hint('while_clause'),
+ 'reading_while': Hint('reading_while'),
+ 'summation': Hint('summation'),
+ 'nonumber': Hint('nonumber'),
}
def test(python, code):
@@ -50,7 +51,7 @@ def test(python, code):
n_correct = 0
for output, correct in zip(outputs, test_out):
- if string_contains_number(output, correct):
+ if string_almost_equal(output, correct):
n_correct += 1
return n_correct, len(test_in)
@@ -58,18 +59,31 @@ def hint(python, code):
# run one test first to see if there are any exceptions
test_in = [(None, '1\n1\n1\n1\n1\n')]
answer = python(code=code, inputs=test_in, timeout=1.0)
- exc = answer[0][3]
- # if have an exception!
- if exc:
- if 'NameError' in exc:
- return [{'id':'name_error', 'args': {'message': exc}}]
- elif 'TypeError' in exc:
- return [{'id':'type_error', 'args': {'message': exc}}]
- else:
- return [{'id':'error', 'args': {'message': exc}}]
+ exc = get_exception_desc(answer)
+ if exc: return exc
+
+ tokens = get_tokens(code)
+
+ # student does not have while or for: instruct him on loops
+ if not has_token_sequence(tokens, ['while']) and \
+ not has_token_sequence(tokens, ['for']):
+ return [{'id' : 'while_clause'}]
+
+ # student does not know how to read several values in while
+ if not has_token_sequence(tokens, ['input']):
+ return [{'id' : 'reading_while'}]
# student is not using print function
- if not has_token_sequence(code, ['print']):
+ if not has_token_sequence(tokens, ['print']):
return [{'id' : 'printing'}]
+ # student does not know how to accumulate values (print contains 0 or 1)
+ if string_contains_number(answer[0][1], 0) or \
+ string_contains_number(answer[0][1], 1):
+ return [{'id' : 'summation'}]
+
+ # student does not print any values
+ if not get_numbers(answer[0][1]):
+ return [{'id' : 'nonumber'}]
+
return None
diff --git a/python/problems/while_and_if/buy_five/sl.py b/python/problems/while_and_if/buy_five/sl.py
index 88d00b7..ac90f74 100644
--- a/python/problems/while_and_if/buy_five/sl.py
+++ b/python/problems/while_and_if/buy_five/sl.py
@@ -1,11 +1,13 @@
# coding=utf-8
import server
-server.problems.load_language('python', 'sl')
+mod = server.problems.load_language('python', 'sl')
+
id = 185
name = 'Blagajna "vse po pet"'
slug = 'Blagajna "vse po pet"'
+
description = '''\
V trgovini "vse po pet" morajo stranke vedno kupiti natanko pet artiklov. Za blagajne zato potrebujejo
programsko opremo, ki uporabnika (blagajnika) vpraša po petih cenah; ko jih le-ta vnese, program
@@ -21,7 +23,7 @@ Vsota: 16
'''
bad_solution = ['''\
-
Slaba rešitev:
+Primer, kako NE reševati
cena1 = float(input('Cena artikla: '))
cena2 = float(input('Cena artikla: '))
@@ -33,19 +35,18 @@ print ("Vsota: " + vsota)
''',
'''\
Rešitev je slaba, saj imamo pet enakih vrstic! Ponavljanje programske kode
-pa velja za slabo prakso. Bolje bo, če uporabimo zanke.
''']
+pa velja za slabo prakso. Uporabite zanko!
''']
-plan = ['''\
-Plan
-Ponavljaj 5x:
-
-- Preberi ceno
-- Prištej vstoti
-
-Izpiši vsoto
''']
+main_plan = ['''\
+Plan:
+
+1. Ponavljaj 5x:
+ 2. Preberi ceno.
+ 3. Prištej vsoti.
+4. Izpiši vsoto.''']
while_clause = ['''\
-Kako bi prebrali 5 cen z uporabo zanke while?
''',
+Kako bi prebral 5 cen z uporabo zanke while?
''',
'''\
Zanka while ima naslednjo sintakso:
@@ -56,18 +57,18 @@ while Pogoj:
stavek n # stavek izven while.
''',
'''\
-Stavki znotraj while (ki so zamaknjeni) se izvajajo toliko časa, dokler velja Pogoj v glavi stavka while.
+
Stavki znotraj while (ki so zamaknjeni) se izvajajo toliko časa, dokler velja Pogoj
v glavi stavka while.
Ko pogoj ne velja več, Python preskoči vrstice, ki so del while-a in nadaljuje s stavki, ki sledijo – v
našem primeru s stavkom n.
'''
]
reading_while = ['''\
-Za večkratno branje želimo uporabiti zanko:
''',
+Za večkratno branje želimo uporabiti zanko
''',
'''\
while ____:
-cena = float(input('Cena artikla: '))
+ cena = float(input('Cena artikla: '))
Kakšen je pogoj?
''',
@@ -84,7 +85,7 @@ stevec = 0
while _________:
cena = float(input('Cena artikla: '))
stevec += 1
-
+
Imaš zdaj morda idejo, kakšen naj bo pogoj?
''',
'''\
@@ -94,7 +95,7 @@ while stevec < 5:
''']
summation = ['''\
-Računanje vsote bo najlažje sproti v zanki.
''',
+
Računanje vsote bo najlažje sproti v zanki.
''',
'''\
Izmisli si spremenljivko, ki bo predstavljala vsoto, jo na
@@ -102,30 +103,31 @@ začetku (pred zanko) nastavi na 0 in ji v vsakem koraku prištej trenutno ceno.
Podobno kot števec.
'''
]
-
-hint = {
- 'plan':[bad_solution,
- plan,
+plan = [bad_solution,
+ main_plan,
while_clause,
reading_while,
- summation],
+ summation]
- 'printing': ['''
+hint = {
+ 'while_clause': while_clause,
+
+ 'reading_while': reading_while,
+
+ 'summation': summation,
+
+ 'printing': ['''\
+Izpiši vsoto
''',
+ '''\
V Pythonu izpisujemo s funkcijo print
.''',
'''
Pazi, da stavek s print
ne bo zamaknjen, saj bo v takem
primeru del while-a in se bo večkrat izpisal.
'''],
- 'name_error' : [general_msg['error_head'],
- general_msg['general'],
- general_msg['name_error'],
- '''\
-Verjetno uporabljate spremenljivko, ki nima nastavljene vrednosti.''',
- '''\
-
Morda v pogoju uporabljate spremeljivko, ki ni definirana
'''],
+ 'nonumber': ['''Izpiši vsoto
'''],
- 'type_error' : [general_exception['error_head'],
- general_exception['general'],
- general_exception['type_error']],
-
- 'error' : [general_exception['error_head'], general_exception['general'],]
+ 'name_error' : [mod.general_msg['error_head'],
+ mod.general_msg['general_exception'],
+ mod.general_msg['name_error'],
+ '''\
+
Verjetno uporabljaš spremenljivko, ki nima nastavljene vrednosti. Morda v pogoju?'''],
}
--
cgit v1.2.1