Permalänk

Vektorer C++ Hjälp

Hej,

Jag försöker lösa en övningsuppgift i C++ och skulle behöva hjälp med hur man skapar dynamiska vektorer. Detta är övningsuppgiften:

"Skapa en vektor som ska innehålla temperaturmätningar från en väderstation. I programmets början ska användaren få ange hur många mätningar som har gjorts. Därefter får användaren mata in olika temperaturer. Temperaturerna ska anges i decimaltal. Programmet ska sedan skriva ut de olika temperaturerna och medeltemperaturen."

Tror att man ska använda sig av en dynamisk vektor. Tyvärr står det inte så mycket i boken hur man gör detta. Detta är det enda exemplet vilket jag inte riktigt förstår:

int size; cin >> size; int* x; x = new int[size]; . . . delete[];

Så här långt har jag kommit hittills men det går inte att köra. Har bara använt int nu men vill att size ska vara int och att temperaturerna användaren anger ska vara float. Vad gör jag fel?

#include "stdafx.h" #include <iostream> using namespace std; int main() { float sum = 0; int temperatures[]; cout << "Hur många m\x84tningar har gjorts?\n"; int size; cin >> size; int* x; x = new int[size]; for (int i = 0; i < size; i++) { cin >> temperatures[i]; sum = sum + temperatures[i]; } cout << "Summan blir: " << sum; float avg = sum / size; cout << "Medeltemperaturen blir: " << avg; cin.get(); return 0; }

Permalänk
Medlem

Tja!

Kan inte C++ överhuvudtaget, men om jag tolkar dig rätt så låter det som att vektorn inte behöver vara dynamisk (ändras i storlek över tiden), eftersom man på förhand vet hur många tal som kommer matas in. Det dynamiska är snarare att programmet skapar en vektor med storlek baserat på hur många mätningar användaren säger att den ska mata in, om det make:ar sense

Visa signatur

NZXT H400i, Intel i5 9600k, EVGA Geforce RTX 2070, Samsung 970 EVO Plus

Permalänk
Medlem

Du allokerar en array av int till 'x' men sen använder du aldrig den. Istället använder du 'temperatures' som du inte allokerat.

Permalänk

@Skogskotten: Jag antar att din kompilator klagar på att "sizeof temperatures isn't known eller liknande. Så ska du allokera något, så får du väl allokera "size" också, och i sånt fall efter "cin >> size".

Men som föregående inlägg, du använder aldrig "x" till något.

Så här typ:

int main()
{
float sum = 0;

cout << "Hur många m\x84tningar har gjorts?\n";
int size;

cin >> size;
int* temperatures = new int[size];

for (int i = 0; i < size; i++)
{
cin >> temperatures[i];
sum = sum + temperatures[i];
}

cout << "Summan blir: " << sum;
float avg = sum / size;
cout << "Medeltemperaturen blir: " << avg;

cin.get();
return 0;
}

Borde fungera, men kan ha något fel också, det är trots allt söndag :). Sen behöver du kanske heller inte allokera nåt på heapen, men i och med att du bara kör programmet en gång så behöver du inte oroa dig för minnesläckor.

Permalänk

#include <iostream> //For cin, cout
#include <vector> //For vector
#include <numeric> //For accumulate

int main() {

//Define what we need
std::vector<float> measurements;
unsigned int numberOfMeasurements = 0;

std::cout << "How many measurments do you want to log?" << std::endl;

std::cin >> numberOfMeasurements;

//Log all the temperatures
for (unsigned int i = 0; i < numberOfMeasurements; i++) {
std::cout << "What is temperature number: " << i << std::endl;
float measurement;
std::cin >> measurement;
measurements.push_back(measurement);
}

//Calculate the average
float average = std::accumulate(measurements.begin(), measurements.end(), 0.0) / measurements.size();

//Print individual temperatures
std::cout << "Temperatures: " << std::endl;
for (unsigned int i = 0; i < numberOfMeasurements; i++) {
std::cout << measurements.at(i);
}

//print the average temperature
std::cout << "Average temperature: " << average << std::endl;

return 0;
}

Permalänk

Eftersom det är dynamiska vektorer som efterfrågas är det std::vector du vill använda

Går även loopa över std::vector lite snyggare...

Om vec är vår vector:

std::vector<float> vec;

for (auto i = vec.begin(); i != vec.end(); i++) {
std::cout << Temp: << *i << std:endl;
}

*i har här typen float

Permalänk

@Skogskotten: Hoppas det hjälper

Permalänk

Tack alla för hjälpen! Har nu löst uppgiften och förstår mer hur man skapar dynamiska vektorer

Har också en annan övningsuppgift jag har problem med som har med char och funktioner att göra. Skriver exakt som ett exempel i boken men jag får error när jag försöker köra det. Det funkar när argumentet är const char* istället för char*, men exemplet i boken säger att man ska använda char*. Vet någon varför det inte funkar för mig?

#include "stdafx.h" #include <iostream> using namespace std; void Hello(char* name) { cout << "Hej " << name << "!"; } int main() { Hello("Krister"); cin.get(); return 0; }

Permalänk

@Skogskotten: "Krister" är konstant i.o.m att du skrivit in det direkt, så det kommer aldirg gå att ändra, funktionen Hello, förväntar sig en char array som den kan mutera (ändra)

