Forum: PC-Programmierung Suche Lösungsansatz Schleifenkonstrukt


von Marko_13 (Gast)


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
}

von student (Gast)


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...

von Sven H. (Gast)


Lesenswert?

Öhm... Seit wann haben alle Monate 31 Tage?

von student (Gast)


Lesenswert?

sorry, wenn du mit einem Sonntag beginnst dann i.O.

von Marko_13 (Gast)


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?

von Klaus (Gast)


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...

von yalu (Gast)


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.

von Markus (Gast)


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?

von Matthias L. (Gast)


Lesenswert?


von Lesen lernen! (Gast)


Lesenswert?

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

von Marko_13 (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.