Suche Lösungsansatz Schleifenkonstrukt

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

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 #1046299
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?
Gast #1046391
Lesenswert?
• ▲
▼
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 #1046397
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?
Gast #1047047
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren