C Schaltjahre berechnen lassen + Tabelle erstellen

DrToxic

Rear Admiral
Registriert
Juni 2008
Beiträge
6.068
Hi,

ich habe hier zwei Aufgaben, die ich bis Montag fertig haben soll:

1.: Einen Algorithmus entwerfen, der prüft, ob ein Jahr ein Schaltjahr ist oder nicht und diesen anschließend in C implementieren.
Dabei soll eine ganze Zahl eingelesen werden und das Programm gibt aus, ob das Jahr ein Schaltjahr ist oder nicht.
( Wenn man einmal weiß, dass Schaltjahre alle 4 Jahre vorkommen, jedoch nicht in vollen Jahrhunderten, sondern nur alle 4 volle Jahrhunderte, ist die Ausgabe easy :D )

Bisher ist das mein Code:
Code:
#include <std io.h>
voidmain(void) {
int n ;
printf("Jahr eingeben");
scanf ("%d", &n);
if ((n%400==0) || (n%4=0 && n%100!=0)){
printf ("Schaltjahr");
} else {
printf ("kein Schaltjahr");
}
}

2.: Ich soll eine Liste erstellen, die die Jahre zwischen beliebigen ganzen Zahlen n und m in definierbaren Schritten darstellt und rechts davon, ob es ein Schaltjahr ist oder nicht.
Das Grobe ist klar, ich brauche n, m und die Schrittzahl, n-(m-1) Zeilen, zwei Spalten und halt die Schaltjahrprüfung aus Aufgabe 1.

Ich kann nur aufs Verrecken nicht herausfinden, wie ich in C eine Tabelle erstelle - könnte mir da jemand helfen?
 
Zuletzt bearbeitet:
mit der tabelle ist bestimmt nur gemeint, dass es sauber untereinander steht.

beim schaltjahr musst du ersma überprüfen obs nen volles jahrhundert ist, wenn nicht, dann iwas mit modulo.
(glaub JAHR%4 und wenn das 0 ist hast du schaltjahr oda so)
 
Pyroplan schrieb:
mit der tabelle ist bestimmt nur gemeint, dass es sauber untereinander steht.
Hmm.. selbst dann weiß ich nicht wirklich, wie ich das realisieren soll, dass n-(m-1) bzw n-m+1 Zeilen erstellt werden.

Pyroplan schrieb:
beim schaltjahr musst du ersma überprüfen obs nen volles jahrhundert ist, wenn nicht, dann iwas mit modulo.
(glaub JAHR%4 und wenn das 0 ist hast du schaltjahr oda so)
Genau, so steht es ja in meinem code oben drin, einfach nur auf "Spoiler" klicken, hab das der Übersicht halber darin versteckt :D

Wenn modulo x == 0, ist die Zahl ohne Rest durch x teilbar :)
 
Hallo,

ich würde eine Funktion dafür schreiben, z. B.

int is_leap_year(int year)
{
return (year % 4) == 0 && (year % 100) != 0 || (year % 400) == 0;
}

(2) würde dann z.B. aussehen:

int main() {
int ab, bis;
scanf("%d %d", &ab, &bis);
for(int j = ab; j <= bis; ++j)
printf("%d %d\n", j, is_leap_year(j));

return 0;
}

Das sollte im wesentlichen passen.
 
Jo du brauchst keine andere Datenstruktur "Tabelle" oder änliches sondern kannst das direkt in einer Schleife ausgeben indem immer deine eigene Funkion aufgerufen wird die das überprüft
Die wollen bestimmt nur sowas sehen wie

Code:
Jahr | Schaltjahr?
--------------
1999 | Nein
2000 | Ja
2001 | Nein

Dh du schreibst einmal den "Kopf" der Tabelle von Hand (die ersten 2 Zeilen) und dann mit einer Schleife jedesmal
jahr " | " istSchaltjahr(jahr)

Es wäre also insgesamt sinnvoll deinen obigen Code in eine Funktion wie "void istSchaltjahr(int jahr)" auszulagern, damit sie in der Schleife immer aufgerufen werden kann
 
Zuletzt bearbeitet:
convexus schrieb:
Hallo,

ich würde eine Funktion dafür schreiben, z. B.

[...]

Das sollte im wesentlichen passen.
Ich bin ja mal der Meinung das war viel zuviel Spoiler! Jetzt ist nichts mehr zum selbst überlegen übrig.
 
sry hatte vorhin zeitmangel und konnte es mir deswegen nicht mehr ansehen.
wenn du es so hattest ist doch gut^^
was die tabelle angeht wurd ja jetzt auch shcon einiges gesagt
 
@belbono:
Da haste wahrscheinlich recht. Mich hat diese Codezeile dazu veranlasst

if ((%400==0) || (%4=0 && %100!==0)){
 
convexus hatt ja schon alles geschrieben :-)

Aber wenn ich folgendes im original Posting sehe :

Code:
if ((%400==0) || (%4=0 && %100!==0))

DrToxic du weist schon das eine Prüfung auf Ungleicheit
Code:
!=
und nicht
Code:
!==
ist ? Und auch das du kein Modulo auf die Variable n machst ... Ich frage mich gerade was ein Kompiler dazu sagen würde ...
 
