for-Anweisung gibt Funktionswerte nicht aus
-
Hallo, da ich jetzt schon eine zeitlang an meinem Problem knabbere wollt ich mal jemanden Fragenn der von der Materie Ahnung hat
:Mein Programm soll eine mathematische Funktion berechnen und dann die Werte untereinander ausgeben. Nur leider bekomm ich keine Funktionswerte berechnet.
Die Werte werden in eine .html Datei ausgegeben die in der Projektmappe gespeichert wird.
Das ganze in Visual Studio 2005.
Kann sich des mal jemand anschauen was hier falsch läuft.
#include<iostream> #include<fstream> #include<math.h> using namespace std; #define HK1 "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"" #define HK2 "\"http://www.w3.org/TR/html4/loose.dtd\">" #define HK3 "<html><head><meta http-equiv=\"Content-Type\"" #define HK4 "content=\"text/html; charset=ISO-8859-1\">" #define HT1 "<title>Informatik 1: File I/O Beispiel</title>" #define HS1 "<style type=\"text/css\"> body {font:10pt courier} </style>" #define HBS "</head><body>" #define HBE "</body></html>" #define ZV "<br>" #define ZW " " #define NP '*' #define BP "<span style=\"color:blue;\">*</span>" #define RP "<span style=\"color:red;\">*</span>" #define GP "<span style=\"color:green;\">*</span>" #define YP "<span style=\"color:yellow;\">*</span>" #define CP "<span style=\"color:cyan;\">*</span>" #define MAX 120 float x; // Fariablendeklaration float v; float R1, R2; void funktion (float x); // Funktiondeklaration int main() { cout << "Bitte geben Sie einen Wert fuer Widerstand R1 zwischen 100 Ohm und 100 kOhm ein:\n" << endl; cin >> R1; if (R1 < 100) { cout << "Unzulaessiger Wert . . .\n"; return 0; } else if (R1 > 100000) { cout << "Unzulaessiger Wert . . .\n"; return 0; } else { cout << "Bitte geben Sie einen Wert fuer Widerstand R2 zwischen 100 Ohm und 100 kOhm ein:\n" << endl; } cin >> R2; if (R2 < 100) { cout << "Unzulaessiger Wert . . .\n"; return 0; } else if (R2 > 100000) { cout << "Unzulaessiger Wert . . .\n"; return 0; } else { cout << "\nDanke, den Graphen finden Sie in der Datei Aufgabe1.html." << endl; } // HTML Datei anlegen und Kopfdaten eintragen ofstream out("Aufgabe1.html"); if (!out) { cout << "\nFehler: Datei kann nicht angelegt werden.\n"; return -1; } out << HK1 HK2 HK3 HK4 HT1 HS1 HBS; // HTML Kopf und Titel out << "Test-" << ZV << ZV << ZV; // Blattüberschrift for (x=0; x<=100; x++) // Funktion aufrufen { funktion (x); out << "*" << v << ZV << endl; } // const int v = 50; // const int x = 100; // short table [50] [100]; // --- hier zeichnen Sie Ihre Funktion mit Hilfe der oben angegebenen Konstanten out << HBE; // HTML Inhalt abschliessen out.close(); // Datei schliessen / speichern return 0; } void funktion (float x) // Funktion definieren { float v; float s; s = 1+(1-x)*x*R1/R2; v = x/s; }Grüße,
Agrippa
-
Was ist genau das Problem?
-
Was geht den nicht? - Ich habe es bei mir mal laufen lassen und es wird was ausgegeben..

-
nimm die neudefinition float v raus aus der funktion
void funktion (float x) // Funktion definieren { float s; s = 1+(1-x)*x*R1/R2; v = x/s; }wobei dir die globalen variablen irgendwann in die knie schießen können

-
SchwammKopf schrieb:
Was ist genau das Problem?
Naja die
for (x=0; x<=100; x++)Anweisung wird anscheinend ausgeführt, nur leider werden die Zeilen ohne den Funktionswert
void funktion (float x) // Funktion definieren { float v; float s; s = 1+(1-x)*x*R1/R2; v = x/s; }ausgegeben.
Die Ausgabe soll etwa so aussehen:
* f(x=0)
* f(x=1)
.
.
.
*f(x=100)leider siht die Ausgabe aber so aus:
* 0
* 0
.
.
.
* 0
-
dann nimm das float v raus!
-
Um noch eine kleine Erklärung zu geben. Das Problem dabei ist, dass du ein globales, sowie lokales v hattest. Und du bist davon ausgegangen, dass es das gleiche ist. Das ist es nicht. Das lokale v (in der Funktion) hat das globale überdeckt und du hast dann das globale v ausgegeben, mit dem du ja in der Funktion noch nichts gemach hast.
Es ist richtig herrlich, was die Leute manchmal für super Beispiele gegen globale Variablen liefern.

-
Super so macht programmieren Spaß
.Danke euch, werd jetzt des Programm ein bisserl "straffen" und dann versuchen des ganze in ein Array zu packen um so den Graphen auszugeben.
Wenn ihr dazu noch Tipps hättet
.Vielen Dank nochmal,
Agrippa
-
Hallo,
Die Ausgabe soll etwa so aussehen:
* f(x=0)
* f(x=1)Also mit MS Visual C++ 6.0 sieht die Sache (ohne "float v" in der Funktion) und zwei Testwerten so aus:
*0
*1
*-13.1467
*-1.2213
*-0.676501
*-0.475227
*-0.368506
*-0.301793
*-0.255921
*-0.22235
*-0.196673
*-0.176375
*-0.159914
*-0.146287
*-0.134818
*-0.125027
*-0.116571
*-0.109192
*-0.102695usw....
Sieht wohl etwas besser aus

-
Also zu verbessern gibt es da noch einiges.

Also erstmal würde ich die globals weglassen.. Sind unnötig. die defines kann man hier noch lassen.
Dann einrückungen sind gut, aber mach sie dort, wo sie auch was bringen.
Am Anfang der main sind sie überflüssig, aber innerhalb von scopes kannste ruhig einmal einrücken..
-
drakon schrieb:
Am Anfang der main sind sie überflüssig, aber innerhalb von scopes kannste ruhig einmal einrücken..
in jedem scope einrücken, auch in der main funktion.
die klammern am anfang, nicht mit einrücken, oder die öffnende hinter den funktionskopf schreiben.aber ok, da wird der prof/dozent/lehrer/sonstiger eben dann punkte für abziehen... je nachdem, wie er/sie es lehrt.
-
Ja das schon, aber hast du gesehen, wie viel er eingerückt hat?! DAS habe ich gemeint, nicht dass man überhaupt nicht einrücken sollte am Anafang der main. Ebenso die vielen Abstände am Anfang sehen unschön aus.
-
Vielleicht sollte man ihm sagen, dass Variablenbezeichner auch ab und zu mehr als 3 Buchstaben haben dürfen.
out << HK1 HK2 HK3 HK4 HT1 HS1 HBS;
Gruß
Don06
-
Tipp:
Eine gute Library, um HTML (+ HTTP) Code zu erzeugen, ist übrigens Cgicc (http://www.gnu.org/software/cgicc/)
-
drakon schrieb:
Ja das schon, aber hast du gesehen, wie viel er eingerückt hat?! DAS habe ich gemeint, nicht dass man überhaupt nicht einrücken sollte am Anafang der main. Ebenso die vielen Abstände am Anfang sehen unschön aus.

-
Nimm boost::spirit.