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 :)
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.
- 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.
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
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.
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 :-)
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?
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.
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
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.
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.
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?
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.
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.
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.
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.
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)
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.
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.
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
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 -
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!
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!
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.
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!
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.