Javascript Calculator double digits - javascript

I am trying to make a calculator that is simple. However I am having a problem when trying to add, subtract, multiply and divide a double digit number. So far when I plug in a 3 it lets me but if I press 3 again it will just show another 3 instead of making it 33. How do I fix my Javascript in order to be able to compute double digit numbers (or even more). so far this is what I have for this particular problem
var firstNumber;
var secondNumber;
var clear;
var operation;
function calculate() {
var answer;
if (operation == "+") {
answer = firstNumber + secondNumber;
} else if (operation == "-") {
answer = firstNumber - secondNumber;
} else if (operation == "*") {
answer = firstNumber * secondNumber;
}else if (operation == "/") {
answer = firstNumber / secondNumber;
}
firstNumber = answer;
displayAnswer(answer)
}
}
function DisplayOutput(data) {
var display = firstNumber + " " + operation + " " + secondNumber;
document.getElementById('answer').textContent = data;
}
function SaveNumber(number) {
if (firstNumber == undefined) {
firstNumber = number;
}else if (firstNumber != undefined) {
secondNumber = number;
}
DisplayOutput(number);
}
function Operation(op){
operation = op;
DisplayOutput(op);
}
function displayAnswer(answer){
document.getElementById('answer').textContent=answer;
}
function clearData(){
firstNumber = null;
secondNumber = null;
answer = 0;
DisplayOutput(answer);
}

I'll try and explain what Paul Hagerty did with his calculator on stanford's objective-c course.
Add a variable that keeps track of when the user is pressing digits.
For example...
var userIsInTheMiddleOfTyping = false;
when the user presses a digit, this var changes it's value to true, and you concatenate the new digit with the ones you already had. When the user enters a new number you check this var, if it's true then you concatenate again.
When the user presses an operand (+, -, x, etc) reset the var's value to false, so it knows the user finished entering the number and the next number he inputs is a new one.

I believe when you enter a number, you use the function SaveNumber.
First of all, you don't need the if after the else, the else already is a "if (firstNumber != undefined)".
Second, if you place the first 3, the firstNumber becomes defined, therefore you are changing the secondNumber.
What you need to do is to change to the secondNumber only when a operator is inserted.
For that, you can create an auxiliary variable.
Third, how are you adding the digits?
var isFirstNumber = true;
...
function SaveNumber(number) {
if (isFirstNumber) {
firstNumber = firstNumber*10; // This shifts the inserted digits to the left
firstNumber = firstNumber + number;
} else {
secondNumber = secondNumber*10;
secondNumber = secondNumber + number;
}
DisplayOutput(number);
}
And where you process the input, when you get an operator you should do:
isFirstNumber = false;

Related

Basic JavaScript - Fibonacci Sequence Generator Not Working

