Geburtsjahr



  • Halli Hallo,

    ich habe folgendes Problem. Ich soll ein Programm realisieren, welches das Alter abfragen soll und dann das Geburtsjahr errechnen soll.

    Dadurch das ich schon einiges von euch gelernt habe, wollte ich das so machen, das er mir das Alter in einem Array abspeichert. Also das schon bei der Eingabe überprüft wird, ob es sich um eine Zahl handelt oder nicht. Hier der Code dazu:

    do
    {
    	in =getc(stdin);
    
    		if((in ==127) || (in ==8))			//127 für Backspacetaste, 8 erkannte er mir nicht, obwohl 8 laut ascii backspace ist.
    			{															// if anweisung für Backspace 
    				if(count >0)
    							{
    								printf("\b \b");
    								--count;								
    							}
    
    				continue;
    			}
    
    		if(in == '\n')									// Entertaste zum verlassen der der Schleife
    			break;
    
    		if(isdigit(in))
    			{
    				alter[count++] = in;				// Ausgabe von Ziffer
    				putc(in, stdout);
    			}
    }
    	while(count <3);
    

    Der sollte meiner achtens auch funktionieren. Jetzt habe ich folgendes Problem:
    Ich habe eine Funktion geschrieben, welche mir das Geburtsjahr über time.h ausrechnen soll. Folgende:

    int Geburtsjahr(int alter) 
    {
    	int geburtsjahr;
    
    	int dyear;			/* Auslesen der Zeit über time.h*/
    	struct tm *year;		/*www.programmieren.com/C-Lernen.html#Headerdateien*/
    	long jetzt;			
    	time(&jetzt);			
    	year = localtime(&jetzt);
    	dyear = year->tm_year + 1900;
    
    	geburtsjahr = dyear - alter;	/* Berechnen des Alters */
    
      return geburtsjahr;
    
    }
    

    Die Funktion funktioniert auch. schon getestet.
    So nun steh ich da mit offenem Haar und weiß nicht, wie ich mein Array in die Geburtsjahr-Funktion rein kriege das er damit rechnen kann.. kann mir da einer helfen?

    Hier einmal der komplette Code:

    /*
    2. Realisieren Sie ein C-Programm, das über die Standard-Eingabefunktion "scanf()"
       das aktuelle Alter abfragt und als Ergebnis das jeweilige Geburtsjahr anzeigt.
    */
    
    #include<stdio.h>
    #include<time.h>
    #include<stdlib.h>
    #include<ctype.h>
    
    int Geburtsjahr(int alter) 
    {
    	int geburtsjahr;
    
    	int dyear;			/* Auslesen der Zeit über time.h*/
    	struct tm *year;		/*www.programmieren.com/C-Lernen.html#Headerdateien*/
    	long jetzt;			
    	time(&jetzt);			
    	year = localtime(&jetzt);
    	dyear = year->tm_year + 1900;
    
    	geburtsjahr = dyear - alter;	/* Berechnen des Alters */
    
      return geburtsjahr;
    
    }
    
    int main(void)
    {
    char alter[4];
    char in;
    int count =0;
    size_t length;
    
    printf("Wie alt sind Sie, oder werden Sie dieses Jahr?\n");
    
    					system("stty -icanon -echo");
    
    do
    {
    	in =getc(stdin);
    
    		if((in ==127) || (in ==8))			//127 für Backspacetaste, 8 erkannte er mir nicht, obwohl 8 laut ascii backspace ist.
    			{															// if anweisung für Backspace 
    				if(count >0)
    							{
    								printf("\b \b");
    								--count;								
    							}
    
    				continue;
    			}
    
    		if(in == '\n')									// Entertaste zum verlassen der der Schleife
    			break;
    
    		if(isdigit(in))
    			{
    				alter[count++] = in;				// Ausgabe von Ziffer
    				putc(in, stdout);
    			}
    }
    	while(count <3);
    
    		alter[count] ='\0';
    
    		length = strlen(alter);
    
    	switch(length)
    		{
    			case 3:
    				if(alter[0] !="1")
    					{
    						printf("Ungültige Alterseingabe!");
    						break;
    					}
    				if(alter[1] >"2")
    					{
    						printf("Sie wären der älteste Mensch der Welt, gratulation! Sie sind %i geboren!\n",Geburtsjahr(alter));
    						break;
    					}
    				else
    					{
    						printf"Sie sind %i geboren!\n",Geburtsjahr(alter));
    					}
    
    			case 2:
    				printf("Sie sind %i geboren!\n",Geburtsjahr(alter));
    				break;
    
    			case 1:
    				if(alter[0] <5)
    					{
    						printf("Sie sind aber ganz schön jung! Dennoch wurden Sie %i geboren!\n",Geburtsjahr(alter));
    					}
    				else
    					{
    						printf("Sie wurden %i geboren!\n",Geburtsjahr(alter));
    					}
    		}
    
    								system("stty icanon echo");
    return 0;
    }	/*			
          if(alter >=123)
            {
              printf("Sie wären der älteste Mensch der Welt, Glückwunsch! Sie sind %i geboren!\n", Geburtsjahr(alter));
            } 
          if(alter <=5)
           {
              printf("Sie sind aber noch sehr jung! Sie sind %i geboren!\n", Geburtsjahr(alter));
           }
          if((alter < 123) && (alter >5)) 
            {
              printf("Sie wurde %i geboren!\n", Geburtsjahr(alter));
            }
          else
            {
           printf("Eingabe enthielt nicht gültige Zeichen!\n");
            }
      return 0;
    }				
    
    */
    

    Er ist leider noch nicht getestet und die Switch anweisungen sind auch das erste mal das ich sowas schreibe. Weiß also nicht ob die funktionieren. Der Teil zum Schluss ist auskommentiert, da ich wie gesagt schon ne weile hin und her wusel um etwas passendes zu finden.

    Grüße und Danke schonmal. 👍



  • Kannst du nicht lesen?
    Du sollst scanf verwenden; was machst du? Du verwendest deinen untauglichen Müll aus der vorigen Aufgabe.



  • Also, es ist ein unding, das man dich noch nicht gesperrt hat für deine Aussagen hier. Unglaublich noch nie erlebt... Wenn du nicht kompetentes abzugeben hast, dann lass es. Deine Kollegen haben das was ich geschrieben habe mitenwickelt. Also beleidigst du nicht nur mich sondern auch die anderen, also bitte.. reiß dich etwas zusammen.

    Nur weil da steht scanf heißt es ja nicht, das ich nicht auch etwas über den Tellerrand schauen kann...

    Aber gut. Vielen Dank auch für deine Hilfe lieber Wutz.



  • Zuerst mal würde ich deinen Code zur Alterseingabe mit einer einfache 'lese-int-aus' -Funktion ersetzen.
    Dann würde ich eine Funktion schreiben, die mir das aktuelle Jahr zurück gibt.
    Der Rest ist ziemlich einfach.

    Code könnte so aussehen:
    Edit: Habe beim schreiben des Codes aus irgendeinem Grund nicht an die Existenz von scanf gedacht. read_age ist also ziemlich unnötig.

    #include <stdio.h>
    #include <time.h>
    
    int read_age()
    {
    	// Puffer erstellen und aus stdin lesen
    	static const size_t BufSize = 20;
    	char buf[BufSize];
    	fgets(buf, BufSize, stdin);
    
    	// Puffer zu int parsen und zurückgeben
    	return (int)strtol(buf, NULL, 10);
    }
    
    int current_year()
    {
    	// Aktuelle Zeit erhalten
    	time_t now;
    	if(time(&now) == (time_t)-1)
    		return -1;
    
    	// Zeit in unserer lokalen Zeitzone
    	struct tm *cur_localtime = localtime(&now);
    	if(!cur_localtime)
    		return -1;
    
    	// Jahr ausrechnen und zurückgeben
    	return 1900 + cur_localtime->tm_year;
    }
    
    int main()
    {
        // TODO: Jegliche Fehlerüberprüfung
    
    	printf("Wie alt sind Sie? ");
    	int age = read_age();
    	int cur_year = current_year();
    
    	int byear = cur_year - age;
    
    	printf("Sie wurden %d geboren!\n", byear);
    
    	return 0;
    }
    


  • Vielen Dank für die Antwort Singender Holzkübel.

    Sehr nett von dir.



  • Singender Holzkübel schrieb:

    Der Rest ist ziemlich einfach.

    Funktioniert nur nicht, wenn der Benutzer in diesem Jahr noch nicht Geburtstag hatte. Aber das ist ein grundsätzliches Problem der Aufgabe.

    @moses030: Du bist drollig.



  • Warum drollig? Was da los?



  • moses030 schrieb:

    Nur weil da steht scanf heißt es ja nicht, das ich nicht auch etwas über den Tellerrand schauen kann...

    scanf macht die Sache aber sehr viel einfacher (und portabel).

    Wenn du etwas eigenes machen möchtest, dann schreibe eine Funktion, die du seperat testen kannst.
    Dann brauchst du in deinem Programm nur den Aufruf von scanf durch deine Funktion ersetzen.

    moses030 schrieb:

    Also, es ist ein unding, das man dich noch nicht gesperrt hat für deine Aussagen hier. Unglaublich noch nie erlebt... Wenn du nicht kompetentes abzugeben hast, dann lass es.

    Wutz ist sehr direkt.
    Wenn dich so etwas stört, wirst du in Interenetforen leiden.
    Das er noch nicht gesperrt ist, wird daran liegen, dass es stimmt was er schreibt.

    moses030 schrieb:

    Deine Kollegen haben das was ich geschrieben habe mitenwickelt. Also beleidigst du nicht nur mich sondern auch die anderen, ...

    Das waren Lösungen für die geforderten Bedingungen.
    Jetzt sieht es anderes aus.

    Da fehlen ein paar break bei den case .



  • Ich habs jetzt umgeschrieben. Danke Dirk, ja ich hab nichts gegen direkt, wirklich nicht, jedoch hat mir sein Kommentar leider nicht wirklich geholfen. Er kann gern sagen okay alter.. dein Code is scheiße.. habt ihr ja schon zur genüge gemacht, aber dann auch bitte sagen was scheiße ist, damit ich weiß ok da muss ich was besser machen. Ihr seid die mit Erfahrung ich lerne die Sprache erst, aber ebend nur mit sinnvoller kritik.

    Wutz hat mir auch schon sehr geholfen, aber da kam dann auch immer noch verbesserung mit hinten ran.

    Aber die Zeichenweise-Eingabe kann ich doch wohl auch woanders verwenden oder? Was war denn schlecht daran zu sagen ok, überprüfe Zeichenweise ob das eine Zahl ist und speichere sie mir in dem Array. Also es ist okay wenn es scheiße ist, aber eine Verbesserung wäre super.

    Vielen Dank nochmal.

    Grüße



  • moses030 schrieb:

    Aber die Zeichenweise-Eingabe kann ich doch wohl auch woanders verwenden oder? Was war denn schlecht daran zu sagen ok, überprüfe Zeichenweise ob das eine Zahl ist und speichere sie mir in dem Array.

    Weil du kein Array brauchst (du kannst das direkt umrechnen²) und weil scanf das auch schon macht.

    ²

    ergebnis = 0
      solange(  istzahl(zahl = lesezahl() ))
        ergebnis = ergebnis * 10 + zahl
    


  • moses030 schrieb:

    Also, es ist ein unding, das man dich noch nicht gesperrt hat für deine Aussagen hier.

    Haha - da hätte ich schon vor Jahren eingesperrt werden müssen. :p


Anmelden zum Antworten