17 svar
481 visningar
rash_2010@live.se 6 – Fd. Medlem
Postad: 12 nov 2018 20:29 Redigerad: 12 nov 2018 21:05

JavaScript

Hej!

Jag försöker skriva en kod som räknar ut vilket nummer en viss dag har under ett år. Dagarna numreras från 1 till 365 eller från 1 till 366 om det är ett skottår.  Om det t.ex. är februari ska man lägga 31 till det inmatade värdet för dag. Om det gäller senare månader måste man ta hänsyn till att februari har 29 dagar när det är skottår.  Jag skrev min kod (se nedan) men vet inte varför den vill inte köra!! 

 

 

function klickade() {
let svar1 = ruta1.value;
let svar2 = ruta2.value;
let svar3 = ruta3.value;
let ar = Number(svar1);
let mon = Number(svar2);
let dag = Number (svar3);
let antal_dagar = 0;
let i=30;
}

for (k = 1; k <== mon; k=k+1) {
if (k= 1 || k=3 || k=5 || k=7 || k=8 || k=10 || k= 12) {
antal_dagar = antal_dagar + 31;
}
}
else {
if (k=4 || k=6 || k=9 || k=11) {
antal_dagar = antal_dagar + 30;
}
}
else {
if (ar % 4 == 0 && ar % 100 !=0) || ar % 400 ==0 && k=2) {
antal_dagar =antal_dagar + 29;
}
}
else {
if (ar % 4 != 0 && ar % 100 ==0) || ar % 400 !=0 && k=2) {
antal_dagar =antal_dagar + 28;
}
}
antal_dagar = antal_dagar + dag;
}

Laguna Online 30498
Postad: 12 nov 2018 21:11

Allt den gör är sätter den lokala variabeln antal_dagar. Hur vill du få veta vad resultatet blir? Ingår det i uppgiften att presentera det på något särskilt sätt? 

Laguna Online 30498
Postad: 12 nov 2018 22:06

Vad är det här "Number" för nåt? Är det du visar verkligen hela programmet?

Affe Jkpg 6630
Postad: 12 nov 2018 22:07
rash_2010@live.se skrev:

Hej!

Jag försöker skriva en kod som räknar ut vilket nummer en viss dag har under ett år. Dagarna numreras från 1 till 365 eller från 1 till 366 om det är ett skottår.  Om det t.ex. är februari ska man lägga 31 till det inmatade värdet för dag. Om det gäller senare månader måste man ta hänsyn till att februari har 29 dagar när det är skottår.  Jag skrev min kod (se nedan) men vet inte varför den vill inte köra!! 

 

 

function klickade() {
let svar1 = ruta1.value;
let svar2 = ruta2.value;
let svar3 = ruta3.value;
let ar = Number(svar1);
let mon = Number(svar2);
let dag = Number (svar3);
let antal_dagar = 0;
let i=30;
}

for (k = 1; k <== mon; k=k+1) { // Dubbla ==?
if (k= 1 || k=3 || k=5 || k=7 || k=8 || k=10 || k= 12) {
antal_dagar = antal_dagar + 31;
}
} //Fel som sedan upprepar sig !
else {
if (k=4 || k=6 || k=9 || k=11) {
antal_dagar = antal_dagar + 30;
}
}
else {
if (ar % 4 == 0 && ar % 100 !=0) || ar % 400 ==0 && k=2) {
antal_dagar =antal_dagar + 29;
}
}
else {
if (ar % 4 != 0 && ar % 100 ==0) || ar % 400 !=0 && k=2) {
antal_dagar =antal_dagar + 28;
}
}
antal_dagar = antal_dagar + dag;
}

Kolla bl.a. dina parenteser {…} 

När du skriver fel parenteser "dödar" du for-loopen efter första if-villkoret.

Jag kan tycka att din kod skulle vara elegantare om du i stället tillämpar:
switch (k){
   case 1:
   case 3:
   …

}


Laguna Online 30498
Postad: 13 nov 2018 09:19

