webForumDet fria alternativet

hjälp med program

8 svar · 370 visningar · startad av Broms

BromsMedlem sedan sep. 2002188 inlägg
#1

Har gjort ett program för att kontrollera datum med hänsyn till skottår. Det jag däremot inte kommer på hur jag skall fixa är en metod för att lägga till x antal dagar till angivet datum, så att den beräknar det nya datumet..

Exempel: 22 Maj 1968 + 12223 dagar ger 8 Nov 2001

Några tips på hur jag skall angripa problemet? Vilken väg som är lättast?

/*
  Name: Testa Datum
  Copyright: none
  Author: Spöket Laban
  Date: 06-05-05 00:37
  Description: Programmet har 2 metoder, en som kontrollerar om ett datum är korrekt,
               samt en metod som adderar x antal dagar och skriver ut nytt datum.
*/

#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int ar;
  int manad;
  int dag;
}datum;    

/*********************

  Namn: datumTest
  Beskrivning: Tar emot en struct av typen datum, och returnerar true / false
  Inparameter: struct datum
  Utparameter: bool (true / false)

**********************/  
bool datumTest(datum dat);     

int main(int argc, char *argv[]){

  datum dat;   

  printf("ange artal\n");
  scanf("%d", &dat.ar);

  printf("ange manad\n");
  scanf("%d", &dat.manad);

  printf("ange dag\n");
  scanf("%d", &dat.dag);     
   
  if (datumTest(dat)==true) printf("korrekt datum\n");
  else  printf("felaktigt datum\n");

  printf("\n\n%d,%d,%d\n",dat.ar,dat.manad,dat.dag);

  system("PAUSE");
  return 0;
}

//testar om ett datum är giltigt, tar hänsyn till skottår.
bool datumTest(datum dat){
  if ((dat.manad == 1 || dat.manad == 3 || dat.manad == 5 || dat.manad == 7 || dat.manad == 8 || dat.manad == 10 || dat.manad == 12) && dat.dag > 0 && dat.dag <= 31){
    return true;						
  }
  else if ((dat.manad == 4 || dat.manad == 6 || dat.manad == 9 || dat.manad == 11) && dat.dag > 0 && dat.dag <= 30){
    return true;
  }
  //test för skottår.
  else if (dat.manad == 2 && dat.dag > 0 && dat.dag <= 29){
    if (dat.dag == 29){
      if (dat.ar%100!=0){
        if (dat.ar%4==0){
          return true;
        }
        else return false;
      }
      else if(dat.ar%100==0){
        if (dat.ar%400==0){
          return true;
        }
        else return false;
      }
    }else return true;     
  }
  else return false;
}
BromsMedlem sedan sep. 2002188 inlägg
#2

jag funderade först på att skapa en struct månader med info om månadsnummer och antal dagar per månad, men det blir ju bara konstigt då man även måste ha koll på året med hänsyn till skottår osv :\

PeWMedlem sedan juni 200010 432 inlägg
#3

Vad är problemet? Skottår får du fram med årtalet modulo 4 undantaget modulo 100.
http://susning.nu/Skott�r

Annars finns det nog en hel del färdig kod att använda. Sök på Gregorian Calendar.. såvida det inte är en skoluppgift förstås ;)

BromsMedlem sedan sep. 2002188 inlägg
#4

Hehe tack för svaret men tror du missade vad jag egentligen frågade om.. tar det igen:

Har gjort ett program för att kontrollera datum med hänsyn till skottår. Det jag däremot inte kommer på hur jag skall fixa är en metod för att lägga till x antal dagar till angivet datum, så att den beräknar det nya datumet.

Det jag frågar efter är tips på hur man angriper problem 2, en metod för att lägga till x antal dagar till angivet datum, så att den beräknar det nya datumet. Så att ett exempel som detta kan ges:

Inmatning: 1968 05 22
Antal dagar: 12223 //<--antal dagar som skall läggas på datumet
Utmatning: 2001 11 08

-------------------------------

Det ÄR en skoluppgift, och jag är endast ute efter tips på hur jag angriper problemet, då jag vill lära mig.

