Neulingsfrage... ;) (Arrays)

GeekGirl

GeekGirl

voll das krasse Bunny
Hi Ihr Lieben,

habe mich gestern entschieden, doch endlich C++ zu lernen... das erste Buch habe ich nach etlichen Stunden schon halb durch (es macht tatsächlich süchtig) :) Nun stehe ich aber vor einem Problem:

Ich möchte die Größe eines Arrays zur Laufzeit festlegen. Das geht anscheinend nicht. Das Programm errechnet einen Mittelwert von einzugebenden Zahlen. Im Quelltext ist die Anzahl der einzugebenden Zahlen, die als Grundlage zur Berechnung dienen, festgelegt. Wie kann ich den User bestimmen lassen, von wievielen Zahlen er den Mittelwert berechnen will? Geht das überhaupt mit Arrays, muß ich da Pointer nehmen oder gibts da ne bessere Möglichkeit?

Hat es einen Sinn, mich näher mit Zeigern/Pointern zu diesem Thema zu befassen, oder ist es dafür noch zu früh?

Hier mal der Code (bitte nicht über meine drolligen Kommentare lachen...) :D :

<code>

//Mittelwert berechnen
#include <iostream>

using namespace std;

int main()
{
double werte[10]; // Definition des Arrays mit 10 double-Werten
double mittelwert = 0;
int loop; //Schleifenvariable, wird unten festgelegt

for(loop = 0; loop < 10; loop++)
{
cout << " Gib einen Wert ein: ";
cin >> werte[loop]; /* um automatisch mit jedem neuen Schl.durchgang
auf das naechste Arrayelement zuzugreifen, uebergibt man die
Schleifenvariable als Index (wobei Index= 1. Zahl im Array)*/

mittelwert += werte[loop]; /* Array-Werte werden in der Variablen
mittelwert addiert */
}
cout << "\n Mittelwert: " << mittelwert/10 << endl;

return 0;
}
</code>

Danke & Gruss,
GeekGirl
 
Ich würd sagen malloc und realloc sind das Stichwort - ganz ohne Pointer wird es bei dynamischen Feldern nicht gehen.

Sowas ähnliches (auch mit Schleife, in der Werte in ein Feld eingefügt wurden) hab ich mal als Info Beleg schreiben müssen ...

hier nur kurz was zusammenkopiert ...
Code:
struct run_info
{ ... }

typedef struct run_info RUN_INFO;

(...)


RUN_INFO *work_table = NULL;// Zeiger auf dynamisches Feld

