Forum: Mikrocontroller und Digitale Elektronik Größter Wert von Array


von Tim Z. (mikroluk)


Lesenswert?

Hallo :) . Ich wollte mal wissen, wie ich den größten Wert, der als 
Array gespeichert wird, ermittle. Also ich hab 40 Messergebnisse als 
Array gespeichert und davon das größte will ich haben.

MfG Tim :)

von Udo S. (urschmitt)


Lesenswert?

Variable größterWert = 0;
Schleife über alle Elemente {
  if (Element > größterWert) dann größterWert = Element
}

Nachtrag: Wenn Werte nagativ sein können, dann größterWert mit dem 
maximalen negativen Wert initialisieren.

von Fabian O. (xfr)


Lesenswert?

- Eine Variable anlegen, die den größten Wert enthalten wird. Am Anfang
  ist sie der kleinstmögliche Wert, der überhaupt auftreten kann.
- In einer Schleife alle Elemente durchgehen.
- Das aktuelle Element mit dem bisherigen größten Wert vergleichen.
  Falls es größer ist, die Variable aktualisieren.
- Am Ende steht der größte Wert in der Variable.

von Tim Z. (mikroluk)


Lesenswert?

Also sähe das dann so aus?:
program XY
a:integer;
daten:array[0..40]of integer;
begin
if (a > größterWert) then
größterWert := a;
daten[a]:=adc_read(1);
end;
end.

EDIT: Werte werden nicht negativ. Sind Lichtmessungen

von Karl H. (kbuchegg)


Lesenswert?

Tim Z. schrieb:
> Also sähe das dann so aus?:
> program XY
> a:integer;
> daten:array[0..40]of integer;
> begin
> if (a > größterWert) then

wer oder was ist a?
Was hat dieses a mit den Werten im Array zu tun?

wer oder was ist größterWert?
Welcher Zahlenwert steht da drinnen, wenn das Programm startet.

> größterWert := a;
> daten[a]:=adc_read(1);
> end;
> end.
>
> EDIT: Werte werden nicht negativ. Sind Lichtmessungen


Nimm die Papier und Bleistift.
Mal dir auf dem Papier Rechtecke auf. Über jedes Rechteck schreibst du 
den Namen einer Variablen. Du hast

> a:integer;
> daten:array[0..40]of integer;

Also

   a
   +-----+
   |     |
   +-----+

   daten
   +-----+-----+-----+-----+-----+-----+
   |     |     |     |     |     |     | .....
   +-----+-----+-----+-----+-----+-----+

