8 svar
267 visningar
no15y är nöjd med hjälpen
no15y 9
Postad: 29 jun 2023 20:17

Uppgift programmering 1 c++, hitta felen.

Hej jag har kört fast rejält på en uppgift, och behöver vägledning (bra förklaring uppskattas även).Koden skal innehålla endel kompileringsfel, ett logisktfel och även någon sortsbugg som gör att programmet krashar.

Här är orginal koden med alla fel:

int i = 0;
while(i <= 24)
{
	cout << "ange temperatur för timme " << i << ";";
	inte newTemp
	cin >> newTemp;
	totalTemp = totalTemp + newTemp;
	i++;
}
cout << "Medeltemperaturen för dygnet är " totalTemp/24 << " grader";

Och här är en av åtgärderna jag kommit fram till, verkar alltid fastna med kompilatorn på "while"

#include <iostream>
int main();
using namespace std;

int i = 0;

while(i <= 24)
{
    cout << "ange temperatur för timme " << i << ";";
	int newTemp
	cin >> newTemp;
	totalTemp = totalTemp + newTemp;
	i++;

cout << "Medeltemperaturen för dygnet är " totalTemp/24 << " grader";
}


Laguna 28686
Postad: 29 jun 2023 20:31

Fastna hur? Vad är felmeddelandet?

anders_k Online 234
Postad: 29 jun 2023 21:09 Redigerad: 29 jun 2023 21:12

Här är rättningen så att det bygger, men du får nog titta på programlogiken, varför dela med 24 ? du skall väl dela med antal timmar som gått.

"main" är standard startpunkt i programmet.

#include <iostream>
using namespace std;

int main()  // detta är entry point i ditt program
{
  int i = 0;
  int totalTemp = 0; // detta saknades
  
  while(i <= 24)
  {
    cout << "ange temperatur för timme " << i << ";";
    int newTemp; // saknade ; efter
    cin >> newTemp;
    totalTemp = totalTemp + newTemp;
    ++i; // normalt gör man prefix incr när det står självt.

    // om du bara skriver /24 blir det en heltalsdivision
    cout << "Medeltemperaturen för dygnet är " << totalTemp/24.0 << " grader";
  }
}
no15y 9
Postad: 2 jul 2023 18:45
anders_k skrev:

Här är rättningen så att det bygger, men du får nog titta på programlogiken, varför dela med 24 ? du skall väl dela med antal timmar som gått.

"main" är standard startpunkt i programmet.

#include <iostream>
using namespace std;

int main()  // detta är entry point i ditt program
{
  int i = 0;
  int totalTemp = 0; // detta saknades
  
  while(i <= 24)
  {
    cout << "ange temperatur för timme " << i << ";";
    int newTemp; // saknade ; efter
    cin >> newTemp;
    totalTemp = totalTemp + newTemp;
    ++i; // normalt gör man prefix incr när det står självt.

    // om du bara skriver /24 blir det en heltalsdivision
    cout << "Medeltemperaturen för dygnet är " << totalTemp/24.0 << " grader";
  }
}

Tack för snabbt svar. förklarade lite dåligt såg jag men programmet ska räkna ut medeltemperaturen på dygnet dvs temperaturen varje timme / 24timmar, vilket den gör nu. Dock så ändrade jag "int i = 0;" till 1 då den ville räkna på timme 0.  Buggen är att om man knappar in bokstäver så krashar programmet.

Fermatrix 7841 – Fd. Medlem
Postad: 2 jul 2023 18:59 Redigerad: 2 jul 2023 18:59

Om du inte vill att användaren ska ange något annat än heltal kan du anävnda dig av ett try and catch block. Man skulle exempelvis kunna gör så att så länge som användaren inte anger en vettigt input så får man försöka igen, eller alternativt avsluta programmet på ett fint sätt.

anders_k Online 234
Postad: 2 jul 2023 19:27 Redigerad: 2 jul 2023 19:31
no15y skrev:

Buggen är att om man knappar in bokstäver så krashar programmet.

Du kan också läsa in det som en sträng och konvertera sen till heltal. Då kan du också skriva ut vad användaren matade in i ditt felmeddelande till användaren.

t.ex. konvertera med std::stoi och hantera exception eller använd std::from_chars om du inte vill hantera exception.

no15y 9
Postad: 2 jul 2023 20:39

antingen gör jag fel eller så behövs något annat, Hela programmet spammar ut alla timmar (24) so fort ett tecken eller bokstavs trycks. har googlat rätt mycket nu och en ide skulle vara att lägga till "if (number) eller else if ifalpha och om den är sann ge felmeddelande där, dock så löser inte det Å Ä Ö eller tecken,  är jag helt ute och cyklar nu? Känns som att det borde finnas en enkel lösning för att inte programmet ska få helfnatt och printa ut allting.

anders_k Online 234
Postad: 2 jul 2023 21:36

Istället för

int newTemp; // saknade ; efter
cin >> newTemp;

Skriv

  string s;
  int newTemp{0};
  try
  {
    getline(cin, s);
    newTemp = stoi(s);
  }
  catch(const invalid_argument& ex)
  {
    cerr << "ogiltligt nummer: " << s << endl;
  }
  catch(const exception& ex)
  {
    cerr << ex.what() << endl;
  }
no15y 9
Postad: 2 jul 2023 21:55

tusen tack!

Svara Avbryt
Close