PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitte schnelle hilfe



Balbero
16.05.2004, 06:16
hi leutz ich binns noch ma^^


vileicht könnt ihr mir ma kurz helfen. ich versuch grad zum üben nen prog zu schreiben mit dem ich später mal rechnen kann. aber irgend was mach ich grundlegend falsch, da er schon am anfang ständig fehler meldungen ausspuckt. ich text euch ma was ich bisher geschrieben hab.

danke schon ma im vorraus, wenn ihr mir sagen könnt wo mein fehler ist.

CODE:


// letz go

#include <iostream>
#include <cmath>
using namespace std;


//funtion zur multiplikation
void Multiplizieren
{
int Zahl1;
int Zahl2;

cout <<"Bitte geben sie die erste Zahl ein!"l;
cin << Zahl1
count << "Bitte geben sie die zweite Zahl ein, die mit der ersten multipliziert werden soll";
cin << Zahl2
double ergebnis;
ergebnis = Zahl1*Zahl2;

return ergebnis
return Zahl1
return Zahl2
}

// haupmenue
int main()
{
int befehl;

cout << endl;
cout << "Menue" << endl;
cout << "Multiplizieren <1>" << endl;
cout << "Dividieren <2>" << endl;
cout << "Addieren <3>" << endl;
cout << "Subtrahieren <4>" << endl;
cout << "Wurzelziehen <5>" << endl;
cout << "Quadrieren <6>" << endl;
cout << "Programm beenden <7>" << endl;
cout << "Bitte ihre gewünschte Wahl:";
cin >> befehl;

// befehl bearbeiten

switch(befehl)

case 7: cout << endl;
cout << "Programm beenden" << endl;
break;

case 1: cout << endl;
Multiplizieren;

return 0;
}



und bitte mich nicht gleich umbringen^^ wenn es zu vatal ist. wie gesagt ich binn erst am üben^.^

Ich liebe den [*code] tag ;) -freezy

codec
16.05.2004, 16:40
Was kommmt als Fehlermeldung?

Ansonsten ersetz mal:


#include <iostream>
#include <cmath>


mit:



#include <stdio.h> //kA ob du das brauchst, machs einfach rein :)
#include <iostream.h>
#include <cmath.h>

Balbero
16.05.2004, 18:30
hmmmm.

hab jetzt deine vorschläge mal eingefügt. nur noch ein fehler. bei <cmath.h> meint er kenne es nicht. als ich das h dann wieder weggenommen hab waren es aber sovort wieder 5 fehler v.v

da muß noch irgend wo ein anderer fehler sein. ich geb mal kurz hier die fehlermeldungen raus:

c:\programme\microsoft visual studio\myprojects\nen versuch\letz go.cpp(6) : error C2871: 'std' : Existiert nicht oder ist kein Namespace

c:\programme\microsoft visual studio\myprojects\nen versuch\letz go.cpp(11) : error C2182: 'Multiplizieren' : Ungueltige Verwendung des Typs 'void'

c:\programme\microsoft visual studio\myprojects\nen versuch\letz go.cpp(11) : error C2239: Unerwartetes Token '{' nach der Deklaration von 'Multiplizieren'

c:\programme\microsoft visual studio\myprojects\nen versuch\letz go.cpp(50) : error C2043: Schluesselwort break ungueltig

c:\programme\microsoft visual studio\myprojects\nen versuch\letz go.cpp(52) : error C2046: Schluesselwort case ungueltig


und wie gesagt. wenn ich aus <cmath> <cmath.h> mach kommt das:

c:\programme\microsoft visual studio\myprojects\nen versuch\letz go.cpp(5) : fatal error C1083: Include-Datei kann nicht geoeffnet werden: 'cmath.h': No such file or directory

Freezy
16.05.2004, 18:45
Wie schon so oft gesagt kenn ich mich ned in C++ aus... aber eineige sachen fallen mir trotzdem auf:

+ Aus [void Multiplitzieren] musst du Afaik [int Multiplizieren()] machen. Du willst aus der Funktion mit [Return] schlieslich was zurückgeben.

+ Du musst glaub ich die Funktion erst Initzialisieren. Dafür übernehme ich aber überhaupt keine garantie ;) Schreib kurz vor [int Multiplizieren()] nochmal [int Multiplizieren();]