tydalMedlem sedan juni 20034 013 inlägg
#5

Du väljer ett referensdatum, exempelvis 1 januari 1900 och så utgår du från det. Skriv en funktion som gör om ett datum till antal dagar sedan 1 januari 1900 och skriv en funktion som gör om ett antal dagar sedan 1 januari 1900 till ett datum.

BromsMedlem sedan sep. 2002188 inlägg
#6

skall jobba på den :p tack så mkt

BromsMedlem sedan sep. 2002188 inlägg
#7

Jag satte mig ner och gjorde programmet ovan.. Dock fungerar det ej som det skall. Det blir inga kompileringsfel men programmet krashar så fort jag har matat in antalet dagar som man skall lägga till det nya datumet.. alltså efter inläsning nummer 2.. ingen som förstår varför? jag har försökt stoppa in korta utskrifter lite överallt för att kolla hur långt in i funktionen som programmet kom, men det krashar så fort antalet dagar lästs in :(

Struct samt funktionsdeklarationerna

//jag plockar med definitionen av strukten här istället för
//i programfilen, då variabeltypen datum används här med.
typedef struct {
  int ar;
  int manad;
  int dag;
}datum; 

/*********************

  Namn: datumTest
  Beskrivning: Tar emot en struct av typen datum, och returnerar true / false.
  Inparameter: struct datum
  Utparameter: bool (true / false)

**********************/  
bool datumTest(datum dat);

/*********************

  Namn: testaSkott
  Beskrivning: Tar emot en struct av typen datum, och returnerar true / false.
  Inparameter: struct datum
  Utparameter: bool (true / false)

**********************/  
bool testaSkott(datum dat);

/*********************

  Namn: makeDays
  Beskrivning: Tar emot en struct av typen datum, och omvandlar detta till
               antalet dagar sedan 2000 01 01.
  Inparameter: struct datum
  Utparameter: int antaldagar

**********************/  
int makeDays(datum dat);

/*********************

  Namn: makeDate
  Beskrivning: Tar emot en int totdagar och omvandlar till ett datum testdat.
  Inparameter: int totdagar
  Utparameter: datum testdat

**********************/  
datum makeDate(int totdagar);

/*********************

  Namn: beraknaDatum
  Beskrivning: Tar emot ett datum dat och antalet dagar int i, skapar ett nytt
               datum av detta genom att anropa funktionen makeDate. 
  Inparameter: int totdagar
  Utparameter: datum testdat

**********************/  
datum beraknaDatum(datum dat, int i);

Programmet:

/*
  Name: Testa Datum
  Copyright: none
  Author: Erik Bröms
  Date: 06-05-05 00:37
  Description: Programmet har 2 metoder, en som kontrollerar om ett datum är korrekt,
               samt en metod som adderar x antal dagar och skriver ut nytt datum.
*/

#include <stdio.h>
#include <stdlib.h>
#include "G_funk.c"

  //<-- Datumet som antaldagar beräknas utifrån. --
#define START_AR 2000
#define START_MANAD 1
#define START_DAG 1
  //----------------------------------------------->

int main(int argc, char *argv[]){

  datum dat;
  int i;
  datum nyttdatum; 

  printf("Ange YYYY MM DD: ");
  scanf("%d%d%d", &dat.ar,&dat.manad,&dat.dag);    
   
  if (datumTest(dat)==true) printf("\nKorrekt datum!\n");
  else  printf("\nFelaktigt datum!\n");
  
  //anrop av funktionen makeDays.
  int antaldagar=makeDays(dat);
  printf("\nAntal dagar sedan 2000: %d\n\n",antaldagar);
  
  printf("Ange antal dagar att lägga till datumet: ");
  scanf("%d", i);   
  nyttdatum=beraknaDatum(dat,i);
  printf("\nNytt datum: %d %d %d\n\n",nyttdatum.ar, nyttdatum.manad, nyttdatum.dag);

  system("PAUSE");
  return 0;
}

//testar om ett datum är giltigt, tar hänsyn till skottår.
bool datumTest(datum dat){
  if ((dat.manad == 1 || dat.manad == 3 || dat.manad == 5 || dat.manad == 7 || dat.manad == 8 || dat.manad == 10 || dat.manad == 12) && dat.dag > 0 && dat.dag <= 31){
    return true;						
  }
  else if ((dat.manad == 4 || dat.manad == 6 || dat.manad == 9 || dat.manad == 11) && dat.dag > 0 && dat.dag <= 30){
    return true;
  }
  //anropar test för skottår.
  else if (dat.manad == 2 && dat.dag > 0 && dat.dag <= 29){
    if (dat.dag == 29){
      return testaSkott(dat);
    }
    else return true;     
  }
  else return false;
}

//testar om det är ett skottår
bool testaSkott(datum dat){
  if (dat.ar%100!=0){
    if (dat.ar%4==0){
      return true;
    }
    else return false;
  }
  else if(dat.ar%100==0){
    if (dat.ar%400==0){
      return true;
    }
    else return false;
  }
}

//gör om ett datum till antalet dagar sedan angivet startdatum.
int makeDays(datum dat){
  int antaldagar=0;
  bool skott;
  datum testdat;
      
  for (int ar=START_AR; ar < dat.ar; ar++){
    testdat.ar=ar;
    if ((skott=testaSkott(testdat)) == true) antaldagar+=366;
    else antaldagar+=365;
  }
  for (int manad=START_MANAD; manad < dat.manad; manad++){
    if (manad == 1 || manad == 3 || manad == 5 || manad == 7 || manad == 8 || manad == 10 || manad == 12) antaldagar+=31;
    else if (manad == 4 || manad == 6 || manad == 9 || manad == 11) antaldagar+=30;
    else if (manad==2){
      testdat.ar=dat.ar;
      skott=testaSkott(testdat);
      if (skott == true) antaldagar+=29;
      else antaldagar+=28;
    }
  }
  antaldagar+=dat.dag;
  return antaldagar;
}

datum makeDate(int totdagar){
  datum testdat;
  testdat.ar=START_AR;
  int m_ar=START_AR;
  int m_manad=START_MANAD;
  int m_dag=START_DAG;
  
  for (int dag=START_DAG; dag<totdagar && ((totdagar>=366 && (testaSkott(testdat))) || (totdagar>=365 && (!testaSkott(testdat)))); dag++){ 
    if (dag==365){
      testdat.ar=START_AR;
      if (testaSkott(testdat)){
        m_ar++;
        totdagar-=366;
      }
      else{ 
        m_ar++;
        totdagar-=365;
      }
      dag=0;
    }
  }
  testdat.ar=START_AR+m_ar;
  
  while(totdagar>=31){
    if(m_manad == 1 || m_manad == 3 || m_manad == 5 || m_manad == 7 || m_manad == 8 || m_manad == 10 || m_manad == 12){
      m_manad++;
      totdagar-=31;
    }
    else if (m_manad == 4 || m_manad == 6 || m_manad == 9 || m_manad == 11){
      m_manad++;
      totdagar-=30;
    }
    else if (m_manad==2){
      if (testaSkott(testdat)){
        m_manad++;
        totdagar-=29;
      }
      else{
        m_manad++;
        totdagar-=28;
      }
    }
  }
  m_dag=totdagar;
  testdat.ar=m_ar;
  testdat.manad=m_manad;
  testdat.dag=m_dag;
  return testdat;
}

datum beraknaDatum(datum dat, int i){
  int antaldagar=makeDays(dat);
  int totdagar=antaldagar+i;
  datum testdat=makeDate(totdagar);
  datum testdat;
  return testdat;
}

Ps. Kan tillägga att makeDays, datumTest och testaSkott fungerar perfekt.. problemet ligger antingen i makeDate eller beraknaDatum

pimmeMedlem sedan sep. 20011 086 inlägg
#8

Du har glömt ett &-tecken där du läser in dagarna.

scanf("%d", &i);
BromsMedlem sedan sep. 2002188 inlägg
#9

thanx baby.. att en sån liten liten grej ska kunna missas när man skrivit ett program på 250 rader :S tack så jättemycket pimme!! =)

136 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)