 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Chrsitian Moeller Guest
|
Posted: Wed Feb 02, 2005 11:10 am Post subject: [Help] Fehler erkennen und korrigieren?!? |
|
|
Tach zusammen,
ich habe folgende Aufgabenstellung im Netz gefunden und will nun wissen wie
ich das ganze am geschicktesten lösen kann. Das ganze soll auf Papier gelöst
werden, also ohne Hilfe des Compilers und da blick ich nicht wirklich durch.
Vielleicht gibt's da ja Tipps und Tricks die ihr mir veraten könnt.
Also es sind 3 Dateien gegeben: function.h, function.cpp und main.cpp mit
folgendem Inhalt:
/************Datei: function.h ***********/
#ifdef __INC_FUNCTION_H_
#define __INC_FUNCTION_H_
void f(int* v, int anzahl);
double f(int v[], int anzahl;
int main ();
#endif //__INC_FUNCTION_H_
/************Datei: function.cpp ****************/
#include <iostream>
using namespace std;
#include "function.h"
int max (int v[4] )
{
//Bestimmung des Maximums
int max = v[0];
for (int i=1; i==4; i++)
{
if (v[i] > max) max = v[i];
}
}
void f(int* v, int anzahl)
{
//Initialisierung
for (int i=0; i<=anzahl; i++)
{
cout<< "Eingabe v[" << i << "]: "; cin >> v[i];
}
}
double f(int v[], int anzahl)
{
//Mittelwert
for (int i=0; i<=anzahl; i++)
{
summe = summe + v[i];
}
return summe / anzahl;
}
int main()
{
cout << "Hello World!" << endl;
return 0;
}
/**********Datei:main.cpp************/
#include
using namespace std;
#include "function.h"
int main (int argc, char* argv[])
{
for (int i=0; i<=argc; i++)
{
cout << "Das " << i << ".te Kommandozeilenargument lautet: "
<< argv[i] << endl;
}
int * v = new int[4];
//Initialisierung des Arrays
f (v, 4);
const double mittelwert = f(v, 4);
cout << "Mittelwert ist: " << mittelwert << endl;
cout << "Maximum ist: " << max (&v) << endl;
int w[8];
//Initialisierung des Arrays
f(&w, ;
mittelwert = f(&w, 4);
cout << "Mittelwert der neuen Folge ist: " << mittelwert << endl;
int& i = 4711;
if (i%2) {
cout << i << " ist eine ungerade Zahl" << endl;
cout << "Sind Sie damit einverstanden j/n " << endl;
char c;
cin >> c;
if (c=="j") {
cout << "Das freut mich!" << endl;
} else {
cout << "Ist auch gut!" << endl;
}
} else {
cout << i << " ist eine gerade Zahl" << endl;
}
cout << "Geben Sie ein Zeichen ein "; cin >> c;
switch (c)
{
case 'o':
cout << "Sie haben ein "o" eingegeben!" << endl;
break;
case 'a':
cout << "Sie haben ein "a" eingegeben!" << endl;
default:
int* i = &c;
cout << "Das Zeichen " << c << " kenne ich nicht!"
<< endl;
cout << "Es hat die Speicheradresse: " << i << endl;
}
delete v;
delete w;
}
Also wie geh ich die Dateien jetzt durch, um die entsprechenden Fehler zu
finden und dann zu korrigieren?
Vielen Dank schon mal für die Hilfe!!!
Gruß,
Christian
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Nicolas Pavlidis Guest
|
Posted: Wed Feb 02, 2005 12:26 pm Post subject: Re: [Help] Fehler erkennen und korrigieren?!? |
|
|
"Chrsitian Moeller" <bonsaigiant (AT) yahoo (DOT) de> writes:
| Quote: | Tach zusammen,
ich habe folgende Aufgabenstellung im Netz gefunden und will nun wissen wie
ich das ganze am geschicktesten lösen kann. Das ganze soll auf Papier gelöst
werden, also ohne Hilfe des Compilers und da blick ich nicht wirklich durch.
Vielleicht gibt's da ja Tipps und Tricks die ihr mir veraten könnt.
Also es sind 3 Dateien gegeben: function.h, function.cpp und main.cpp mit
folgendem Inhalt:
/************Datei: function.h ***********/
#ifdef __INC_FUNCTION_H_
#define __INC_FUNCTION_H_
|
Nicht wirklich ein Fehler, aber nicht Standard - konform:
Fuehrende Underlines sind Compilerbauern / und Libraryprogrammieren
vorbehalten, duerften also laut Stnandard in "normalem" Code nicht
vorkommen.
| Quote: | void f(int* v, int anzahl);
double f(int v[], int anzahl;
int main ();
|
Auch nicht wirklich ein fehler deshalb schreib ich das auch noch:
main sollte man nicht deklarieren, dem Compiler ist es glaub ich aber
egal.
| Quote: | #endif //__INC_FUNCTION_H_
/************Datei: function.cpp ****************/
#include <iostream
using namespace std;
#include "function.h"
int max (int v[4] )
{
//Bestimmung des Maximums
int max = v[0];
for (int i=1; i==4; i++)
{
if (v[i] > max) max = v[i];
}
}
void f(int* v, int anzahl)
{
//Initialisierung
for (int i=0; i<=anzahl; i++)
{
cout<< "Eingabe v[" << i << "]: "; cin >> v[i];
}
}
double f(int v[], int anzahl)
{
//Mittelwert
for (int i=0; i<=anzahl; i++)
{
summe = summe + v[i];
}
return summe / anzahl;
}
int main()
{
cout << "Hello World!" << endl;
return 0;
}
/**********Datei:main.cpp************/
#include
using namespace std;
#include "function.h"
int main (int argc, char* argv[])
{
for (int i=0; i<=argc; i++)
{
cout << "Das " << i << ".te Kommandozeilenargument lautet: "
argv[i] << endl;
}
int * v = new int[4];
//Initialisierung des Arrays
f (v, 4);
const double mittelwert = f(v, 4);
cout << "Mittelwert ist: " << mittelwert << endl;
cout << "Maximum ist: " << max (&v) << endl;
int w[8];
//Initialisierung des Arrays
f(&w, ;
mittelwert = f(&w, 4);
cout << "Mittelwert der neuen Folge ist: " << mittelwert << endl;
int& i = 4711;
if (i%2) {
cout << i << " ist eine ungerade Zahl" << endl;
cout << "Sind Sie damit einverstanden j/n " << endl;
char c;
cin >> c;
if (c=="j") {
cout << "Das freut mich!" << endl;
} else {
cout << "Ist auch gut!" << endl;
}
} else {
cout << i << " ist eine gerade Zahl" << endl;
}
cout << "Geben Sie ein Zeichen ein "; cin >> c;
switch (c)
{
case 'o':
cout << "Sie haben ein "o" eingegeben!" << endl;
break;
case 'a':
cout << "Sie haben ein "a" eingegeben!" << endl;
default:
int* i = &c;
cout << "Das Zeichen " << c << " kenne ich nicht!"
endl;
cout << "Es hat die Speicheradresse: " << i << endl;
}
delete v;
delete w;
}
Also wie geh ich die Dateien jetzt durch, um die entsprechenden Fehler zu
finden und dann zu korrigieren?
|
Ich geb dir mal zwei Tipps:
Schau dir mal die "Theorie" zu Functionoverloading und pointer / Array
Compatibilitaet an, dann schau die die Deklarationdne von den beiden f -
Funktionen an und du wirst Fehler finden.
Dann schau dir die "Thorie" zu const an, wo mit man constanten
initialisieren muss, dann auch die die Definition der constanten im main
an.
Dann schau dir an was mit delet "geloescht" werden kann und was nicht,
und schau dir genau an was im main mit delete ueber den Jordan geschickt
wird.
Weiters schau dir an wie man die Abruchbedingung bei for - Schleifen
setzten muss, damit diese wirklich funktioniert ( == vs <= ) und schau
dir die for - Schleife in der Function max().
Weiters schau dir an ob alle Funktionen (auszer main()) wirklich
auch deklariert sind.
Und noch was: Schau dir an womit man Referenzen initialisieren darf, und
womit nicht.
Hoffe das ich dir weiter helfen konnte.
LG
Nicolas
P.S. Ich nehme an, dass du nicht wolltest, dass man die Fehler
offenkunding postet .
--
| Quote: | Nicolas Pavlidis | Elvis Presly: | |__ |
Student of SE & KM | "Into the goto" | |__| |
[email]pavnic (AT) sbox (DOT) tugraz.at[/email] | ICQ #320057056 | |
-------------------University of Technology, Graz----------------|
|
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Wed Feb 02, 2005 1:31 pm Post subject: Re: [Help] Fehler erkennen und korrigieren?!? |
|
|
"Chrsitian Moeller" <bonsaigiant (AT) yahoo (DOT) de> writes:
[rearranged by tm]
| Quote: | Also wie geh ich die Dateien jetzt durch, um die entsprechenden Fehler zu
finden und dann zu korrigieren?
|
Die wirkliche Schwierigkeit ist, die absichtlichen von den
unabsichtlichen Fehlern zu unterscheiden. :-)
Lass function.h mal links liegen und schau Dir die Funktionen in
function.cpp und main.cpp an. Die Namen dieser Funktionen suggerieren
ja, was die Funktionen etwa tun sollen.
Fang mal mit der Funktion int max (int v[4] ) an; überlege Dir, ob die
macht, was ihr Prototyp (Rückgabetyp, Name, Parameterliste) sagt.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Chrsitian Moeller Guest
|
Posted: Wed Feb 02, 2005 3:26 pm Post subject: Re: [Help] Fehler erkennen und korrigieren?!? |
|
|
Hallo,
also das mit dem Functionoverloading und Pointer / Array versteh ich nicht.
Functionoverloading bedeutet doch, das man Funktionnen mit gleichem Namen
haben kann, solange die Parameter (bzw. deren typen) unterschiedlich sind,
oder?
Aber wie funktioniert das denn jetzt mit den Pointer / Array?
In der double f Funktion fehlt doch die Deklaration von "summe", oder?
#Dann schau dir die "Thorie" zu const an, wo mit man constanten
#initialisieren muss, dann auch die die Definition der constanten im main
#an.
f (v, 4);
| Quote: | const double mittelwert = f(v, 4);
cout << "Mittelwert ist: " << mittelwert << endl;
cout << "Maximum ist: " << max (&v) << endl;
|
was mach ich damit? aus mittelwert wird MITTELWERT aber was mach ich mit der
Funktion f(v, 4) und stimmt dann "max(&v)"?
#Dann schau dir an was mit delete "geloescht" werden kann und was nicht,
#und schau dir genau an was im main mit delete ueber den Jordan geschickt
#wird.
zu "delete" hab ich leider nix gefunden. Hat das was mit diesen Ausdrücken
zu tun?
| Quote: | int * v = new int[4];
int w[8];
also ein pointer und ein array.... |
Bitte um Hilfe damit ich ein bissle weiterkomme.
Danke!!!
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Wed Feb 02, 2005 5:09 pm Post subject: Re: [Help] Fehler erkennen und korrigieren?!? |
|
|
Chrsitian Moeller wrote:
| Quote: | also das mit dem Functionoverloading und Pointer / Array versteh ich nicht.
Functionoverloading bedeutet doch, das man Funktionen mit gleichem Namen
haben kann, solange die Parameter (bzw. deren typen) unterschiedlich sind,
oder?
|
Und das sind sie im vorliegenden Falle nicht, selbst wenn es so aussieht.
void foo(char c[]);
void foo(char c[42]);
void foo(char c[666]);
sind samt und sonders Synonyme für
void foo(char* c);
obwohl die Variablendeklarationen
extern char c[];
char c[] = "Haha hihi";
char c[42];
char c[666];
von ihrem Typen her nichts mit
char* c;
zu tun haben - eine historisch begründete Inkonsistenz!
Folgendes Programm gibt z.B. für 'b' eine andere Größe aus als für 'a',
'c' und 'd' (bei mir z.B. "20 4 20 20"):
#include <iostream>
#include <ostream>
typedef char schrumm[5 * sizeof(char*)];
schrumm a;
void foo(schrumm b, schrumm& c)
{
schrumm d;
std::cout << sizeof a << ' ' << sizeof b << ' ' << sizeof c << ' ' << sizeof d << 'n';
}
int main()
{
foo(a, a);
return 0;
}
Nachzulesen ist das Ganze in der C++-Norm § 8.3.5/3.
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Chrsitian Moeller Guest
|
Posted: Wed Feb 02, 2005 6:35 pm Post subject: Re: [Help] Fehler erkennen und korrigieren?!? |
|
|
Ok, und wie muss ich die Funktion(en) jetzt korrigieren, damit es keinen
Fehler mehr gibt??
void f(int* v, int anzahl)
{
//Initialisierung
for (int i=0; i<=anzahl; i++)
{
cout<< "Eingabe v[" << i << "]: ";
cin >> v[i];
}
}
//Stimmt die Begründung das v auf das Erste Element des Arrays zeigt und
somit halt auch ein Pointer(v) ist?
double f(int v[], int anzahl)
{
//Mittelwert
int summe;
for (int i=0; i<=anzahl; i++)
{
summe = summe + v[i];
}
return summe / anzahl;
}
Stimmt die int max soweit?
int max (int v[4] )
{
//Bestimmung des Maximums
int max = v[0];
for (int i=1; i<=4; i++)
{
if (v[i] > max)
max = v[i];
}
}
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Wed Feb 02, 2005 10:41 pm Post subject: Re: [Help] Fehler erkennen und korrigieren?!? |
|
|
Christian Moeller wrote:
| Quote: | Ok, und wie muss ich die Funktion(en) jetzt korrigieren, damit es keinen
Fehler mehr gibt??
|
Die beiden Funktionen können so mit gleichem Namen und äquivalenten
Parametertypen nicht koexistieren. Am besten ist es, ihnen aussage-
kräftige Namen zu geben - warum nicht 'void Init(int*, int)' sowie
'double Mittelwert(int*, int)'?
Wenn du's ganz gut machen willst, schreibst du
double Mittelwert(int const* v, int anzahl)
- mit dem 'const' wird dem aufrufenden Anwender versprochen, dass diese
Funktion den übergebenen Zeiger nicht benutzt, um das Array, auf welches
er zeigt, zu verändern, was ja (im Gegensatz zu 'Init()'!) weder
erforderlich noch wünschenswert wäre!
| Quote: | void f(int* v, int anzahl)
{
//Initialisierung
for (int i=0; i<=anzahl; i++)
|
Guck mal genau hin, wie oft diese Schleife durchlaufen wird, und wie
oft sie durchlaufen werden soll! Wenn du dabei Schwierigkeiten hast,
stell dir zunächst mal vor, 'anzahl' wäre gleich 1 oder sogar 0 ...
| Quote: | {
cout<< "Eingabe v[" << i << "]: ";
cin >> v[i];
}
}
//Stimmt die Begründung das v auf das Erste Element des Arrays zeigt und
somit halt auch ein Pointer(v) ist?
|
Im vorliegenden Kontext (als Funktionsparameter) ja, 'v' ist ein Zeiger
auf 'int' und kann genauso gut auch als 'int* v' deklariert werden. In
anderen Kontexten bedeuten dagegen, wie gesagt, die Schreibweisen 'int v[]'
und 'int* v' zwei ganz verschiedene Dinge - auch wenn ein Array überall
auftauchen darf, wo ein Zeiger erwartet wird und dabei dann automatisch
in einen Zeiger aufs erste Arrayelement verwandelt wird.
| Quote: | double f(int v[], int anzahl)
{
//Mittelwert
int summe;
|
Hmmm... Hier definierst du eine Variable, ohne ihr einen Wert zu
geben - leider wird sie dann irgendwelchen unvorhersagbaren
Datenmüll enthalten - vielleicht 0, vielleicht aber auch -1816718949
- ich weiß es nicht. Am gemeinsten ist es, wenn sie zufälligerweise
gerade während der Tests bei dir immer 0 hat (dann denkst du, alles
ist in Butter und lieferst das Programm an die Kunden) und dann später
beim Endanwender nicht mehr...
Also, solche Variablen stets, möglichst schon bei der Definition
initialisieren:
int summe = 0;
| Quote: | for (int i=0; i<=anzahl; i++)
|
Siehe oben - wie oft wird die Schleife durchlaufen?
| Quote: | {
summe = summe + v[i];
|
Kann auch kürzer als
summe += v[i];
geschrieben werden - ist aber hier nicht sooo wichtig.
| Quote: | }
return summe / anzahl;
}
Stimmt die int max soweit?
int max (int v[4] )
|
Das 'int v[4]' ist zwar vom Standpunkt der Sprache aus nicht falsch,
aber für den Programmierer (zumal den Anfänger) irreführend - wie
gesagt, ist es (aber eben nur in diesem speziellen Kontext als
Funktionsparameter) ein Synonym für 'int* v' und die 4 ist reine
Verzierung - ob die Funktion mit einem Zeiger auf das erste Element
eines Arrays mit 4, 666, 3 oder nur einem Element (oder gar einem
Zeiger auf eine einzelne 'int'-Variable) aufgerufen wird, ist dem
Compiler völlig wurscht - bloß dass das Ergebnis dann nicht unbedingt
deinen Erwartungen entspricht...
Warum nicht ganz einfach der Funktion ein ähnliches Interface gönnen
wie den anderen beiden - Konsistenz vereinfacht stets sowohl die
Implementierung als auch die Benutzung! Also:
int max(int const* v, int anzahl)
Auch diese Funktion braucht das Array nur lesend zuzugreifen und
nicht zu verändern.
| Quote: | {
//Bestimmung des Maximums
int max = v[0];
for (int i=1; i<=4; i++)
|
Siehe oben. Außerdem nicht vergessen, die 4 zu ersetzen!
| Quote: | {
if (v[i] > max)
max = v[i];
}
}
|
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Chrsitian Moeller Guest
|
Posted: Thu Feb 03, 2005 9:57 am Post subject: Re: [Help] Fehler erkennen und korrigieren?!? |
|
|
Hallo nochmal,
also erstmal danke Falk für die ausführlichen Erklärungen. Ich hab jetzt mal
die function.h und function.cpp erstellt, allerdings versteh ich das mit der
for-Schleife nicht.
Hiermal die 2 Dateien soweit ich es verstanden habe:
/************Datei: function.h ***********/
#ifdef _INC_FUNCTION_H_ //Hier sollte doch "ifndef" stehen? Was bedeutet
das "INC" und kann man das weglassen?
#define _INC_FUNCTION_H_
void Init(int* v, int anzahl);
double Mittelwert(int const* v, int anzahl);
int main ();
#endif //_INC_FUNCTION_H_
/************Datei: function.cpp ****************/
#include <iostream>
using namespace std;
#include "function.h"
// Kann ich diese "int max" Funktion auch in die Header-Datei packen, oder
ist das nicht sinvoll?
// Nur zum Verständnis: Eigentlich bräuchte man doch gar keine header-datei
(in diesem Beispiel) weil die Funktionen alle über int main () stehen,
richtig?
int max(int const* v, int anzahl)
{
//Bestimmung des Maximums
int max = v[0]; // Das sagt doch, dass erste Element im Array v soll
int max zugewiesen werden, richtig?
for (int i=1; i<=anzahl; i++) // wenn anzahl 1 oder 0 ist dann läuft
die Schleife nicht durch. Was mach ich denn mit Anzahl, geb ich dem einen
Wert zb. anzahl = 10; oder kommt v[i] da hinein? Wobei ich dann ja kein
"anzahl" als parameter bräuchte ,oder?
{
if (v[i] > max)
max = v[i];
}
}
void Init(int* v , int anzahl)
{
//Initialisierung
for (int i=0; i<=anzahl; i++) // Was muss hier hin?
{
cout<< "Eingabe v[" << i << "]: ";
cin >> v[i];
}
}
double Mittelwert(int const* v, int anzahl)
{
//Mittelwert
int summe = 0;
for (int i=0; i<=anzahl; i++) // Gleiches Verständnisproblem hier!
{
summe = summe + v[i];
}
return summe / anzahl;
}
int main()
{
cout << "Hello World!" << endl;
return 0;
}
Ich danke wieder für die Hilfe!!!
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Thu Feb 03, 2005 4:03 pm Post subject: Re: [Help] Fehler erkennen und korrigieren?!? |
|
|
Chrsitian Moeller wrote:
| Quote: |
Hallo nochmal,
also erstmal danke Falk für die ausführlichen Erklärungen. Ich hab jetzt mal
die function.h und function.cpp erstellt, allerdings versteh ich das mit der
for-Schleife nicht.
|
Ich beschraenke mich jetzt nur auf das Thema 'Arrays und Schleifen'
Also: Das wichtigste zuerst: Array Inidzierung in C++ ist 0-basiert.
Was heist das?
Das heist das der erste Index in ein Array die Nummer 0 hat.
Das heist also, wenn Du ein Array hast
int Irgendwas[4];
Dann besteht dieses Array aus:
Irgendwas[0]
Irgendwas[1]
Irgendwas[2]
Irgendwas[3]
-> Der hoechste zulaessige Index in ein Array ist immer um 1 kleiner
als die Zahl mit der das Array definiert wurde! Bei der Definition gibt
man die Anzahl an, da aber bei 0 zu zaehlen begonnen wird, ...
Das heist aber auch, dass sowas wie
for( int i = 0; i <= anzahl; i++ )
aufgrund des verwendeten '<=' schon mal suspekt ist. Obige Schleife
generiert bei anzahl == 4, die Zahlen 0 1 2 3 4 und die letzte Zahl
ist mit ziemlicher Sicherheit nicht koscher, da wir ja gesehen haben
das ein Array der Groesse 4 nur indizes 0 1 2 3 besitzt. ('anzahl'
impliziert dass hier die tatsaechliche Anzahl an Arrayeintraegen gemeint
ist und nicht der hoechste zulaessige Index)
Daher: Wann immer du eine Schleife siehst, die offensichtlich ueber ein
Array drueberlaeuft *und* deren Schleifenbedingung nicht dem Muster
for( int i = 0; i < AnzahlEintraege; i++ )
Mach_was_mit_Array[i]
folgt, dann musst Du schon stutzig werden. Dein optischer Pattern Matcher
soll durch das '<' bzw. dessen Nichtvorhandensein auf Alarm umschalten!
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Thu Feb 03, 2005 4:11 pm Post subject: Re: [Help] Fehler erkennen und korrigieren?!? |
|
|
Chrsitian Moeller wrote:
| Quote: |
/************Datei: function.cpp ****************/
#include <iostream
using namespace std;
#include "function.h"
// Kann ich diese "int max" Funktion auch in die Header-Datei packen, oder
ist das nicht sinvoll?
|
Koennte man.
Aber bevor Du Dir damit neue Probleme einhandelst lass das erst mal
so wies ist. Wenn Du das Ding in den Header packst, gibts andere Problem.
Die sind zwar leicht zu loesen, aber: Ein Schritt nach dem anderen. Du hast
im Moment ganz andere Probleme.
| Quote: | // Nur zum Verständnis: Eigentlich bräuchte man doch gar keine header-datei
(in diesem Beispiel) weil die Funktionen alle über int main () stehen,
richtig?
int max(int const* v, int anzahl)
{
//Bestimmung des Maximums
int max = v[0]; // Das sagt doch, dass erste Element im Array v soll
int max zugewiesen werden, richtig?
for (int i=1; i<=anzahl; i++) // wenn anzahl 1 oder 0 ist dann läuft
die Schleife nicht durch. Was mach ich denn mit Anzahl, geb ich dem einen
Wert zb. anzahl = 10; oder kommt v[i] da hinein? Wobei ich dann ja kein
"anzahl" als parameter bräuchte ,oder?
{
if (v[i] > max)
max = v[i];
}
}
|
Nehmen wir mal an, max wird mit einem Array der Groesse 4 aufgerufen
d.h. anzahl = 4
max = v[0]; // ist noch ok, v[0] existiert
for( int i=1; i<=anzahl; i++ )
erster Schleifendurchlauf: i hat den Wert 1
if( v[i] also v[1], ist auch ok, v[1] existiert
zweiter Schleifendurchlauf: i hat den Wert 2
if( v[i] also v[2], ist auch ok, v[2] existiert
dritter Schleifendurchlauf: i hat den Wert 3
if( v[i] also v[3], ist auch ok, v[3] existiert
vierter Schleifendurchlauf: i hat den Wert 4 (4 ist kleiner oder gleich anzahl !)
if( v[i] also v[4], ***oops**** v[4] existiert nicht !
Deine obige Analyse hat auch noch einen kleinen Schoenheitsfehler:
| Quote: | int max = v[0]; // Das sagt doch, dass erste Element im Array v soll
int max zugewiesen werden, richtig?
for (int i=1; i<=anzahl; i++) // wenn anzahl 1 oder 0 ist dann läuft
die Schleife nicht durch. Was mach ich denn mit Anzahl, geb ich dem einen
|
Wenn anzahl gleich 0 ist, dann gibt es ueberhaupt keinen Element im Array.
Wie kannst Du dann sagen:
int max = v[0]; // Das sagt doch, dass erste Element im Array v soll
v[0] existiert doch gar nicht !
| Quote: |
void Init(int* v , int anzahl)
{
//Initialisierung
for (int i=0; i<=anzahl; i++) // Was muss hier hin?
|
Ich denke das solltest Du mit der bisherigen Hilfe jetzt schon
alleine rausfinden koennen.
Welche Werte kann i annehmen? Wie gross ist das Array? Was folgt daraus?
| Quote: | {
cout<< "Eingabe v[" << i << "]: ";
cin >> v[i];
}
}
double Mittelwert(int const* v, int anzahl)
{
//Mittelwert
int summe = 0;
for (int i=0; i<=anzahl; i++) // Gleiches Verständnisproblem hier!
|
Gleiche Antwort
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Mang Guest
|
Posted: Thu Feb 03, 2005 4:44 pm Post subject: Re: [Help] Fehler erkennen und korrigieren?!? |
|
|
"Chrsitian Moeller" <bonsaigiant (AT) yahoo (DOT) de> schrieb im Newsbeitrag
news:ctssen$9b4$00$1 (AT) news (DOT) t-online.com...
| Quote: | Hallo nochmal,
[snip Code erklärt von anderen] |
| Quote: |
double Mittelwert(int const* v, int anzahl)
{
//Mittelwert
int summe = 0;
for (int i=0; i<=anzahl; i++) // Gleiches Verständnisproblem hier!
{
summe = summe + v[i];
}
return summe / anzahl;
}
|
Noch was, was nicht jedem am Beginn klar ist: Am Schluß dividierst Du ein
int durch ein int. In C++ kommt dann immer ein int raus.
Z.B.: summe == 5 und anzahl == 3 ergibt in C++ 1, weil die Nachkommastellen
wegfallen. Daß der Rückgabetyp double ist, ist egal, das Kind liegt nun
schon im Brunnen -> in meinem Beispiel wird einfach 1 in 1.0 konvertiert. Um
mit Nachkommastellen zu rechnen, muß mindestens einer der Operanden
Fließkomma sein:
return static_cast<double>(summe) / anzahl;
Der static_cast<> konvertiert den Wert zwischen den Klammern (summe) in den
Wert eines Typen zwischen den <> (double).
Im übrigen kann es Dir passieren, daß summe einen zu großen Wert annimmt,
und überläuft. Wenn du z.B ein 32-bit int hast, probiere mal aus, was
passiert, wenn Du ein paar mal hintereinander jeweils 1.5 Milliarden dazu
addierst (lass Dir die Werte jeweils ausgeben) [Achtung: Was Du auf Deinem
Bildschirm siehst muß nicht reproduzierbar sein auf anderen Maschinen! Im
Prinzip kann das Programm auch abstürzen, je nachdem welches System Du hast.
Aus Lerngründen würde ich es dennoch probieren.]
Die schnellste Lösung diesbezüglich besteht wohl darin, summe als double zu
deklarieren. Dann brauchst Du auch den static_cast<double>() nicht mehr, da
ja ein Operand sowieso schon double ist.
Thomas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Christian Moeller Guest
|
Posted: Fri Feb 04, 2005 10:38 am Post subject: Re: [Help] Fehler erkennen und korrigieren?!? |
|
|
Ein weiterer Versuch mit weiteren Fragen mit Bitte um weitere
Hilfestellungen :-)
/************Datei: function.cpp ****************/
#include <iostream>
using namespace std;
#include "function.h"
int max(int const* v, int anzahl)
{
//Bestimmung des Maximums
int max = v[0]; // Was mich hier stutzig macht:
"Welche Werte kann i annehmen? Wie gross ist das Array? Was folgt
daraus?"
Wo seh ich denn wieviele Elemente in das Array hinein passen? Oder
muss man grundsätzlich i<anzahl schreiben?
for (int i=1; i
{
if (v[i] > max)
max = v[i];
}
}
void Init(int* v , int anzahl)
{
//Initialisierung
for (int i=0; i<anzahl; i++)
{
cout<< "Eingabe v[" << i << "]: ";
cin >> v[i]; // was hat es mit dieser Eingabe auf sich? Man
gibt eine Zahl ein? Soll die dann oben mit max verglichen werden? Oder wie
funktioniert das?
}
}
double Mittelwert(int const* v, int anzahl)
{
//Mittelwert
int summe = 0;
for (int i=0; i<anzahl; i++)
{
summe = summe + v[i];
}
return static_cast
}
int main()
{
cout << "Hello World!" << endl;
return 0;
}
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Christian Moeller Guest
|
Posted: Fri Feb 04, 2005 3:25 pm Post subject: Re: [Help] Fehler erkennen und korrigieren?!? |
|
|
Ich bin mal jetzt an die main.cpp gegangen, mit weiteren Fragen, die ihr mir
hoffentlich erklären könnt.
DANKE!!!
/**********Datei:main.cpp************/
#include <iostream>
using namespace std;
#include "function.h"
int main (int argc, char* argv[])
{
for (int i=0; i<=argc; i++) // Hier < ?
{
cout << "Das " << i << ".te Kommandozeilenargument lautet: "
<< argv[i] << endl;
}
int * v = new int[4]; // versteh ich nicht
//Initialisierung des Arrays
f (v, 4); // Mittelwert (v, 4);? Für was steht hier die 4?
const double mittelwert = f(v, 4); // Mittelwert(v, 4);?
cout << "Mittelwert ist: " << mittelwert << endl;
cout << "Maximum ist: " << max (&v) << endl; // muss dann die max in
die header-datei?
int w[8];
//Initialisierung des Arrays
f(&w, ; // Mittelwert(&w, ;?
mittelwert = f(&w, 4); // wie ist das zu verstehen?
cout << "Mittelwert der neuen Folge ist: " << mittelwert << endl;
int& i = 4711; // funktioniert das so?
if (i%2) {
cout << i << " ist eine ungerade Zahl" << endl;
cout << "Sind Sie damit einverstanden j/n " << endl;
char c;
cin >> c;
if (c=="j") { // (c=='j')?
cout << "Das freut mich!" << endl;
} else {
cout << "Ist auch gut!" << endl;
}
} else {
cout << i << " ist eine gerade Zahl" << endl;
}
cout << "Geben Sie ein Zeichen ein ";
cin >> c;
switch (c)
{
case 'o':
cout << "Sie haben ein "o" eingegeben!" << endl;
break;
case 'a':
cout << "Sie haben ein "a" eingegeben!" << endl;
default:
int* i = &c; // Das versteh ich auch nicht.
cout << "Das Zeichen " << c << " kenne ich nicht!"
<< endl;
cout << "Es hat die Speicheradresse: " << i << endl;
}
delete v;
delete w; // löschen des Arrays möglich?
}
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Fri Feb 04, 2005 5:19 pm Post subject: Re: [Help] Fehler erkennen und korrigieren?!? |
|
|
"Christian Moeller" <bonsaigiant (AT) yahoo (DOT) de> writes:
| Quote: | int max(int const* v, int anzahl)
{
//Bestimmung des Maximums
int max = v[0]; // Was mich hier stutzig macht:
"Welche Werte kann i annehmen?
|
i hat Typ int. Die möglichen Werte hängen von der C++-Implementation
ab, können jedoch abgefragt werden: INT_MIN und INT_MAX (deklariert in
<climits>) bzw. std::numeric_limits<int>::min() und
std::numeric_limits<int>::max() (deklariert in <limits>).
| Quote: | Wie gross ist das Array? Was folgt daraus? Wo seh ich denn
wieviele Elemente in das Array hinein passen?
|
In dieser Funktion nirgends. Du weisst nur, dass v auf ein int zeigt,
und musst hoffen, dass die darauf folgenden anzahl-1 ints
"existieren". Natürlich muss in der Dokumentation von max() stehen,
dass der Aufrufer dafür verantwortlich ist, max() entsprechend
aufzurufen.
| Quote: | Oder muss man grundsätzlich i<anzahl schreiben?
for (int i=1; i
{
if (v[i] > max)
max = v[i];
}
}
void Init(int* v , int anzahl)
{
//Initialisierung
for (int i=0; i<anzahl; i++)
{
cout<< "Eingabe v[" << i << "]: ";
cin >> v[i]; // was hat es mit dieser Eingabe auf sich? Man
gibt eine Zahl ein?
|
Ja. Von "standard input" wird eine Zahl einzulesen
versucht. Typischerweise ist in dieser Situation standard input an die
Tastatur gebunden.
| Quote: | Soll die dann oben mit max verglichen werden? Oder wie funktioniert das?
|
Von den eingegebenen Zahlen soll das Maximum bestimmt werden.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Mon Feb 07, 2005 9:55 am Post subject: Re: [Help] Fehler erkennen und korrigieren?!? |
|
|
Christian Moeller wrote:
| Quote: |
Ein weiterer Versuch mit weiteren Fragen mit Bitte um weitere
Hilfestellungen :-)
/************Datei: function.cpp ****************/
#include <iostream
using namespace std;
#include "function.h"
int max(int const* v, int anzahl)
{
//Bestimmung des Maximums
int max = v[0]; // Was mich hier stutzig macht:
"Welche Werte kann i annehmen? Wie gross ist das Array? Was folgt
daraus?"
Wo seh ich denn wieviele Elemente in das Array hinein passen? Oder
muss man grundsätzlich i
for (int i=1; i
{
if (v[i] > max)
max = v[i];
}
}
|
ad 1) Im obigen kann i die Werte von 1 bis 'anzahl - 1' annehmen
ad 2) Wie gross das Array ist, siehst Du hier nirgends. Allerdings
koennen wir davon ausgehen, dass derjenige der das geschrieben
hat, nicht daemlich ist.
Da Arrays in C++ ja so ein 'halber' Datentyp sind, gibt es in C++
2 grundsaetzliche Moeglichkeiten, die Uebergabe zu bewerksteligen:
* entweder muss irgendein Arrayelement einen 'Schluesselwert' enthalten,
der das Ende des nutzbaren Arraybereiches markiert. (Die alten
C-style strings arbeiten nach diesem Prinzip: ' ' markiert das Ende)
* oder der Funktion wird die Groesse des Arrays zusaetzlich zum Array
direkt mitgegeben.
Wenn Du also eine Funktion siehst, die die Signatur
void foo( pointer_auf_irgendwas Offensichtliches_Array, int Anzahl )
besitzt, dann kannst Du mal davon ausgehen, dass Anzahl die Groesse
des Arrays beschreibt. Muss natuerlich nicht immer so sein, wird es aber
in mehr als 90% aller Faelle sein. Klarheit bringt dann eine Analyse, wie
Anzahl in der Funktion verwendet wird (wobei allerdings obige Interpretation
als Arbeitshypothese schon mal nicht schlecht ist).
| Quote: | void Init(int* v , int anzahl)
{
//Initialisierung
for (int i=0; i<anzahl; i++)
{
cout<< "Eingabe v[" << i << "]: ";
cin >> v[i]; // was hat es mit dieser Eingabe auf sich? Man
gibt eine Zahl ein? Soll die dann oben mit max verglichen werden? Oder wie
funktioniert das?
}
}
|
Diese Eingabe befuellt lediglich das Array. Was dann damit weiter gemacht
wird, ist nicht das Bier dieser Funktion.
Eine Funktion eine Aufgabe:
Init: Einlesen von Zahlen in ein Array
max: Die groesste Zahl in einem Array suchen
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|