(Hinweis: ich hab jetzt nicht alle 41 Elemente des Arrays aufgemalt. Ist 
normal auch nicht notwendig. Wenns mit 5 geht, dann gehts auch mit 41.

Beachte: ich hab keine Zahlenwerte reingeschrieben, weil bisher ja nur 
die Variablen vereinbart wurden!

So und jetzt spielst du Computer und arbeitest dein Programm ab. Welches 
ist die erste Zeile

  if (a > größterWert) then

ok. dann mach das mal.
a > größterWert

also a.
Bei welchem Rechteck steht a dabei? Such es auf deinem Papier.
Welcher WErt steht im Rechteck.

Oops. da steht gar kein Wert drinnen.
Fehler.

also: größterWert
Such das Rechteck größterWert auf deinem Papier.
Ooops. Da gibt es kein Rechteck mit diesem Namen!

d.h. deine erste Anweisung im Programm ist schon nicht machbar:
Die eine Variable hat keinen Wert von dem wir wüssten. Die andere 
Variable existiert erst gar nicht.

Und im übrigen hat das was du geschrieben hast, herzlich wenig mit dem 
zu tun, was du als VOrgabe bekommen hast:
1
Variable größterWert = 0;
2
Schleife über alle Elemente {
3
  if (Element > größterWert) dann größterWert = Element
4
}
5
6
....
7
8
- Eine Variable anlegen, die den größten Wert enthalten wird. Am Anfang
9
  ist sie der kleinstmögliche Wert, der überhaupt auftreten kann.
10
- In einer Schleife alle Elemente durchgehen.
11
- Das aktuelle Element mit dem bisherigen größten Wert vergleichen.
12
  Falls es größer ist, die Variable aktualisieren.
13
- Am Ende steht der größte Wert in der Variable.

In beiden Fällen war von einer Schleife die Rede.
Wo ist deine Schleife?

Wie machst du das ganze denn zu Fuss?
Angenommen du hast
   12   8   15    23    11    19
also 6 Werte. Wie gehst du vor, wenn du selbst den größten Wert 
heraussuchen sollst.
Also ich gehe so vor:
Ich nehm mir mal den ersten Wert her, die 12 und merk mir die als 
größten Wert.
Dann geh ich die restlichen Zahlen durch, eine nach der anderen
    8
    und ich frage mich: Ist 8 größer als der Wert, den ich mir als
     den bisher größten WErt gemerkt habe?
    mein gemerkter Wert war 12
    8 ist nicht größer als 12, also kann 8 nicht der größte Wert
    insgesammt sein. Egal welche Zahlen noch kommen, die 12 ist
    auf jeden Fall größer als die 8

    nächste Zahl: 15
    ist 15 größer als das bisherige Maximum, welches 12 war?
    Ja ist es.
    Also kann 12 sicher nicht mehr der größte WErt in der Reihe sein,
    denn die 15 sind größer. Also merke ich mir die 15 als größten
    Wert

    nächste Zahl: 23
    ist 23 größer als die gemerkten 15?
    Ja ist es.
    Also merk ich mir die 23 anstelle der 15

    nächste Zahl: 11
    ist 11 größer als die gemerkten 23?
    Nein ist es nicht.
    Also kann 11 nicht die größte Zahl sein, sondern die 23
    bleiben auch weiterhin mein Kandidat für die größte Zahl

    nächste und letzte Zahl (weil damit die 6 Zahlen abgearbeitet sind)
    die 19
    19 ist nicht größer als die gemerkten 23
    Ergo kann auch 19 nicht die größte Zahl insgesamt sein.
    Die gemerkten 23 bleiben bestehen

Und da ich somit alle Zahlen untersucht habe und ich am Ende mit der 
gemerkten 23 ausgestiegen bin, ist 23 die größte Zahl in dieser Reihe 
von Zahlen.

Ob ich jetzt am Anfang mit einem gemerkten größten Wert von 0 beginne 
oder ob ich gleich mit der allerersten Zahl im Array als bisherigen 
größten Wert anfange ist wurscht, solange sicher ist, dass 0 nicht 
fälschlicherweise der größte Wert sein kann, weil alle Zahlen zufällig 
kleiner als 0 (also negativ) sind.

So. Und genau das, was ich selbst persönlich machen würde, muss auch 
letzten Endes dein Programm machen um festzustellen, welches der größte 
Wert in einem Array ist.

von Ralf G. (ralg)


Lesenswert?

Gehe mal Schritt für Schritt das Programm durch:
Bedeutung deiner Variablen, Anfangswerte deiner Variablen, Indexbereich 
von 'daten'...

Edit: da war Karl Heinz mit der 'Langfassung' schneller :-)

von Tim Z. (mikroluk)


Lesenswert?

Ja gut. Also gebe ich den 41 Kästchen Namen? So z.B. :
+-----+-----+-----+-----+-----+-----+
|  a  |  b  |  c  |  d  |  e  |  f  |
+-----+-----+-----+-----+-----+-----+
Und schreibe dann
wenn a größer ist als b, lösche b und das solang bis ein Wert übrig 
bleibt?
Also nicht das ich jetzt alles ausschreibe (if a>b then, if b>c then), 
sondern das in eine Schleife packe?

von Karl H. (kbuchegg)


Lesenswert?

Tim Z. schrieb:
> Ja gut. Also gebe ich den 41 Kästchen Namen? So z.B. :

Nein. du gibst ihnen keine Namen

Das erste ArrayElement ist   daten[0]
das zweite ArrayElement ist  daten[1]
das dritte ArrayElement ist  daten[2]
.....