Permalänk
Hedersmedlem

Hur ny (eller gammal) är boken?
C++ har ändrats ganska mycket med tiden. Dagens kompilatorer är nog striktare än de som användes för 15+ år sedan. Ovanstående inlägg stämmer bra.

Om du kompilerar programmet som det står i boken (med en kompilator som accepterar det -- GCC ger "bara" en varning), och i Hello() försöker t ex sätta name[0] = 'A' så kommer programmet krascha, eftersom textsträngen lagras i minne som inte är skrivbart.
Om parametern istället är "const char *", som den (åtminstone numer) bör vara så får man kompileringsfel, vilket förstås är att föredra över en krasch.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Skrivet av BjornPaulstrom:

@Skogskotten: "Krister" är konstant i.o.m att du skrivit in det direkt, så det kommer aldirg gå att ändra, funktionen Hello, förväntar sig en char array som den kan mutera (ändra)

Tack förstår vad du menar! Konstigt att de använder det som ett exempel i boken när det är fel. Prövade att göra om det till en char vektor och det funkade

Permalänk

@Skogskotten: Om det är C++ du ska använda skulel jag rekommendera std::string istället:

#include <iostream>
#include <string>

void Hello(std::string name)
{
std::cout << "Hej " << name << "!";
}

int main()
{
Hello("Krister");

std::cin.get();
return 0;
}

Permalänk
Skrivet av Thomas:

Hur ny (eller gammal) är boken?
C++ har ändrats ganska mycket med tiden. Dagens kompilatorer är nog striktare än de som användes för 15+ år sedan. Ovanstående inlägg stämmer bra.

Om du kompilerar programmet som det står i boken (med en kompilator som accepterar det -- GCC ger "bara" en varning), och i Hello() försöker t ex sätta name[0] = 'A' så kommer programmet krascha, eftersom textsträngen lagras i minne som inte är skrivbart.
Om parametern istället är "const char *", som den (åtminstone numer) bör vara så får man kompileringsfel, vilket förstås är att föredra över en krasch.

Den är från 2012 så mycket kan nog ha ändrats sen dess? Går en baskurs i programmering och de går efter den här boken. Men skönt att veta vad problemet var i alla fall

Skrivet av BjornPaulstrom:

@Skogskotten: Om det är C++ du ska använda skulel jag rekommendera std::string istället:

#include <iostream>
#include <string>

void Hello(std::string name)
{
std::cout << "Hej " << name << "!";
}

int main()
{
Hello("Krister");

std::cin.get();
return 0;
}

Tack för tipset, jag föredrar att använda string men ville gärna veta hur jag skulle göra för att använda char också

Permalänk

Hej igen, så tror jag förstår hur man skapar en vektor genom att användaren matar in storleken. Men jag förstår inte hur man kan lägga till eller ta bort element.

T.ex jag har en annan övningsuppgift där man ska skapa ett program som ska kontrollera temperaturer i olika städer. Användaren ska kunna lägga till en stad och ange namn och temperatur. Utan att använda sig av <vector>

Kan någon snälla hjälpa mig med hur jag ska börja och vad jag behöver använda mig av?

Permalänk
Medlem

@Skogskotten: Om du allokerar en vektor med new som du gjort i tidigare exempel så får du själv hålla reda på vilka element i vektorn som är fyllda. D.v.s. du behöver troligtvis ha en variabel som håller reda på hur många element du fyllt.

I såna fall handlar det egentligen inte om att lägga till eller ta bort element i vektorn. Vektorn har så många element du allokerat, och det du kan göra är att ändra på vad de innehåller. Att "lägga till" ett element är alltså bara att tilldela ett av elementen i vektorn ett värde, och att "ta bort" innebär att du ändrar elementet till något värde som ditt program tolkar som ett tomt värde.

Om man bara ska lagra inmatad data så är det lätt, bara stoppa den på första lediga plats i vektorn (d.v.s. på samma index som antalet element du redan lagrat, eftersom första indexet är 0).

När man blandar in borttagning så blir det däremot genast lite mer komplicerat, eftersom du som sagt inte kan ta bort ett element i vektorn utan bara ändra dess värde. Om vektorn då innehåller t.ex. {1, 2, 3, 4} och du tar bort 2 och sedan lägger till 5 så får du {1, _, 2, 3, 5}. Det finns ett flertal olika strategier för att hantera det, men jag vet inte hur mycket det är menat att du ska göra i uppgiften så jag låter bli att gå in i detalj om det.

Om du ska lagra både namn och temperatur så kan du antingen använda två vektorer, en för namn och en för temperaturer. Alternativt så kan du deklarera en struct som innehåller den datan och ha en vektor med instanser av den strukten istället.

Permalänk
Medlem

@Skogskotten:

Är det en array så lägger du in värden genom att använda index för arrayen

arr[0] = 75;

Sätt första värdet till 75 om det är en array av ints.

arr[1] = 10;

Sätt andra värdet till 10.. osv. Notera att arrayer är 0-indexade

Edit: Eftersom du ska lägga in städer och temperaturer som har en relation lämpar det sig att använda en map exempelvis. Där staden kan vara en nyckel till temperaturen.

std::map<std::string, int> temperaturer;

https://en.cppreference.com/w/cpp/container/map