I am new to JavaScript, for some reason my Fibonacci Sequence Generator. What is a Fibonacci Sequence, easy, it is a sequence that takes the last two numbers of the sequence and adds them to create the next number. Here is an example. 0, 1, 1, 2, 3, 5, 8, 13, 21... I tried to make a loop with a while statement in which the variable that was once the first number (in this case 0), converts into a new number which is whatever that number was plus the second number (in this case 1). example: var firstNumber(which is 0) + var secondNumber(which is 1) = var firstNumber(which no equals to 1 because we added 0 + 1). If this goes on in a loop, then, in theory, it could go infinitely adding the last number and the one before it, and making that second to last number making the result of the addition. Here is my code, it is not working at all. Any help would be deeply appreciated. Hopefully, I have explained my self correctly.
var firstNumber = 0;
var secondNumber = 1;
function fibonacciGenerator(n){
while (secondNumber <= n){
firstNumber + secondNumber == firstNumber;
secondNumber + firstNumber == secondNumber;
}
}
console.log(fibonacciGenerator(50));
firstNumber + secondNumber == firstNumber; this is not the way to assign a value to a variable
and you need to add a return statement at the end of your function.
Does this help ?
var firstNumber = 0;
var secondNumber = 1;
function fibonacciGenerator(n){
while (secondNumber <= n){
firstNumber = firstNumber + secondNumber;
secondNumber = secondNumber + firstNumber;
}
return secondNumber
}
console.log(fibonacciGenerator(50));
You need to assign a third variable to store the sum of the first and second variable each iteration after that you should make your loop starts from 2, not 1 because you already assing it before the loop staring,
another thing when you assign a value from variable to another it works from right side to left side so it should be like this
firstNumber = firstNumber + secondNumber;
secondNumber = secondNumber + firstNumber;
so after editing it would be like this
function fibonacciGenerator(n) {
var a = 0,
b = 1,
c;
for (let i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return b;
}
console.log(fibonacciGenerator(9))
to read more about it check this link

JavaScript says 10 is lower then 9

I'm trying to learn JavaScript and when I started the MDN Tutorial, I tried to do the first exercise alone, which worked okay so far. But there is one really weird situation.
The Game generates a Random number from 1 - 100 and the User has 10 guesses to find out that number.
I simplified the game to 1 - 10 for this purpose.
When the random number is a 9 and i guess 10, the code says my input was too low. I don't understand why that is. In every other situation, it works exactly as expected.
For debugging reasons, the random number will be shown in the dialog after the first guess.
This is my code:
var number = 0;
var turns = 0;
var guess = 0;
var won = false;
playGame();
function playGame() {
won = false;
number = (Math.random() * 10).toFixed(0);
guess = prompt("Guess a number from 1 to 10");
turns = 0;
while(turns < 10) {
console.log(number + " " + guess);
if(guess < number) {
turns++;
guess = prompt("Number is " + number + ".\n\nYou guessed " + turns + " Times already.\n\nYour guess was to low! Guess again:");
won = false;
} else if(guess > number) {
turns++;
guess = prompt("Number is " + number + ".\n\nYou guessed " + turns + " Times already.\n\nYour guess was to high! Guess again:");
won = false;
} else if(guess === number) {
alert("You got it!");
won = true;
break;
}
}
if(confirm("Wanna play again?")){
playGame()
} else {
alert("kkbye!");
}
}
Thanks in advance. If you see something in my code you'd like to comment, I'd love to hear feedback and become better, even if it isn't directly related to this ;)
The problem is, that you are working with Strings, if you compare two strings with < it will only compare as many characters as it has to until it finds a character that is smaller (smaller being it's Integer representation) than another:
console.log("10" < "9");
Here it will only compare "1" to "9", meaning char code 49 to char code 57.
49 is less than 57, meaning the whole expression is true. You can learn more about the ASCII char codes here.
You should use Numbers instead:
console.log(Number("10") < Number("9"));
You are only dealing with Strings, since both prompt() and Number.toFixed() return Strings. If you encapsulate those in Number() calls your game works:
var number = 0;
var turns = 0;
var guess = 0;
var won = false;
playGame();
function playGame() {
won = false;
number = Number((Math.random() * 10).toFixed(0));
guess = Number(prompt("Guess a number from 1 to 10"));
turns = 0;
while(turns < 10) {
console.log(number + " " + guess);
if(guess < number) {
turns++;
guess = prompt("Number is " + number + ".\n\nYou guessed " + turns + " Times already.\n\nYour guess was too low! Guess again:");
won = false;
} else if(guess > number) {
turns++;
guess = prompt("Number is " + number + ".\n\nYou guessed " + turns + " Times already.\n\nYour guess was too high! Guess again:");
won = false;
} else if(guess === number) {
alert("You got it!");
won = true;
break;
}
}
if(confirm("Wanna play again?")){
playGame()
} else {
alert("kkbye!");
}
}
The Javascript Prompt returns a string. In fact, input text box always returns string. So when you enter 10 it returns "10" and toFixed() will also return string.
So you need to correct two lines from your code
number = parseInt((Math.random() * 10).toFixed(0));
guess = prompt("Guess a number from 1 to 10");
guess = parseInt(guess);
Also you need to check for NAN condition to be on safer side.

Printing the next 10 even and odd numbers ( java-script)

1) If I enter an even number, I want next 10 even numbers to be printed. If I enter an odd number, I want next 10 odd numbers to be printed.
2)If I enter an even number, I want previous 5 even numbers to be printed. If I enter an odd number, I want previous 5 odd numbers to be printed.
i am newbie to programming and trying to learn java-script myself, the above is the question i am trying to solve. i am confused, i am not sure how to make the code to write the next 10 odd even number (i am referring to the first question).also the previous 5 (referring to second question).. below is my starting attempt. i am stuck
function isEven {
var value = prompt("");
if (value % 2 == 0) {
for (var i = 2; i <= ; i = i + 2;)
document.write(i + "<br>");
}
}
isEven();
Answer 1:
if(number>=0){
for(i=2;i<21;i+=2){
console.log(number+i);
}
}
Answer 2:
for(i=2;i<11;i+=2){
if((number-i)>=0){
console.log(number-i);
}
}
1) If I enter an even number, I want next 10 even numbers to be printed. If I enter an odd number, I want next 10 odd numbers to be printed.
function function1() {
var value = prompt("");
value = parseInt(value);
for (var i = 1; i <= 10; i = i + 1){
value = value + 2;
document.write(value + "<br>");
}
}
2)If I enter an even number, I want previous 5 even numbers to be printed. If I enter an odd number, I want previous 5 odd numbers to be printed.
function function2() {
var value = prompt("");
value = parseInt(value);
for (var i = 1; i <= 5; i = i + 1){
value = value - 2;
document.write(value + "<br>");
}
}
Just to clarify. You want to print both the previous 5 numbers and next 10 numbers of same 'evenness' for any given number?
In which case, you should do just that... You dont need to care if the number is even or odd, because the next/previous is always 2 away. (What you do when you cross 0 is up to you)
for (var i = 1; i <= 5; i++)
document.write((INPUT - (i*2)) + "<br>");
for (var i = 1; i <= 10; i++)
document.write((INPUT + (i*2)) + "<br>");
refer this woking demo. hope this will help to you.
<!DOCTYPE html>
<html>
<head>
<title></title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
<style type="text/css">
</style>
<body>
Enter a number : <input type="number" id="num">
<button id="butp" class="chk">print previous five numbers</button>
|| <button id="butn" class="chk">print next ten numbers</button>
<ul id="print">
</ul>
<script type="text/javascript">
$(".chk").click(function(){
var the_id = $(this).attr('id');
//alert(the_id);
var theVal = parseInt($("#num").val());
if (the_id =="butp") //this means user asking for previous
{
if (theVal==0 || theVal < 10)
{
alert("cannot continue the operation, please enter a valid nubmer to continue");
}
else
{
for (var i=1;i<6;i++)
{
newVal = theVal - (i*2);
$("#print").append($("<li>"+newVal+"</li>"));
}
}
}
else // this means user asking for next
{
for (var i = 1;i<11;i++)
{
if (theVal==0)
{
alert("please enter a valid number to continue");
}
else
{
newVal = theVal + (i*2);
$("#print").append($("<li>"+newVal+"</li>"));
}
}
}
});
$("#num").on('change keyup keydown', function(){
theVal = $(this).val();
if (theVal == "")
{
$("#print li").css({"display":"none"})
}
})
</script>
</body>
</html>
function evenOdd(value) {
if(value%2==0){
console.log(`it's and even number ${value} next 3 digit will be`);
for (var i = 1; i <= 10; i = i + 1){
value = value + 2;
console.log(value);
}
}else{
console.log(`it's and odd number ${value} next 3 digit will be`);
for (var i = 1; i <= 10; i = i + 1){
value = value + 2;
console.log(value);
}
}
}
evenOdd(13)

