Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Berechnung beliebiger Werte mit Hilfe von Funktionen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
03.01.2014, 20:31 Uhr
LnyGiant



Hallo liebe Cplusplus-forum Member,

ich habe ein "riesiges" (für viele bestimmt einfaches) Problem und hoffe, dass ihr mir in irgendeiner Weise helfen könnt.

Es handelt sich hier um ein Programm, das dazu dient verschiedene elektrotechnische Größen (wie unter anderem Widerstände, (Teil-) Leistung der Widerstände, Teilspannungen uvm.) zu berechnen.

Das Programm ist in 2 Stränge gegliedert:

- Parallelschaltung
- Reihenschaltung

Ich möchte eine ausgelagerte Funktion für den Gesamtwiderstand einer Reihenschaltung berechnen, jedoch mit beliebig vielen Werten.
Das heißt: Es wird die angelegte Spannungen abgefragt, die Anzahl der Widerstände, welche Schaltung vorliegt und die dazugehörigen Werte der Widerstände.

Es tut sich hierbei aber immer wieder ein Problem auf und zwar, dass die Berechnung des Gesamtwiderstandes (Reihenschaltung) aus irgendeinem Grund nicht erfolgt.

Wenn ich die Funktion für die Reihenschaltung richtig habe, ist alles andere viel einfacher. Ich sitze schon seit gut 6 Stunden vor den PC und finde den Fehler einfach nicht (Ich muss hinzufügen, dass ich noch Anfänger bin). Ich bin für jegliche Hilfe dankbar!


C++:
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <vector>

using namespace std;

float reihenwid (float gesamtr, float eing, int erneut)

{
    gesamtr = gesamtr + eing;
    erneut ++;
    cout << gesamtr;
    return (gesamtr);
}

