Behöver hjälp med några programeringsuppgifter (enkla) Arduino

Trädvy Permalänk
Medlem
Registrerad
Jan 2016

Behöver hjälp med några programeringsuppgifter (enkla) Arduino

Hej det e snart dags för en gammal omtenta av en kurs i datorteknik.

jag vill säga att jag inte är så duktig på detta och det var ett tag sen jag läste kursen.
Behöver hjälp lösningar till några gamla tentauppgifter.

jag började svara på de och behöver kolla om de är rätta

1)
Skriv en for-loop som skriver ut kvadraten på tal mellan 0 och 9. Använd
funktionerna Serial.println() och Serial.print() för utskrift. Utskriften skall se ut på
följande sätt
0*0=0
1*1=1
2*2=4
3*3=9
.
.
.
9*9=81

for (int i=0; i <10; i++){ serial.println(i*i); }

2)
a) Skriv funktionen ”Kvadrat(x)” och deklarera variablerna. Funktionen skall
returnera kvadraten på inargumentvärdet x.
b) Anropa funktionen ”Kvadrat” från
void loop(){
.
.
.
}
och skriv ut det returnerade värdet med Serial.println()

2a)

int Kvadrat(int value) { return value*value; }

2b)

void loop() { int toPrint; toPrint = Kvadrat(1); Serial.println(toPrint); }

3)
En vektor med heltal har sparats i:
int Mat_data_Vektor[10];
a) Skriv en for-loop som letar om det finns ett större tal i vektorn än 100. Använd
println() för utskrift till serialmonitorn om det finns större tal än 100.
b) Skriv ut det största värdet i vektorn. Använd println() för utskrift till
serialmonitorn.
Tips: uppgiften behöver inte lösas med funktioner

int largest = Mat_data_Vektor[0]; for(int i=0; i<sizeof(Mat_data_Vektor) i++) { if(Mat_data_Vektor[i] > 100) { serial.print(Mat_data_Vektor[i]);//Skriver alla talen > 100 för 3a } if(largest < Mat_data_Vektor[i]) { largest = Mat_data_Vektor[i]; //sparar största värdet för 3b } } serial.print(largest);//skriver ut det största talet för 3b

4)
a) Skriv funktionen ”Compare”. Funktionen skall ha två inargument, x och y av
typen double. Funktionen skall returnera värdet av typen integer. Funktionen skall
returnera en etta om x > y annars noll.
b) Anropa funktionen ”Compare” från
void loop(){
.
.
.
}
och skriv ut det största talet på x eller y med Serial.println()

4a)

int Compare(double x, double y){ if(x>y) { return 1; } return 0; }

4b)

void loop(){ Compare(1,2); //den här gör anropar funktionen men den bryr sig inte om vad som //returneras... Serial.println(2);//tvåan är ju y och det är störra än 1... förstår inte riktigt uppgiften faktiskt. }

5)
En vektor med heltal har sparats i:
int Mat_data_Vektor[10];
a) Skriv en for-loop som summerar de tio heltalsvärdena i vektorn ovan.
b) Skriv ut det största värdet i vektorn. Använd println() för utskrift till
serialmonitorn.
Tips: uppgiften behöver inte lösas med funktioner

5a)

int sum=0; for(int i=0; i<sizeof(Mat_data_Vektor); i++) { sum += Mat_data_Vektor[i]; }

6)
a) Skriv funktionen ”Absolute”. Funktionen skall ha ett inargument, av typen
integer. Funktionen skall returnera värdet av typen integer. Funktionen skall
beräkna och returnera absolutbeloppet av inargumentet.
Tips: Absolutbeloppet på |x| är att negativa tal blir positiva.
b) Anropa funktionen ”Absolute” från
void loop(){
.
.
.
}
och skriv ut det returnerade värdet med Serial.println()

6a)

int Absolute(int x) { return sqrt(x*x);//kvadraten är alltid positiv. ta sen roten ur kvadraten för att få //absolutvärdet. Kanske finns nått annat sätt i Arduino.. }

6b)

void loop(){ Serial.println(Absolute(1)); }

7)
Skriv en for-loop som skriver ut kvadraten på tal mellan 0 och 49 till serialmonitorn.
Använd funktionerna Serial.println() och Serial.print() för utskrift.
Utskriften skall se ut på följande sätt i serialmonitorn.
0*0=0
1*1=1
2*2=4
3*3=9
.
.
49*49=2401

7)

for(int i=0; i<8; i++) { Serial.print(i); Serial.print(*); Serial.print(i); Serial.print(=); Serial.println(i*i); }

8)
a) Skriv funktionen ”Median”. Funktionen skall ha en inargumentvariabel, av typen
Array som skall kunna lagra integers. Funktionen skall returnera värden av typen
integers. Funktionen skall returnera medianvärdet av de integervärdena lagrade i
vektorn/arrayen. Vi antar att vektorn /arrayen alltid har längden 3.
Tips: Medianen är ”mitten värdet”.
Ex 1, medianen är 12 av de tre värdena 3, 100 och 12
Ex 2, medianen är 5 av de tre värdena 5, 2 och 99
b) Anropa funktionen ”Median” från
void loop(){
.
.
.
}
och skriv ut det returnerade värdet med Serial.println()

