Update components/MathQuizApp.tsx
Browse files- components/MathQuizApp.tsx +46 -13
components/MathQuizApp.tsx
CHANGED
@@ -26,11 +26,25 @@ const generateQuestion = (difficulty) => {
|
|
26 |
break;
|
27 |
}
|
28 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
return {
|
30 |
num1,
|
31 |
num2,
|
32 |
operation,
|
33 |
-
answer:
|
34 |
};
|
35 |
};
|
36 |
|
@@ -72,7 +86,7 @@ const CalculatorComponent = ({ onClose }) => {
|
|
72 |
case '+': return firstOp + secondOp;
|
73 |
case '-': return firstOp - secondOp;
|
74 |
case '*': return firstOp * secondOp;
|
75 |
-
case '/': return firstOp / secondOp;
|
76 |
default: return secondOp;
|
77 |
}
|
78 |
};
|
@@ -80,16 +94,26 @@ const CalculatorComponent = ({ onClose }) => {
|
|
80 |
const performOperation = (nextOperator) => {
|
81 |
const inputValue = parseFloat(display);
|
82 |
|
83 |
-
if (
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
}
|
90 |
-
|
91 |
-
setWaitingForSecondOperand(true);
|
92 |
-
setOperator(nextOperator);
|
93 |
};
|
94 |
|
95 |
return (
|
@@ -141,13 +165,21 @@ const MathQuizApp = () => {
|
|
141 |
|
142 |
const handleSubmit = (e) => {
|
143 |
e.preventDefault();
|
144 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
145 |
setResult('Correct!');
|
146 |
setScore(score + 1);
|
147 |
} else {
|
148 |
setResult(`Incorrect. The correct answer is ${question.answer}.`);
|
149 |
setWrongAnswers(wrongAnswers + 1);
|
150 |
}
|
|
|
151 |
setUserAnswer('');
|
152 |
setQuestion(generateQuestion(difficulty));
|
153 |
};
|
@@ -157,6 +189,7 @@ const MathQuizApp = () => {
|
|
157 |
setQuestion(generateQuestion(e.target.value));
|
158 |
setScore(0);
|
159 |
setWrongAnswers(0);
|
|
|
160 |
};
|
161 |
|
162 |
return (
|
@@ -172,7 +205,6 @@ const MathQuizApp = () => {
|
|
172 |
{showCalculator ? 'Hide Calculator' : 'Show Calculator'}
|
173 |
</button>
|
174 |
</div>
|
175 |
-
|
176 |
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
|
177 |
<div className="space-y-6">
|
178 |
<form onSubmit={handleSubmit} className="space-y-6">
|
@@ -202,6 +234,7 @@ const MathQuizApp = () => {
|
|
202 |
value={userAnswer}
|
203 |
onChange={(e) => setUserAnswer(e.target.value)}
|
204 |
className="bg-gray-50 border border-gray-300 text-gray-900 text-xl rounded-lg focus:ring-blue-500 focus:border-blue-500 p-4 w-full text-center"
|
|
|
205 |
/>
|
206 |
</div>
|
207 |
<div className="text-center">
|
|
|
26 |
break;
|
27 |
}
|
28 |
|
29 |
+
// For division, ensure it results in a whole number or simpler decimal
|
30 |
+
if (operation === '/') {
|
31 |
+
// Make sure num2 is not zero to avoid division by zero
|
32 |
+
num2 = num2 === 0 ? 1 : num2;
|
33 |
+
// For easier difficulty levels, try to make divisions that result in whole numbers
|
34 |
+
if (difficulty === 'easy' || difficulty === 'medium') {
|
35 |
+
num1 = num2 * Math.floor(Math.random() * 10) + 1;
|
36 |
+
}
|
37 |
+
}
|
38 |
+
|
39 |
+
const answer = eval(`${num1} ${operation} ${num2}`);
|
40 |
+
// Round the answer to 2 decimal places if it's a float
|
41 |
+
const roundedAnswer = Number.isInteger(answer) ? answer : parseFloat(answer.toFixed(2));
|
42 |
+
|
43 |
return {
|
44 |
num1,
|
45 |
num2,
|
46 |
operation,
|
47 |
+
answer: roundedAnswer,
|
48 |
};
|
49 |
};
|
50 |
|
|
|
86 |
case '+': return firstOp + secondOp;
|
87 |
case '-': return firstOp - secondOp;
|
88 |
case '*': return firstOp * secondOp;
|
89 |
+
case '/': return secondOp === 0 ? 'Error' : firstOp / secondOp;
|
90 |
default: return secondOp;
|
91 |
}
|
92 |
};
|
|
|
94 |
const performOperation = (nextOperator) => {
|
95 |
const inputValue = parseFloat(display);
|
96 |
|
97 |
+
if (nextOperator === '=') {
|
98 |
+
if (operator && firstOperand !== null) {
|
99 |
+
const result = calculate(firstOperand, inputValue, operator);
|
100 |
+
setDisplay(String(result));
|
101 |
+
setFirstOperand(null);
|
102 |
+
setOperator(null);
|
103 |
+
setWaitingForSecondOperand(false);
|
104 |
+
}
|
105 |
+
} else {
|
106 |
+
if (firstOperand === null) {
|
107 |
+
setFirstOperand(inputValue);
|
108 |
+
} else if (operator) {
|
109 |
+
const result = calculate(firstOperand, inputValue, operator);
|
110 |
+
setDisplay(String(result));
|
111 |
+
setFirstOperand(result);
|
112 |
+
}
|
113 |
+
|
114 |
+
setWaitingForSecondOperand(true);
|
115 |
+
setOperator(nextOperator);
|
116 |
}
|
|
|
|
|
|
|
117 |
};
|
118 |
|
119 |
return (
|
|
|
165 |
|
166 |
const handleSubmit = (e) => {
|
167 |
e.preventDefault();
|
168 |
+
|
169 |
+
// Parse the user answer as a float and check against the question answer
|
170 |
+
const parsedAnswer = parseFloat(userAnswer);
|
171 |
+
|
172 |
+
// Check if the answer matches (with some tolerance for floating point)
|
173 |
+
const isCorrect = Math.abs(parsedAnswer - question.answer) < 0.001;
|
174 |
+
|
175 |
+
if (isCorrect) {
|
176 |
setResult('Correct!');
|
177 |
setScore(score + 1);
|
178 |
} else {
|
179 |
setResult(`Incorrect. The correct answer is ${question.answer}.`);
|
180 |
setWrongAnswers(wrongAnswers + 1);
|
181 |
}
|
182 |
+
|
183 |
setUserAnswer('');
|
184 |
setQuestion(generateQuestion(difficulty));
|
185 |
};
|
|
|
189 |
setQuestion(generateQuestion(e.target.value));
|
190 |
setScore(0);
|
191 |
setWrongAnswers(0);
|
192 |
+
setResult('');
|
193 |
};
|
194 |
|
195 |
return (
|
|
|
205 |
{showCalculator ? 'Hide Calculator' : 'Show Calculator'}
|
206 |
</button>
|
207 |
</div>
|
|
|
208 |
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
|
209 |
<div className="space-y-6">
|
210 |
<form onSubmit={handleSubmit} className="space-y-6">
|
|
|
234 |
value={userAnswer}
|
235 |
onChange={(e) => setUserAnswer(e.target.value)}
|
236 |
className="bg-gray-50 border border-gray-300 text-gray-900 text-xl rounded-lg focus:ring-blue-500 focus:border-blue-500 p-4 w-full text-center"
|
237 |
+
step="any"
|
238 |
/>
|
239 |
</div>
|
240 |
<div className="text-center">
|