JavaScript OnClick Method

I was having trouble with the OnClick method I was learning while creating a game. Every time I enter the value and click the button, it is stuck in a loop, I tried document.write and it works using that, but than it opens a new page instead of showing up on screen.
I am new to the programming community, so any help would be nice.
<body>
<p>Enter an integer between 1-100 here:
<input id="number" type="text" />
</p>
<p>
<button onclick="onclickFunction()" type="button">Enter</button>
</p>
<p id="result"></p>
<script type="text/javascript">
function onclickFunction() {
var a = Math.random();
var b = a * 100;
var c = Math.ceil(b);
var intNumber;
var count = 0;
var bool = false;
do {
do {
intNumber = document.getElementById("number").value;
}
while (intNumber > 100 || intNumber < 0);
if (intNumber > c) {
document.getElementById("result").innerHTML = "Too High " + "</br>";
bool = false
} else if (intNumber < c) {
document.getElementById("result").innerHTML = "Too Low " + "</br>";
bool = false
} else if (intNumber == c) {
document.getElementById("result").innerHTML = "You Win!" + "<br>" + " It took you " + count + " tries";
bool = true
}
count = count + 1
} while (bool !== true);
document.getElementById("result").innerHTML = "Win!";
}
</script>
</body>
Updated:
<script type="text/javascript">
// Declare all your functions first
// These functions expect no parameters and return values.
function onclickFunction()
{
var a = Math.random();
var b = a * 100;
var c = Math.floor(b);
// Input from text box.
var randomNumber = document.getElementById("number").value;
// Output to paragraph.
if (randomNumber < c && randomNumber != c)
{
document.getElementById("result").innerHTML = "Too Low " + "</br>";
}
else if (randomNumber > c && randomNumber != c )
{
document.getElementById("result").innerHTML = "Too High" + "</br>";
}
else if (randomNumber == c)
{
document.getElementById("result").innerHTML = "Win!";
}
// Clear text box for further input.
document.getElementById("name").value = "";
}
</script>
<p>Enter an integer between 1-100 here: <input id="number" type="text" /></p>
<p><button onclick="onclickFunction()" type="button">Enter</button></p>
<p id="result"></p>
</body>
First of all, it is always useful to create a fiddle.
That way people who are reading your question can run your code immediately.
Let's break down the code
var a = Math.random();
var b = a * 100;
var c = Math.ceil(b);
This can be done in a single line, to save variables.
do
{
intNumber = document.getElementById("number").value;
}
while (intNumber > 100 || intNumber < 0);
I'm not a big fan of using do/while loops this way, although it can come handy when you want to run the do code at least once, like now.
This loop keeps running when the number is bigger than 100, or smaller than 0. So if I pick an incorrect number that means my browser crashes.
if (intNumber>c){
document.getElementById("result").innerHTML = "Too High " + "</br>";
bool = false
}else if (intNumber<c){
document.getElementById("result").innerHTML = "Too Low " + "</br>";
bool = false
}else if (intNumber == c){
document.getElementById("result").innerHTML = "You Win!" + "<br>" + " It took you " + count + " tries";
bool = true
}
First you are checking if the guess is bigger than the answer, than if it's smaller. That means that the last check if it's equal is unnecessary, since that is the only option left. You can just use an else here.
Also try to be consistent with your spacing and where you place your curly brackets.
do{
//Stuff
}
and
do
{
//Stuff
}
Are both valid ways to use brackets, but stick to one style or your code will get too confusing.
count = count + 1
A small oversight here is that the count starts at 0. So when you guess the number in a single try, it will say you have done it in 0 tries.
while (bool !== true);
document.getElementById("result").innerHTML = "Win!";
}
All the previous code will be done until bool becomes true. The problem here is that if I entered a wrong number (or an invalid number). The program will keep running the if statement which requires a lot of computer power since it never stops. It is impossible to change your guess and the page crashes, because the browser is stuck in the while loop.
The simplest solution for this is to calculate if the new guess was correct when the player inputs a new number. So when onClickFunction is called again.
That way you never have to use a while loop. Although you have to calculate the random number somewhere else.
I hope that helped, if you have any question let me know!