+ Aus

switch(befehl)

case 7: cout << endl;
cout << "Programm beenden" << endl;
break;

case 1: cout << endl;
Multiplizieren;

mach mal

switch(befehl)
{
case 7:
{
cout << endl;
cout << "Programm beenden" << endl;
break;
}
case 1:
{
cout << endl;
Multiplizieren;
}
}

Wenn ich mich noch richtig entsinne sollte das ein Paar fehlermeldungen entfernen ;)

Jesus_666
16.05.2004, 20:40
1.) Funktion "Multiplizieren" ist void, obwohl sie einen Rückgabewert hat. Das ist nicht zulässig. die Funktion sollte besser double sein; du gibst ja sowieso ein double zurück. Was BTW overkill ist, wenn man sowieso ints miteinander multipliziert.
2.) Funktion "Multiplizieren" hat drei return-Statements - nur das erste wird ausgeführt werden, da bei einem return die Funktion automatisch verlassen wird.
3.) Der switch hat kein "default"-Ziel. Sollte er aber besser.
4.) Falls am Ende des Programms keine Leerzeile ist: Die sollte besser.

Das sind die Probleme, die ich so gefunden habe, mal sehen, was g++ so sagt (ich interpretier's gleich)...

Zeile 9: void Multiplikation <- Die Argumentliste fehlt; korrekt wäre "void Multiplikation()"
Zeile 14: cout <<"Bitte geben sie die erste Zahl ein!"l; <- kein Leerzeichen zwischen << und "[...]"
Zeile 14: cout <<"Bitte geben sie die erste Zahl ein!"l; <- Was hat die 1 da am Ende zu suchen?
Zeile 15: cin << Zahl1 <- ; fehlt
Zeile 15: cin << Zahl1 <- cin >> Zahl1; wäre richtig
Zeile 16: count << "Bitte geben sie die zweite Zahl ein, die mit der ersten multipliziert werden soll"; <- sollte cout heißen
Zeile 18: cin << Zahl2 <- ; fehlt
Zeile 18: cin << Zahl1 <- cin >> Zahl2; wäre richtig
Zeile 22: return ergebnis <- ; fehlt
Zeile 46: switch() ohne {}. Die korrekte Form wäre:
switch(Bedingung)
{
case x:
// Zeug
case y:
// Zeug
case default:
// Zeug
break; //ist besser, wenn der letzte case mit break; aufhört
}
Zeile 51: Multiplizieren; <- Funktionen müssen immer mit Parameterliste aufgerufen werden (Multiplizieren();)

So, das sollte reichen. Keep it up! ;)


Antwort wäre früher gekommen, der Server wollte nur wieder nicht und dann war ich afk... Falls redundant, bitte nicht beachten.

Balbero
16.05.2004, 22:33
danke für eure hilfe!!!!!!

aber nuhn hab ich dabei nur noch zwei fehler/probs

hier noch mal die aktuelle version:

// letz go

#include <stdio.h>
#include <iostream.h>
#include <cmath>
using namespace std;


//funtion zur multiplikation
int Multiplizieren
{
int Zahl1;
int Zahl2;

cout <<"Bitte geben sie die erste Zahl ein!"l;
cin << Zahl1
cout << endl;
cout << "Bitte geben sie die zweite Zahl ein, die mit der ersten multipliziert werden soll";
cin << Zahl2
cout << endl;

double ergebnis;
ergebnis = Zahl1*Zahl2;

cout << "Das Ergebnis von "<< Zahl1 << "mal "<< Zahl2 <<"ist "<< ergebnis <<endl;


return ergebnis

}


// haupmenue
int main()
{
int befehl;

cout << endl;
cout << "Menue" << endl;
cout << "Multiplizieren <1>" << endl;
cout << "Dividieren <2>" << endl;
cout << "Addieren <3>" << endl;
cout << "Subtrahieren <4>" << endl;
cout << "Wurzelziehen <5>" << endl;
cout << "Quadrieren <6>" << endl;
cout << "Programm beenden <7>" << endl;
cout << "Bitte ihre gewünschte Wahl:";
cin >> befehl;

// befehl bearbeiten

switch(befehl)
{
case 7:
{
cout << endl;
cout << "Programm beenden" << endl;
break;
}

case 1:
{
cout << endl;
Multiplizieren;
break;
}
}
return 0;
}



