Programmeer Opdracht 2

Nog een zo'n leuke oefening als programmeer opdracht 1 gevonden in men school map van vorig jaar.

[b:a0c58652ab]Opdracht[/b:a0c58652ab]
Maak een programma dat het aantal dagen van de maand berekent en de hoeveelste dag het is van het jaar.
Let op met de schrikkelmaanden ! :slight_smile:
[img:a0c58652ab]http://preface.be/driek/prog1.PNG[/img:a0c58652ab]

[b:a0c58652ab]Aandacht[/b:a0c58652ab]
Gelieve OOP te werken!

Ik had de oefening gemaakt in C#, maar zou graag eens de code zien in Cocoa.

Het is echt niet de moeite waard dat OO te modelleren. Zonder complete redundantie is dat zelfs niet eens mogelijk :)

PS. Het is opdracht 3 :wink:

Tipje voor de beginners: Op internet zijn algoritmen te vinden, zoek ze, beoordeel ze, en implementeer ze, maar zorg wel dat je weet wat ze doen :slight_smile:

[code:1:8848c84102] using System;

class DagenEnJaren{
static void Main(string[] args){
uint Year = 0;
uint Month = 0;
uint Day = 0;

Console.Write("Geef het jaartal in aub. (formaat JJJJ):");
Year = uint.Parse(Console.ReadLine());
while (Year < 1000){
  Console.Write("Ongeldig jaartal, correct jaartal aub.:");
  Year = uint.Parse(Console.ReadLine());
};

Console.Write("Geef de maand aub. (formaat MM):");
Month = uint.Parse(Console.ReadLine());
while (Month > 12 | Month < 1){
  Console.Write("Ongeldige maand, correcte maand aub.:");
  Month = uint.Parse(Console.ReadLine());
};

Console.Write("Geef de dag aub. (formaat DD):");
Day = uint.Parse(Console.ReadLine());
while ( Day < 1 | Day > AantalDagenInMaand(Month,Year)){
  Console.Write("Ongeldige dag, correcte dag aub.:");
  Day = uint.Parse(Console.ReadLine());
};

Console.WriteLine("nnEr zijn {0} dagen in de {1}e maand van het jaar {2}.", AantalDagenInMaand(Month,Year),Month,Year);
Console.WriteLine("nHet volgnummer van deze dag is: {0}n", VolgnummerInJaar(Day,Month,Year));
}/*Main*/

static uint AantalDagenInMaand(uint Month,uint Year){
  uint DaysInMonth = 1;
switch(Month){
  case 1: DaysInMonth = 31;
    break;
  case 2: if (SchrikkelJaar(Year)){
            DaysInMonth = 29;
          } else{
            DaysInMonth = 28;
          }
    break;
  case 3: DaysInMonth =31;
    break;
  case 4: DaysInMonth =30;
    break;
  case 5: DaysInMonth =31;
    break;
  case 6: DaysInMonth =30;
    break;
  case 7: DaysInMonth =31;
    break;
  case 8: DaysInMonth =31;
    break;
  case 9: DaysInMonth =30;
    break;
  case 10: DaysInMonth =31;
    break;
  case 11: DaysInMonth =30;
    break;
  case 12: DaysInMonth = 31;
    break;	
}
  return DaysInMonth;
}/*AantalDagenInMaand*/

static bool SchrikkelJaar(uint Year){
  return (Year%4 == 0 && Year%100 != 0)||(Year%400 == 0);
}/*SchrikkelJaar*/
static uint VolgnummerInJaar(uint Day, uint Month, uint Year){
  uint Volgnummer = 0;
  uint I = 0;
  Volgnummer = Day;
  for(I=1; I!=Month; I+=1){
    Volgnummer = Volgnummer + AantalDagenInMaand(I, Year);
  };
  return Volgnummer;
}/*VolgnummerInJaar*/

}/DagenEnJaren/
[/code:1:8848c84102]

Daar is niets OO aan :) Dat is gewoon procedural geschreven :)

Even lekker in Haskell:

[code:1:a72bc07afe]
dayInYear :: Int -> Int -> Int -> (Int,Int)
dayInYear day month year = ((months year)!!(month-1),
sum(take (month-1) (months year))+ day)

months :: Int -> [Int]
months x | isLeapYear x = [31,29,31,30,31,30,31,31,30,31,30,31]
| otherwise = [31,28,31,30,31,30,31,31,30,31,30,31]

isLeapYear :: Int -> Bool
isLeapYear year = mod year 4 == 0 && (mod year 100 /= 0 || mod year 400 == 0)
[/code:1:a72bc07afe]

Werking:

[code:1:a72bc07afe]
Main> dayInYear 03 04 2006
(30,93)
Main> dayInYear 03 05 2006
(31,123)
[/code:1:a72bc07afe]

[quote:47284a33d6="driek"][code:1:47284a33d6] switch(Month){ case 1: DaysInMonth = 31; break; case 2: if (SchrikkelJaar(Year)){ DaysInMonth = 29; } else{ DaysInMonth = 28; } break; case 3: DaysInMonth =31; break; case 4: DaysInMonth =30; break; case 5: DaysInMonth =31; break; case 6: DaysInMonth =30; break; case 7: DaysInMonth =31; break; case 8: DaysInMonth =31; break; case 9: DaysInMonth =30; break; case 10: DaysInMonth =31; break; case 11: DaysInMonth =30; break; case 12: DaysInMonth = 31; break; }[/code:1:47284a33d6][/quote:47284a33d6] waarom doe je geen fallthrough ? [code:1:47284a33d6]switch(Month){ case 2: if (SchrikkelJaar(Year)){ DaysInMonth = 29; }else{ DaysInMonth = 28; } break; case 1: case 3: case 5: case 7: case 8: case 10: case 12: DaysInMonth =30; break; case 4: case 6: case 9: case 11: DaysInMonth =31; break; }[/code:1:47284a33d6]...minder schrijfwerk :P .