und weil du in den [ ]   eine Zahl angeben kannst, kannst du dort auch 
einen arithmetischen Ausdruck angeben. Genau das ist nämlich das geile 
an Arrays. Man kann   daten[i]  schreiben, und wenn die Variable i den 
Wert 1 hat, dann wird bei daten[i] der Wert für daten[1] geholt. Wenn i 
den Wert 5 hat, dann wird bei daten[i] dann eben der Wert daten[5] 
geholt. Mit anderen Worten: Der Array Index ist berechenbar.
Und deswegen kann man schreiben

var
   i: integer;

...

   for i := 0 to 40 do
     println( daten[i] );


und das gibt alle 40 Arrayelemente aus, weil i #in einer Schleife# von 0 
bis 40 durchgezählt wird und das jeweilige i-te Element aus dem Array 
ausgegeben wird. Im ersten Schleifendurchlauf hat i den Wert 0 und es 
wird daten[0] ausgegeben. Im nächsten Schleifendurchlauf hat i dann den 
Wert 1 und es wird daten[1] ausgegeben. Im daruaffolgenden 
Schleifendurchlauf hat i dann den Wert 2 und es wird daten[2] 
ausgegeben. etc. etc.

von Ulrich P. (uprinz)


Lesenswert?

Ich glaube Du beschreibst nicht genau was Du wirklich willst.

Aber der Reihe nach:
Du hast in Deinem Beispiel die Schleife vergessen, die durch das Array 
durch läuft.

Dann macht es Sinn, zuerst den ADC zu lesen, dann diesen Wert auf 
"größer als der bisher größte" zu vergleichen und in größterWert 
zwischen zu speichern.

Das ganze sieht aber danach aus, als wolltest Du einen Mittelwert aus 40 
Werten bilden, und davon die Extrema ausschließen, also den jeweils 
kleinsten und größten Messwert nicht bewerten.

Das geht auch viel einfacher :)

Mittelwert ist ja die Summe aller Werte durch die Anzahl der Werte.
Also wie groß kann die Summe maximal werden?
ADC-Maximum * Anzahl also beispielsweise 2^10*40=40960. Je nach 
Controller sind Integer typen 16 oder 32 Bit groß, passt also.

Jetzt durchlaufen wir also einfach eine Schleife von 40 Messwerten und 
addieren diese zu einer Summe.
Danach merken wir uns noch den größten und den kleinsten Messwert.
Nachdem wir die 40 Messwerte addiert haben, ziehen wir davon den größten 
und den kleinsten wieder ab und dividieren lediglich durch 38 (denn zwei 
Messwerte bleiben unberücksichtigt.

Und weil das Dividieren einen kleinen Microcontroller immer so fertig 
macht, addieren wir nicht 40 sondern 34 Werte, subtrahieren unsere 
beiden Extrema und teilen dementsprechend durch 32. Das entspricht einem 
Shift-Right um 5 und geht jedem kleinen uC leicht von der Hand.

Wir haben damit die Mittelwerte ohne Extrema, ohne viel RAM Verbrauch 
und mit frei gewordener Rechenzeit.

Gruß, Ulrich

von Tim Z. (mikroluk)


Lesenswert?

Ok. Jetzt wurden alle Werte ausgegeben. Kann man dann jetzt schreiben
var größterWert:integer;
...
if (i>größterWert) then
...
?
Ich möchte keinen Mittelwert. Ich möchte nur den größten gemessenen 
Wert.

von Karl H. (kbuchegg)


Lesenswert?

Tim Z. schrieb:
> Ok. Jetzt wurden alle Werte ausgegeben. Kann man dann jetzt schreiben
> var größterWert:integer;
> ...
> if (i>größterWert) then

wieso willst du hier i mit dem größtenWErt vergleichen?

Hab ich das am Papier gemacht?
Nein, hab ich nicht.
Ich hab die Werte aus daten, und nacheinander verglichen

Ich hab bei meinem Beispiel nicht

   (0)  (1)  (2) (3)   (4)   (5)
 +----+----+----+----+-----+-----+
 | 12 | 8  | 15 | 23 |  11 | 19  |
 +----+----+----+----+-----+-----+

0, 1, 2, 3, 4 und 5 nacheinander verglichen. Sondern ich habe den Inhalt 
vom Array an der Indexposition 0, also daten[0] mit dem bisherigen 
größten Wert verglichen. Und dann hab ich den Wert an der Indexposition 
1, also daten[1] mit dem größten Wert verglichen.

von Tim Z. (mikroluk)


Lesenswert?

Aber
var
   i: integer;

...

   for i := 0 to 40 do
     println( daten[i] );
gibt doch nur alle Werte aus. Den größten Wert hab ich doch dann 
immernoch nicht?

von Karl H. (kbuchegg)


Lesenswert?

Ulrich P. schrieb:
> Ich glaube Du beschreibst nicht genau was Du wirklich willst.

Was er will ist klar (auch aus seinem anderen Thread):
Er will ein Programm schreiben ohne die dazu notwendigen Grundlagen zu 
lernen bzw. zu üben.

von Karl H. (kbuchegg)


Lesenswert?

Tim Z. schrieb:

>    for i := 0 to 40 do
>      println( daten[i] );
> gibt doch nur alle Werte aus. Den größten Wert hab ich doch dann
> immernoch nicht?


Nein.
Das sollte für dich auch nur Anschaungsmaterial sein, warum man 
überhaupt Arrays benutzt und was man mit dem Index so machen kann, bzw. 
was man davon hat, dass man den Index auch 'berechnen' kann.

von Tim Z. (mikroluk)


Lesenswert?

Achso ok. Ich habe die Grundlagen schon verstanden. Das mit den Servos 
habe ich jetzt auch verstanden. Das Problem ist nur, dass ich mir das 
mit Beispielen und so nicht so gut vorstellen kann. Wenn ich das mit 
Programmcodes lese fällt mir dies wesentlich einfacher, weil ich dann 
ein Bild habe, wie ich das Programm schreiben soll.

von Karl H. (kbuchegg)


Lesenswert?

Tim Z. schrieb:

> Programmcodes lese fällt mir dies wesentlich einfacher,

Den Schmäh kenn ich :-)

