Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [Opgelost][C++] Berekenen van totale weerstand van n resistors in parallel  (gelezen 6030 keer)

Offline Joshua822

  • Lid
Hallo allemaal.

Ik wil een programma schrijven om de totale weerstand van een netwerk van resistors die in parallel geschakeld zijn te berekenen.

Dit is de formule:


Nu, hoe kan ik dit schrijven in C++? Ik heb namelijk geen idee hoe ik dit moet aanpakken.

Hier is een test om te kijken of het goed werkt: twee resistors met een weerstand van respectievelijk 400 en 200 Ohm moeten als ze in parallel geschakeld zijn een totale weerstand opleveren van 133.3 Ohm.

Weet iemand hoe je dit schrijft?

Alvast bedankt! :D
« Laatst bewerkt op: 2010/08/22, 15:38:12 door Joshua822 »

Offline Rachid

  • Lid
    • rachidbm
    • Mijn blog
Re: [C++] Berekenen van totale weerstand van n resistors in parallel
« Reactie #1 Gepost op: 2010/08/21, 18:11:29 »
Volgens mij heeft je probleem weinig met C++ te maken. Of ik kan het verkeerd begrijpen. Maar het punt is dat jij Req wilt uitrekenen?

Op papier doe je het zo:
1/ ( (1/400) + (1/200) ) = 133
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Offline Double12

  • Lid
Re: [C++] Berekenen van totale weerstand van n resistors in parallel
« Reactie #2 Gepost op: 2010/08/21, 22:11:02 »
Dit is de meest simpele implementatie, als het aantal weerstanden dat parallel staat altijd gelijk is (namelijk 2). In andere programmeertalen zal de code er vergelijkbaar uit zien.
In C++:
double R_1 = 400.0;
double R_2 = 200.0;
double R_totaal = 1/( (1/R_1) + (1/R_2));

Als het aantal weerstanden variabel is, wordt het iets ingewikkelder.

Je kunt een loop maken die bij elk rondje om een nieuw getal vraagt. (1/dat getal) wordt toegevoegd aan de totale weerstand. De loop eindigt als er bijvoorbeeld q wordt ingevoerd. Deze methode werkt echter alleen als je met een text-based interface werkt, in een GUI is het denk ik minder bruikbaar.

De elegantere methode is om eerst alle ingevoerde getallen in elementen van een array of vector te stoppen. Daarna loop je met een loop alle elementen van de array of vector na en tel je (1/dat getal) op bij de totale weerstand. Een array is een heel simpel gegevenstype, maar heeft als nadeel dat je vooraf het aantal elementen moet opgeven, terwijl je meestal nog niet weet hoeveel getallen de gebruiker gaat invoeren. De vector is een gegevenstype dat specifiek is voor C++. Het heeft als voordeel dat je vooraf nog niet het aantal elementen hoeft op te geven, je voegt gewoon telkens een nieuw getal aan het eind van de vector toe.

Een boek over C++ helpt wel, dan weet je hoe je een vector goed kunt gebruiken :)
« Laatst bewerkt op: 2010/08/21, 22:15:44 door Double12 »

Re: [C++] Berekenen van totale weerstand van n resistors in parallel
« Reactie #3 Gepost op: 2010/08/22, 12:28:39 »
maar heeft als nadeel dat je vooraf het aantal elementen moet opgeven, terwijl je meestal nog niet weet hoeveel getallen de gebruiker gaat invoeren. De vector is een gegevenstype dat specifiek is voor C++. Het heeft als voordeel dat je vooraf nog niet het aantal elementen hoeft op te geven, je voegt gewoon telkens een nieuw getal aan het eind van de vector toe.

Of je gebruikt new en deleteen laat het geheugen dynamisch alloceren. Dat lijkt mij simpeler dan het leren van - relatief moeilijke - theorie over vectoren.
Zo:#include <iostream>
#include <new>
using namespace std;
int main(int argc, char *argv[]){
cout << "Hoeveel weerstanden? ";
int i;
cin >> i;
double *p_array = new double[i];

//rest van code
delete[] p_array; //Wis de array. Niet per se nodig, maar dan ken je de syntax alvast :)
return 0;
}

Mijn twee cent. :)
« Laatst bewerkt op: 2010/08/22, 12:39:12 door SteefuitHeerlen »
Bezoek ook eens de Ubuntu NL IRC-kanalen! |

Re: [C++] Berekenen van totale weerstand van n resistors in parallel
« Reactie #4 Gepost op: 2010/08/22, 13:21:54 »
Relatief moeilijk? vector<double> v; v.push_back(waarde); ?
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Re: [C++] Berekenen van totale weerstand van n resistors in parallel
« Reactie #5 Gepost op: 2010/08/22, 13:40:39 »
Ja. Relatief aan mijn eigen ervaringen en mening. Ik draag enkel een mogelijke oplossing aan.

Re: [C++] Berekenen van totale weerstand van n resistors in parallel
« Reactie #6 Gepost op: 2010/08/22, 14:25:38 »
#include <Sylph.h>
#include <Sylph/Core/Vector.h>

