C++ upphöjt med variabler? (Nybörjare)

Permalänk
Medlem

C++ upphöjt med variabler? (Nybörjare)

Hej, har precis börjat med att programmera i C++ och försöker göra ett program som beräknar värdeökning på valfritt insatt belopp under valfri tid.

Detta är det jag har skrivit hittills:

Citat:

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

int main()
{
setlocale(LC_ALL, "");
double Belopp, Ränta, Tid, Slutkapital, Förändringsfaktor, Förändringsfaktor2;
cout << "Ange Belopp: ";
cin >> Belopp;
cout << "\nAnge räntesats (%) : ";
cin >> Ränta;
cout << "\nAnge antal år: ";
cin >> Tid;
cout << "\n" << endl;
Förändringsfaktor = Ränta*0.01+1;
Förändringsfaktor2=double pow(double Förändringsfaktor, double Tid); //upphöjt?
Slutkapital = Ränta*Belopp;
cout << "Efter " << Tid << " år har ditt kapital stigit till " << Slutkapital << " :-" << endl;
system("pause");
return 0;
}

Problemet är att jag inte lyckas göra förändringsfaktor^tid då ^ tydligen var tecknet för exklusiv disjunktion.

Hur upphöjer jag två variabler? (x^y)

Tar gärna emot andra förbättringar också

EDIT: Kan vara lättare att läsa såhär:

Dold text
Visa signatur

[4770k delid] [1080 EK] [PG348Q] [Custom loop][1.75TB SSD]

Permalänk
Medlem

tror det bör lösa sig om du tar bort double framför pow.

Edit ser inte heller varför du måste ange double som typ för dina parametrar, tror det är fel men har inte skrivit någon c++ på rätt länge.

funkar det om du skriver så här?

Förändringsfaktor2= pow(Förändringsfaktor, Tid);

Visa signatur

| Ryzen 5800x | Asus prime x470 pro | Asus rtx 3080 tuf oc | Gskill 32gb 3,6ghz | aw3225qf |

Permalänk
Medlem
Citat:

Edit ser inte heller varför du måste ange double som typ för dina parametrar, tror det är fel men har inte skrivit någon c++ på rätt länge.

funkar det om du skriver så här?

Förändringsfaktor2= pow(Förändringsfaktor, Tid);

Jupp, detta löser problemet

Permalänk
Medlem

Bara för att tillägga så kan du tänka på att när du hämtar värden från funktioner ska du inte skriva med vad du förväntar dig för värde (Det är vad du gjort för fel och vad de två tidigare nämnt), utan det du måste se till att komma ihåg är att variabeln du sätter värdet till är av rätt typ (Vilket den i detta fallet är, som du ser på rad 114 där du initierar den).

Permalänk
Medlem
Skrivet av Ragin Pig:

tror det bör lösa sig om du tar bort double framför pow.

Edit ser inte heller varför du måste ange double som typ för dina parametrar, tror det är fel men har inte skrivit någon c++ på rätt länge.

funkar det om du skriver så här?

Förändringsfaktor2= pow(Förändringsfaktor, Tid);

Det testade jag efter att jag läst på ett antal olika sidor på google.

Skrivet av Thesoxie:

Jupp, detta löser problemet

Tack för svaren! det löste problemet med upphöjningen.

Det funkade dock inte ändå och jag märkte att jag hade skrivit såhär:

Citat:

Slutkapital = Ränta*Belopp;

Istället för såhär:

Citat:

Slutkapital = Förändringsfaktor2*Belopp;

Visa signatur

[4770k delid] [1080 EK] [PG348Q] [Custom loop][1.75TB SSD]

Permalänk
Medlem
Skrivet av AfterShock:

Bara för att tillägga så kan du tänka på att när du hämtar värden från funktioner ska du inte skriva med vad du förväntar dig för värde (Det är vad du gjort för fel och vad de två tidigare nämnt), utan det du måste se till att komma ihåg är att variabeln du sätter värdet till är av rätt typ (Vilket den i detta fallet är, som du ser på rad 114 där du initierar den).

Förstår inte riktigt xD Kan du förklara lite enklare?

Menar du vilken typ jag använder för variablerna? Skulle int fungera bättre än double?