Aber mach dir keine Hoffnungen. Ich schreib dir das nicht.
Nicht mit dem was du hier zeigst. Da fehlt es an allen Ecken und Enden.
Ich weiß nicht, warum du für die Schule sowas programmieren musst und 
warum du so schwimmst. Hast du das ganze Jahr über nichts getan, bist du 
nur mitgeschwommen, hast du deine Hausübungen nicht gemacht ... Ich hab 
keine Ahnung, ich will es auch nicht wissen. Ich weiß nur, dass ich 
dich, wenn ich dein Lehrer wäre, mit der Performance glatt und ohne 
Gewissensbisse durchfallen lassen würde. Es sei denn natürlich, das ist 
ein Freifach. Dann würde ich dir nahelegen dir ein anderes Hobby zu 
suchen oder es in einem oder zwei Jahren noch mal zu versuchen. Momentan 
bist du noch nicht soweit.

von Tim Z. (mikroluk)


Lesenswert?

Ich habe nicht verlangt, das auf dem Silbertablett zu bekommen. Wollte 
lediglich Hilfe, da wir das noch nicht gelernt haben in der Schule. In 
der Arbeit hatte ich eine gute Note und auch alle anderen vom Lehrer 
vorgegebenen Programmierarbeiten habe ich erfolgreich beendet. Nur 
leider ist das, was ich jetzt schreiben muss wesentlich schwerer und ich 
habe so gut wie keine Kenntnisse auf diesem Niveau. Die Kenntnisse würde 
ich mir auch gerne erarbeiten (Von mir aus auch mit viel Zeit) . Aber im 
Internet finde ich nur Anleitungen für Profis. (Und wenn dann nicht für 
meine mir zur Verfügung gestellten Geräte oder andere 
Programmiersprachen)

von Karl H. (kbuchegg)


Lesenswert?

Tim Z. schrieb:
> Ich habe nicht verlangt, das auf dem Silbertablett zu bekommen. Wollte
> lediglich Hilfe, da wir das noch nicht gelernt haben in der Schule. In
> der Arbeit hatte ich eine gute Note und auch alle anderen vom Lehrer
> vorgegebenen Programmierarbeiten habe ich erfolgreich beendet.

Sorry. Aber das glaub ich dir nicht.

> Nur
> leider ist das, was ich jetzt schreiben muss wesentlich schwerer


