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

Trädvy Permalänk
Medlem
Plats
Halmstad
Registrerad
Nov 2014

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

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

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2004

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);

| i5 6500 | asus z170-k | asus 970 strix | 16gb ddr4 | asus mg279Q | FD Define r4

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Maj 2012
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

Main i7 7700k - msi Z170 Krait Gaming - msi GTX 1080 FE - Corsair LPX 16GB 2800 mhz - 2x intel 530 240GB [RAID 0] - be quiet! Straight Power e9 680w - Asus Xonar Essence STX - H100i

Laptop MacBook Air 13" early 2014

Kringutrustning Acer XB271HU - HHKB Professional 2 Purple Sliders - Realforce 88UB - IBM model M - Logitech G400 - Beyerdynamic DT-770 PRO 80Ω - Sennheiser HD6xx - Woo Audio WA6 - Blue Snowball

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Dec 2014

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).

Trädvy Permalänk
Medlem
Plats
Halmstad
Registrerad
Nov 2014
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;

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

Trädvy Permalänk
Medlem
Plats
Halmstad
Registrerad
Nov 2014
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?

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

Trädvy Permalänk
Medlem
Plats
Lund
Registrerad
Jan 2011

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

Trädvy Permalänk
Medlem
Plats
Lund
Registrerad
Jan 2011
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.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Dec 2014
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

Trädvy Permalänk
Medlem
Plats
Halmstad
Registrerad
Nov 2014
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!

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

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2016
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.

Trädvy Permalänk
Medlem
Registrerad
Sep 2009

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).

Смерть -это решение всех проблем. Нет человека - нет проблемы
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

Trädvy Permalänk
Medlem
Plats
Halmstad
Registrerad
Nov 2014
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

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

Trädvy Permalänk
Medlem
Plats
Götet
Registrerad
Okt 2013

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

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

Trädvy Permalänk
Medlem
Registrerad
Sep 2009
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++.

Смерть -это решение всех проблем. Нет человека - нет проблемы
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

Trädvy Permalänk
Medlem
Plats
Halmstad
Registrerad
Nov 2014
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)?

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

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
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.

Trädvy Permalänk
Medlem
Plats
Halmstad
Registrerad
Nov 2014
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!

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