work_table = (RUN_INFO *)malloc(*array_size*sizeof(RUN_INFO); // Feld anlegen

*array_size = dev_count + dyn_array_oversize; // neue groesse berechnen
work_table=(RUN_INFO *)realloc(work_table, *array_size*sizeof(RUN_INFO)); // mehr Speicher anfordern

Das Feld würde ich aber nicht mit jeder hinzugefügten Variable um 1 vergrößern - das ist imho ineffizient.

Im Anhang zum Nachvollziehen das Programm mit auszuwertender Datei - sollte eigentlich funktionieren.
 

Anhänge

  • main.txt
    5,1 KB · Aufrufe: 3
  • daten03.txt
    5,5 KB · Aufrufe: 2
atomical schrieb:
Ich würd sagen malloc und realloc sind das Stichwort -

Nur mal eine kleine Anmerkung, sie wollte C++-Code, und da gehört nie und nimmer malloc und realloc rein, dass kannst du in jedem guten C++ lesen, so z.B. auch in Effektiv C++ programmieren. Nimm lieber new und delete, viel Speicherschonender und sicherer.
 
RlDdLeR schrieb:
Nur mal eine kleine Anmerkung, sie wollte C++-Code, und da gehört nie und nimmer malloc und realloc rein, dass kannst du in jedem guten C++ lesen, so z.B. auch in Effektiv C++ programmieren. Nimm lieber new und delete, viel Speicherschonender und sicherer.

8o - so sehr vertieft haben wir das als AT'ler nicht.
 
Hi Geek,
ich schreibe nur sehr selten C-Code und habe das hier auch nicht getestet, es ist ein Vorschlag:

<code>

//Mittelwert berechnen
#include <iostream>

using namespace std;

int main()
{
double werte; // Definition des Arrays mit 10 double-Werten
double mittelwert = 0;
int loop; //Schleifenvariable, wird unten festgelegt

cout >> "Gib die Grösse des Arrays ein:";
cin << groesse;

for(loop = 0; loop < groesse; loop++)
{
cout << " Gib einen Wert ein: ";
cin >> werte[loop]; /* um automatisch mit jedem neuen Schl.durchgang
auf das naechste Arrayelement zuzugreifen, uebergibt man die
Schleifenvariable als Index (wobei Index= 1. Zahl im Array)*/

mittelwert += werte[loop]; /* Array-Werte werden in der Variablen
mittelwert addiert */
}
cout << "\n Mittelwert: " << mittelwert/groesse << endl;

return 0;
}
</code>

so ungefähr vielleicht....

Niels
 
Wieso gehst Du das Problem überhaupt so an?
Eingabe in ein temporäre Variable, zur Summe hinzuaddieren, am Ende durch die Zahl der eingegebenen Werte teilen.
 
nikster77 schrieb:
Hi Geek,
ich schreibe nur sehr selten C-Code und habe das hier auch nicht getestet, es ist ein Vorschlag:

<code>

//Mittelwert berechnen
#include <iostream>

using namespace std;

int main()
{
double werte; // Definition des Arrays mit 10 double-Werten
double mittelwert = 0;
int loop; //Schleifenvariable, wird unten festgelegt

cout >> "Gib die Grösse des Arrays ein:";
cin << groesse;

for(loop = 0; loop < groesse; loop++)
{
cout << " Gib einen Wert ein: ";
cin >> werte[loop]; /* um automatisch mit jedem neuen Schl.durchgang
auf das naechste Arrayelement zuzugreifen, uebergibt man die
Schleifenvariable als Index (wobei Index= 1. Zahl im Array)*/

mittelwert += werte[loop]; /* Array-Werte werden in der Variablen
mittelwert addiert */
}
cout << "\n Mittelwert: " << mittelwert/groesse << endl;

return 0;
}
</code>

so ungefähr vielleicht....

Niels

danke erstmal... funzt trotzdem noch nicht so ganz... ;(

bash-2.05b$ g++ mittelwertneu.cpp -o mittelwertneu
mittelwertneu.cpp: In function `int main()':
mittelwertneu.cpp:12: error: no match for 'operator>>' in 'std::cout >> "Gib
die Gr\37777777703\37777777666sse des Arrays ein:"'
mittelwertneu.cpp:13: error: `groesse' undeclared (first use this function)
mittelwertneu.cpp:13: error: (Each undeclared identifier is reported only once
for each function it appears in.)
mittelwertneu.cpp:18: error: invalid types `double[int]' for array subscript
mittelwertneu.cpp:22: error: invalid types `double[int]' for array subscript
bash-2.05b$
 
atomical schrieb:
Ich würd sagen malloc und realloc sind das Stichwort - ganz ohne Pointer wird es bei dynamischen Feldern nicht gehen.

Sowas ähnliches (auch mit Schleife, in der Werte in ein Feld eingefügt wurden) hab ich mal als Info Beleg schreiben müssen ...

hier nur kurz was zusammenkopiert ...
Code:
struct run_info
{ ... }

typedef struct run_info RUN_INFO;

(...)


RUN_INFO *work_table = NULL;// Zeiger auf dynamisches Feld

work_table = (RUN_INFO *)malloc(*array_size*sizeof(RUN_INFO); // Feld anlegen

*array_size = dev_count + dyn_array_oversize; // neue groesse berechnen
work_table=(RUN_INFO *)realloc(work_table, *array_size*sizeof(RUN_INFO)); // mehr Speicher anfordern

Das Feld würde ich aber nicht mit jeder hinzugefügten Variable um 1 vergrößern - das ist imho ineffizient.

Im Anhang zum Nachvollziehen das Programm mit auszuwertender Datei - sollte eigentlich funktionieren.


wobei ich soweit noch gar nicht bin, malloc oder realloc zu kennen... ich guck mir trotzdem mal die Files an ;)
 
foobarflu schrieb:
Wieso gehst Du das Problem überhaupt so an?
Eingabe in ein temporäre Variable, zur Summe hinzuaddieren, am Ende durch die Zahl der eingegebenen Werte teilen.

Beispiel? das ganze sitzt noch nicht so fest (nach den paar Stunden seit gestern), daß ich das auf Anhieb einordnen könnte ;)
 
RlDdLeR schrieb:
Nur mal eine kleine Anmerkung, sie wollte C++-Code, und da gehört nie und nimmer malloc und realloc rein, dass kannst du in jedem guten C++ lesen, so z.B. auch in Effektiv C++ programmieren. Nimm lieber new und delete, viel Speicherschonender und sicherer.

woher kommt denn malloc und realloc, wenns kein C++ ist? *neugierig ist* :bounce:
 
Jippiiiieee

ich hab des Rätsels Lösung gefunden (per dummen Zufall, aber egal) :)

