M03 Lösningsförslag

På denna sidan finns lösningsförslag till uppgifterna. Tanken är att via dessa lösningsförslag både få tips om lösningen för den specifika uppgiften men det kan också finnas alternativa lösningar och ibland är det mer utförliga förklaringar på lösningen. Jag försöker också se till att koden är välkommenterad, vissa koder är skrivna av mig medan andra är genererade av generativ AI men då är de kontrollerade av mig så att de fungerar.

Att kopiera färdiga lösningar gör inte att du blir bättre på programmering, men det kan vara ett effektivt sätt att få lite hjälp för att bli en duktig programmerare. Det är ditt ansvar att använda hjälpen på rätt sätt.

xxxx

yyyyy

Uppgift: Räkna ut omkretsen och arean på en cirkel

void setup() {
  Serial.begin(9600);               // Startar Serial Monitor

  float radie = 5.0;                // Radien på cirkeln
  float omkrets = 2 * PI * radie;   // Beräkning av omkrets
  float area = PI * radie * radie;  // Beräkning av area

  // Utskrifter
  Serial.print("Radie: ");          // Radien
  Serial.println(radie);
  
  Serial.print("Omkrets: ");        // Omkretsen
  Serial.println(omkrets);

  Serial.print("Area: ");           // Arean
  Serial.println(area);
}

void loop() {
  // Tom loop, allt körs i setup()
}

PI är en inbyggd konstant i Arduino-miljön som representerar talet π (pi) med ett värde på cirka 3.14159. Att PI är inbyggd innebär att vi kan använda den direkt i beräkningar som har med cirklar att göra, utan att behöva definiera eller skriva ut värdet manuellt. Detta gör koden enklare och minskar risken för fel vid avrundningar.

Att använda PI i koden är också bra för att hålla beräkningarna exakta och konsekventa, eftersom det värde som Arduino tillhandahåller är mer exakt än en avrundad version.

Uppgift: Konvertera temperatur från Celsius till Fahrenheit

void setup() {
  Serial.begin(9600);                                               // Startar Serial Monitor

  int temperaturCelsius = 25;                                       // Temperatur i Celsius
  float temperaturFahrenheit = temperaturCelsius * 9.0 / 5.0 + 32;  // Beräkning av Fahrenheit

  // Skriver ut resultatet med konkatenering
  Serial.print(temperaturCelsius);
  Serial.print(" C = ");
  Serial.print(temperaturFahrenheit);
  Serial.println(" F");
}

void loop() {
  // Tom loop, allt körs i setup()
}

Uppgift: Beräkning av löptid och hastighet

void setup() {
  Serial.begin(9600); // Startar Serial Monitor

  float distans = 5.0; // Distans i km
  float minuter = 25; // Tid i minuter
  float sekunder = 30; // Tid i sekunder

  // Omvandling av tid till timmar
  float tid_i_timmar = minuter / 60.0 + sekunder / 3600.0;

  // Beräkning av hastighet i km/h
  float hastighet = distans / tid_i_timmar;

  // Utskrift av resultatet
  Serial.print("Distans: ");
  Serial.print(distans);
  Serial.println(" km");

  Serial.print("Total tid: ");
  Serial.print(tid_i_timmar);
  Serial.println(" timmar");

  Serial.print("Hastighet: ");
  Serial.print(hastighet);
  Serial.println(" km/h");
}

void loop() {
  // Tom loop, allt körs i setup()
}

Uppgift: Arrayer och loopar

// Skapar en konstant variabel för antalet element i arrayen
// `const int` används för att indikera att värdet inte ska förändras
const int antalElement = 10; 

// Skapar en array med en storlek baserad på konstanten ovan
// Arrayen är global och deklareras utanför setup(), vilket gör att den kan användas i hela programmet
int array[antalElement];

void setup() {
  Serial.begin(9600); // Startar Serial Monitor för utskrift

  // Fyller arrayen med värden baserat på dess index
  for (int i = 0; i < antalElement; i++) {
    array[i] = i * 2; // Lagrar värdet som är en funktion av index (index * 2)
  }

  // Skriver ut arrayens värden till Serial Monitor
  Serial.println("Arrayens värden:");
  for (int i = 0; i < antalElement; i++) {
    Serial.print("Index ");
    Serial.print(i);
    Serial.print(": ");
    Serial.println(array[i]); // Skriver ut värdet på varje element
  }
}

void loop() {
  // Tom loop eftersom alla operationer sker i setup()
}

Varför global placering kan vara bättre

Att deklarera arrayen globalt gör den tillgänglig i hela programmet, vilket är användbart om vi senare vill använda arrayen i både setup() och loop(). En lokal array i setup() skulle bara vara tillgänglig där, och värdena skulle inte kunna nås senare i loop() utan att skapas och fyllas på nytt.

Uppgift: Lista och loopar

#include <linkedlist.h> // Inkluderar LinkedList-biblioteket

// Skapar en konstant variabel för antalet element i LinkedList
const int antalElement = 10;

// Skapar en global LinkedList med `int`-värden
LinkedList<int> lista = LinkedList<int>();

void setup() {
  Serial.begin(9600); // Startar Serial Monitor för utskrift

  // Fyller LinkedList med värden baserat på dess index
  for (int i = 0; i < antalElement; i++) {
    lista.add(i * 2); // Lagrar värdet som är en funktion av index (index * 2)
  }

  // Skriver ut LinkedListens värden till Serial Monitor
  Serial.println("LinkedListens värden:");
  for (int i = 0; i < antalElement; i++) {
    Serial.print("Index ");
    Serial.print(i);
    Serial.print(": ");
    Serial.println(lista.get(i)); // Använder `get(i)` för att hämta varje element
  }
}

void loop() {
  // Tom loop eftersom alla operationer sker i setup()
}

Fördelar och Nackdelar med LinkedList kontra Array

  • Flexibilitet: LinkedList är användbar när vi inte vet exakt hur många element vi kommer att behöva lagra, eftersom den kan ändra storlek dynamiskt.
  • Prestanda: Att få tillgång till element i en LinkedList är dock långsammare än i en array, eftersom den inte lagrar data på kontinuerliga minnesplatser.

Uppgift: Temperaturkonvertering med funktioner

// Funktion för att konvertera Celsius till Fahrenheit
float celsiusToFahrenheit(float celsius) {
  // Använder formeln F = (C * 9/5) + 32
  return (celsius * 9.0 / 5.0) + 32.0;
}

// Funktion för att konvertera Fahrenheit till Celsius
float fahrenheitToCelsius(float fahrenheit) {
  // Använder formeln C = (F - 32) * 5/9
  return (fahrenheit - 32.0) * 5.0 / 9.0;
}

// Funktion som skriver ut temperaturkonverteringstabeller
void printConversionTables() {
  Serial.println("Celsius | Fahrenheit");

  // Loopar från 0 till 100 grader Celsius i steg om 10
  for (int celsius = 0; celsius <= 100; celsius += 10) {
    // Konverterar aktuell Celsius-temperatur till Fahrenheit
    float fahrenheit = celsiusToFahrenheit(celsius);

    // Skriver ut resultatet med två decimaler
    Serial.print(celsius);
    Serial.print(" C = ");
    Serial.print(fahrenheit);
    Serial.println(" F");
  }

  Serial.println(); // Tom rad för avskiljning

  Serial.println("Fahrenheit | Celsius");

  // Loopar från 32 till 212 grader Fahrenheit i steg om 10
  for (int fahrenheit = 32; fahrenheit <= 212; fahrenheit += 10) {
    // Konverterar aktuell Fahrenheit-temperatur till Celsius
    float celsius = fahrenheitToCelsius(fahrenheit);

    // Skriver ut resultatet med två decimaler
    Serial.print(fahrenheit);
    Serial.print(" F = ");
    Serial.print(celsius);
    Serial.println(" C");
  }
}

void setup() {
  Serial.begin(9600); // Startar Serial Monitor med 9600 baud-hastighet

  // Anropar funktionen för att skriva ut konverteringstabellerna
  printConversionTables();
}

void loop() {
  // Tom loop eftersom all kod körs i setup()
}

Uppgift: Tal större än medelvärde

#include <LinkedList.h> // Inkluderar LinkedList-biblioteket

void setup() {
  Serial.begin(9600); // Startar Serial Monitor

  int values[10]; // Deklarerar en array för att lagra 10 heltal
  int sum = 0; // Variabel för att lagra summan av talen

  // Genererar 10 slumpmässiga heltal mellan 1 och 100
  for (int i = 0; i < 10; i++) {
    values[i] = random(1, 101); // random(1, 101) genererar tal mellan 1 och 100
    sum += values[i]; // Adderar värdet till summan
  }

  // Beräknar medelvärdet
  float average = sum / 10.0; // Dividerar med 10.0 för att få ett flyttal

  // Skriver ut arrayens värden och medelvärdet
  Serial.println("Arrayens värden:");
  for (int i = 0; i < 10; i++) {
    Serial.print("Index ");
    Serial.print(i);
    Serial.print(": ");
    Serial.println(values[i]);
  }

  Serial.print("Medelvärde: ");
  Serial.println(average);

  // Skapar en LinkedList för att lagra värden över medelvärdet
  LinkedList<int> highValues = LinkedList<int>();

  // Lägger till värden över medelvärdet i LinkedList
  for (int i = 0; i < 10; i++) {
    if (values[i] > average) {
      highValues.add(values[i]);
    }
  }

  // Skriver ut värdena i LinkedList
  Serial.println("Värden över medelvärdet:");
  for (int i = 0; i < highValues.size(); i++) {
    Serial.println(highValues.get(i));
  }
}

void loop() {
  // Tom loop, eftersom allt körs i setup()
}

Uppgift: Yatzy

  

Uppgift: xxxx