Fix Javascript Value to 0 decimals

I have this script which is working in formatting my currency but now its not fixing my value to 0 decimal places, Im new to javascript so could anybody explain where and hwo I'd do this? Thanks
function FormatNumberBy3(num, decpoint, sep) {
// check for missing parameters and use defaults if so
if (arguments.length == 2) {
sep = ",";
}
if (arguments.length == 1) {
sep = ",";
decpoint = ".";
}
// need a string for operations
num = num.toString();
// separate the whole number and the fraction if possible
a = num.split(decpoint);
x = a[0]; // decimal
y = a[1]; // fraction
z = "";
if (typeof(x) != "undefined") {
// reverse the digits. regexp works from left to right.
for (i=x.length-1;i>=0;i--)
z += x.charAt(i);
// add seperators. but undo the trailing one, if there
z = z.replace(/(\d{3})/g, "$1" + sep);
if (z.slice(-sep.length) == sep)
z = z.slice(0, -sep.length);
x = "";
// reverse again to get back the number
for (i=z.length-1;i>=0;i--)
x += z.charAt(i);
// add the fraction back in, if it was there
if (typeof(y) != "undefined" && y.length > 0)
x += decpoint + y;
}
return x;
}
I may be misunderstanding your question, but it sounds like you want Math.floor()
http://www.javascripter.net/faq/mathfunc.htm
You can round numbers mathematically, which is much, much faster and much, much, much simpler. There are literally hundreds of examples of this algorithm all over this site alone.
function round(number, places)
{
var multiplicator = Math.pow(10, places);
return Math.round(number * multiplicator) / multiplicator;
}
alert(round(123.456, 0)); // alerts "123"
This function lets you round to an arbitrary decimal place. If you want to round to the nearest integer, you may simply use Math.round(x).
Math.round rounds a decimal number to the nearest integer. Assuming you want to keep 3 decimal places, all you have to do is multiply the decimal number by 1000 (which is 10 power 3), round to the nearest integer, then divide by 1000. This is what this snippet does.
Your function appears to work for me... I assume the result of passing "1000" as an argument should be "1,000"? I'm not sure I understand what you mean by "fixing [your] value to 0 decimal places".
Here's a function I wrote to format numbers (like your above function does) for an API once:
function num_format(str) {
if (typeof str !== 'string' || /[^\d,\.e+-]/.test(str)) {
if (typeof str === 'number') {
str = str.toString();
} else {
throw new TypeError("Argument is not a string with a number in it");
}
}
var reg = /(\d+)(\d{3})/;
str = str.split(".");
while (reg.test(str[0])) {
str[0] = str[0].replace(reg, "$1,$2");
}
return str.join(".");
}
Remove the error checking code and it becomes quite a short little function (five lines). Pass it any number and it will format it correctly, although I didn't allow the option of specifying the separators.
As for rounding numbers to arbitrary decimal places, I suggest seeing zneak's answer above. Then would simply do:
num_format(round("100000.12341234", 2));
Which would give a result of "100,000.12".
This function should be capable of all various scenarios:
function formatNumber(num, precision, sep, thousand, addTrailing0) {
if (isNaN(num))
return "";
if (isNaN(precision))
precision = 2;
if (typeof addTrailing0 == "undefined")
addTrailing0 = true;
var factor = Math.pow(10, precision);
num = String(Math.round(num * factor) / factor);
if (addTrailing0 && precision > 0) {
if (num.indexOf(".") < 0)
num += ".";
for (var length = num.substr(num.indexOf(".")+1).length; length < precision; ++length)
num += "0";
}
var parts = num.split(".");
parts[0] = parts[0].split("").reverse().join("").replace(/(\d{3})(?=\d)/g, "$1" + (thousand || ",")).split("").reverse().join("");
num = parts[0] + (parts.length > 1 ? (sep || ".") + parts[1] : "");
//debug:
document.write(num + "<br />");
return num;
}
Examples:
formatNumber(32432342342.3574, 0); // 32,432,342,342
formatNumber(32432342342.3574, 2); // 32,432,342,342.36
formatNumber(1342.525423, 4, ".", ","); // 1,342.5254
formatNumber(1342.525423, 2, ",", "."); // 1.342,53
formatNumber(1342.525423); // 1,342.53
formatNumber(1342.525423, 0); // 1,343
formatNumber(342.525423, 8); // 342.52542300
formatNumber(42.525423, 8, null, null, false); // 42.525423
formatNumber(2.5, 3, ",", "."); // 2,500
Working Live Demo at http://jsfiddle.net/roberkules/xCqqh/

Categories