Forum: Mikrocontroller und Digitale Elektronik Index des kleinsten Wertes eines Arrays


von Christoph H. (christoph_b)


Lesenswert?

Hallo

Ich habe folgendes Problem

Ich muss in einem Array den niedrigsten und den 2 niedrigsten Wert 
finden und den Index davon ausgeben. Das ganze leider in C

zb.
A[]== {951, 953, 896, 33, 932, 973}

kleinster Wert ist 33 also A[3] also den Wert 3
2 kleinster Wert ist 896 also A[2] also Wert 2

Ich blicke da momentan nicht durch wie ich das am besten angehe ;-)

Gruß Christoph

von Fabian O. (xfr)


Lesenswert?

Du legst Dir zwei Variablen an, die den Index des niedrigsten und 
zweitniedrigsten Werts enthalten sollen. Als initiale Indizes nimmst Du 
0 und 1 (je nachdem, welcher Array-Wert größer ist).

Dann gehst Du in einer Schleife alle Elemente des Arrays durch und 
vergleichst den aktuellen Wert mit den bisher niedrigsten Werten, deren 
Indizes in den beiden Variablen stehen. Wenn er kleiner ist, 
aktualisierst Du die Variablen. Wenn Du einmal durch bist, stehen in den 
beiden Variablen die richtigen Indizes.

von Jannik G. (jannik_96)


Lesenswert?

Hallo,

ich programmiere eigentlich nicht mit C, aber so würde ich es machen:
Erstmal nach der Größe sortieren lassen,
dann im Ursprungsarray den Index suchen, bei dem der Wert gleich dem 
ersten des sortierten Arrays ist.

grüße
jannik

'Edit: Da war wohl jemand schneller.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jannik G. schrieb:
> Erstmal nach der Größe sortieren lassen,

Der Schritt ist zuviel. Um zu sortieren, musst Du vergleichen. Wenn Du 
vergleichst, bist Du sowieso schon fertig. Die Umsortiererei kannst Du 
Dir also sparen.

von Klaus W. (mfgkw)


Lesenswert?

Jannik G. schrieb:
> ich programmiere eigentlich nicht mit C, aber so würde ich es machen:
> Erstmal nach der Größe sortieren lassen,
> dann im Ursprungsarray den Index suchen, bei dem der Wert gleich dem
> ersten des sortierten Arrays ist.

D.h. du sortierst das ganze Feld um, (Laufzeitordnung mindestens 
O(n*log(n))), um anschließend das Feld linear zu durchlaufen (O(n)), 
obwohl auch eine lineare Suche reicht?


>
> grüße
> jannik
>
> 'Edit: Da war wohl jemand schneller.

Kein Wunder bei dieser Vorgehensweise :-)

Mein Vorschlag: einen Zeiger auf das kleinstwertige Feldelement anlegen 
(ich nenne ihn mal pMin) und auf Verdacht mit der Adresse des ersten 
Feldelements initlaisieren (pMin=&feld[0]).
Dann ab [1] das Feld durchlaufen und jedes Elemente mit *pMin 
vergleichen. Falls das aktuelle Element kleiner ist als *pMin, dann pMin 
auf das aktuelle setzen.

Wenn man zum Schluß nicht den Zeiger braucht, sondern den Index, dann 
(pMin-feld) nehmen, das ist der Index.

von Karl H. (kbuchegg)


Lesenswert?

Und nicht auf die Sonderfälle vergessen.
Welches ist der korrekte Index, wenn das Feld nur 1 Element groß ist? 
Welches, wenn das Feld überhaupt keine Elemente enthält?

von Lupo (Gast)


Lesenswert?

In einem Durchgang:

