| Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann. |
Diskussion: Tage berechnen im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige Hallo allerseits, für die unter euch willigen eine neue Programmieraufgabe. Problemstellung: Gegeben ist ein Datum vom Anwender (Eingabe: TT.MM.YYYY). ...
![]() |
| | #1 (permalink) | |
| Anzeige Hallo allerseits, für die unter euch willigen eine neue Programmieraufgabe. Problemstellung: Gegeben ist ein Datum vom Anwender (Eingabe: TT.MM.YYYY). Zu Berechnen sind die Tage vom 01.01.YYYY bis TT.MM.YYYY. Schwierigkeit dabei ist es, das von der jeweiligen Pattform (Programmiersprache) keine integrierten Datumsabfragen oder sonstige Utilities genutzt werden sollen. Hinweise: Zu beachten sind ebenfalls die Schaltjahre. Um heraus zu bekommen ob ein bestimmtes Jahr ein Schaltjahr ist, muss dieses durch 4 oder 400 Teilbar sein. Zitat:
Januar - 31 Tage Februar - 28 Tage ( + evt. Schaltjahr ) März - 31 Tage April - 30 Tage Mai - 31 Tage Juni - 30 Tage Juli - 31 Tage August - 31 Tage September - 30 Tage Oktober - 31 Tage November - 30 Tage Dezember - 31 Tage Nach dem ersten Lösungsvorschlag eines anderen werde ich meine Java-Variante vorstellen. Viel Erfolg minzel | ||
| | |
| | #2 (permalink) |
| Registriert seit: 03.12.04 ![]() Likes: 0 | Wenn ich das richtig verstanden habe soll das ganze so ablaufen: Eingabe: 12.08.2005 Ausgabe: Der 12.08.2005 ist ein Freitag Oder? Gruß, Boar |
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) | |
| Themenstarter | Jein ... Zitat:
//////////////////////////////////////////////// Syntax: TT.MM.YYYY Datum: 12.08.2005 <- Hier folgt die Eingabe vom Anwender Datum: Okay Zeitraum: Vom 1.1.2005 bis 12.8.2005 Tage: 224 //////////////////////////////////////////////// Habe noch vergessen zu erwähnen das, dass Datum natürlich gültig sein sollte. mfg minzel | |
| | |
| | #4 (permalink) |
| Registriert seit: 03.12.04 ![]() Likes: 0 | Achso, ok! Das macht die ganze Aufgabe erheblich einfacher. Werd mich am Wochenende mal dransetzen. EDIT So, hat ein bisschen länger gedauert. Das Programm funktioniert soweit, die Überprüfung des eingegebenen Datums ist nur noch nicht 100% exakt. Folgende Eingaben sind im Moment erlaubt: Syntax: TT.MM.JJJJ 0<=TT<=31, 0<=MM<=12, 1000<=JJJJ<=3000 Also könnte man z.B. auch 30.02.2005 eingeben und das Programm sagt trotzdem, dass das Datum gültig ist. Da setz ich mich bei Gelegenheit noch dran. Das Ganze ist wie immer in Java programmiert. Gruß, Boar |
| | |
| | #5 (permalink) |
| Themenstarter | Nicht schlecht die Variante. Das Programm erfüllt auf jeden Fall teilweise seinen Zweck. Hier nun meine versprochene Lösung. Dies ist einer meiner Perversesten Java-Programme, da in der Hauptklasse keine Variablen verwendet werden, sämtliche Fehlerroutinen selber geschrieben und komplett OOP Programmiert wurde. Ebenfalls eigens geschriebene Datums-Funktionen. Programm erfüllt alle Anforderungen der Aufgabenstellung. Sollte auch fehlerfrei sein. Wird ein falsches (formatiertes) oder ungültiges Datum eingegeben wird unweigerlich eine Exception geworfen und das Programm bricht abrupt ab. Bei korrekter Eingabe wird das richtige Ergebnis präsentiert. >> printDays_Quelltext.zip >> printDays_Execute.zip viel vergnügen :) minzel |
| | |
| | #6 (permalink) | |
| Registriert seit: 03.12.04 ![]() Likes: 0 | Zitat:
![]() Alle falschen Datum-Eingaben führen jetzt zum Syntaxfehler. Auch Schaltjahre werden berücksichtigt. Also ist es z.B. möglich, den 29.02.2004 einzugeben, der 29.02.2003 erzeugt aber einen Syntaxfehler. Deine Lösung gefällt mir sehr gut. Beeindruckender Quelltext! | |
| | |
| | #7 (permalink) |
| Themenstarter | sorry, der satz sollte nicht einschüchternd sein ^^ ney, aber krass, jenau so, mal schauen ob noch jemand ne lösung hat. vieleicht dann doch mal in c oder so. minzel |
| | |
| | #8 (permalink) |
| weiß eigentlich einer von euch warum der Juli und der August beide 31 Tage haben?? *g* Hilfestellung Juli => Julius Cäser August => Augustus die Geschichten der beiden überschneiden sich. Und die überschneidung liefert die Lösung *g* (falls der Post euch so dämlich erscheint einfach löschen!!) | |
| | |
| | #9 (permalink) | |
| Zitat:
also in c: Code: if((jahr%4 == 0 && jahr%100 != 0) || jahr%400 == 0) Code: #include <iostream>
using namespace std;
short datum_pruefen(short, short, int);
short tage_berechnen(short, short, int);
int main()
{
short tag,monat, pruefen;
int jahr, tage;
cout << "Bitte ein Datum eingeben (Syntax: TT MM YYYY, ohne Punkt!)." << endl;
cout << "Datum: ";
cin >> tag >> monat >> jahr;
cin.get();
pruefen = datum_pruefen(tag, monat, jahr);
if(pruefen == 0)
{
cout << "Falsches Datum!n";
return 0;
}
cout << "nDatum korrekt!" << endl;
tage = tage_berechnen(tag, monat, jahr);
cout << "nZeitraum vom 1.1." << jahr << " bis zum "
<< tag << "." << monat << "." << jahr << endl
<< "Tag(e): " << tage << endl;
cout << "nEnter zum beenden druecken.";
cin.get();
return 0;
}
short datum_pruefen(short tag, short monat, int jahr)
{
switch (monat)
{
case 1:
if(tag <= 31)
return 1;
return 0;
break;
case 2:
if((jahr%4 == 0 && jahr%100 != 0) || jahr%400 == 0)
{
if(tag <= 29)
return 1;
}
if(tag <= 28)
return 1;
return 0;
break;
case 3:
if(tag <= 31)
return 1;
return 0;
break;
case 4:
if(tag <= 30)
return 1;
return 0;
break;
case 5:
if(tag <= 31)
return 1;
return 0;
break;
case 6:
if(tag <= 30)
return 1;
return 0;
break;
case 7:
case 8:
if(tag <= 31)
return 1;
return 0;
break;
case 9:
if(tag <= 30)
return 1;
return 0;
break;
case 10:
if(tag <= 31)
return 1;
return 0;
break;
case 11:
if(tag <= 30)
return 1;
return 0;
break;
case 12:
if(tag <= 31)
return 1;
return 0;
break;
default:
return 0;
break;
}
return 1;
}
short tage_berechnen(short tag, short monat, int jahr)
{
short tage = 0;
short monate[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
monat--;
for(int i=0;i<monat;i++)
tage += monate[i];
monat++;
tage += tag;
if((jahr%4 == 0 && jahr%100 != 0) || jahr%400 == 0)
tage++;
return tage;
} ![]() compiliert hab ich das programm mit ms visual c++, getestet auf win xp | ||
| | |
| | #10 (permalink) |
| Registriert seit: 02.05.05 ![]() Likes: 0 | Meine Lösung ist jetzt ohne Datumsprüfung, aber die Berechnung ist ok. Code: #include <stdio.h>
int mon[12] =
{ /* Jan */ 0,
/* Feb */ 31,
/* Mar */ 31+28,
/* Apr */ 31+28+31,
/* Mai */ 31+28+31+30,
/* Jun */ 31+28+31+30+31,
/* Jul */ 31+28+31+30+31+30,
/* Aug */ 31+28+31+30+31+30+31,
/* Sep */ 31+28+31+30+31+30+31+31,
/* Okt */ 31+28+31+30+31+30+31+31+30,
/* Nov */ 31+28+31+30+31+30+31+31+30+31,
/* Dez */ 31+28+31+30+31+30+31+31+30+31+30
};
unsigned long Get_Tage(int tag, int monat, int jahr)
{
unsigned long tage;
tage = jahr*365+((jahr-1)/4)-((jahr-1)/100)+((jahr-1)/400);
tage += mon[monat-1];
if (monat > 2)
{ if ((jahr% 4)==0) tage++;
if ((jahr%100)==0) tage--;
if ((jahr%400)==0) tage++;
}
tage += tag-1;
return(tage);
}
int main()
{
int geboren, heute;
geboren = Get_Tage(18, 9, 1972);
heute = Get_Tage(8, 9, 2005);
printf("tage = %i\n", heute-geboren);
return(-1);
} |
| | |
| | #11 (permalink) |
| Registriert seit: 11.09.05 ![]() Likes: 0 | Ich hab auch mal ne Java-Lösung geschrieben (Ich bin Java-Anfänger, deshalb ist sie bestimmt nicht optimal, Berechnung stimmt aber) Code: //Tagerechner.java
import java.io.*;
class Datum {
int tag = 1;
int monat = 1;
int jahr = 1901;
boolean schaltjahr = false;
int month[] = new int[12];
void getDatum() throws IOException
{
month[0]=31; month[1]=28; month[2]=31;
month[3]=30; month[4]=31; month[5]=30;
month[6]=31; month[7]=31; month[8]=30;
month[9]=31; month[10]=30; month[11]=31;
BufferedReader din = new BufferedReader(new InputStreamReader(System.in));
do {
System.out.println("Tag: ");
tag = Integer.parseInt(din.readLine());
} while (tag <= 0 || tag > 31);
do {
System.out.println("Monat (1-12): ");
monat = Integer.parseInt(din.readLine());
monat--;
} while (monat < 0 || monat > 12);
while (tag > month[monat] || tag <= 0) {
System.out.println("Der eingegebene Tag ist ungültig.\nTag: ");
tag = Integer.parseInt(din.readLine());
}
do {
System.out.println("Jahr: ");
jahr = Integer.parseInt(din.readLine());
} while (jahr < 0);
}
void ifSchaltjahr()
{
if (jahr%400 == 0) {
month[1] = 29;
} else if (jahr%4 == 0 && jahr%100 != 0) {
month[1] = 29;
} else {
month[1] = 28;
}
}
void printTage()
{
int tage = 0;
// Tage der Monate werden nach und nach hinzugezählt
for (int i=0; i<monat; i++)
{
tage += month[i];
}
// Tage im aktiven Monat werden hinzugezählt
tage += tag;
// Ergebnis wird ausgegeben
System.out.println("Zeitspanne vom 1.1." + jahr +
" bis zum " + tag + "." + (monat+1) + "." + jahr + ": "
+ tage + " Tage");
}
}
public class Tagerechner
{
public static void main(String[] args) throws IOException
{
Datum date = new Datum();
date.getDatum();
date.ifSchaltjahr();
date.printTage();
}
} |
| | |
| | #12 (permalink) |
| Registriert seit: 01.12.03 ![]() Likes: 0 | Hi, dies ist mein erster Post hier im Forum. Bin begeistert von den Programmieraufgaben und würde mir manchmal wünschen, das es mehr davon gibt. Bis jetzt habe ich nie die Möglichkeit gefunden, mal eine zu versuchen, aber jetzt habe ich mich einfach mal hingesetzt und versucht. Dies ist dabei rausgekommen. Würde mich über Verbesserungsvorschläge und Tipps freuen. Code: import java.io.*;
import java.util.StringTokenizer;
public class PrintDays {
// the day count of the months ( be careful with february )
static int months[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
// main function
public static void main(String[] args) {
StringTokenizer datum = new StringTokenizer(readDatum());
int day = Integer.valueOf(datum.nextToken(".")).intValue();
int month = Integer.valueOf(datum.nextToken(".")).intValue();
int year = Integer.valueOf(datum.nextToken(".")).intValue();
if(datum.hasMoreElements()){
System.out.println("Fehler bei der Eingabe, bitte nutzen Sie das angegebene Format.");
System.exit(-1);
}
System.out.println("\nEs sind " + calculateDays(day,month,year)
+ " Tage seit dem 01.01." + year + " vergangen");
}
// reads the date
public static String readDatum(){
String input = null;
System.out.println("Bitte geben Sie ein Datum ein. Format DD.MM.YYYY");
System.out.print("> ");
try{
BufferedReader in = new BufferedReader( new InputStreamReader(System.in) );
input = in.readLine();
} catch(Exception e){
System.out.println("Fehler bei der Eingabe");
System.exit(-1);
}
return input;
}
// calculate days
public static int calculateDays(int day, int month, int year){
int days = 0;
if( (year%4==0 && year%100!=0) || year%400==0 ){
months[1] = 29;
}
// check if month is correct
if(month <= 0 || month > 12){
System.out.println("Sie haben ein ungueltiges Datum angegeben.");
System.exit(-1);
}
// check if day is correct
if(day > months[month-1] || day <= 0){
System.out.println("Sie haben ein ungueltiges Datum angegeben.");
System.exit(-1);
}
// adding days of month
for(int i = 0; i < month-1; i++){
days += months[i];
}
// adding days of current month
days += day;
return days;
}
} |
| | |
| | #13 (permalink) |
| So hier mal meine Lösung in c++ Anmerkung ich hab vor 2 tagen mit c++ begonnen also vergebt mir wenn mein kode übelst suckt ^^. Desweiteren hab ich die ganezn kommentare auf englisch einfach weil ich nach nem englischen buch lerne "C++ for dummies" und selber englisch besser als deutsch finde :-p Also langere Rede kurzer Sinn hier meine version Code: #include <cstdio>
#include <cstdlib>
#include <iostream.h>
//prototype of getdays
int getdays(int days,int month,int year);
//main function
int main()
{
cout << "Welcome to count days v0.0001 by Ancient 4 Hackerboard.de progamming challenge\n"
<< "Please enter a date in the format dd mm yyyy\n";
int d,m,y;
cin >> d >> m >> y;
cout << "Thank you\n";
if (getdays(d,m,y) > 0)
{
cout << "Days passed from 01.01." << y << " until " << d << "." << m << "." << y << ": " << getdays(d,m,y);
}
else
{
cout << "Told ya an error occured";
return 0;
}
return 0;
}
//real getdays function
int getdays(int days,int month,int year)
{
//int array of months with corresponding day values
int monarray[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
//answer variable
int totaldays = 0;
//check that user entries are valid
if ((month < 13 && month > 0) && (days <= monarray[month]))
{
//add number of days of all full months passed at user date
for(int i = 1 ; i < month ; i++)
{
totaldays = totaldays + monarray[i];
}
//if leapyear and february included then total days incremented by 1
if ((year%400 == 0 || year%4 == 0) && (month > 2))
{
totaldays += 1;
}
totaldays = totaldays + days;
return totaldays;
}
else
{
cout << "an error has occured we will now terminate try again with real values goodbye\n" ;
return 0;
}
} MFG Ancient. | |
| | |
| | #14 (permalink) |
| Hehe 20 Zeilen ohne Datumscheck (Leerzeilen inklusive :]) Code: #include <iostream>
int main(void)
{
int d,m,y,days = 0;
short months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
std::cout << "Datum eingeben(dd mm yyyy):\n";
std::cin >> d >> m >> y;
for (int i = 0; i < m-1 ;i++)
days += months[i];
if(((y % 4) == 0 || (y % 400) == 0) && (m > 2) )
++days;
std::cout << "Seit dem 1.1. sind " << (days + d) << " Tage vergangen!\n";
return 0;
} Code: #include <iostream>
int main(void)
{
int d,m,y,days = 0;
short months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
std::cout << "Datum eingeben(dd mm yyyy):\n";
std::cin >> d >> m >> y;
if(d > months[d] || m > 12 )
return -1;
for (int i = 0; i < m-1 ;i++)
days += months[i];
if(((y % 4) == 0 || (y % 400) == 0) && (m > 2) )
++days;
std::cout << "Seit dem 1.1. sind " << (days + d) << " Tage vergangen!\n";
return 0;
} ![]() Xalon P.S:Wenn mein Programm der Aufgabe nicht nachkommt (ja ich weiß 100% kommt es ihr nicht nach ) sagt es mir ^^ | |
| | |
| | #15 (permalink) |
| Kleine Anmerkung am Rande... Wenn die Jahreszahl ohne Rest durch 400 teilbar ist, ist sie auch durch 4 teilbar. Ihr könnt Euch also eigentlich die Abfrage mit dem 'or' sparen. Sinn macht die Abfrage nach modulo 400 aber gewissermaßen schon, denn um ganz korrekt zu sein... Jahreszahlen, die durch 100 aber nicht durch 400 teilbar sind, sind keine Schaltjahre (zu mindest im gregorianischen Kalender) - bspw. 1900, 2100, 2200, 2300 etc.. Die Abfrage müsste also lauten: Code: if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) | |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| 43 Tage | Easyrider | Off topic-Zone | 2 | 01.11.09 19:28 |
| Stream Last berechnen | Easyrider | Network · LAN, WAN, Firewalls | 1 | 27.03.09 15:21 |
| a^-1 modulo m Wie berechnen? | elite-noob | Science & Fiction | 3 | 04.02.09 17:23 |
| a^-1 modulo m Wie berechnen? | elite-noob | Off topic-Zone | 3 | 04.02.09 17:23 |
| Festplattenkapazität berechnen | BlackMarvel | Off topic-Zone | 4 | 16.07.06 23:02 |