- Kursmaterial
- Planering
- Arbete
- Kunskapsdokument
- Andra kurser
- Om Kursolle
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