Das, warum es in diesem Post geht ist eine der einfachsten Übungen mit 
Arrays. Und Arrays an sich stehen auch in Pascal ganz am Anfang. So 
ungefähr 3. oder 4. Unterrichtsstunde Einführungsunterricht in Pascal. 
Du kannst mir nicht erzählen, dass ihr ein ganzes Semester lang 
programmiert habt, ohne je auf Arrays gestossen zu sein.

Egal. Wie auch immer.

Es sind ja nicht nur Arrays.
Du hast Schwierigkeiten in der Definition von Variablen - manchmal meine 
ich du weißt gar nicht, was eine Variable ist. Der Begriff Schleife sagt 
dir gar nichts. Mit Syntax kommst du nicht klar. Man beschreibt dir ein 
Verfahren in Prosa und du präsentierst irgendwas, das noch nicht mal in 
Ansätzen irgendwas mit der Beschreibung zu tun hat - so das man noch 
nicht mal "dicht drann" sagen könnte (und das bei 4 Zeilen Code - das 
ist dann schon eine Leistung, aber eine negative) .... eben an allen 
Ecken und Enden.

von Tim Z. (mikroluk)


Lesenswert?

Wir haben das ganze Semester (Halbjahr) programmiert, jedoch zuerst 
Delphi (Ampelprogrammierung und Turtle) und danach Turbopascal (2 oder 3 
Unterrichtsstunden) . In Mikropascal haben wir gelernt LED an und 
auszuschalten Potis, LCDs, NTCs und LDRs zu benutzen und Servos zu 
steuern.

von Tim Z. (mikroluk)


Lesenswert?