8a)

int Median(int x[]){ int temp; for(int i=1;i<sizeof(x);i++) { //Först sortera vektorn if(x[i]>x[i-1]) { temp = x[i]; x[i] = x[i-1]; x[i-1] = temp; } } return x[1]; //sen returna värdet som ligger på plats x[1] (i mitten av vektorn) }

9)
Skriv ett program som skall vänta på en knappnedtryckning. Strömbrytaren/
knappen är kopplad till pin 7. Programmet skall således ”hänga sig” tills knappen
trycks ned.
Ledning: Använd funktionen: digitalRead(inPin);

while(true){ if(digitalRead(7)==1) { break; } }

10)
a) Skriv en funktion ”Find_Largest_Value” som skall leta upp det största talet
lagrade i en vektor. Funktionen skall returnera positionen var det största talet finns i
vektorn. Funktionen skall ha inargumentvärdena x[] och size. Där x är vektorn och
size är argumentet vilket avgör hur lång vektorn är.
ex: Vektorn nedan har 9 element och det största värdet är i position 3. Funktionen skall i detta
exempel returnera talet 3
Värde 13 20 5 74 2 45 3 25 53
Position 0 1 2 3 4 5 6 7 8
b) Anropa funktionen ” Find_Largest_Value” från
void loop(){
.
.
.
}
och skriv ut det returnerade värdet med Serial.println()

int Find_Larges_Value(int x[], int y) int largest = x[0]; int position = 0; for(int i=0; i<sizeof(x) i++) { // tror inte att man inte ens behöver använda längden, tror att //sizeof() funkar fint if(largest < Mat_data_Vektor[i]){ largest = Mat_data_Vektor[i]; //sparar största värdet för 3b position = i; } } serial.print(largest);//skriver ut det största talet för 3b

11)
a) Skriv funktionen ”Div_by_Two”. Funktionen skall returnera inargumentvärdet
dividerat med 2.
b) Anropa funktionen ”Div_by_Two” från
void loop(){
.
.
.
}
och skriv ut det returnerade värdet med Serial.println()

11a)

double Div_by_Two(int x){ return x/2; }

11b)

12)
a) Skriv funktionen ”Medel_Varde(x,y)” och deklarera variablerna. Funktionen
skall returnera medelvärdet av två inargumentvärden x och y.
Tips: Medelvärde = (x+y)/2
b) Anropa funktionen ”Medel_Varde” från
void loop(){
.
.
.
}

12a)

double Medel_Varde(int x, int y) { return (x+y)/2; }

12b)

...

Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Dec 2008

Din förra tråd stängdes, men eftersom du försökt själv den här gången så får du ett svar.

I stort sett ser det OK ut. Du har gjort en del grodor/slarvfel vid inmatningen, men det tror jag den rättande skulle kunna acceptera.

1) Du räknar ut rätt sak, men utskriften ser inte ut som den skall.

3) Det borde stå largest = Mat_data_Vektor[i]; //sparar största värdet för 3b

4) Jag tror att du borde ha två variabler, säg x och y, som du skickar till compare och baserat på resultatet mata ut x eller y. Nu har du genat lite för mycket.

5) Samma som 3

6) Du får rätt svar så länge som x*x får plats i int. Ett annat sätt vora att kolla om talet (x) är negativt och antingen returnera -x eller x.

7) Här skulle kompilatorn klaga. Du kan inte skriva ut * och =. Du kan skriva "*" och "=".

8) Rätt tänkt men din sortering är inte tillräckligt bra. Den klarar inte talen 3 2 1. Du kommer hitta det största talet, men de två lägre blir inte korrekt sorterade.

10) Samma som 3.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jul 2003

Skummade igenom lite snabbt. Utöver det @ingetledigtnamn redan påpekat så tror jag du missförstått hur sizeof() fungerar.
3 och 5: Notera att du redan vet att vektorn är 10 element långt, du kan därför använda det i din loop istället för sizeof(). Din lösning är egentligen bättre än vad som "skulle räcka" [då den är mer flexibel], men du har som sagt missförstått sizeof().
sizeof() returnerar storleken i bytes, inte hur många element. Har du en array int x[10] så kommer sizeof() returnera 10*2 (Storleken på en int. Beror på ditt målsystem, men för arduino verkar den vara två byte lång). Så du skulle kunna skriva sizeof(x)/sizeof(int) för att få antalet element. Jag skulle dock rekommendera att använda sizeof(x)/sizeof(x[0]) istället. Då blir det rätt även om du ändrar datatypen på arrayen.

10 fungerar definitivt inte som du skrivit, då en array som skickas som argument "bryts ned" till en pekare. Din sizeof där kommer alltså returnera storleken på pekaren och inte ens storleken på hela arrayen. Därför är size-parametern nödvändig.

Quidquid latine dictum sit, altum videtur.