Hilfe bei C

    • BigBiber
      BigBiber
      Bronze
      Dabei seit: 17.09.2006 Beiträge: 3.279
      Ich weiß falsches Forum hier ist wesentlich mehr Traffic ist dringend ;)
      code:
      int main(void){
      
      /* declare needed variables */
      int year, i, day;
      char* month;
      
      /* start "for" */
      for(i = 0; i <= 8; i++){
          
          /* read year from infile */
          scanf("%d", &year);
      
          day = getMonthDay(year);
            
            /* get month and day */
            if(day > 31){
              month = "April";
              day = day - 31;
            }
            else{
              month ="March";
            }
          /* write date in outfile */
          printf("%d - %s %d\n", year, month, day);
      
      }
      
        /* return 0 if works correctly */
        return 0;
      
      }
      


      Das letzte Datum wird mit mir doppelt ausgegeben ich habe schon alles mögliche versucht :f_cry:
  • 14 Antworten
    • FritzPhantom
      FritzPhantom
      Bronze
      Dabei seit: 18.08.2006 Beiträge: 396
      Bei mir wird da nichts doppelt ausgegeben.
    • BigBiber
      BigBiber
      Bronze
      Dabei seit: 17.09.2006 Beiträge: 3.279
      Original von FritzPhantom
      Bei mir wird da nichts doppelt ausgegeben.
      komisch ich bekomme das letzte Datum doppelt ausgegeben...

      Das Programm soll zu einen gegebenen Jahr die Ostertage ausgeben und die Daten werden mittels einer Infile eingelesen und in einer Outfile ausgegeben (UNIX Umleitung)

      Das letzte schreibt er mir nochmal rein...

      Hier nochmal die Methode getDayMonth falls es hilft...

      code:
      int getMonthDay(int year){
      
      /*declare needed integers */
      int golden_year, century, skipped_leap_years, correction_factor, sunday, epact, day;
      
      /* start of the Knuth algorithm */
      golden_year = year % 19 + 1;
      
      century = year / 100 + 1;
      
      skipped_leap_years = 3 * century / 4 - 12;
      
      correction_factor = ((8 * century + 5) / 25) - 5;
      
      sunday = 5 * year / 4 - skipped_leap_years - 10;
      
      epact = (11 * golden_year + 20 + correction_factor - skipped_leap_years) % 30;
      
         if(epact == 25){
           if(golden_year > 11){
             epact = epact + 1;
           }
         }
         else if(24 == epact){
           epact = epact + 1;
         } 
      
      day = 44 - epact;
         
         if(day < 21){
           day = day + 30;
         }
      
      day = day + 7 - ((sunday + day) % 7);
      
      /* return day */
      return day;
      }
      
    • Kampfschildkroete
      Kampfschildkroete
      Bronze
      Dabei seit: 05.06.2006 Beiträge: 1.840
      Bei mir kennt er "getMonthDay" nicht.
    • CKWebsolutions
      CKWebsolutions
      Bronze
      Dabei seit: 30.04.2007 Beiträge: 2.171
      Laut Code läuft das Ding neun mal durch und kliest jedes Mal ein Jahr aus Infile.
      Kanns sein, dass du da einfach zweimal das selbe Jahr drin stehen hast an Stelle 8 und 9?
    • FritzPhantom
      FritzPhantom
      Bronze
      Dabei seit: 18.08.2006 Beiträge: 396
      code:
      int main(void){
      
      /* declare needed variables */
      int year, i, day;
      char* month;
      
      /* start "for" */
      for(i = 0; i <= 8; i++){
          
          /* read year from infile */
          [B]if (scanf("%d", &year) != -1) {[/B]
      
          day = getMonthDay(year);
            
            /* get month and day */
            if(day > 31){
              month = "April";
              day = day - 31;
            }
            else{
              month ="March";
            }
          /* write date in outfile */
          printf("%d - %s %d\n", year, month, day);
          [B]}[/B]
      }
      
        /* return 0 if works correctly */
        return 0;
      
      }
      
      


      So sollte es funktionieren, hängt irgendwie mit der Pipe zusammen, war bei mir auch doppelt dann.
    • BigBiber
      BigBiber
      Bronze
      Dabei seit: 17.09.2006 Beiträge: 3.279
      Vielen Dank =)

      Wenn du einen Stars Account hast gibt mal die SN bekommst dann noch 5$ dafür ;)
    • daegga
      daegga
      Bronze
      Dabei seit: 11.02.2007 Beiträge: 2.255
      ich schätz mal du denkst, er läuft nur 8 mal durch die schleife...sind aber 9 mal
      ergo benötigst du auch 9 jahreszahlen im inputfile...sonst wird das letzte einfach wiederverwendet (du setzt den wert ja nicht zurück)
      die for-schleife ist sowieso schwachsinn...while-schleife bis du keinen input mehr bekommst (die abfrage dafür hat firtzphantom ja schon geschrieben)
      außer du willst aus irgendeinem grund auf 9 zahlen begrenzen...dann exakt den code von fritzphantom nehmen
    • BigBiber
      BigBiber
      Bronze
      Dabei seit: 17.09.2006 Beiträge: 3.279
      Original von daegga
      ich schätz mal du denkst, er läuft nur 8 mal durch die schleife...sind aber 9 mal
      ergo benötigst du auch 9 jahreszahlen im inputfile...sonst wird das letzte einfach wiederverwendet (du setzt den wert ja nicht zurück)
      die for-schleife ist sowieso schwachsinn...while-schleife bis du keinen input mehr bekommst (die abfrage dafür hat firtzphantom ja schon geschrieben)
      außer du willst aus irgendeinem grund auf 9 zahlen begrenzen...dann exakt den code von fritzphantom nehmen
      Stimmt jetzt wo du es sagt sowas fällt einen gar nicht auf meistens zumindest nicht weil mein eigentlich immer i mit 0 setzt^^ ist zumindest häufiger
      Man könnte auch eine while schleife in erwägung ziehen mal gucken...
    • daegga
      daegga
      Bronze
      Dabei seit: 11.02.2007 Beiträge: 2.255
      darum nimmt man als bedingung auch "<" und nicht "<=" ... dann verwirrt einen die zahl nicht ;)
      wenn du bei for-schleifen schon probleme bekommst, dann pass gut bei arrays und stringoperationen auf...die dinger sind viel zu fehleranfällig bei C
    • BigBiber
      BigBiber
      Bronze
      Dabei seit: 17.09.2006 Beiträge: 3.279
      So siehts jetzt aus

      code:
      int main(void){
      
      /* declare needed variables */
      int oldyear, actualyear, day;
      char* month;
      oldyear = 0;
      
      /* endlosschleife */
        while(1){
      
          /* get year */
          scanf("%d", &actualyear);
      
           if(oldyear != actualyear){
      
             day = getMonthDay(actualyear);
            
             /* get month and day */
               if(day > 31){
                 month = "April";
                 day = day - 31;
               }
               else{
                 month ="March";
               }
      
           /* write date in outfile */
           printf("%d - %s %d\n", actualyear, month, day);
           oldyear = actualyear;
           }
           else{
             break;
           }
        }
      
      return 0;
      
      }
      


      normalerweise habe ich keine probleme damit aber es gibt Fehler die weil gerade so offentsichtlich sind übersehen werden^^
    • daegga
      daegga
      Bronze
      Dabei seit: 11.02.2007 Beiträge: 2.255
      naja, so offensichtlich sind die ja nicht...ein kleines zeichen mehr oder weniger, eine zahl auf oder ab... das fällt beim drüberlesen nicht so schnell auf ... und wenn mans dann am schluss entdeckt, kommt man sich saublöd vor, für soetwas so lange zum debuggen gebraucht zu haben...


      ich kenn jetzt deine aufgabenstellung nicht, aber deine lösung schaut mir wie ein workaround aus, der nicht 100%ig funktioniert. wenn ich zufällig 2 mal die gleiche zahl mittendrin ins file schreibe, dann bricht dein algorithmus ab.
      wenn dus unbedingt mit break machen willst (wird ja nicht so gerne gesehen), dann:
      code:
      if (scanf("%d", &actualyear) == -1)
         break;
      
    • halfmoon
      halfmoon
      Bronze
      Dabei seit: 27.01.2008 Beiträge: 1.512
      Nur so am Rande, Variablen sauber deklarieren und auch INITIALISIEREN, gerade in C. Sollte manchmal grobe Fehler vermeiden, vorallen wenn man mit Pointern hin und herwirft. Man weiss ja nie was vorher in der Speicheradresse fürn Kram drin stand ;)
    • BigBiber
      BigBiber
      Bronze
      Dabei seit: 17.09.2006 Beiträge: 3.279
      ok danke für den Tipp ;)

      Es gab so ein Problem schon mal mit der doppelten Ausführung da lag es aber daran das sp lange ausgegeben wird bis er eine 0 findet laut dem Dozent deswegen fiel die Schleife nicht unter Generalverdacht ;)
    • BigBiber
      BigBiber
      Bronze
      Dabei seit: 17.09.2006 Beiträge: 3.279
      Original von halfmoon
      Nur so am Rande, Variablen sauber deklarieren und auch INITIALISIEREN, gerade in C. Sollte manchmal grober Fehler vermeiden, vorallen wenn man mit Pointern hin und herwirft.
      Wir hatten erst 2 Vorlesungen in C und Pointern auch noch nichts am Hut^^