Permalänk
Medlem

Hjälp med C++ skoluppgift

Hej alla!
Jag har fått i skoluppgift att skriva ett program som läser temperatursensorer. Sensorerna finns på olika våningar i ett hus, det finns 6 sensorer.
Följande värden skall läsas in: rum, våning och hur många grader som uppmättes vid mättillfället.
Vad vi efterfrågar användaren:
Rum:
Våning:
Antal grader vid mät-tillfället:
Indata till programmet sparas lämpligast i en vektor eller en fältvariabel.
Mätområden: under 0 grader, 0 till 10 grader, 11 till 20 grader, 21 till 30 grader och över 30 grader.
När man läst in alla sensorers värden ska resultatet sorteras innan det skrivs ut, vid utskrift skall alla
resultat finnas med hur många temperaturer som ligger inom området.
Vid inmatningen skall alltså inte vara i storleksordning, det ska vara möjligt att skriva in olika
temperaturvärden, det vill säga det skall gå att börja med 20 grader, sen -1 och när alla värden har
matats in, då skall sortering ske av ditt program.
Sorteringen sker per temperatur.

Programexempel:
Rum: Kök
Våning: 2
Antal grader vid mät-tillfälle: -2
(upprepa frågan 5 gånger till)
Efter sortering:
Rum Våning Temperatur
Kök vån 2 -2 grader
1 sensor har registrerat värden under 0 grader.
Toalett vån 2 13 grader
Sovrum vån 2 20 grader
2 sensorer har registrerat värden mellan 11 och 20 grader.
Toalett vån 1 22 grader
Tvättstuga vån 1 23 grader
Vardagsrum vån 2 22 grader
3 sensorer har registrerat värden mellan 21 och 30 grader

Här är min kod, har fått den att funka med vet inte hur jag ska göra för att skriva ut de unerstruckna raderana i programexmplet ovanför.. har tänkt mig variabler för olika mättområdena som ökar när en temperatur i samma område läggs in i vektorn.. med if-satser men vet inte hur jag ska börja.. sedan är det utskriften av dessa rader också..hur ska jag göra? All hjälp tas emot med öppen famn! Tack alla på förhand..

#include <iostream> #include <string> #include <vector> #include <tuple> #include <algorithm> class Temperatur { public: std::string rum; std::vector<std::tuple<std::string, int, int>> sensor; int temp, vån; void Info(void) { for (int i = 0; i < 6; i++) { std::cout<<"Rum: "; std::cin>>rum; std::cout<<"V\x86ning: "; std::cin>>vån; std::cout<<"Antal grader vid m\x84t-tillf\x84llet: "; std::cin>>temp; sensor.push_back(make_tuple(rum, vån, temp)); //sorterar efter temperatur std::sort(sensor.begin(), sensor.end(), [](const std::tuple<std::string, int, int>& a, const std::tuple<std::string, int, int>& b) -> bool { return std::get<2>(a) < std::get<2>(b); }); } void utskrift() { std::cout << std::setiosflags(std::ios::left); std::cout << std::setw(30) << "Rum" << std::setw(30) << "V\x86ning " << std::setw(30) << "Temperatur"<< std::endl<<std::endl; for (auto x : sensor ) { std::cout<<std::setw(30)<<std::get<0>(x)<<"v\x86n "<<std::get<1>(x) <<" "<<std::get<2>(x)<<" grader"<< std::endl; } }; int main(void) { Temperatur t; t.Info(); t.utskrift(); return 0; }

Permalänk
Medlem

Du behöver inte lagra antalet sensorer per mätområde, det räcker med att räkna sensorerna medan du skriver ut dem eftersom de är sorterade. Varje gång du sen kommer till en sensor som hör till nästa mätområde så skriver du ut räknaren och nollställer den.

Permalänk
Medlem
Skrivet av perost:

Du behöver inte lagra antalet sensorer per mätområde, det räcker med att räkna sensorerna medan du skriver ut dem eftersom de är sorterade. Varje gång du sen kommer till en sensor som hör till nästa mätområde så skriver du ut räknaren och nollställer den.

Hej "perost"! Du har alltid kloka råd att ge

Det låter ju enklare så som du skriver
Menar du något sånt här:

if(std::get<2>(sensor[i])<0) { s++; std::cout<<s<<" sensor har registrerat värden under 0 grader."<<std::endl; s=0; } else if(std::get<2>(sensor[i])>=0 || std::get<2>(sensor[i])<=10) { s++; std::cout<<s<<" sensor har registrerat värden mellan 1 och 10 grader."<<std::endl; s=0; } else if(std::get<2>(sensor[i])>10 || std::get<2>(sensor[i])>=20) { s++; std::cout<<s<<" sensor har registrerat värden mellan 11 och 20 grader."<<std::endl; s=0; } else if(std::get<2>(sensor[i])>20 || std::get<2>(sensor[i])>=30) { s++; std::cout<<s<<" sensor har registrerat värden mellan 21 och 30 grader."<<std::endl; s=0; } else if(std::get<2>(sensor[i])>30) { s++; std::cout<<s<<" sensor har registrerat värden över 30 grader."<<std::endl; s=0; }

Testade att lägga denna kod innanför for-loopen i metoden för utskrift men vid utskriften skrevs första temperatur-mättningen ut och efter det avslutades programmet.. vad tror du jag gör för fel?

Permalänk
Medlem

@ivana89: Nej, du krånglar till det genom att försöka hantera alla mätområden samtidigt. Du behöver bara hålla koll på vad den övre gränsen för nästa mätområde är, när en sensor har ett värde högre än det så skriver du ut hur många som var i det området och ökar sedan gränsen till nästa mätområde. D.v.s.:

// Nästa gräns = 10 Kök vån 2 -2 grader // Sensorer i mätområdet = 1 1 sensor har registrerat värden under 0 grader. // Nästa gräns = 20 Toalett vån 2 13 grader // Sensorer i mätområdet = 1 Sovrum vån 2 20 grader // Sensorer i mätområdet = 2 2 sensorer har registrerat värden mellan 11 och 20 grader. // Nästa gräns = 30 Toalett vån 1 22 grader // Sensorer i mätområdet = 1 Tvättstuga vån 1 23 grader // Sensorer i mätområdet = 2 Vardagsrum vån 2 22 grader // Sensorer i mätområdet = 3 3 sensorer har registrerat värden mellan 21 och 30 grader

Ett annat sätt att lösa det på är att separera sorteringen i mätområden och själva utskriften, genom att först hitta vilka sensorer som hör till det första mätområdet, skriva ut dem, hitta vilka sensorer som hör till det andra mätområdet, skriv ut dem, etc. Även med denna lösning så behöver du inte en massa if-satser för varje mätområde, det räcker med en variabel som innehåller slutgränsen för nästa mätområde.

Permalänk
Medlem
Skrivet av perost:

@ivana89: Nej, du krånglar till det genom att försöka hantera alla mätområden samtidigt. Du behöver bara hålla koll på vad den övre gränsen för nästa mätområde är, när en sensor har ett värde högre än det så skriver du ut hur många som var i det området och ökar sedan gränsen till nästa mätområde. D.v.s.:

// Nästa gräns = 10 Kök vån 2 -2 grader // Sensorer i mätområdet = 1 1 sensor har registrerat värden under 0 grader. // Nästa gräns = 20 Toalett vån 2 13 grader // Sensorer i mätområdet = 1 Sovrum vån 2 20 grader // Sensorer i mätområdet = 2 2 sensorer har registrerat värden mellan 11 och 20 grader. // Nästa gräns = 30 Toalett vån 1 22 grader // Sensorer i mätområdet = 1 Tvättstuga vån 1 23 grader // Sensorer i mätområdet = 2 Vardagsrum vån 2 22 grader // Sensorer i mätområdet = 3 3 sensorer har registrerat värden mellan 21 och 30 grader

Ett annat sätt att lösa det på är att separera sorteringen i mätområden och själva utskriften, genom att först hitta vilka sensorer som hör till det första mätområdet, skriva ut dem, hitta vilka sensorer som hör till det andra mätområdet, skriv ut dem, etc. Även med denna lösning så behöver du inte en massa if-satser för varje mätområde, det räcker med en variabel som innehåller slutgränsen för nästa mätområde.

Ja, som en amatör så blir det väldigt naturligt att krångla till det mycket mer än vad det behövs :'D
Jag är väldigt tacksam för din förklaring, dock förstår jag inte riktigt hur jag ska fortsätta.. måste vara att jag suttit hela veckan med 4 olika uppgiffter och nu är det här sista som ska göras innan jag är helt klar men nu har jag börjat tänka väldigt ensidigt som gör att jag fastnar och inte ser andra sätt för att lösa det..Kan du ge mig ett exempel eller förklara lite djupare? Tack så hemskt mycket för din hjälp!!!