und die dazugehörigen fehler, welche ich absolut nicht verstehen kann. aber schaut selbst:

C:\Programme\Microsoft Visual Studio\MyProjects\nen versuch\letz go.cpp(6) : error C2871: 'std' : Existiert nicht oder ist kein Namespace

C:\Programme\Microsoft Visual Studio\MyProjects\nen versuch\letz go.cpp(11) : error C2239: Unerwartetes Token '{' nach der Deklaration von 'Multiplizieren'


wenn ihr ir hier weiterhelfen könntet, so das alles funktzt, müsste ich es eigentlich schaffen das ganze konzet später auch auf die anderen funktionen übernehmen zu können.


@jesus_666
könnte man nicht auch als einzelner bürger innerhalb der eu auf ein verfahren gegen solch einen beschluß ins rollen bringen??? oder zumindest ne europaweite unterschriften aktion??

MuadDib
16.05.2004, 22:56
deine Schnittstelle fuer Multiplizieren muss so aussehen:



int Multiplizieren() {
//hier dein Code
}


und so aufgerufen werden:



Multiplizieren();


Des weiteren gehört nach return ergebnis ein Strichpunkt. und using namespace std läuft nicht, da noch kein Namespace std definiert worden ist. Allerdings ist das auch komplett unnütz, die Zeile kannst du streichen.

Jesus_666
16.05.2004, 23:05
Original geschrieben von MuadDib
und using namespace std läuft nicht, da noch kein Namespace std definiert worden ist. Allerdings ist das auch komplett unnütz, die Zeile kannst du streichen. [/B]
Echt? AFAIK wird exakt das in der <stdio.h> getan... Immerhin kann man ja ohne using namespace std; auch auf std::cin und std::cout nicht ohne das std::-Präfix zugreifen, AFAIK.

Allerdings weiß ich nicht, ob und wie MSVC++ die STL implementiert; an einigen Stellen scheint es ja vom ISO-C++ abzuweichen...

MuadDib
17.05.2004, 01:42
Original geschrieben von Jesus_666
Echt? AFAIK wird exakt das in der <stdio.h> getan... Immerhin kann man ja ohne using namespace std; auch auf std::cin und std::cout nicht ohne das std::-Präfix zugreifen, AFAIK.

Allerdings weiß ich nicht, ob und wie MSVC++ die STL implementiert; an einigen Stellen scheint es ja vom ISO-C++ abzuweichen...

In der stdio.h sicher nicht, die ist noch ein Relikt aus C-Tagen... wenn dann in der iostream. Auf cin und cout kann man sicher ohne namespace und praefix zugreifen, da bin ich sicher --- aber der namespace koennte tatsaechlich dort definiert sein (sagen zumindest einige google-Tools), nur moechte ich dann wissen, warum der Compiler hier einen Fehler schmeisst... (ein Zeilenschritt?)

Jesus_666
17.05.2004, 04:40
1.) Ich hatte erst iostream geschrieben, mich dann falsch korrigiert und bei der Rückkorrektur war der Server down. Go figure.
2.) Zumindest g++ besteht AFAIK auf dem Namespace; der MS-Compiler scheint die Namespaces für die STL offenbar komplett zu ignorieren.

Balbero
17.05.2004, 05:18
den namespace konnt ich wirklich einfach so löschen. dadurch wurden die fehler von 2 auf einen heruntergesenkt.

@muadib
nur die wenn ich die beiden klammern hinter die ausdrücke setzt, erhöhen sich die fehler von einem fehler auf 5 fehler und 1 warnung



wie grad oben gesagt, hab ich nur noch ein fehler. und das ist die geschweifte klammer unter int Multiplizieren ich mach sie gleich im obiegen post mal schnell farbig

Ineluki
17.05.2004, 08:12
so .. ich habe mich mal erbarmt und alle zich fehler korrigiert *seuftz*
Das Programm compiliert jetzt fehlerfrei mit Dev-C++, also GNU-C++ konform.
Wenn MS hier immer noch rumspinnt, liegts an denen und deren standardfremdheit.



//#include <stdio.h> brauchst du nicht, da du kein printf oder so hast
#include <iostream> // c++ header haben nach neuem Standard KEIN .h

