Suche Lösungsansatz Schleifenkonstrukt

Gast #1046272
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

1
#include <iostream>
2

3
using namespace std;
4

5

6

7
int main()
8
{
9
     int tag_woche, tag_monat, freitag_13=0;
10
    
11

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

15
        for(tag_monat=1; tag_monat<=31;tag_monat++)
16
        {
17
            for(tag_woche=1;tag_woche<=7;tag_woche++)
18
            {
19
                if(tag_woche==5)
20
                {
21
                    if(tag_monat==13)
22
                    {
23
                        freitag_13+=1;
24
                    }
25
                }
26
                cout << "tag_woche = " <<  tag_woche << endl;
27

28
            }
29
          cout << "tag_monat = " <<  tag_monat << endl;
30
        }
31
      cout << "Freitag der 13te = " <<  freitag_13 << endl;
32
    }
33

34
    return 0;
35
}
Gast
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...
Gast
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?
Gast
@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...
Gast
So ähnlich könnte das gehen:
1
#include <iostream>
2

3
using namespace std;
4

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

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

Wenn du möchtest, kannst du die Variablen m, et und wt als Enums über
alle Monats- bzw. Wochentagsnamen definieren.
Gast
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?
Gast
@ 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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.