int main(int argc, char *argv[])
{
    /* Allgemeine Variablen */
    
    char nochmal;
    int choice;
    int widerstaende;
    float widwert;
    float spannung;
    
    /* Variablen für Funktionen */
    
    float anzahl;
    float eing;    
    float gesamtr=0;                                                             // Initialisierung des Gesamtwiderstandes mit 0
    int erneut=1;                                                                // Initialisierung von nochmal mit 1
    float reihenwid (float gesamtr, float eing);
    
    
    do
    {
        
    cout << "Elektro-Technik-Elektronischer Taschen Rechner (ET-ETR)" << endl;   // Überschrift
    cout << "*******************************************************" << endl;     // Überschrift
    cout << "\n";
    
    /********************ABFRAGE VON SCHALTUNGSKOMPONENTEN*******************/
    
    cout <<    "Geben Sie den Wert der angelegten Spannung ein!\n" << endl;         // Ausgabe: Frage nach Spannungshöhe
    cout <<  "Spannungswert [in Volt]: ";
    cin >> spannung;                                                             // Eingabe des Spannungswertes
    
    cout << "\n";
    cout << "Geben Sie die Anzahl der Widerstaende ein!" << endl;
    cout << "\nAnzahl: ";
    cin >> anzahl;                                                               // Eingabe von der gewünschten Anzahl der Zahlen
    
    /* Festlegung der Widerstandswerte erfolgt später! */
    
    /****************ENDE ABFRAGE VON SCHALTUNGSKOMPONENTEN******************/
    
    system  ("cls");        

    cout << "Bitte geben Sie die Art Ihrer Schaltung ein!\n\n";                     // Ausgabe: Frage nach Art der Schaltung
    cout << "<1> = Parallelschaltung\n";                                         // Wahl 1 = Parallelschaltung
    cout << "<2> = Reihenschaltung\n\n";                                         // Wahl 2 = Reihenschaltung
    cout << "Ihre Wahl: <->\b\b";                                                 // Ausgabe:  Wahl
    cin >>  choice;                                                                  // Eingabe der Wahl  (1 oder 2)
    system ("cls");                                                                 // Bildschirm "putzen"
    
    switch (choice)                                                                    
    { /* Anfang: "switch-Befehl" */
        
    /***********************ANFANG: PARALLELSCHALTUNG************************/
    
        case 1:                                                                     // Wahl 1: Parallelschaltung
        cout << "\n";
        cout << "Sie haben 'Parallelschaltung' gew"<< "\x84"<< "hlt!" << endl;
    
    /*******************BERECHNUNG: GESAMTWIDERSTAND*************************/
    
            
        while(erneut <= anzahl)                                                  // Beginn der While-Schleife
        {                                                                          
                  cout << "\n";
                  cout << "Widerstand Nr. " << erneut << ": ";
                  cin >> eing;                                                   // Eingabe der Widerstandswerte    
    
                  gesamtr = gesamtr + 1/eing;                                    // Berechnung des Gesamtwiderstandes
                  erneut++;                                                      // Addiert auf Variable nochmal +1
        }
        
        cout << "\n";          
        cout << "Der Gesamtwiderstand betr" << "\x84" << "gt: " << gesamtr << endl;  // Ausgabe der Summe
      
        break;                                                                     // Abschluss vom "ersten Fall"


    /***********************ENDE: PARALLELSCHALTUNG**************************/
    
    
    /***********************ANFANG: REIHENSCHALUNG***************************/

    
        case 2:                                                                     // Wahl 2: Reihenschaltung
        cout << "\n";
        cout << "Sie haben 'Reihenschaltung' gew"<< "\x84"<< "hlt!" << endl;

    
    /*******************BERECHNUNG: GESAMTWIDERSTAND*************************/                                                        
        
        while(erneut <= anzahl)                                                  // Beginn der While-Schleife
        {                                                                          
                  cout << "\n";
                  cout << "Widerstand Nr. " << erneut << ": ";
                  cin >> eing;
                  
                  float reihenwid (float gesamtr, float eing, float erneut);
                  erneut++;    
        }
        
    
        cout << "\n";          
        cout << "Der Gesamtwiderstand betr" << "\x84" << "gt: " << gesamtr << endl;  // Ausgabe der Summe
        break;                                                                         // Abschluss vom "zweiten Fall"
          

    /**********************ENDE: REIHENSCHALTUNG*****************************/
    
        default:
        cout << "\nFehler bei der Auswahl !\n\n";
        break;                          
    }
        cout << "\n\nNochmal? Dann bitte j eingeben!\n";                         // Abfrage ob erneuter Start
        cout << "Ihre Wahl: "  << endl;
        cin >> nochmal;                                                          // Einlesen von Wahl
        cout << "\n\n" << endl;                                                  // Zeilensprünge
    }   /* Ende: "switch-Befehl" */  
                              
        while (nochmal == 'j');                                                     // Wenn j bzw. J erneuter Start sonst Schluss
        cout << "\nDas Programm wird beendet!\n";                                 // Hinweis, dass Programm beendet wird

    return 0;                                                                     // Anfangszustand
}




P.S.: Ich muss hinzufügen, dass die Formel für die Parallelschaltung falsch ist. Das Problem kann ich aber noch lösen.

-----
Edit: code-Tags durch cpp-Tags ersetzt

Dieser Post wurde am 04.01.2014 um 20:01 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.01.2014, 20:28 Uhr
Hans
Library Walker
(Operator)


Hi,

Du hast die Funktion reihenwid() mehrfach definiert. Erst am Anfang, vor main() und später noch mal in den Zeilen 33 und 114, wo Du sie eigentlich aufrufen willst. Beim Aufruf einer Funktion hat der Rückgabetyp vor dem Namen nichts zu suchen! Also:

C++:
float reihenwid (float gesamtr, float eing);


Definiert eine Funktion, bzw. so erst mal nur einen Prototyp.


C++:
R = reihenwid (gesamtr, eing);


ruft die Funktion auf, welche das Ergebnis an die Variable R zurück gibt.
Hier werden keine Datentypen mehr angegeben, sondern nur noch Variablennamen. Datentypen werden hier als bekannt voraus gesetzt und vom Compiler auf korrektheit, d.h. übereinstimmung überprüft.