Visa signatur

[4770k delid] [1080 EK] [PG348Q] [Custom loop][1.75TB SSD]

Permalänk

Extratips: Man brukar skriva variabelnamn med liten bokstav i början. Stora bokstäver i början brukar man bara använda till klasser

Permalänk
Skrivet av theo0019:

Förstår inte riktigt xD Kan du förklara lite enklare?

Menar du vilken typ jag använder för variablerna? Skulle int fungera bättre än double?

Du behöver inte skriva "double" varje gång du använder en variabel av typen double. Det gör du bara i deklarationen, dvs där du skapar variabeln. Sedan använder du bara variabelns namn.

edit: extratips 2: man brukar även använda "int" som heltalsvariabel och "float" som flyttalsvariabel (för decimaltal). Större datatyper såsom double eller long tar mycket onödig minnesplats brukar bara användas när man vill lagra extremt stora tal som inte får plats annars.

Permalänk
Medlem
Skrivet av theo0019:

Förstår inte riktigt xD Kan du förklara lite enklare?

Menar du vilken typ jag använder för variablerna? Skulle int fungera bättre än double?

Precis som @_MmattiasS_ beskrev det

Permalänk
Medlem
Skrivet av _MmattiasS_:

Extratips: Man brukar skriva variabelnamn med liten bokstav i början. Stora bokstäver i början brukar man bara använda till klasser

Tack

Skrivet av _MmattiasS_:

Du behöver inte skriva "double" varje gång du använder en variabel av typen double. Det gör du bara i deklarationen, dvs där du skapar variabeln. Sedan använder du bara variabelns namn.

edit: extratips 2: man brukar även använda "int" som heltalsvariabel och "float" som flyttalsvariabel (för decimaltal). Större datatyper såsom double eller long tar mycket onödig minnesplats brukar bara användas när man vill lagra extremt stora tal som inte får plats annars.

Tack!

Visa signatur

[4770k delid] [1080 EK] [PG348Q] [Custom loop][1.75TB SSD]

Permalänk
Skrivet av _MmattiasS_:

Större datatyper såsom double eller long tar mycket onödig minnesplats brukar bara användas när man vill lagra extremt stora tal som inte får plats annars.

"mycket" är lite av en överdrift, skiljer 4 bytes på majoriteten av plattformar (32 bit floats vs 64 bit double). Det finns en anledning till att det är floats, och inte doubles, som måste ha ett jobbigt 'F' (eller 'f') i litterala värden. Oftast är det en double man vill ha, och trådskaparens exempel faller bra in i denna kategori tycker jag.

Permalänk
Medlem

Om inte pow funkar varför inte bygga en (exemple ej testat att kompillera):

double powerUp(double value, int power){ double res=0; if(value<0){ res=1/value; for(short i=0; i<=power; i++){ res+=res*1/value; } return res; } res=value; for(short i=0; i <= power; i++){ res+=res*value } return res; }

Kan ha tänkt fel (Lite trött).

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem
Skrivet av asdfgh:

Om inte pow funkar varför inte bygga en (exemple ej testat att kompillera):

double powerUp(double value, int power){ double res=0; if(value<0){ res=1/value; for(short i=0; i<=power; i++){ res+=res*1/value; } return res; } res=value; for(short i=0; i <= power; i++){ res+=res*value } return res; }

Kan ha tänkt fel (Lite trött).

Fattar inget av det där men fick iallafall pow att fungera

Visa signatur

[4770k delid] [1080 EK] [PG348Q] [Custom loop][1.75TB SSD]

Permalänk
Medlem

Till sist, det fina med C språksläkten är att man kan överlagra operatorer (googla hur, väldigt enkelt). Så du kan göra om ^ tecknet till att faktiskt vara upphöjt med. Bra övning för dig i framtiden när du hunnit koda lite mer.

Lycka till!

Skickades från m.sweclockers.com

Visa signatur

Processor: Motorola 68000 | Klockfrekvens: 7,09 Mhz (PAL) | Minne: 256 kB ROM / 512 kB RAM | Bussbredd: 24 bit | Joystick: Tac2 | Operativsystem: Amiga OS 1.3

Permalänk
Medlem
Skrivet av theo0019:

Fattar inget av det där men fick iallafall pow att fungera

Tanken var att matte matematiskt räcka men det var helt fel ser jag nu.
Men enligt matten vet vi för negativa potsen:

x^(-1) => 1/x x^(-2) => 1/x*1/x x^(-3) => 1/x*1/x*1/x ... ...

för positiva potenser:

x^(1) => x x^(2) => x*x x^(3) => x*x*x ... ...

och att x^0 = 1 oavsätt x.

Då kan vi skriva följande potens funktion:

// Det första double i funktions namnet är för vi // vill att svar ska vara i double form. // double inom () är för vi vill kunna skicka in t,ex // 0.5 => x=0.5 (om du kollar hur jag beskrivit potenser // via matte innan) // int inom () är för vi vill bara ha heltals up höjningar. // om vi skulle vilja göra uphöjningar för icke heltal hade det // blivit jobbigare. double powerUp(double value, int power){ double res=1.0; // Negativa potenser if(power<0){ for(short i = 0; i>power; i--){ res*=1.0/value; } // När x^0 } else if(power==0){ res=1.0; // positiva potenser. } else{ for(short i = 0; i<power; i++){ res*=value; } } return res; }

Vilket vi kan använda i vårt program på följande sätt:

#include <iostream> using namespace std; // Det första double i funktions namnet är för vi // vill att svar ska vara i double form. // double inom () är för vi vill kunna skicka in t,ex // 0.5 => x=0.5 (om du kollar hur jag beskrivit potenser // via matte innan) // int inom () är för vi vill bara ha heltals up höjningar. // om vi skulle vilja göra uphöjningar för icke heltal hade det // blivit jobbigare. double powerUp(double value, int power){ double res=1.0; // Negativa potenser if(power<0){ for(short i = 0; i>power; i--){ res*=1.0/value; } // När x^0 } else if(power==0){ res=1.0; // positiva potenser. } else{ for(short i = 0; i<power; i++){ res*=value; } } return res; } int main(){ // Skriva ut direkt cout << "2 to the power of 6 is: " << powerUp(2, 6) << endl; cout << "2 to the power of -2 is: " << powerUp(2.0, -2) << endl; cout << "2 to the power of 0 is: " << powerUp(2, 0) << endl; // Spara till variable double test = powerUp(2,4); // Skriva ut variablen. cout << "2 to the power of 4 is: " << test << endl; // Vi kan även använda oss av variabler: double base=4; int powVal=6; double ans = powerUp(base, powVal); cout << base << " to the power of " << powVal << " is: " << ans << endl; // Eller base = powerUp(base,powVal); cout << "The anser is: " << base << endl; return 0; }

För vi har skapat en funktion som räknar våra potenser. Om du inte använder denna kod gör det inget, om inget annat hoppas jag att det lärde dig lite i c++.

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem
Skrivet av talonmas:

Till sist, det fina med C språksläkten är att man kan överlagra operatorer (googla hur, väldigt enkelt). Så du kan göra om ^ tecknet till att faktiskt vara upphöjt med. Bra övning för dig i framtiden när du hunnit koda lite mer.

Lycka till!

Skickades från m.sweclockers.com

Ska definitivt kolla på det!

Skrivet av asdfgh:

Tanken var att matte matematiskt räcka men det var helt fel ser jag nu.
Men enligt matten vet vi för negativa potsen:

x^(-1) => 1/x x^(-2) => 1/x*1/x x^(-3) => 1/x*1/x*1/x ... ...

för positiva potenser:

x^(1) => x x^(2) => x*x x^(3) => x*x*x ... ...

och att x^0 = 1 oavsätt x.

Då kan vi skriva följande potens funktion:

// Det första double i funktions namnet är för vi // vill att svar ska vara i double form. // double inom () är för vi vill kunna skicka in t,ex // 0.5 => x=0.5 (om du kollar hur jag beskrivit potenser // via matte innan) // int inom () är för vi vill bara ha heltals up höjningar. // om vi skulle vilja göra uphöjningar för icke heltal hade det // blivit jobbigare. double powerUp(double value, int power){ double res=1.0; // Negativa potenser if(power<0){ for(short i = 0; i>power; i--){ res*=1.0/value; } // När x^0 } else if(power==0){ res=1.0; // positiva potenser. } else{ for(short i = 0; i<power; i++){ res*=value; } } return res; }