Input:
ARRAY_MAXINDEX = Höchster Index im Array
1
int a[MAXINDEX+1];
2
int i, m, k, n1, n2;
3
4
n1 = -1;
5
n2 = -1;
6
k = MAXINT;
7
m = ARRAY_MAXINDEX;
8
9
for (i = 0; (i <= m); i++)
10
{
11
  if (a[i] < k1)
12
  {
13
    n2 = n1;
14
    k1 = a[i];
15
    n1 = i;
16
  }
17
}

Resultate:

n1 = Index kleinstes Element (Wert in k)
n2 = Index zweitkleinstes Element
n1, n2 in [0..MAXINDEX] oder -1, falls nicht vorhanden

von Karl H. (kbuchegg)


Lesenswert?

@Lupo


keine gute Idee.
Er ist Schüler und soll was lernen. Das tut er aber nicht, wenn du ihm 
jetzt schon den Code vorwirfst. Erst mal soll er sich selber die 
Programmstrategie zurechtlegen. Auf dem Papier mal ein bischen testen. 
Solange, bis er eine brauchbare Konzeptidee hat die er auch 
ausformulieren kann.
Wenn er dann noch programmtechnische Schwierigkeiten hat, dann hilf ihm. 
Dagegen ist nichts zu sagen. Aber erst mal muss er mal mit einem 
Gedankengang rüberkommen (der noch den einen oder anderen Fehler 
enthalten kann). In der ersten Lernphase ist die Beschäftigung mit dem 
Problem schon fast wichtiger als die Umsetzung.
Du musst dir immer denken: Auf diesem Lernlevel ist es wichtiger, dass 
er in möglichst allen Details versteht, warum ein Verfahren sein Problem 
löst. Das er danach ein Programm hat ist eher ein Abfallprodukt davon.

von Lupo (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Er ist Schüler und soll was lernen.

Das blieb mir verborgen - und über genügend Greise, deren Belehrung 
keinerlei wirtschaftlichen Nutzen mehr verspricht, dürfte Deutschland 
verfügen. So bleibt als Motivation zu helfen lediglich Altruismus.

von Simon K. (simon) Benutzerseite


Lesenswert?

Christoph B. schrieb:
> Ich muss in einem Array den niedrigsten und den 2 niedrigsten Wert
> finden und den Index davon ausgeben. Das ganze leider in C

Wieso "leider"?

von Verwirrter Anfänger (Gast)


Lesenswert?

Lupo schrieb:
> Input:
> ARRAY_MAXINDEX = Höchster Index im Array
> int a[MAXINDEX+1];
> int i, m, k, n1, n2;
>
> n1 = -1;
> n2 = -1;
> k = MAXINT;
> m = ARRAY_MAXINDEX;
>
> for (i = 0; (i <= m); i++)
> {
>   if (a[i] < k1)
>   {
>     n2 = n1;
>     k1 = a[i];
>     n1 = i;
>   }
> }


Ich denke hier gibts auch ein Problem, wenn a[n1] < a[i] < a[n2], oder 
hab ich was übersehen?

von Bernd (Gast)


Lesenswert?

Lupo schrieb:
> So bleibt als Motivation zu helfen lediglich Altruismus.
du hilfst ihm aber nicht

es gibt da noch was über das du dich Mal informieren solltest:
http://de.wikipedia.org/wiki/Helfersyndrom

von Bernd (Gast)


Lesenswert?

ich nehms zurück, du hilfst ihm doch, da sind ja so viele Fehler drin,
wenn er die rausfindet lernt er doch was
abgesehen von Tippfehlern: was ist mit 2 gleichen kleinsten Zahlen?

von MagIO (Gast)


Lesenswert?

@Verwirrter Anfänger:
Richtig, ... kann aber nur passieren, wenn der erste Wert schon der 
kleinste ist.
Man sollte also besser 2 if-Bedingungen benutzen. Eines für k1/n1 und 
eines für k2/n2.

Aber mehr wird nicht verraten ;o)

von Christoph H. (christoph_b)


Lesenswert?

Danke für die Anregungen. Werde mir das morgen mal genauer Anschauen und 
mich bei bedarf nochmals melden ;-)

von Drobel (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Er ist Schüler und soll was lernen.

So oder so kein Problem, da das Programm nicht funktioniert.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Schüler lernen eh nichts gescheites mehr (in der Schule), also kann man 
auch direkt die Lösung geben:
1
int a[]; // Beispielhaft mit einer bestimmten Anzahl an Elementen
2
int i, anzahl, min;
3
4
min = 0; // Zählung ab 0. Element, welches erstmal das Kleinste ist.
5
anzahl = sizeof(a) / sizeof(int); // Größe des Arrays durch die Größe eines Elementes ist die Anzahl der Elemente
6
7
for (i = 1; i < anzahl; i++) if (a[i] < a[min]) min = i;

Der Code ermittelt den Index des ersten auftretens der kleinsten Zahl, 
wenn die if-Abfrage auf <= testet, wird das letzte Auftreten getestet.

Wer will kann jetzt noch den Sonderfall, mit einem leeren Array 
behandeln.

von Karl H. (kbuchegg)


Lesenswert?

Lupo schrieb:
> Karl Heinz Buchegger schrieb:
>> Er ist Schüler und soll was lernen.
>
> Das blieb mir verborgen

Die Aufgabenstellung ist eine typische Schulaufgabe.
(und die Worte 'muss' und 'leider' erzählen den Rest).

von Christoph H. (christoph_b)


Lesenswert?

ich kann euch versichern das es keine Schulaufgabe ist. Aus diesem Alter 
bin ich raus.

Es geht um ein Projekt das ich in der Schule abgeschlossen habe und wo 
ich nun in meine Freizeit weitermache und es gerne verbessere.

Ich versuche die Rasenkante mittels 16 IR Sensoren zu erkennen. Um 
Fehler auszubessern probiere ich es gerade mittels Korrelation.

Das "Leider" kommt daher da ich die Funktionen von C# sehr schätze und 
mir das leider in C fehlt.

Gruß Christoph

von Karl H. (kbuchegg)


Lesenswert?

OK, ich nehm (fast) alles zurück.

(Traurig was C# und Java mit dem Nachwuchs machen. Das der Nachwuchs 
keine dynamischen Datenstrukturen mehr implementieren kann, daran hab 
ich mich schon gewöhnt. Das man allerdings keine Idee hat, wie man das 
kleinste Element in einem Array findet, das ist neu. Dabei ist das DIE 
(grossgeschrieben) Standardaufgabe für die erst Übung mit Arrays)

von Bernd (Gast)


Lesenswert?

Tim T. schrieb:
> Der Code ermittelt den Index des ersten auftretens der kleinsten Zahl,
> wenn die if-Abfrage auf <= testet, wird das letzte Auftreten getestet.

tja, schönes Programm, aber leider Themaverfehlung, das war nicht die 
Fragestellung,

wird ja auch immer beklagt das das Textverständnis der heutigen 
Generation zu wünschen läßt ;-)

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Bernd schrieb:
> tja, schönes Programm, aber leider Themaverfehlung, das war nicht die
> Fragestellung,

Stimmt, hatte nur die Überschrift gelesen.

Dann eben ergänzt:
1
int a[]; // Beispielhaft mit einer bestimmten Anzahl an Elementen
2
int i, anzahl, min, min_b;
3
4
min = 0; // Zählung ab 0. Element, welches erstmal das Kleinste ist.
5
anzahl = sizeof(a) / sizeof(int); // Größe des Arrays durch die Größe eines Elementes ist die Anzahl der Elemente
6
7
for (i = 1; i < anzahl; i++) if (a[i] < a[min]) min = i;
8
9
if (min == 0) min_b = 1; // Falls das 0. Element tatsächlich das kleinste war.
10
else min_b = 0;
11
12
for (i = min_b+1; i < anzahl; i++) if ((a[i] < a[min_b]) && (min_b != min)) min_b = i;

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.