Dann hast du noch ein Problem mit dem Überladen, sofern Dir der Begriff schon was sagt. Oben vor main() hast Du reihenwid() mit 3 Parametern definiert, benutzt sie aber in Zeile 33 nur mit 2 Parametern. - Und ich hab hier extra nichts von aufrufen geschrieben, weil Du eine neue Version der Funktion definierst, die nur zwei Parameter benötigt. Das der Compiler das nicht anmeckert hat was mit der Möglichkeit zu tun, Funktionen zu überladen, - was auch immer das nun bedeutet.

Hans


---
Edit: blöde Fehler korrigiert.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 06.01.2014 um 19:48 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.01.2014, 10:06 Uhr
~f.-th.
Gast


Kommentare im Quelltext sind prinzipiell gut. Aber müssen die auch hinter selbsterklärendem Quelltext stehen?

Beispiel:

C++:
    cout << "<1> = Parallelschaltung\n";                                         // Wahl 1 = Parallelschaltung
    cout << "<2> = Reihenschaltung\n\n";                                         // Wahl 2 = Reihenschaltung


Denke da stört der Kommentar bei der Übersicht. Anders wäre das da bei kryptischen Abkürzungen.

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.01.2014, 22:28 Uhr
Hans
Library Walker
(Operator)


@~f.-th.:
Wenn du schon solche Sachen anschneidest: Zum einen hast Du recht, aber was mich hier mehr stört ist, dass die Kommentare so weit vom Quelltext entfernt stehen, und die damit verbundenen Zeilenumbrüche. Die stören bei mir nämlich den Lesefluss, weil sie durch die Umbrüche bedingt zum einen die Formatierung durcheinander bringen und zum anderen die Reste der Kommentare sich immer zwischen dem Quelltext drängen. Das mag auf einem breiten 16:10 Monitor vielleicht ganz gut hinkommen, wird aber spätestens beim drucken wieder problematisch, wenn man nur 80 oder 90 Spalten zur Verfügung hat. Dieser Quelltext hier benötigt aber bis zu 130 Spalten pro Zeile, was für meinen Geschmack eindeutig zu viele sind. - Jedenfalls wenn man ihn auf A4 im Hochformat druckt. Ich habs mal in OpenOffice mit dem Zeichensatz "Lucida Console" mit 10 Punkten Schriftgrösse getestet. Das ist für meinen Geschmack immer noch eine Katastrophe. Bei A4-quer sieht das anders aus, aber selbst da gibt es noch Zeilenumbrüche, und vor allem: wer macht sowas? (ausser mir jetzt.)
Soweit mal mein Senf zum Thema Programmierstil bzw. Coding-Style.

Hans


P.S. Ich hab das Programm mal mit AStyle umformatiert (GNU-Style) und die Kommentare so gesetzt, wie ich es bevorzuge, wobei ich aber einige der bemängelten Kommentare drin gelassen habe. Das sieht dann so aus:

C++:
//////////////////////////////////////////////////////////////////////////////////////////////////
/* Datei: etech.cpp

   Wiederstandsberechnungen von Reihen- und Parallelschaltungen bei Gleichstrom.
   Dieses Programm stammt von jemandem aus den C/C++ Forum.
*/


#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <vector>

using namespace std;

float reihenwid (float gesamtr, float eing, int erneut)

{
    gesamtr = gesamtr + eing;
    erneut ++;
    cout << gesamtr;
    return (gesamtr);
}

