Array Borland Builder

Hallo Zusammen,
bin ein C++ einsteiger.
Habe am Donnerstag eine Klassenarbeit zum Thema Array.
Habe mal versucht zu üben, aber irgendetwas mache ich falsch.
Ziel: Zahlen in ein zweidimensionales Array einlesen und später auslesen. z.B. 3 Weitspringer (Springernr: 10, 11, 12) sowie deren gesprungene weiten.

Anbei mal das was ich geschrieben habe.
Funktioniert aber nicht so wie es sein soll.
Kann mir einer bitte helfen??


#include
#include
#pragma hdrstop
#include
#include
#include

#pragma argsused
int main(int argc, char* argv[])
{
int tabelle [3][2];
int i;
int zeit;

for (i=1; i

Danke schon einmal im voraus.

Hallo!

Anbei mal das was ich geschrieben habe.
Funktioniert aber nicht so wie es sein soll.
Kann mir einer bitte helfen??

Deine Tabelle hat die Größe 3x2, für die Schleife bräuchtest du aber eine der Größe 11x2.

Jan

Hallo Jan,
erst einmal danke für die rasche Antwort.
Allerdings verstehe ich nicht weshalb 11x2???
Ich will doch nur folgendes, eine Tabelle mit 3 Zeilen (Springer 10,11, 12) und 2 Spalten (eines für die Springer nummern und eines für die werte der Springer).

Also ungefähr so:
Springer 10, 7meter
Springer 11, 3meter
Springer 12, 6 meter

mir würde auch
10, 7
11, 3
12, 6

vollkommen reichen.
Daher verstehe ich jetzt nicht weshalb 11x2??

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

Daher verstehe ich jetzt nicht weshalb 11x2??

Deine Laufvariable geht von 1 bis 10. Also greifst du im Letzten Schleifendurchlauf mit tabelle[i][1] auf die 11. Zeile deiner Tabelle zu, obwohl sie nur 3 Zeilen hat. Wie kommst du also auf den Bereich 1 bis 10?

Jan

Hallo,

bin ein C++ einsteiger.

Dein Code ist rein in C. Da ist nichts C++.

Habe am Donnerstag eine Klassenarbeit zum Thema Array.

Da fängst Du ja richtig früh mit dem lernen an :smile:

#include
#include

Wozu brauchst Du die vcl und time Bibliotheken?

#pragma hdrstop

Was soll das pragma da und wenn Du schon hdrstop nutzt, wo ist der Pfad?

#include
#include

Wozu brauchst Du die conio?

#include

#pragma argsused

Wenn Du keine Warnungen über nicht gebrauchte Parameter haben willst, dann schreib doch besser

int main(void) 

und lass das pragma weg.

int main(int argc, char* argv[])
{
int tabelle [3][2];

Wie bereits gesagt: Eine „Tabelle“ mit drei Zeilen und zwei Spalten. Aber Achtung! Die Indizes gehen von 0 bis 2 bzw. 0 bis 1, nicht von 1 bis 3 oder 1 bis 2!

Missverständnisse damit sind so häufig, dass man ihnen einen eigenen Namen gegeben hat: „off-by-one Error“. Also „Einen-daneben-Fehler“

int i;
int zeit;

for (i=1; i

Wozu ist das getch() gut?

Damit will soll das Programm eine Pause machen, denke ich: Also es wird auf einen Tastendruck gewartet.

Besser und eleganter ist natürlich:
system(„pause“);

Hallo!

Wozu ist das getch() gut?

Damit will soll das Programm eine Pause machen, denke ich:

Ja, damit sich das DOS-Fenster nach dem Doppelklick auf die exe-Datei nicht gleich wieder schließt. So’n ein Blödsinn wird gelehrt, statt den Schülern beizubringen, wie man ein Konsolenfenster öffnet, um dann darin direkt zu arbeiten.

Besser und eleganter ist natürlich:
system(„pause“);

Naja, wenn schon eine proprietäre Lösung, dann doch besser getch(), statt sich auf das Vorhandensein von pause zu verlassen.

Jan

Hallo,
also ich wollte eigentlich jeden springer 3 mal springen lassen und somit von jedem Springer 3 mal ein wert bekommen.
Die höchsten werte der 3 Springer sollte im Array bleiben, die vorherigen werte überschrieben werden.
Mit 1 bis 10 wollte ich eigentlich angeben, das der eingegebene Wert min. 1 und max. 10 sein soll.
Nun habe ich mal 1 - 1 angegeben anstelle 1-10.
Nun läuft das Programm einmal durch und das Fenster schließt sich danach. Wäre ja richtig, da ich 1-1 angegeben habe, richtig?
Das Problem ist nur, das am Ende des Programms ein großer wirrkürlicher Zahlenwert ausgegeben wird anstelle der tabelle (array).
Also sozusagen nicht die Werte die ich vorher eingebe und in den Array einlese.
Woran kann das liegen?

Danke und Gruß
Cojay

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

Das Problem ist nur, das am Ende des Programms ein großer
wirrkürlicher Zahlenwert ausgegeben wird anstelle der tabelle
(array).

Gleich aus zwei Gründen:

  1. Die Feldindexe beginnen mit 0. Wenn die Schleifenvariable i den Startwert 1 hat, wie bei dir, wird z.B. tabelle[0][0] oder tabelle[0][1] nie etwas zugewiesen. for-Schleifen über Arrays sehen faktisch immer so aus (für ein Array mit 100 Elementen):

    for(i=0; i
    Mit i gleich 0 greift man aufs 1. Element, mit i gleich 99 auf das letzte Element des Arrays zu.

    1. Die 1. Tabellenspalte enthält komplett „Zufallswerte“, weil du ihr ebenfalls nie zuweist. Da sollen ja die Springernummern rein.

    Jan

Hallo!

Das Problem ist nur, das am Ende des Programms ein großer
wirrkürlicher Zahlenwert ausgegeben wird anstelle der tabelle
(array).

Gleich aus zwei Gründen:

  1. Die Feldindexe beginnen mit 0. Wenn die Schleifenvariable i
    den Startwert 1 hat, wie bei dir, wird z.B. tabelle[0][0] oder
    tabelle[0][1] nie etwas zugewiesen. for-Schleifen über Arrays
    sehen faktisch immer so aus (für ein Array mit 100 Elementen):

for(i=0; i
Mit i gleich 0 greift man aufs 1. Element, mit i gleich 99 auf
das letzte Element des Arrays zu.

  1. Die 1. Tabellenspalte enthält komplett „Zufallswerte“, weil
    du ihr ebenfalls nie zuweist. Da sollen ja die Springernummern
    rein.

Das verstehe ich nicht. Mit scanf %i, &zeit lese ich den wert ein und mit tabelle [i][1]= zeit speicher ich es doch in den array, oder nicht?

Jan

Also,
bevor ich dich noch um letzten nerv bringe,
kannst du mir den richtigen Code schreiben?
ist ja nicht allzu lang.
Dann könnte ich 1 zu 1 vergleichen mit meinem code und dann auch den Fehler genau sehen.
Das wäre echt super von dir.

Danke und Gruß
cojay

Hallo!

Das verstehe ich nicht. Mit scanf %i, &zeit lese ich den wert
ein und mit tabelle [i][1]= zeit speicher ich es doch in den
array, oder nicht?

Ja, aber i beginnt bei dir mit 1. i wird also nie 0 und somit tabelle[0][1] nie etwas zugewiesen.

bevor ich dich noch um letzten nerv bringe,
kannst du mir den richtigen Code schreiben?

Sollst du haben, auch wenn ich nicht völlig verstanden habe, was passieren soll. Ich gehe mal davon aus, dass die Springernummern mit 10 beginnen sollen.

for(i=0; i

Hallo,

Das verstehe ich nicht. Mit scanf %i, &zeit lese ich den wert
ein und mit tabelle [i][1]= zeit speicher ich es doch in den
array, oder nicht?

Wozu nimmst Du dann überhaupt einen zweidimensionalen Array, wenn Du nie etwas in die erste Spalte schreibst (also [x][0]). Da sollen doch wohl die Springernummern rein, oder? Der Computer kann das aber nicht erraten, das musst Du schon programmieren.

Am besten atmest Du mal ruhig durch und schreibst das Programm ganz von vorne! Da ist soviel falsch, dass es einfacher ist, komplett neu anzufangen. Male Dir doch vorher mal ein Ablaufdiagramm oder schreibe in einfachem Pseudocode auf, wie es funktionieren soll. Dann kannst Du Dich daran entlanghangeln beim programmieren.

bevor ich dich noch um letzten nerv bringe,
kannst du mir den richtigen Code schreiben?

Ich hoffe, er tut es nicht. Du sollst doch was lernen. Wenn man es Dir vorkaut, dann wird das nichts. Für die Arbeit morgen sehe ich aber ein Problem auf Dich zukommen. Mit oder ohne Musterlösung.

Gruß

Fritze

Na toll. Wieder eine Lösung vorgekaut. Schade eigentlich.

Gruß

Fritze

Hallo Fritze!

Na toll. Wieder eine Lösung vorgekaut. Schade eigentlich.

Naja nu. Er hat sich ja nun wirklich bemüht. Der Groschen will einfach nicht fallen und morgen ist Klausur. Dann darf er ruhig ein lauffähiges Beispiel bekommen.

Gruß, Jan

Damit will soll das Programm eine Pause machen, denke ich:

Ja, damit sich das DOS-Fenster nach dem Doppelklick auf die
exe-Datei nicht gleich wieder schließt. So’n ein Blödsinn wird
gelehrt, statt den Schülern beizubringen, wie man ein
Konsolenfenster öffnet, um dann darin direkt zu arbeiten.

Willst du beim Programmieren jedesmal erst kompelieren, Konsole öffnen, Programm ausführen?
Uns wurde geleert: Klick im Visual Studio auf Debug -> Programm starten (ohne debuggen) (oder so ähnlich)
Dann hält es zwar auch ohne getch() oder system(„pause“) an, aber die Klickerei ist doch auf dauer ziemlich nerfig.
Mit system(„pause“) brauche ich nur auf den Abspielpfeil oder F5 klicken.
bei getch() kann dir passieren, dass das Programm manchmal nicht anhält, weil noch was im Input-Buffer ist.
Also vorher noch ein fflush(stdout) oder gleich system(„pause“);

Klar. Wenn man mit dem Programmieren fertig ist, sollte man das „Pause“ entfernen. Alternativ kann man auch Makros einsetzen, die dann nur beim Debugging pausieren.

Naja, wenn schon eine proprietäre Lösung, dann doch besser
getch(), statt sich auf das Vorhandensein von
pause zu verlassen.

Wo gibt es das denn nicht?
Ist ja hauptsächlich auch nur zum Debuggen dar.

Hallo,
ja hat funktioniert.
Und, ich habeerkannt wo meine groben Gedankenfehler waren.

Danke nochmals.

Habe dann auch weiter geübt und ein 9x2 aray gebildet, wo jeder der 3 Springer, 3 mal springt (also 3 werte pro Springer =9 Werte).

Das hat auch Funktioniert.
Nun versuche ich irgendwie das hinzubekommen, die besten Werte der 3 Springer aus dem Array auszulesen. Da komme ich aber wieder an schwierigkeiten.

Könnt Ihr mir da weiterhelfen?

Danke und Gruß

Na toll. Wieder eine Lösung vorgekaut. Schade eigentlich.

Gruß

Fritze

Hallo Fritze,
ich weiss du meinst es gut. Und eigentlich hast du ja auch recht.
Aber wenn man mal auf dem Schlauch steht, will man es einfach nicht begreifen. Meine Absicht war es ja nicht, es einfach stur abzuschreiben und auswendig zu lernen, sondern den Code richtig zu lesen und mit dem von meinem zu vergleichen und vor allem zu verstehen. Ich denke da ist ein unterschied, oder?

-gruß
Cojay

Hi
Bei drei Springern, mit jeweils drei Versuchen, hätte ich an ein 3x3 array gedacht, aber gut.

Wie würdest du denn normalerweise (im Kopf) vorgehen, um das Maximum aus drei Zahlen herauszufinden?
Versuch dir darüber klar zu werden, und dann einfach im Code abbilden.
Gruß
re-G

Hallo,

Habe dann auch weiter geübt und ein 9x2 aray gebildet, wo
jeder der 3 Springer, 3 mal springt (also 3 werte pro Springer
=9 Werte).

Ich verstehe immer noch nicht so ganz, wie Du eine Tabelle „malen“ würdest, in denen drei Springer je drei Weiten springen. Warum nicht

Springer Nr. -- Weite 1 -- Weite 2 -- Weite 3
---------------------------------------------
 11 -- 10 -- 10 -- 11
 9 -- 11 -- 12 -- 12
 123 -- 12 -- 10 -- 11
---------------------------------------------

Das wären bei mir 3 Zeilen mit je vier Spalten. Ein Array mit [3][4] also. Wenn die Springer immer in der selben Reihenfolge kommen und aufeinanderfolgend nummeriert sind, dann braucht man nur 3x3, weil man sich die erste Spalte schenken kann und die Nummer gleich der Zeilenzahl ist.

Wenn das vielleicht damit geklärt ist, kannst Du Dir überlegen, auf welche Weise Du den weitesten Sprung finden möchtest. Du könntest einerseits stumpf danach suchen, wenn alle Werte eingegeben sind. Oder du sortierst die Werte bereits bei der Eingabe und weißt das dann automatisch. Es gibt verschiedene mehr oder weniger elegante und aufwändige Methoden für solche Aufgaben.

Gruß

Fritze

Hallo,

Habe dann auch weiter geübt und ein 9x2 aray gebildet, wo
jeder der 3 Springer, 3 mal springt (also 3 werte pro Springer
=9 Werte).

Ich verstehe immer noch nicht so ganz, wie Du eine Tabelle
„malen“ würdest, in denen drei Springer je drei Weiten
springen.

Sei mir nicht böse, aber ich habe kein mal Unterricht und möchte auch nicht malen.

Warum nicht

Springer Nr. – Weite 1 – Weite 2 – Weite 3

11 – 10 – 10 – 11
9 – 11 – 12 – 12
123 – 12 – 10 – 11

Das ist sicher auch eine Möglichkeit, aber was spricht den gegen meine 9x2 Tabelle? Eine Spalte für die Springer Nr. und die andere für die Werte.
Viele Wege führen nach Rom.

Das wären bei mir 3 Zeilen mit je vier Spalten. Ein Array mit
[3][4] also. Wenn die Springer immer in der selben Reihenfolge
kommen und aufeinanderfolgend nummeriert sind, dann braucht
man nur 3x3, weil man sich die erste Spalte schenken kann und
die Nummer gleich der Zeilenzahl ist.

Wenn das vielleicht damit geklärt ist, kannst Du Dir
überlegen, auf welche Weise Du den weitesten Sprung finden
möchtest. Du könntest einerseits stumpf danach suchen, wenn
alle Werte eingegeben sind. Oder du sortierst die Werte
bereits bei der Eingabe und weißt das dann automatisch. Es
gibt verschiedene mehr oder weniger elegante und aufwändige
Methoden für solche Aufgaben.

Gruß

Fritze

Habe mir meine Gedanken bereits gemacht.
Würde ja nicht einen Forumbeitrag schreiben, bevor ich dies getan hätte.
Ich habe es mit if & else versucht
Auszug aus dem Code:

scanf ("%i", &Zeit)

if (Zeit>i)
{
tabelle [i][1]=zeit
}
Damit wollte ich vorher überprüfen ob der eingelesene und der Variable Zeit zugeordnete Wert, größer ist als der Wert der bisher eingetragen war.
Aber es Funktioniert irgendwie nicht.

Du schreibst zwar immer, „überlege und schreibe es dir auf“ .
Für Leute wie dich, die hierin geübt sind, ist es sicherlich einfach.
Aber diejenigen für die es neu ist, bauen oft Gedankenfehler mit rein oder verstehen es schlicht und einfach nicht. Auch wenn es noch so einfach ist. Da brauch man jemand der es einem schritt für schritt erklärt.
Ich schreibe sicherlich keinen Code ohne vorher zu überlegen.
Aber wenn man schon bei der Überlegung Gedankenfehler hineinbaut, weil man es nicht kennt, und zusätzlich dann auch noch den Code Fehlerhaft aufschreibt, weil man hier auch ungeübt ist, wird es schwer.
Du musst es dir so vorstellen, wie wenn ein Kind neu rechnen lernt. Wenn es in seinen Gedanken bereits einen Rechen/Gedankenfehler macht, kann es noch so darüber nachdenken, aber der Fehler wird immer wieder eingebaut. Bis Ihm jemand den Fehler zeigt und sagt 1 Apfel + 2 Apfel = 3 Apfel.

Also wenn es mir bitte jemand auf solche Art erklären kann und möchte, dann bitte, bitte!
Fragen warum ich es so mache und nicht anders, obwohl es vielleicht doch so geht, und das ich doch vorher überlegen soll, und was eigentlich irgenwelche Befehle in meinem Code sollen, bringen mich nicht wirklich weiter.

Gruß

Cojay