Minimum aus Array bestimmen

Mach dir wikrlich mal eine Tabelle wie es deepthroat sagt da kann man sehr viel an Information dazugewinnen, da man dann versteht was der Code macht.
Wenn der User 100 Einträge an das Array machen soll dann gibt es keine Vereinfachung des Problems, bei solchen Programmen arbeite ich immer mit Zufallswerten also schreibe Zufallswerte in dein Array.

C:
srand(time(0));
for (int i = 0; i < Arraylaenge; i++)
   ar[i] = rand() % 100;

mfg.
 
Okay.... ich glaube ich habs jetzt...
schau dir mal an ob das so okay ist. Beim Testlauf hatte ich den Anschein als wär alles okay.

C:
int main (void)
{
	int ar[4];											/*array besteht aus 4 Komponenten*/
	int min, i ,nm;
	
	printf("Bitte 4 Zahlen eingeben:\n");
	scanf("%d %d %d %d",&ar[0],&ar[1],&ar[2],&ar[3]);	/*Zuweisen der eingegebenen Werte an das Array*/

	min=ar[0];			/*initialisierung. wird überschrieben sobald kleinerer Wert gefunden wird*/
			
	for(i=0;i<sizeof(ar)/sizeof(int);i++)	/*siehe untere Erklärung*/
	{
		if(ar[i]<min)
			nm=i;

		if(ar[i]<min)	/*wenn array i kleiner min ist, wird arry i zum neuen minimum*/
			min = ar[i];
	}
	printf("Der Kleinste Wert des Arrays ist '%d' und befindet sich in ar[%d].\n",min,nm);
	return 0;
}
 
Kann es sein dass i immer 4 ist da meine Schleife ja ++1 bis 4 läuft?
Ja. Richtig. :)

Und deswegen ist es auch nicht OK wenn man auf ar[ i ] ( entspricht ar[4] ) zugreift, denn dieses Element gibt es in dem Array nicht! Die Array Elemente sind "numeriert" von 0 bis 3.

Nun zum Fehler:

Du hast in deinem Code vergessen die Variable nm zu initialisieren. D.h. diese enthält einen zufälligen Wert (Tabelle machen!). Wenn sich nun das Minimum bei ar[0] befindet (also alle anderen Elemente sind >= ar[0]) wird die Variable nm in der Schleife nicht geändert und das ist dann nicht korrekt.

Du setzt ja im Grunde am Anfang min = ar[0]. Dann mußt du da auch den entsprechenden Index speichern.

Dann kann man natürlich auch meist noch etwas vereinfachen bzw. optimieren:
C:
int i, nm;

min = ar[0]; nm = 0;

for (i = 1; i < sizeof(ar)/sizeof(int); ++i) {
  if (ar[i] < min) {
    nm = i;
    min = ar[i];
  }
}
Gruß
 
Ahhhhhh...........alles klar.
Danke dir tausend mal.

Um nochmal auf die Schleife für mein scanf zurück zu kommen. Ich habe absolut keine Idee wie ich das realisieren könnte...
 
Um nochmal auf die Schleife für mein scanf zurück zu kommen. Ich habe absolut keine Idee wie ich das realisieren könnte...
Du mußt doch nur die sich ändernde Komponente jeder Zeile durch eine Variable ersetzen und eine Schleife drumrumbauen:
C:
scanf("%d", &a[0]);
scanf("%d", &a[1]);
scanf("%d", &a[2]);
scanf("%d", &a[3]);
/* ... usw. */

C:
int j;
for (j = 0; j < sizeof(ar)/sizeof(int); ++j) {
  scanf("%d", &ar[j]);
}
 
Ja.........klingt logisch...
habs nun so in mein i eingegeben. Der will aber nicht. (Stack around the variable ar was corrupted.

Hier nochmal der komplette Code:

C:
#include <stdio.h>
int main (void)
{
	int ar[4];											/*array besteht aus 4 Komponenten*/
	int j,min,i,nm;
	
	printf("Bitte 4 Zahlen eingeben:\n");
	for(j=0;j<sizeof(ar)/sizeof(int);++j);
	{	
		scanf("%d",&ar[j]);
	}

	min=ar[0];			/*initialisierung. wird überschrieben sobald kleinerer Wert gefunden wird*/
	nm=0;		
	for(i=0;i<sizeof(ar)/sizeof(int);i++)	/*siehe untere Erklärung*/
	{
		if(ar[i]<min)	/*wenn array i kleiner min ist, wird arry i zum neuen minimum*/
			min = ar[i];
			nm=i;
	}
	printf("Der Kleinste Wert des Arrays ist '%d' und befindet sich in ar[%d].\n",min,nm);
	return 0;
}

warum eingentlich ++j und nicht j++ Ist das egal? Funktioniert auf beide Weisen nicht...
 
Zuletzt bearbeitet:
Ja, ist ein schöner Anfängerfehler - da muss jeder durch. :)

Du hast dort die Schleife mit dem Semikolon bereits abgeschlossen. Das Semikolon steht für die leere Anweisung; d.h. in der Schleife passiert nichts. Allerdings wird j natürlich hochgezählt - bis j gleich 4 ist. Nach der Schleife, innerhalb der eckigen Klammern, wird versucht an die Speicherstelle von ar[4] etwas zu speichern, aber die Speicherstelle ar[4] gehört gar nicht mehr zum Array dazu!

warum eingentlich ++j und nicht j++ Ist das egal? Funktioniert auf beide Weisen nicht...
Das eine ist der Präinkrementoperator, das andere der Postinkrementoperator.

Natürlich gibt's einen Unterschied:
C:
int a = 5, b, c;

b = ++a;
c = a++;
Nachdem dieser Code ausgeführt wurde ist a = 7, b = 6, c = 6.

Das liegt daran, das ++a (der Präinkrementoperator) im Grunde erst den Wert von a erhöht und dann den neuen Wert zurückgibt. Während a++ (Postinkrementoperator) den Wert von a auch erhöht aber noch den alten Wert von a zurückgibt - also als wenn a erst hinterher erhöht worden wäre.

Wenn du den Rückgabewert des Operators nicht verwendest (so wie in der for-Schleife), ist es egal welchen Operator du nimmst.

Gruß

\edit: Dann hab ich grad noch einen anderen Fehler bemerkt (du mußt schon richtig abschreiben ;)). Man darf hinter eine Schleife und eine if-Anweisung nur eine Anweisung schreiben.
C:
#
if(ar[i]<min)   /*wenn array i kleiner min ist, wird arry i zum neuen minimum*/
            min = ar[i];
            nm=i;
Wenn du das so schreibst, gilt das if nur für die erste Anweisung, nämlich für
Code:
min = ar[i].
In diesem Fall muß man die Anweisungen in einen Block zusammenfassen:
C:
#
if(ar[i]<min) {  /*wenn array i kleiner min ist, wird arry i zum neuen minimum*/
            min = ar[i];
            nm=i;
}
 
Zuletzt bearbeitet:
Danke dir vielmals.... jetzt t alles.... und was noch wichtiger ist: Jetzt hab ich alles verstanden.

Bist mein Held :)
 

Neue Beiträge

Zurück