#include <iostream>

namespace {
    inline double I(double d) {
        return 1.0/d;
    }
}

double calculateResistanceParallel(Array<double> params) {
     double toReturn = 0.0;
     sforeach(double d, params) {
          toReturn = I(d);
     }
     return I(toReturn);
}

int SylphMain(Array<String> args) {
    // Voorbeeld 1: in de code zelf:
    double res1 = calculateResistanceParallel({1.0, 5.0, 4.0, 2.0});

    // Voorbeeld 2: via de argumenten:

    Vector<double> res2args;

    args = args[range(1,-1)];
    sforeach(String s, args) {
         res2args.add(s.toDouble());
    }

    double res2 = calculateResistanceParallel(res2args);

    return 0;
}
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Joshua822

  • Lid
Re: [C++] Berekenen van totale weerstand van n resistors in parallel
« Reactie #7 Gepost op: 2010/08/22, 15:36:59 »
Bedankt allemaal!

Ik heb mijn idee wel niet uitgelegd. Sorry dus, dat ik geen vectors gebruik in het onderstaande programma. Dit is omdat ik niet van plan was om het programma een interface te geven die dit vereist. Ik wist gewoon niet hoe ik die formule met breuken moest maken met gewone decimalen zodat ik hem kon programmeren in C++ ( Wiskunde is niet mijn sterkste vak ;) ). Maar toch bedankt.

Ik heb nu dit stukje code geschreven, waaruit je wel kunt opmaken wat voor interface ik bedoelde:
/*********************************************
* total_resistance: Calculates the total     *
*                   resistance of n resistors*
*                   in parallel.             *
*                                            *
*            Usage: Enter a resistance to add*
*                   to the total, or 0 to    *
*                   exit.                    *
*********************************************/

#include <iostream>

// The resistance the user inputs for the next resistor
double current_resistance;

// The total resistance of the resistors
double total_resistance;

int main ( ) {
   
    /* Asks the user to input the resistance of the first resistor
       and puts this input into current_resistance. */
    std::cout << "Enter the resistance of the first resistor: ";
    std::cin >> current_resistance;

    /* If the user didn't input 0, we calculate the current total resistance
       and print that out and then we start theoop.
       ELse we abort the program. */     
    if ( current_resistance != 0 ) {
         
        total_resistance = 1 / ( 1 / current_resistance );
   
        std::cout << "Total resistance: " << total_resistance << " Ohm.\n\n";

    } else {
           
        std::cout << "Aborting.\n";
        std::cin.get ( );
        std::cin.get ( );
        return ( 0 );
   
    } 

    // Enter a loop to be able to get input n times
    while ( true ) {
        /* Ask the user to input the resistance of the next reistor
           and store that in current_resistance. */
        std::cout << "Enter the resistance of the next resistor: ";
        std::cin >> current_resistance;

        /* If the user didn't input 0, we calculate the current total resistance
           and print that out and then we continue with the loop.
           Else we abort the program. */
        if ( current_resistance != 0 ) {
            total_resistance = 1 / ( ( 1 / total_resistance ) + ( 1 / current_resistance ) );

            std::cout << "Total resistance: " << total_resistance << " Ohm.\n\n";

        } else {
           
            std::cout << "Aborting.\n";
            std::cin.get ( );
            std::cin.get ( );
            return ( 0 );
 
        }
 
    }
 
    /* This is normally never reached, but it is needed to comform to the ANSI
       recommendations about C++. */
    return ( 0 );
 
}
Dit werkt perfect :)

Offline Double12

  • Lid
Ja dat ziet er goed uit. :) Je schrijft alleen veel code dubbel door het aparte geval voor de eerste input.

Je kunt beter het eerste stuk weghalen, en alleen de code binnen de loop gebruiken. Je moet dan in de loop een teller bijhouden. If teller==0 kun je dan een iets andere tekst laten zien ("first resistor") en geef je de variabele total_resistance een waarde.

Trouwens,
total_resistance = 1 / ( 1 / current_resistance );
is hetzelfde als
total_resistance = current_resistance;
:P

Wat dacht je van een kort stukje code dat hetzelfde doet:
#include <iostream>
using namespace std;
int main () {
double totaal, invoer;
do{
cout << "Enter the resistance of the resistor: ";
cin >> invoer;
if (totaal > 0){
totaal = (totaal*invoer)/(totaal+invoer);
cout << "Total resistance: " << totaal << " Ohm\n\n";
}else{
totaal = invoer;
}
} while (invoer > 0);
return 0;
}

Je mag deze code :  totaal = (totaal*invoer)/(totaal+invoer);
ook vervangen door jou formule  :  totaal = 1/(1/totaal+1/invoer)
« Laatst bewerkt op: 2010/08/24, 03:13:57 door Ward De Ridder »
http://leerubuntu.org (ubuntu zonder moeilijke woorden)
VoidWarranties (Hackerspace) Antwerpen
Microsoft isn't evil, they just make really crappy operating systems. - Linus Torvalds