using namespace std; // Diese Zeile ist fuer die STL SEHR SEHR wichtig.
// Ob MS sich hier mal wieder nicht an den standard haellt, weiss ich auch nicht


// Funtion zur Multiplikation
// Im Hauptprogramm verwendest du den Rueckgabewert sowieso nicht.
// Daher wird sie definiert, das sie weder nen Wert zurueckgibt, noch verlangt
void Multiplizieren(void)
{
int Zahl1=0; // =0 <- initialisieren gehoehrt zum guten Ton
int Zahl2=0;

// cout <<"Bitte geben sie die erste Zahl ein!"l;
//<- was das l da zu suchen hat, weiss ich auch nicht.
cout <<"Bitte geben sie die erste Zahl ein! : ";
// cin << Zahl1 das ist definitiv falsch. Mit >> liest du aus dem String.
// Zudem: Nach jeder Anweisung musst du ein ; machen
cin >> Zahl1;
cout << endl;
cout << "Bitte geben sie die zweite Zahl ein,"<<endl
<<"mit welcher die erste multipliziert werden soll :";
// cin << Zahl2 das selbe Problem wie oben
cin >> Zahl2;
cout << endl;

// Extradefinition des Ergebnisses ueberfluessig.
// double ergebnis;
// ergebnis = Zahl1*Zahl2;
// durch den Cast in den typ double kannst du groessere zahlen darstellen
cout << "Das Ergebnis von "<< Zahl1 << " mal "<< Zahl2 <<" ist "<< double(Zahl1)*Zahl2 <<endl;

// return ergebnis; brauchen wir nicht mehr, da kein Wert zurueckgegeben wird
}


// haupmenue
int main(void) // void in die Klammer schreiben, wenn man keine Parameter haben will
{
int befehl;

cout << endl;
cout << "Menue" << endl;
cout << "Multiplizieren <1>" << endl;
cout << "Dividieren <2>" << endl;
cout << "Addieren <3>" << endl;
cout << "Subtrahieren <4>" << endl;
cout << "Wurzelziehen <5>" << endl;
cout << "Quadrieren <6>" << endl;
cout << "Programm beenden <7>" << endl;
cout << "Bitte ihre gewünschte Wahl:";
cin >> befehl;

// befehl bearbeiten

switch(befehl)
{ // Beginn Switch
case 7:
//{ <- die { } um die Breakbloecke sind ueberfluessig und unueblich, wenn nicht sogar falsch
cout << endl;
cout << "Programm beenden" << endl;
break;
// } <- siehe oben
case 1:
cout << endl;
// Multiplizieren; <- Eine Funktion ohne Parameter wird immer mit () aufgerufen
Multiplizieren();
break;
} // End Switch
// Der folgende Befehl laesst nochmal warten, bis enter gedrueckt wurde.
// Sonst siehst du nix, wenn du nicht auf cmdline arbeitest. Funkt i.d.R nur auf WinDos
system("pause");
return 0;
}


Ich hab mir erlaubt, deine Fehler auszukommentieren und ranzuschreiben, was du falsch gemacht hattest.

Gruss Ineluki

Balbero
17.05.2004, 11:37
Ich bedanke mich noch einmal herzlich für die fiele hilfe und werde mir mühe geben eure ratschläge zu beachten und mich weiterhin verbessern.

Balbero

Jesus_666
17.05.2004, 14:59
Original geschrieben von Ineluki


// Der folgende Befehl laesst nochmal warten, bis enter gedrueckt wurde.
// Sonst siehst du nix, wenn du nicht auf cmdline arbeitest. Funkt i.d.R nur auf WinDos
system("pause");


Das gleiche Ergebnis hättest du auch hinbekommen, indem du einfach...

cout << "Beliebige Taste zum Fortfahren drücken..." << endl;
cin >> befehl;
...hingeschrieben hättest... Systemaufrufe sollte man nach Möglichkeit vermeiden, wenn es eine brauchbare Alternative gibt.


Weiter oben könnte man noch ein cout einsparen:

cin >> Zahl1;
cout << endl;
cout << "Bitte geben sie die zweite Zahl ein,"<<endl
<<"mit welcher die erste multipliziert werden soll :";

// cout akzeptiert auch Steuerzeichen wie \n (Zeilenende)