Danke für die vielen Antworten! :)

kuddlmuddl schrieb:
Dh du schreibst einmal den "Kopf" der Tabelle von Hand (die ersten 2 Zeilen) und dann mit einer Schleife jedesmal
jahr " | " istSchaltjahr(jahr)
Danke, das hat mir echt weiter geholfen :)
Peinlich ist jetzt nur, dass ich jetzt nicht weiß, wie ich es hinbekommen soll, dass er das Jahr vorne in die Zeile setzt, printf("i") wird sicherlich nicht funktionieren..

Mein bisheriger Code wäre in etwa so:
Code:
int m, n, o;
printf("Startjahr eingeben");
scanf("%d" &m);
printf("Endjahr eingeben");
scanf("%d" &n);
printf("Schritt eingeben");
scanf("%d" &o);
printf("Jahr | Schaltjahr");
printf("_________________");
for (i=m, j=n; i=j; i=i+o) {
/*Jahreszahl des aktuellen Schritts*/ if ((i%400==0) || (i%4=0 && i%100!==0)){
printf (" | ja");
} else {
printf (" | nein");
}
kuddlmuddl schrieb:
Es wäre also insgesamt sinnvoll deinen obigen Code in eine Funktion wie "void istSchaltjahr(int jahr)" auszulagern, damit sie in der Schleife immer aufgerufen werden kann
Wie man sicherlich gemerkt hat, bin ich absoluter Anfänger. Bisher haben wir uns mit dem void am Anfang gar nicht beschäftigt, uns wurde nur gesagt, dass wir das erstmal immer hinschreiben sollen, bis das in der Vorlesung behandelt wurde.
Ist aber an sich nur eine Schönheits- bzw Performancekorrektur, oder?

Zunra schrieb:
DrToxic du weist schon das eine Prüfung auf Ungleicheit
Code:
!=
und nicht
Code:
!==
ist ?
Nein, wusste ich nicht, danke :)

Zunra schrieb:
Und auch das du kein Modulo auf die Variable n machst ...
Wieso macht man das nicht? Ich bin mir ziemlich sicher, dass wir das in der Übung so gemacht haben, als es darum ging, zu ermitteln, ob eine Zahl auf "3" endet.

Also n = beliebige Zahl und dann wenn n modulo 10 == 3 --> letzte Zahl = 3, weil der Rest der Division durch 10 = 3 ist.

Zunra schrieb:
Ich frage mich gerade was ein Kompiler dazu sagen würde ...
Klingt jetzt lustig aber.. ich hab noch nie kompiliert.
Würde ich aber gern mal, dann müsste ich nicht hier wegen jeder Kleinigkeit nachfragen und könnte selbst nach Fehlern suchen.

Ich hatte mal danach gegoogelt, aber C-Compiler gibt's ja wie Sand am Meer. Nehm ich da einfach irgendeinen?

P.S.: Code im Eingangspost korrigiert
 
Zuletzt bearbeitet:
Ja du sollst Modulo auf n machen, du hast aber (%100) geschrieben und nicht (n%100) :)

Nachtrag :
Eine kostenlose IDE wäre:
http://www.eclipse.org/callisto/c-dev.php

Ist zwar für den Moment mit Kanonen auf Spatzen geschossen, aber wenn man sich erst mal mit eclipse angefreundet hat, kann man es auch für C++ und Java benutzen.
 
Zuletzt bearbeitet:
Kümmer dich am besten erstmal um einen Compiler und Entwiclungsumgebung.. nur in ner Textdatei programmierne kann jeder. Vor allem die ganzen schönen Fehlermeldungen beim ersten Kompilieren muss man auch kennen lernen ;-)
zB:
Code::Blocks
Bloodshed Software - Dev-C++
oder größer:
Microsoft Visual Studio 2010 Express
bzw. die genannte Eclipse-Entwicklungsumgebung

Als Tipp für eine Ausbaufähige Zwischenlösung:

Schreib eine Schleife die einfach nur die Jahreszahl untereinander schreibt. Also wenn dein programm mit 1999 2001 aufgerufen wird sollte einfach nur
Code:
1999
2000
2001
in der Konsole stehen.

Hattet ihr schon Funktionen? Dann wäre die andere sinnvolle Zwischenlösung die Entscheidung Schaltjahr vs. kein-Schaltjahr in eine Funktion auszulagern und einfach aufzurufen.
Dh dein Programm macht sowas wie
printf( istSchaltjahr(jahr) );
Dies ist aber nicht nötig.. Wenn du nur "Schleifen" und "Bedingungen" (if/else) hattest reicht das auch um die Tabellen-Aufgabe zu lösen. Mach die obere Zwischenlösung mit den Jahreszahlen mal zu erst
 
Zuletzt bearbeitet:
Eclipse würde ich dir für den Anfang nicht unbedingt empfehlen, da du den Compiler selbst installieren und in Eclipse einbinden musst. Aber wenn du dich für diesen Weg entscheiden solltest, wird dir das hier helfen: klick mich
 