Was Variablen sind kann ich erklären:
Eine Variable steht für einen Wert, der Variabel ist, sich also 
verändern kann. (Ist i=1 und man sagt i+1 und danach soll i ausgegeben 
werden ist i=2)
Schleifen sind dazu da um bestimmte Prozesse zu wiederholen. 
(Beispielsweise eine for Schleife . Wenn ich für i in 10 Schritten 
erreichen will, dass i=10 ist, dann würde ich das so schreiben:
var i:integer;
...
i:=1;
for i:=1 to 10 do
begin
i:=i+1;
end;
Und bei Syntax bin ich mir nicht 100% sicher, aber ich glaube es ist die 
Schreibweise. (Beispielsweise ein Strichpunkt nach var i:integer;)
EDIT: Ich weiß, dass ich hier schlechtes Deutsch angewendet habe. Sorry

von Karl H. (kbuchegg)


Lesenswert?

Tim Z. schrieb:

> Schleifen sind dazu da um bestimmte Prozesse zu wiederholen.
> (Beispielsweise eine for Schleife . Wenn ich für i in 10 Schritten
> erreichen will, dass i=10 ist, dann würde ich das so schreiben:
> var i:integer;
> ...
> i:=1;
> for i:=1 to 10 do
> begin
> i:=i+1;
> end;

Siehst du - genau das meine ich.
Selbstgewählte Aufgabenstellung, so einfach wie es nur sein kann.
Und trotzdem - falsch -

von Tim Z. (mikroluk)


Lesenswert?

Was habe ich falsch gemacht?

von Karl H. (kbuchegg)


Lesenswert?

Tim Z. schrieb:
> Was habe ich falsch gemacht?

Wenn das for die Variable i von sich aus durchzählt und du innerhalb der 
Schleife i nochmal um 1 erhöhst, dann kann das nicht deine 
selbstgewählte Aufgabenstellung erfüllen.

Ein 'for' beinhaltet schon, dass die Schleifenvariable bei jedem 
Durchlauf um 1 erhöht wird!

von Tim Z. (mikroluk)


Lesenswert?

Ok verstanden dann halt so:
> var i:integer;
var a:integer;
> ...
> i:=1;
> for a:=1 to 10 do
> begin
> i:=i+1;
> end;
Das meine ich mit Denkanstoß. Mir zeigen was ich falsch gemacht habe und 
dann hoffe ich, dass ich das selber lösen kann!

von Karl H. (kbuchegg)


Lesenswert?

Tim Z. schrieb:
> Ok verstanden dann halt so:
>> var i:integer;
> var a:integer;
>> ...
>> i:=1;
>> for a:=1 to 10 do
>> begin
>> i:=i+1;
>> end;

Ein Pascal Programm kann nur eine 'var' Sektion haben.

Man könnte sich jetzt auch noch fragen, wozu man da jetzt eigentlich ein 
a UND ein i braucht, wenn die Werte von a und i sowieso immer identisch 
sind.

von Tim Z. (mikroluk)


Lesenswert?

Man kann es ja dann auch so machen
var i:integer;

...
for i:=1 to 10 do
begin
end;

und für solche Fehler gibt es ja dann noch den Compiler, der mir das 
sagt!

von Karl H. (kbuchegg)


Lesenswert?

Tim Z. schrieb:

> Das meine ich mit Denkanstoß. Mir zeigen was ich falsch gemacht habe und
> dann hoffe ich, dass ich das selber lösen kann!


Der springende Punkt ist, dass es für jemanden, der eine 
Aufgabenstellung wie deine lösen will, es überhaupt nicht mehr notwendig 
sein darf sich mit diesen Problemchens rumzuschlagen, die dich plagen.

Das ist so wie ein Chirurg, der eine Blinddarmoperation macht und erst 
mal die OP-Schwester fragt, wie rum er das Skalpell halten muss.


Ich will dich wirklich nicht entmutigen.
Aber so wie ich das sehe, ist die einzige Chance, wie du innerhalb der 
nächsten 2 Wochen zu deinem Sonnenfolgerprogramm kommst, die, dass dir 
wer anderer das Programm schreibt.
Klingt nicht nett, ich weiß. Aber es ist die Wahrheit.

von Tim Z. (mikroluk)


Lesenswert?

Naja das ist schon so. Verstehe sie ja auch, dass es sich vielleicht 
anhört als ob ich faul wäre. Letzten Endes habe ich mir das ja nicht 
alleine ausgedacht sondern in der Gruppe. (Selbst wenn nicht, war es 
Aufgabe ein Projekt zu überlegen) . Ich habe schon nach einem 
kostenlosen Ebook oder so gesucht, aber auch da keins gefunden. Da ich 
halt noch Anfänger bin passieren mir solche Fehler. Aber das ist so, wie 
wenn der Chirurg noch in der Ausbildung ist und ihm dann so ein Fehler 
passiert. Wenn ich alles schon könnte und wüsste, müsste ich nicht mehr 
in die Schule zu gehen. Ich verstehe den Sinn der Aufgabe, dass die 
Schüler ein Projekt machen so, dass es eben genau diese Anfängerfehler 
unterbinden soll, in dem man die Programmiersprache anwendet und diese 
sich durch die Anwendung und Übung dann im Gehirn verankert...

EDIT: Das mit dem Thread gestern (oder vorgestern), haben mir mehr meine 
Gruppenmitglieder eingeredet. War ne blöde Idee. Ich würde ja sowieso 
den Sinn der Aufgabe unterbinden.

von DirkB (Gast)


Lesenswert?

Wie wäre es mit einem echten Buch aus der Bibliothek?

von Paul Baumann (Gast)


Lesenswert?

Ich empfehle Dir das Buch "Programmiersprache Turbo-Pascal"
von Gregor Kuhlmann ISBN 3-499-18148-7

Das ist sehr nahrhaft, in deutscher Sprache und enthält auch viel
Beispiel-Code.

MfG Paul

http://www.ebay.de/sch/sis.html?_nkw=Programmiersprache+TURBO+PASCAL+Gregor+Kuhlmann+&_itemId=250823745466

von Spess53 (Gast)


Lesenswert?

Hi

>Wir haben das ganze Semester (Halbjahr) programmiert, jedoch zuerst
>Delphi (Ampelprogrammierung und Turtle) und danach Turbopascal (2 oder 3
>Unterrichtsstunden) .

Das zugrunde liegende Pascal ist das gleiche. Stammt beides von Borland.

>In Mikropascal haben wir gelernt LED an und
>auszuschalten Potis, LCDs, NTCs und LDRs zu benutzen und Servos zu
>steuern.

Ändert aber nichts an der Tatsache, das du grundlegende Defizite in 
Pascal hast.

MfG Spess

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.