Vilket vi kan använda i vårt program på följande sätt:

#include <iostream> using namespace std; // Det första double i funktions namnet är för vi // vill att svar ska vara i double form. // double inom () är för vi vill kunna skicka in t,ex // 0.5 => x=0.5 (om du kollar hur jag beskrivit potenser // via matte innan) // int inom () är för vi vill bara ha heltals up höjningar. // om vi skulle vilja göra uphöjningar för icke heltal hade det // blivit jobbigare. double powerUp(double value, int power){ double res=1.0; // Negativa potenser if(power<0){ for(short i = 0; i>power; i--){ res*=1.0/value; } // När x^0 } else if(power==0){ res=1.0; // positiva potenser. } else{ for(short i = 0; i<power; i++){ res*=value; } } return res; } int main(){ // Skriva ut direkt cout << "2 to the power of 6 is: " << powerUp(2, 6) << endl; cout << "2 to the power of -2 is: " << powerUp(2.0, -2) << endl; cout << "2 to the power of 0 is: " << powerUp(2, 0) << endl; // Spara till variable double test = powerUp(2,4); // Skriva ut variablen. cout << "2 to the power of 4 is: " << test << endl; // Vi kan även använda oss av variabler: double base=4; int powVal=6; double ans = powerUp(base, powVal); cout << base << " to the power of " << powVal << " is: " << ans << endl; // Eller base = powerUp(base,powVal); cout << "The anser is: " << base << endl; return 0; }

För vi har skapat en funktion som räknar våra potenser. Om du inte använder denna kod gör det inget, om inget annat hoppas jag att det lärde dig lite i c++.

Tack, det där måste ha tagit ett tag att skriva xD

Men varför ska jag använda det om det fungerar lika bra med tal1=pow(tal2,tal3)?

Visa signatur

[4770k delid] [1080 EK] [PG348Q] [Custom loop][1.75TB SSD]

Permalänk
Medlem
Skrivet av theo0019:

Men varför ska jag använda det om det fungerar lika bra med tal1=pow(tal2,tal3)?

Att implementera sin egen pow-funktion kan vara en bra övning för att lära sig hur det fungerar, men mycket mer än så är det inte. pow i standardbiblioteket är vältestad, optimerad och hanterar alla specialfall som kan uppstå. Den enda orsaken att använda din egen implementation är om pow är för långsam för dina behov, och du t.ex. klarar dig med en grov uppskattning.

Detsamma gäller för övrigt mycket annat i C++. C++ har ett stort standardbibliotek som du i de allra flesta fall bör använda. Att implementera t.ex. din egen strängklass kan vara en lärosam upplevelse som många går igenom, men när du gjort det så kan du lika gärna slänga den och använda t.ex. std::string istället. Om du sen blir kunnig nog för att implementera saker på ett bättre sätt än standardbiblioteket så har du förhoppningsvis förnuft nog att veta om det är en bra idé eller inte.

Permalänk
Medlem
Skrivet av perost:

Att implementera sin egen pow-funktion kan vara en bra övning för att lära sig hur det fungerar, men mycket mer än så är det inte. pow i standardbiblioteket är vältestad, optimerad och hanterar alla specialfall som kan uppstå. Den enda orsaken att använda din egen implementation är om pow är för långsam för dina behov, och du t.ex. klarar dig med en grov uppskattning.

Detsamma gäller för övrigt mycket annat i C++. C++ har ett stort standardbibliotek som du i de allra flesta fall bör använda. Att implementera t.ex. din egen strängklass kan vara en lärosam upplevelse som många går igenom, men när du gjort det så kan du lika gärna slänga den och använda t.ex. std::string istället. Om du sen blir kunnig nog för att implementera saker på ett bättre sätt än standardbiblioteket så har du förhoppningsvis förnuft nog att veta om det är en bra idé eller inte.

Okej Tack så jätte mycket för alla svar!

Visa signatur

[4770k delid] [1080 EK] [PG348Q] [Custom loop][1.75TB SSD]