Soo, sorry, dass ich mich erst jetzt wieder melde, aber in der Hochschule geht's im Moment drunter und drüber, hab alle Hände voll zu tun :)

Dank eurer Tipps und einer Menge Suchmaschinenarbeit konnte ich nun beide Programme zur vollsten Zufriedenheit meiner Dozenten fertig stellen - das mit den do-while-Schleifen mit Rückfragen an den Anwender und das grafische Aufhübschen mit den "unsichtbaren Platzhaltern" (%5d) war zwar etwas übers Ziel hinaus geschossen, hat mir aber ein dickes Lob eingebracht :D

Code 1
Code:
#include <stdio.h>
void main(void){
    int n;
    printf("Jahr eingeben \n");
    scanf("%d", &n);
    if((n%400==0) || (n%4==0 && n%100!=0)) {
        printf("Schaltjahr \n");
    } else {
        printf("kein Schaltjahr \n");
        }
    }
Code 2
Code:
#include <stdio.h>
void main(void){
    int i, m, n, o;
    printf("Startjahr eingeben \n");
    scanf("%d", &m);
    do {
        printf("Endjahr eingeben \n");
        scanf("%d", &n);
        if (n<m) {
            printf("Endjahr muss eine groessere Zahl als Startjahr sein! \n");
            }
        } while(n<m);
    do {
        printf("Schritt eingeben \n");
        scanf("%d", &o);
        if (o<=0) {
            printf("Schrittweite darf nicht 0 oder kleiner sein! \n");
            }
        } while (o<=0);
    printf(" Jahr | Schaltjahr \n");
    printf("__________________ \n");
    for (i=m; i<=n; i=i+o) {
        if((i%400==0) || (i%4==0 && i%100!=0)) {
            printf("%5d | ja \n", i);
        } else {
            printf("%5d | nein \n", i);
            }
        }
    }
Hat sogar mit dem Kompilieren geklappt ;)

Ich habe nur trotzdem noch eine Frage:

Dort im Praktikum benutzen wir Microsoft Visual Studio 2010 Professional, über MSDNAA kann ich jedoch "nur" das 2008er beziehen. Ich wollte da eigentlich morgen mal nachfragen, ob da was bezüglich 2010 geplant ist, aber nachdem ich gesehen habe, dass die Einzellizenz für 2010 professional 949,00 Euro kostet (!! :freak: ), halte ich das für unwahrscheinlich. Naja, fragen kostet ja nichts..

Bei wikipedia sieht es so aus, als würde die 2010er Version schon einige Neuerungen bringen, was mach ich denn nun?

nehme ich:
a) Microsoft Visual Studio 2010 Express?
b) Microsoft Visual Studio 2008 Professional?
oder c) soll ich das komplett sein lassen und mich direkt in die 1337-open-source compiler einarbeiten? ;)

(oder d) Microsoft Visual Studio 2010 Professional für deutlich mehr als ein Monatsgehalt kaufen? :lol: )
 
Glückwunsch erstmal ;) Da hast du aber ne steile Lernkurve gehabt :)

Bei uns im msdn aa gibts auch 2010 afaik. Aber ich glaube die Unis müssen dafür zahlen und kaufen daher evtl nicht jedesmal die aktuellste Lizenz.
Ich find aber grundsätzlich komisch wenn auf euren Uni-Rechnern nen lizensiertes 2010 läuft aber ihr dieses nicht über msdnaa nach hause mitnehmen könnt. Da müsste die Uni ja dann auch Lizenzgebühren zahlen?

Um auf Uni-Übungs-Niveau zu Programmieren ist garantiert 2008 oder auch 2010 express ausreichend.
Ich denke, das aller wichtigste ist, das gleiche zu nutzen was die anderen haben. Bestimmt (hoffentlich?^^) arbeitet ihr bald in Gruppen und da macht es garantiert keinen Spaß, wenn jeder eine andere Entwicklungsumgebung nutzt weil ihr dann die Projekte schlecht austauschen könnt.
 
Bei der MSDNAA werden Rahmenverträge geschlossen mit unterschiedlichen Abstufungen. Das Paket, in dem 2008 drin ist (Developer AA imo), da ist auch 2010 drin. Frag einfach mal nach, ob der zuständige Admin das freischaltet (Email des verantwortlichen gibt es auf deiner MSDNAA Seite direkt).
 
kuddlmuddl schrieb:
Glückwunsch erstmal ;) Da hast du aber ne steile Lernkurve gehabt :)

Naja, von nichts kommt nichts ;)
Ist ja schön, wenn man nach einer Menge Arbeit das Ergebnis sieht :)

Ich habe heute mit dem MSDNAA-Admin gesprochen und er hat alle 2010er Versionen freigeschaltet.
Ich lade mir gerade Visual Studio 2010 Ultimate runter - das kostet einfach mal 4.000 Euro bei Amazon... :freak:

Aber damit hat sich die Frage dann ja auch erledigt :D


edit:
hier stand Mist
 
Zuletzt bearbeitet:
Zurück
Oben