cin >> Zahl1;
cout << "\nBitte geben sie die zweite Zahl ein,\nmit welcher die erste multipliziert werden soll :";

Ansonsten sieht das gut aus.

Ineluki
17.05.2004, 19:14
Original geschrieben von Jesus_666


// Der folgende Befehl laesst nochmal warten, bis enter gedrueckt wurde.
// Sonst siehst du nix, wenn du nicht auf cmdline arbeitest. Funkt i.d.R nur auf WinDos
system("pause");


Das gleiche Ergebnis hättest du auch hinbekommen, indem du einfach...


cout << "Beliebige Taste zum Fortfahren drücken..." << endl;
cin >> befehl;
...hingeschrieben hättest... Systemaufrufe sollte man nach Möglichkeit vermeiden, wenn es eine brauchbare Alternative gibt.



Leider hast du dabei nicht recht Jeez, denn cin >> ignoriert fuehrende leerzeichen und zeilenendzeichen. Du kannst also auf Enter rumhaemmern, bis du schwarz wirst, solange du nicht wenigstens ein alphanumerisches zeichen eingeben hast ... habs selbst ausprobiert. Daher der systemaufruf.

Was ich schon ewig in c suche ist eine moeglichkeit, genau 1 zeichen von der tastatur zu lesen, ohne noch enter druecken zu muessen .. selbst getc will so einen bloedsinn. Sinnvoll waere auch zu wissen, wie ich pruefen kann, ob ueberhaupt ein zeichen im Tastenpuffer ist.

sprich, wie mache ich das aus dem guten alten pascal bekannte
repeat until keypressed; c:=readkey;

Firzen
18.05.2004, 13:44
Ich verwende beim Beenden eigentlich immer getch(); Mit getch() liest du immer genau nur ein Zeichen. Für getch() müsstest du allerdings noch conio.h includen.
Falls du die eingegebene Taste speichern willst musst du a=getch(); und nicht getch(a); schreiben.

mfg
Firzen

Ineluki
18.05.2004, 18:37
@Firzen ..

Thx fuer die Hilfe, da gibt es aber nur ein Problem ...
die conio.h ist keine Standard-Include Datei, sondern eine Spezifikation von Borland, das heisstm nicht auf allen Plattformen verfuegbar -__-
Trotzdem Thx ^__^

MuadDib
20.05.2004, 15:20
Original geschrieben von Firzen
Ich verwende beim Beenden eigentlich immer getch(); Mit getch() liest du immer genau nur ein Zeichen. Für getch() müsstest du allerdings noch conio.h includen.
Falls du die eingegebene Taste speichern willst musst du a=getch(); und nicht getch(a); schreiben.

mfg
Firzen


Thx fuer die Hilfe, da gibt es aber nur ein Problem ...
die conio.h ist keine Standard-Include Datei, sondern eine Spezifikation von Borland, das heisstm nicht auf allen Plattformen verfuegbar -__-

IIRC gibts in der stdio.h auch getchar(), die eigentlich genau das gleiche machen muesste. Keine Ahnung warum Borland die gleiche Funktion neu implementiert :confused:

Jesus_666
20.05.2004, 18:23
Original geschrieben von MuadDib
IIRC gibts in der stdio.h auch getchar(), die eigentlich genau das gleiche machen muesste. Keine Ahnung warum Borland die gleiche Funktion neu implementiert :confused:
conio.h ist Microsoft-spezifisch. Die Shell-Methoden sind zwischen DOS/Windows und Unix generell inkompatibel, weil die Shells ganz anders funktionieren. conio.h beinhaltet AFAIK DOS/Win-spezifische Shellfunktionen.

Firzen
20.05.2004, 20:16
IIRC gibts in der stdio.h auch getchar(), die eigentlich genau das gleiche machen muesste. Keine Ahnung warum Borland die gleiche Funktion neu implementiert

AFAIK ist getchar() doch gleichbedeutend mit fgetc(stdin). getchar() liefert immer ein Zeichen aus stdin als Rückgabewert zurück. Befindet sich kein Zeichen in stdin, so erzeugt getchar eine Eingabe, die du wie bei zb. scanf nur mit Enter beenden kannst.
getch() liest allerdings immer nur ein Zeichen ein, unabhängig davon ob es Enter oder zb. "a" ist.

mfg
Firzen