Det torde finnas ett sätt att se felmeddelanden. I en browser heter det ofta "Javascript console" eller något sådant, och man får fram den genom "Developer Tools" eller något sådant. Om det finns ett syntaxfel så står det där.

rash_2010@live.se 6 – Fd. Medlem
Postad: 13 nov 2018 19:43

 Hej !

just det, den ska fungera på så sätt att resultatet måste redovisas så som nedan:

År?

sen kommer inmatningrutan

Månad?

sen kommer inmatnigsrutan

Dag?

sen kommer inmatningsrutan

Beräkna

sedan räknar koden vilket datum dagen har under ett visst år

...............................................................................................................

och här kommer hur jag tänkte före det stycket jag postade innan med att jag skapade frågorna och inmatningsrutorna och de fungerar

"use strict";
// fråga
let fraga1 = document.createElement("p");
document.body.appendChild(fraga1);
fraga1.innerHTML = "År?";
let ruta1 = document.createElement("input");
document.body.appendChild(ruta1);
ruta1.focus();

let fraga2 = document.createElement("p");
document.body.appendChild(fraga2);
fraga2.innerHTML = "Månad?";
let ruta2 = document.createElement("input");
document.body.appendChild(ruta2);

let fraga3 = document.createElement("p");
document.body.appendChild(fraga3);
fraga3.innerHTML = "Dag?";
let ruta3 = document.createElement("input");
document.body.appendChild(ruta3);

// Beräkna
let knapp = document.createElement("button");
document.body.appendChild(knapp);
knapp.style.marginLeft = "10px";
knapp.innerHTML = "Beräkna";
knapp.onclick = klickade;

// Resultat
let resultat = document.createElement("p");
document.body.appendChild(resultat);

 

Jag vet att jag har gjort fel någonstans kanske med if satserna och som gör att programmet vill inte köra!! Något tips??

rash_2010@live.se 6 – Fd. Medlem
Postad: 13 nov 2018 20:00

 Jag testade att ha "måsparentes" för for-loop nån annan stans med det visar fortfarande fel meddelande:(

Jag vet tyvärr inte hur man använder switch-funktion i JavaSkript! Har inte kommit så långt:( 

Affe Jkpg 6630
Postad: 13 nov 2018 20:38
rash_2010@live.se skrev:

 Hej !

just det, den ska fungera på så sätt att resultatet måste redovisas så som nedan:

År?

sen kommer inmatningrutan

Månad?

sen kommer inmatnigsrutan

Dag?

sen kommer inmatningsrutan

Beräkna

sedan räknar koden vilket datum dagen har under ett visst år

...............................................................................................................

och här kommer hur jag tänkte före det stycket jag postade innan med att jag skapade frågorna och inmatningsrutorna och de fungerar

"use strict";
// fråga
let fraga1 = document.createElement("p");
document.body.appendChild(fraga1);
fraga1.innerHTML = "År?";
let ruta1 = document.createElement("input");
document.body.appendChild(ruta1);
ruta1.focus();

let fraga2 = document.createElement("p");
document.body.appendChild(fraga2);
fraga2.innerHTML = "Månad?";
let ruta2 = document.createElement("input");
document.body.appendChild(ruta2);

let fraga3 = document.createElement("p");
document.body.appendChild(fraga3);
fraga3.innerHTML = "Dag?";
let ruta3 = document.createElement("input");
document.body.appendChild(ruta3);

// Beräkna
let knapp = document.createElement("button");
document.body.appendChild(knapp);
knapp.style.marginLeft = "10px";
knapp.innerHTML = "Beräkna";
knapp.onclick = klickade;

// Resultat
let resultat = document.createElement("p");
document.body.appendChild(resultat);

 

Jag vet att jag har gjort fel någonstans kanske med if satserna och som gör att programmet vill inte köra!! Något tips??

 Du ser inte var jag markerat:
} //Fel som sedan upprepar sig !

Laguna Online 30498
Postad: 13 nov 2018 21:48

Kommentarer utöver det som Affe skriver om innehållet i funktionen:

 

Du skriver "felmeddelande", men vad är felmeddelandet? Hela.

 

Du gör element och en knapp som kör funktionen, men hur ska det som funktionen räknar ut hamna i 'resultat'?

 

För att kolla om funktionen körs alls: låt den göra nästan ingenting utom att smälla upp en alert-ruta.

rash_2010@live.se 6 – Fd. Medlem
Postad: 14 nov 2018 19:29

Hej Affe! Jag har förstått av din kommentar att placeringen för } är fel för den dödar if-satsen där! Jag har försökt att placera det efter den sista if-satsen men får samma felmeddelande som gör att jag inte kan köra programmet för att se om jag skrev koden rätt. Något tips på vad kan ha gått för fel?

