mikrocontroller.net

Forum: PC-Programmierung Suche Lösungsansatz Schleifenkonstrukt


Autor: Marko_13 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi all.

Ich bin neu in der Welt der C++ Prgrammierung.
Bin gerade dabei die Struktur von C++ zu erlernen.
Ich arbeite das Buch "C++ programmieren lernen", vom Addison Wesley 
Verlag durch.
Ich denke, das ich das Buch gut verstehe.

Mein "Hänger" liegt eher nicht am Verständnis der Prgrammierung, sondern 
am Ansatz einer Lösung für folgendes Problem.

Im Buch ist ein Übung:

Es soll ermittelt werden, wie oft "Freitag der 13te" in einem Jahr 
vorkommen kann.
Die Übung soll nur mit den, bisher bekannten, Schleifenkontrukten (for 
und while) bzw. case-Anweisung erfolgen.
Ich möchte bewußt die Übung ohne eine "case-Anweisung" lösen.

Real kommt "Freitag der 13te mindestens 1-mal maximal 3-mal im Jahr vor)

Mit meinem Code hätten wir diesen Tag wohl jeden Monat. :(
Wo und wie kann ich den Code ändern, dass der Monat (tag_monat) nicht 
immer bei Montag(tag_woche) beginnt.

Danke für eure Hilfe


#include <iostream>

using namespace std;



int main()
{
     int tag_woche, tag_monat, freitag_13=0;
    

    for(int monat=1;monat<=12;monat++)
    {

        for(tag_monat=1; tag_monat<=31;tag_monat++)
        {
            for(tag_woche=1;tag_woche<=7;tag_woche++)
            {
                if(tag_woche==5)
                {
                    if(tag_monat==13)
                    {
                        freitag_13+=1;
                    }
                }
                cout << "tag_woche = " <<  tag_woche << endl;

            }
          cout << "tag_monat = " <<  tag_monat << endl;
        }
      cout << "Freitag der 13te = " <<  freitag_13 << endl;
    }

    return 0;
}



Autor: student (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du deine tage, und monate bei 0 initialisierst dann ist Freitag = 4

Montag = 0
Di 1
Mi 2
Do 3
Fr 4

Nicht jeder Monat hat 31 Tage...

überleg dir das konzept noch einmal...

Autor: Sven H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Öhm... Seit wann haben alle Monate 31 Tage?

Autor: student (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, wenn du mit einem Sonntag beginnst dann i.O.

Autor: Marko_13 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok - Sven H. - Stimmt.
Einfachheithalber wollte ich erst einmal alle Monate mit 31 Tagen 
versehen.
Auch wenn ich damit nicht auf die reale Anzahl der Freitags kommen 
würde.

Macht es denn einen Unterschied die Tage und Monate mit 0 zu 
initialisieren anstatt mit 1?
Es wird doch nur "hochgezählt". Oder?

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Marko_13: Bist du auch neu in  der Welt des Lesens? Wenn nein, dann 
hast du bestimmt nen anderen guten Grund, warum du dein Thema in der 
Codesammlung erstellt hast...

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ähnlich könnte das gehen:
#include <iostream>

using namespace std;

int main() {
  // Anzahl der Tage pro Monat
  static int tpm[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  int et;       // erster Wochentag im Jahr, 0..6
  int sj;       // Schaltjahr? 0=nein, 1=ja
  int m;        // Monat, 0..11
  int wt;       // Wochentag des 13. eines Monats, 0..6
  int n, nmax;  // Anzahl und max. Anzahl der 13. Freitage

  nmax = 0;
  // Das Jahr kann ein normales oder ein Schaltjahr sein
  for(sj=0; sj<2; sj++) {
    // Das Jahr kann mit einem von 7 Wochentagen beginnen
    for(et=0; et<7; et++) {
      // für jede der obigen 2*7 Kombinationen werden die 13. Freitage gezählt
      n = 0;
      wt = (et+12) % 7;           // Wochentag des 13. Januar
      for(m=0; m<12; m++) {       // Schleife über alle Monate
        if(wt==5)                 // Freitag?
          n++;                    //   wenn ja, dann zählen
        wt = (wt+tpm[m]) % 7;     // Wochentag des 13. des nächsten Monats
      }
      if(n>nmax)                  // Neues Maximum gefunden?
        nmax = n;
    }
    tpm[1] = 29;            // für zweiten Durchlauf Schalttag berücksichtigen
  }
  cout << nmax << endl;     // Ergebnis
  return 0;
}

Wenn du möchtest, kannst du die Variablen m, et und wt als Enums über
alle Monats- bzw. Wochentagsnamen definieren.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob der Montag nun 0 oder 1 ist, ist doch egal, das kann man festlegen 
wie man will. Man muss nur aufpassen wenn man fertige Funktionen 
benutzt, dort ist das oft 0.

@Marko:
Wie entscheidest Du denn, ob ein Tag ein Freitag ist?

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Lesen lernen! (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
*Wenn ihr eigene Programme oder Anleitungen geschrieben habt könnt ihr 
sie hier posten. Fragen werden gelöscht!!!!!!*

Autor: Marko_13 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Klaus: Ich spüre in deinen Worten etwas Frustration.
         Ist Dir noch kein Fehler unterlaufen?
         Nimm dir ein Beispliel an " Lesen lernen! (Gast)"
         Das ist ein Hinweis, welcher bei mir ankommt.
         Also, lies und lern auch du!!!

@yalu:   Danke für deine Arbeit.
         Doch Felder sind zu dieser Übung noch nicht erlaubt.
         Werde mir dein Code aber sehr gern annehmen. :o)

@Markus: Ich werde mir angwöhnen, bei 0 anfangen zu zählen.
         Wie ich nach dem Freitag frage?
         Ich würde fragen, ob die Variable 'tag_woche' den Wert 5 
besitzt
         und dann evtl durch den Operator '&&' den 'tag_monat' nach dem 
Wert
         13 abfragen. Wenn beides der Wahrheit entspricht sollte ich den
         ersten 'freitag_13' haben. Oder?

Danke euch allen.

Bei Bedarf kann der Threat geschlossen werden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.