eigentlich hab ich nur ganz doof weggekürzt, eher versuchsweise, aber komischerweise funzt es *freu* kann mir jemand sagen, ob das jetzt schlampiger Code ist (abgesehen von den Comments)?

edit: ich glaube, jetzt isses auch gar kein Array mehr, oder?

//Mittelwert berechnen
#include <iostream>

using namespace std;

int main()
{
double werte;
double mittelwert = 0;
int loop; //Schleifenvariable, wird unten festgelegt

double groesse;
cout << "Gib die Grösse des Arrays ein:";
cin >> groesse;

for(loop = 0; loop < groesse; loop++)
{
cout << " Gib einen Wert ein: ";
cin >> werte;

mittelwert += werte;
}
cout << "\n Mittelwert: " << mittelwert/groesse << endl;

return 0;
}
 
Zuletzt bearbeitet:
GeekGirl schrieb:
woher kommt denn malloc und realloc, wenns kein C++ ist? *neugierig ist* :bounce:

kommt von C, C++ ist ja die Obermenge von C, aber es hat halt Neuerungen etc.

Btw: Grats zu deinem Erfolg, was lange währt wird ewig gut sagt man doch oder? :)

/edit: Der Code ist ganz gut geschrieben, gerade das du im ANSI-Standard (einfach eine Klausel wie COde auszusehen hat) gefällt mir gut. Du kannst aber auch beim Kompilieren die Option -Wall mit einbinden (g++ -Wall bla.cpp -o blaprog), dann zeigt er dir jedesmal Formverstösse an, die aber nicht unbedingt falsch sein müssen, geht halt nur um schöneren Code.
 
Zuletzt bearbeitet:
RlDdLeR schrieb:
kommt von C, C++ ist ja die Obermenge von C, aber es hat halt Neuerungen etc.

Btw: Grats zu deinem Erfolg, was lange währt wird ewig gut sagt man doch oder? :)

/edit: Der Code ist ganz gut geschrieben, gerade das du im ANSI-Standard (einfach eine Klausel wie COde auszusehen hat) gefällt mir gut. Du kannst aber auch beim Kompilieren die Option -Wall mit einbinden (g++ -Wall bla.cpp -o blaprog), dann zeigt er dir jedesmal Formverstösse an, die aber nicht unbedingt falsch sein müssen, geht halt nur um schöneren Code.

dann muss ich wohl ein gutes Buch haben, ich wusste das gar nicht mit dem Standard... ich tappe ja noch relativ im Dunkeln... danke für den Tipp mit dem -Wall :)
 
<offtopic>
welches buch hast du denn?
</offtopic>
 
sphreak schrieb:
<offtopic>
welches buch hast du denn?
</offtopic>

jetzt nicht lachen bitte... "C++ Training intensiv" von Dirk Louis, Markt & Technik

ich habe schon jede Menge gelernt, weil er wirklich sehr ausführlich erklärt, der Nachteil ist, daß das Buch nur das Allernötigste an Beispielen enthält und jedes Beispiel mit den gleichen Hinweisen beginnt (wahrscheinlich, damit man überall im Buch einsteigen kann);

ansonsten hab ich hier noch "C++ Programmierung" von John R. Hubbard liegen, das werde ich als nächstes durchgehen :)
 
Es überrascht mich, dass man aus einem Dirk lOuis Buch eigentlich so gutes Wissen bekommen kann. Ich habe ein anderes Buch von ihm, in dem so wichtige Sachen wie Pointer einfach ausgelassen wurden. Vielleicht hat sich der Gute ja gewandelt ;) Ich hab hier noch C++ Entwicklung mit Linux von Thomas Wieland, auch ein sehr sehr gutes Buch.
 
GeekGirl schrieb:
jetzt nicht lachen bitte... "C++ Training intensiv" von Dirk Louis, Markt & Technik
Hm.. das Buch kenn ich nicht, aber ist bestimmt besser als der Volkard Kurs, den mag ich nämlich auch nicht, musste mich aber in der Schule damit rumschlagen.
Wünsche dir dann noch viel Spaß mit C++ :)
 

Ähnliche Themen

dynamische Speicherreservierung

C Programm unter Unix

Problem mit Texteingabe

deprecated conversion from string constant to ‘char*’

wirre zeichen :(

Zurück
Oben