rash_2010@live.se 6 – Fd. Medlem
Postad: 14 nov 2018 19:43

Hej Laguna

Det enda felmeddelandet jag får är att den pekar mot for-loopen där det står "missing '==' " och därför bytte jag från '='  till  '==' (med tanke på att det ska vara bara ett likhetstecken och inte dubbla)  men ändå den vägrar köra! 

Affe Jkpg 6630
Postad: 14 nov 2018 22:34

Du ska inte flytta en parentes, du ska ta bort många parenteser...

if (villkor) {
...;
}
else if (villkor) {
...;
}
else {
...;
}

Laguna Online 30498
Postad: 15 nov 2018 06:06

För att undvika förvirring använder man olika ord för de olika parenteserna: () är parenteser, [] hakparenteser och {} krullparenteser. Klamrar säger man ofta om {} också.

Laguna Online 30498
Postad: 15 nov 2018 08:32

Om man kan bör man använda en editor som hjälper till att indentera så det blir läsligt, dvs. skjuta in raderna så att det framgår vilken grupp av satser de hör till. T.ex. så här:

 

for (k = 1; k <= mon; k=k+1) {
     if (k= 1 || k=3 || k=5 || k=7 || k=8 || k=10 || k= 12) {
         antal_dagar = antal_dagar + 31;
     }
}

 

Då ser man mycket lätt om det är några klamrar för mycket, eller om de sitter fel. Och allt blir mycket lättare att överblicka.

Affe Jkpg 6630
Postad: 15 nov 2018 08:47

Även om jag har en editor som markerar klammerparen, brukar jag ändå skriva så här:
for (k = 1; k <= mon; k++)
{
     if (villkor)
     {
         antal_dagar += 31;
     }
}

Laguna Online 30498
Postad: 15 nov 2018 08:50
Affe Jkpg skrev:

Även om jag har en editor som markerar klammerparen, brukar jag ändå skriva så här:
for (k = 1; k <= mon; k++)
{
     if (villkor)
     {
         antal_dagar += 31;
     }
}

Javisst, det är en stilfråga. Även i C eller C++ finns båda stilarna. Om man samarbetar i ett projekt bör alla använda samma stil, men annars spelar det ingen roll.

rash_2010@live.se 6 – Fd. Medlem
Postad: 18 nov 2018 17:02

Ska försöka göra om lite i uppgiften, tack för alla tips:)

Ironboy 15 – Fd. Medlem
Postad: 15 jun 2020 16:16

Du kan utnyttja att JavaScript är ganska bra på att räkna på datum :) 


// year = 4 digits, month 1-12, date 1-28...31
function dayNumber(year, month, date) {
  let d = new Date(year, month - 1, date).getTime(), co = 0;
  while (new Date(d - ++co * 24 * 60 * 60 * 1000).getFullYear() === year) { }
  return co;
}

// Test
console.log(dayNumber(2000, 3, 1)); // 60
console.log(dayNumber(2019, 3, 1)); // 60
console.log(dayNumber(2020, 3, 1)); // 61 (leap year)
console.log(dayNumber(2020, 12, 31)); // 366 (leap year)

Svara
Close