Array Probelm --> Gelöst



  • genau das meinte er.



  • ZockerFloh7 schrieb:

    ich bin absoluter anfänger, also wie mache ich min-/max- und aktuelleZahl-Variable? Meinst du sowas wie, dass jede eingegebene Zahl mit der nächsten eingegebenen verglichen wird und dann davon die größere bzw. kleinere wieder in die variable gespeichert wird?

    Exakt!

    Für min/max könntest du sowas hier notieren:

    //ganz oben in deinem Code:
    #define max(a,b)            (((a) > (b)) ? (a) : (b))
    #define min(a,b)            (((a) < (b)) ? (a) : (b))
    
    //Anwendung:
    int i=max(3,5);  //i wird der größere Wert 5 zugewiesen
    i=min(3,5);      //i wird der kleinere Wert 3 zugewiesen
    


  • _matze schrieb:

    ZockerFloh7 schrieb:

    ich bin absoluter anfänger, also wie mache ich min-/max- und aktuelleZahl-Variable? Meinst du sowas wie, dass jede eingegebene Zahl mit der nächsten eingegebenen verglichen wird und dann davon die größere bzw. kleinere wieder in die variable gespeichert wird?

    Exakt!

    Für min/max könntest du sowas hier notieren:

    //ganz oben in deinem Code:
    #define max(a,b)            (((a) > (b)) ? (a) : (b))
    #define min(a,b)            (((a) < (b)) ? (a) : (b))
    
    //Anwendung:
    int i=max(3,5);  //i wird der größere Wert 5 zugewiesen
    i=min(3,5);      //i wird der kleinere Wert 3 zugewiesen
    

    Also das mit dem Array hab ich jetzt kapiert, danke.
    kannst du des mit dem #define näher erklären? da blick ich noch nich so ganz durch...



  • Ein #define ist eine Präprozessoranweisung, die eigentlich nur eine simple Textersetzung bewirkt. Soll heißen, überall im Code, an dem z.B. "max(3,5)" vorkommt, wird an diese Stelle stattdessen "(((3) > (5)) ? (3) : (5))" gesetzt, und zwar vor dem Kompilieren. So kann man sich einfache 'Funktionen' zusammenbasteln. Sowas nennt man dann Makro. Bemängelt wird dabei oft die Typunsicherheit, aber in vielen Fällen finde ich das ok und einfach praktisch.

    Du kannst stattdessen auch richtige Funktionen schreiben:

    int min(int a,int b) {
      return a>b ? b : a;
    }
    int max(int a,int b) {
      return a>b ? a : b;
    }
    

    Oder, falls du den ternären Operator (dieser ?:-Kram) noch nicht kennst, schön ausgeschrieben:

    int min(int a,int b) {
      if(a>b) {
        return b;
      }
      return a;
    }
    int max(int a,int b) {
      if(a>b) {
        return a;
      }
      return b;
    }
    


  • _matze schrieb:

    Bemängelt wird dabei oft die Typunsicherheit, aber in vielen Fällen finde ich das ok und einfach praktisch.

    ist ja auch praktisch. und das mit fehlender typsicherheit ist doch quark. so'n makro mit falschen typen gefüttert gibt auch 'nen compile-fehler.
    🙂



  • Basher schrieb:

    _matze schrieb:

    Bemängelt wird dabei oft die Typunsicherheit, aber in vielen Fällen finde ich das ok und einfach praktisch.

    ist ja auch praktisch. und das mit fehlender typsicherheit ist doch quark. so'n makro mit falschen typen gefüttert gibt auch 'nen compile-fehler.
    🙂

    Erstens das, und zweitens kann ein Makro ja auch Vorteile gegenüber einer Funktion haben. Das max()-Makro funktioniert auch mit float. Und performance-technisch ist es wohl das mögliche Maximum.



  • #define max(a,b)            (((a) > (b)) ? (a) : (b))
    #define min(a,b)            (((a) < (b)) ? (a) : (b))
    

    also wenn ich des etzt richtig verstehe, dann kommt dieser teil ganz oben hin, vor int main()

    aber was genau macht der teil?
    sorry wenn ich mich so blöd anstelle aber ich hab keine ahnung
    mit dfine max wird max gesetzt oder?
    (a,b) sin bloß beliebige variablen?? 😕

    des dahinter müsste dann beschreiben in welchem fall max welchen wert annimmt, oder auch nicht 😞

    ich hab jetzt mal des mit dem array gemacht wie matze gesagt hat un des schau bei mir dann so aus:

    # include <stdlib.h>
    # include <stdio.h>
    
    int main()
    {
    
    int Durchgang;
    int min;
    int Anzahl;
    int Zahl[Anzahl];
    
       printf( "Dieses Programm wurde geschrieben um die groeste und kleinste von Ihnen eingegebene Zahl zu bestimmen.\nBitte gib die Anzahl der Zahlen, die du eingeben willst an!\n\n");
       scanf( "%d", &Anzahl);
       printf( "\nGib nun bitte die %d Zahlen ein.\n\n", Anzahl);
    
           for( Durchgang = 1; Durchgang <= Anzahl; Durchgang = Durchgang + 1)
           {
               scanf( "%d", &Zahl[Anzahl]);
           }
    
              if( Zahl[0] < Zahl[1])
               {
                   min = Zahl[0];
                   printf( "\n\nDie kleinste eingegebene Zahl war %d.\n", min);
                   system ("pause");
               }
    
               else
               {
                   min = Zahl[1];
                   printf( "Die kleinste eingegebene Zahl war %d.\n", min);
                   system ("pause");
               }
    
    }
    

    leider gibts für die kleinste zahl immer noch 16384 aus...



  • das problem ist die deklaration von

    int Zahl[Anzahl];
    

    du hast für anzahl keinen Wert definiert. wie auch, du weißt ihn ja beim starten des Programms noch nicht. Der benutzer soll es ja eingeben.

    Also wird das als "wert" genommen, was an der Stelle im Arbeitsspeicher steht, der nun für "Anzahl" reserviert ist. Das ist aber kein Wert, den du gebrauchen kannst. Da könnte auch "-14204753774" stehen.

    Dein computer erzeugt also ein Array von der größe "egalWelcherSchrottAuchDaStehenMag"

    also unsinniges zeug.

    Eine Möglichkeit für dich wäre, erst den Benutzer die Größe angeben zu lassen:

    int anzahl;
    
    printf("bitte anzahl eingeben");
    scanf("%d",&anzahl);
    int zahl[anzahl];
    

    das sollte funktionieren.

    wurde aber schon erwähnt...

    Lg Jann



  • Also da liegt noch einiges im Argen...

    Hier mal ein kleines Beispiel, wie die von Probe-Nutzer vorgeschlagene Lösung aussehen könnte. Da siehst du auch mal, wie man die Makros verwendet und verstehst vielleicht eher, was es damit auf sich hat.
    Vielleicht ist dieser Ansatz für dich auch erstmal leichter, da es mit den Arrays ja noch ein wenig hapert:

    #define max(a,b)            (((a) > (b)) ? (a) : (b))
    #define min(a,b)            (((a) < (b)) ? (a) : (b)) 
    
    #include <stdio.h>
    
    int main()
    {
    	int Anzahl=0;
    	int Zahl;
    	int AktuellesMinimum=(int)((unsigned int)~0>>1);	//ignoriere diese Zeile erstmal... ;)
    	int AktuellesMaximum=0;
    	printf( "Dieses Programm wurde geschrieben um die groeste und kleinste von Ihnen eingegebene Zahl zu bestimmen.\nBitte gib die Anzahl der Zahlen, die du eingeben willst an!\n\n");
    	scanf( "%d", &Anzahl);
    	if(Anzahl>0) {
    		printf( "\nGib nun bitte die %d Zahlen ein.\n\n", Anzahl);
    
    		for( int Durchgang = 0; Durchgang < Anzahl; Durchgang++ ) {
    			scanf( "%d", &Zahl);
    			AktuellesMinimum=min(Zahl,AktuellesMinimum);
    			AktuellesMaximum=max(Zahl,AktuellesMaximum);
    		}
    
    		printf( "\n\nDie kleinste eingegebene Zahl war %d.\n", AktuellesMinimum);
    		printf( "Die größte eingegebene Zahl war %d.\n", AktuellesMaximum);
    	}else {
    		printf("Sie müssen schon mehr als 0 Zahlen eingeben wollen...");
    	}
    	{
    		char c;
    		while((c=getchar())!='\n');	//den Eingabepuffer leeren...
    	}
    	getchar();	//Schließen der Konsole verhindern
    	return 0;
    }
    

    Ansonsten kannst du für die Array-Variante diesen Thread noch mal ganz genau durchlesen (denn des Rätsels Lösung wurde schon mehrfach erwähnt).

    Und bitte arbeite an deiner Einrückung!
    http://de.wikipedia.org/wiki/Einrückungsstil



  • Keithy schrieb:

    das problem ist die deklaration von

    int Zahl[Anzahl];
    

    Eine Möglichkeit für dich wäre, erst den Benutzer die Größe angeben zu lassen:

    int anzahl;
    
    printf("bitte anzahl eingeben");
    scanf("%d",&anzahl);
    int zahl[anzahl];
    

    das sollte funktionieren.

    wurde aber schon erwähnt...

    Lg Jann

    achso, das heißt ich setzte einfach int zahl[anzahl];
    nach dem scanf
    ich wusste garnich dass man z.b. int zahl au mitten rein setzen kann, dachte des geht nur am anfang...
    trozdem kommt bei mir dann am ende nie des richtige raus 😕



  • _matze schrieb:

    Also da liegt noch einiges im Argen...

    Hier mal ein kleines Beispiel, wie die von Probe-Nutzer vorgeschlagene Lösung aussehen könnte. Da siehst du auch mal, wie man die Makros verwendet und verstehst vielleicht eher, was es damit auf sich hat.
    Vielleicht ist dieser Ansatz für dich auch erstmal leichter, da es mit den Arrays ja noch ein wenig hapert:

    #define max(a,b)            (((a) > (b)) ? (a) : (b))
    #define min(a,b)            (((a) < (b)) ? (a) : (b)) 
    
    #include <stdio.h>
    
    int main()
    {
    	int Anzahl;
    	int Zahl;
    	int AktuellesMinimum=(int)((unsigned int)~0>>1);	//ignoriere diese Zeile erstmal... ;)
    	int AktuellesMaximum=0;
    	printf( "Dieses Programm wurde geschrieben um die groeste und kleinste von Ihnen eingegebene Zahl zu bestimmen.\nBitte gib die Anzahl der Zahlen, die du eingeben willst an!\n\n");
    	scanf( "%d", &Anzahl);
    	if(Anzahl>0) {
    		printf( "\nGib nun bitte die %d Zahlen ein.\n\n", Anzahl);
    
    		for( int Durchgang = 0; Durchgang < Anzahl; Durchgang++ ) {
    			scanf( "%d", &Zahl);
    			AktuellesMinimum=min(Zahl,AktuellesMinimum);
    			AktuellesMaximum=max(Zahl,AktuellesMaximum);
    		}
    
    		printf( "\n\nDie kleinste eingegebene Zahl war %d.\n", AktuellesMinimum);
    		printf( "Die größte eingegebene Zahl war %d.\n", AktuellesMaximum);
    	}else {
    		printf("Sie müssen schon mehr als 0 Zahlen eingeben wollen...");
    	}
    	{
    		char c;
    		while((c=getchar())!='\n');	//den Eingabepuffer leeren...
    	}
    	getchar();	//Schließen der Konsole verhindern
    	return 0;
    }
    

    Ansonsten kannst du für die Array-Variante diesen Thread noch mal ganz genau durchlesen (denn des Rätsels Lösung wurde schon mehrfach erwähnt).

    Und bitte arbeite an deiner Einrückung!
    http://de.wikipedia.org/wiki/Einrückungsstil

    wow, danke
    ich schaus mir mal genauer an



  • ZockerFloh7 schrieb:

    ich wusste garnich dass man z.b. int zahl au mitten rein setzen kann, dachte des geht nur am anfang...

    In C89 geht's auch nicht, C99 kann das (und C++ sowieso). Ist ja auch meist praktischer und übersichtlicher, Variablen erst dann zu deklarieren, wenn man sie braucht.



  • etz versteh ichs, is ja ginial in der schleife gleich des maximum und minimum zu bestimmen

    eine frage hätt ich noch
    was macht die zeile:

    int AktuellesMinimum=(int)((unsigned int)~0>>1);
    


  • ZockerFloh7 schrieb:

    etz versteh ichs, is ja ginial in der schleife gleich des maximum und minimum zu bestimmen

    Das ist nur das, was Probe-Nutzer auf Seite 1 vorgeschlagen hatte.

    ZockerFloh7 schrieb:

    eine frage hätt ich noch
    was macht die zeile:

    int AktuellesMinimum=(int)((unsigned int)~0>>1);
    

    Ey, ich hab doch gesagt: ignorieren! 😃

    Na ja, die Zeile macht nix anderes als die Variable auf den maximalen (vorzeichenbehafteten) Wert zu setzen. Das sorgt dafür, dass der erste Vergleich mit einem eingelesenen Wert garantiert so ausfällt, dass dieser Wert zugewiesen wird. Würdest du diese Variable z.B. auf 0 setzen,würdest du logischerweise als Endergebnis immer 0 als Minimumwert bekommen (sofern kein negativer Wert eingegeben wurde). So sparen wir uns eine Spezialbehandlung der ersten Eingabe.

    Wenn dich interessiert, wie genau das hier funktioniert, google mal nach "Bitshift" oder "Bitoperationen"...



  • _matze schrieb:

    ZockerFloh7 schrieb:

    etz versteh ichs, is ja ginial in der schleife gleich des maximum und minimum zu bestimmen

    Das ist nur das, was Probe-Nutzer auf Seite 1 vorgeschlagen hatte.

    ZockerFloh7 schrieb:

    eine frage hätt ich noch
    was macht die zeile:

    int AktuellesMinimum=(int)((unsigned int)~0>>1);
    

    Ey, ich hab doch gesagt: ignorieren! 😃

    Na ja, die Zeile macht nix anderes als die Variable auf den maximalen (vorzeichenbehafteten) Wert zu setzen. Das sorgt dafür, dass der erste Vergleich mit einem eingelesenen Wert garantiert so ausfällt, dass dieser Wert zugewiesen wird. Würdest du diese Variable z.B. auf 0 setzen,würdest du logischerweise als Endergebnis immer 0 als Minimumwert bekommen (sofern kein negativer Wert eingegeben wurde).

    Wenn dich interessiert, wie genau das hier funktioniert, google mal nach "Bitshift" oder "Bitoperationen"...

    jo, hab grad 0 eingegeben, stimmt 🙂
    Danke


Anmelden zum Antworten