int main(int argc, char *argv[])
{
    /* Allgemeine Variablen */

    char nochmal;
    int choice;
    int widerstaende;
    float widwert;
    float spannung;

    /* Variablen für Funktionen */

    float anzahl;
    float eing;
    float gesamtr=0;      // Initialisierung des Gesamtwiderstandes mit 0
    int erneut=1;         // Initialisierung von nochmal mit 1
    float reihenwid (float gesamtr, float eing);  // Logischer Fehler:
                                                  // Definition eines Funktionsprototyps


    do
        {
            // Überschrift
            cout << "Elektro-Technik-Elektronischer Taschen Rechner (ET-ETR)" << endl;  
            cout << "*******************************************************" << endl;    
            cout << "\n";
            
            /********************ABFRAGE VON SCHALTUNGSKOMPONENTEN*******************/
            
            cout <<    "Geben Sie den Wert der angelegten Spannung ein!\n" << endl;        
            cout <<  "Spannungswert [in Volt]: ";
            cin >> spannung;  
            
            cout << "\n";
            cout << "Geben Sie die Anzahl der Widerstaende ein!" << endl;
            cout << "\nAnzahl: ";
            cin >> anzahl;      // Eingabe von der gewünschten Anzahl der Zahlen

            /* Festlegung der Widerstandswerte erfolgt später! */

            /****************ENDE ABFRAGE VON SCHALTUNGSKOMPONENTEN******************/
            
            system  ("cls");
            
            // Ausgabe: Frage nach Art der Schaltung
            cout << "Bitte geben Sie die Art Ihrer Schaltung ein!\n\n";                    
            cout << "<1> = Parallelschaltung\n";     // Wahl 1 = Parallelschaltung
            cout << "<2> = Reihenschaltung\n\n";     // Wahl 2 = Reihenschaltung
            cout << "Ihre Wahl: <->\b\b";            // Ausgabe:  Wahl
            cin >>  choice;                          // Eingabe der Wahl  (1 oder 2)
            system ("cls");                          // Bildschirm "putzen"

            switch (choice) /* Anfang: "switch-Befehl" */
                {
                   /***********************ANFANG: PARALLELSCHALTUNG************************/

                  case 1:  // Parallelschaltung
                    cout << "\n";
                    cout << "Sie haben 'Parallelschaltung' gew"<< "\x84"<< "hlt!" << endl;

                   /*******************BERECHNUNG: GESAMTWIDERSTAND*************************/

                    while(erneut <= anzahl)  // Beginn der While-Schleife
                        {
                            cout << "\n";
                            cout << "Widerstand Nr. " << erneut << ": ";
                            cin >> eing;        // Eingabe der Widerstandswerte

                            gesamtr = gesamtr + 1/eing;   // Berechnung des Gesamtwiderstandes
                            erneut++;                     // Addiert auf Variable nochmal +1
                        }

                    cout << "\n";
                    // Ausgabe der Summe
                    cout << "Der Gesamtwiderstand betr" << "\x84" << "gt: " << gesamtr << endl;  

                    break;              // Abschluss Parallelschaltung

                    /***********************ENDE: PARALLELSCHALTUNG**************************/


                    /***********************ANFANG: REIHENSCHALUNG***************************/

                    case 2:     // Wahl Reihenschaltung
                    cout << "\n";
                    cout << "Sie haben 'Reihenschaltung' gew"<< "\x84"<< "hlt!" << endl;

                    /*******************BERECHNUNG: GESAMTWIDERSTAND*************************/

                    while(erneut <= anzahl)  
                        {
                            cout << "\n";
                            cout << "Widerstand Nr. " << erneut << ": ";
                            cin >> eing;

                            float reihenwid (float gesamtr, float eing, float erneut);
                            /* Logischer Fehler!
                               Definition eines Funktionsprototyps */


                            erneut++;
                        } // while()


                    cout << "\n";
                    // Ausgabe der Summe
                    cout << "Der Gesamtwiderstand betr" << "\x84" << "gt: " << gesamtr << endl;  
                    break;        // Abschluss vom "zweiten Fall"

                    /**********************ENDE: REIHENSCHALTUNG*****************************/

                default:
                    cout << "\nFehler bei der Auswahl !\n\n";
                    break;
                }
            cout << "\n\nNochmal? Dann bitte j eingeben!\n";   // Abfrage ob erneuter Start
            cout << "Ihre Wahl: "  << endl;
            cin >> nochmal;                                    // Einlesen von Wahl
            cout << "\n\n" << endl;                            // Zeilensprünge
        }   /* Ende: "switch-Befehl" */

    while (nochmal == 'j');          // Wenn j bzw. J erneuter Start sonst Schluss
    cout << "\nDas Programm wird beendet!\n";    // Hinweis, dass Programm beendet wird

    return 0;                                    // Anfangszustand
}



Zu beachten wäre auch noch der "Kopfkommentar", der grundsätzlich den Dateinamen und eine Erklärung enthält, was das Programm oder Modul macht, bzw. machen soll, sofern man noch dran arbeitet.
Fall es sich um Beispiele aus Lehrbüchern handelt, schreibe ich da auch immer noch die genauen Quellenangaben rein, damit ich später noch weis wo es her kommt. Genaue Quellenangabe heisst hier: genau so, wie es für Zitate in wissenschaftlichen Arbeiten gefordert wird! - Wenn ich so ein Beispiel ändere und damit experimentiere, vermerke ich das ebenfalls dort.
Und zuletzt wäre noch anzumerken, dass ich die logischen Fehler im Quelltext drin gelassen habe, - allerdings markiert.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 06.01.2014 um 19:59 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.01.2014, 22:42 Uhr
LnyGiant



Habe alles hinbekommen und Programm läuft

Jetzt habe ich mir ein kleines anderes Programm geschrieben, da ich das Ganze mal mit Vektoren ausprobieren wollte.

Ich möchte mit Hilfe des Arrays alle eingegeben Widerstandswerte speichern, um diese später abzurufen (zur Berechnung der Teilspannungen).
Aber schon bei der Funktion für den Gesamtwiderstand spuckt er mir diesen Fehler aus "[Error] cannot convert 'std::vector<float>' to 'float' for argument '2' to 'float reihenwid(float, float)'".

Wenn ich die Rechnung aber nicht als Funktion aufrufe, sondern direkt in der While-Schleife ganz normal verfasse (gesamtr = gesamtr + wid) funktioniert alles.


C++:
#include <iostream>
#include <iomanip>
#include <vector>
#include <cstdlib>

using namespace std;

int main(int argc, char *argv[])
{
    int erneut = 1;
    int anzahl;
    float gesamtr = 0;
    
    float reihenwid (float gesamtr, float wid);
    
    cout << "Geben Sie die Anzahl der Widerstaende ein!" << endl;
    cout << "\nAnzahl: ";
    cin >> anzahl;  
    vector <float> wid(anzahl);    
        
        while(erneut <= wid.size())
        {
                cout << "\n";
                cout << "Widerstand Nr. " << erneut << ": ";
                cin >> wid[erneut-1];
        
                gesamtr = reihenwid (gesamtr, wid);
                erneut++;
        }
        
        cout << gesamtr;
    return 0;
}

float reihenwid (float gesamtr, float wid)

{
    gesamtr = gesamtr + wid;
    return (gesamtr);
}


Dieser Post wurde am 06.01.2014 um 22:43 Uhr von LnyGiant editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.03.2014, 10:05 Uhr
~xiaweiww
Gast


Ich möchte eine ausgelagerte Funktion für den Gesamtwiderstand einer Reihenschaltung berechnen, jedoch mit beliebig vielen Werten.
Das heißt: Es wird die angelegte Spannungen abgefragt, die Anzahl der Widerstände, welche Schaltung vorliegt und die dazugehörigen Werte der Widerstände.

__________________
Fifa 14 Coins

-----
Edit: Den Link und ein paar Leerzeilen aus diesem Spambeitrag gelöscht.

Dieser Post wurde am 20.03.2014 um 10:42 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.03.2014, 13:21 Uhr
ao

(Operator)


Dann fang mal an. Wie weit bist du gekommen? Was ist das Problem?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.03.2014, 15:27 Uhr
Tommix




Zitat von ao:
Was ist das Problem?


Das das ein Spam-Bot ist?

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
18.03.2014, 17:34 Uhr
ao

(Operator)


Mist. Reingefallen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
18.03.2014, 21:56 Uhr
Hans
Library Walker
(Operator)


Das ist allerdings auch ein "fieser" Spam-Bot!
Obwohl ich den Eindruck habe, dass es davon in letzter Zeit mehrere gibt, bzw. die Teile immer geschickter werden. Denn ähnliche Postings von Spam-Bots sind mir hier neulich schon mal aufgefallen. Dieser hier hat hier heute noch zwei weitere Postings abgesetzt, die ich allerdings gelöscht habe.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: