Hjälp med uppgift på programmering.

Permalänk
Medlem

Hjälp med uppgift på programmering.

Hej, har fastnat lite här och behöver hjälp med en uppgift.

den lyder:
Skriv ett program där användaren skriver in ett antal heltal.
Hur många tal ska den som kör prorgammet själv bestämma, dock max 20.

Programmet ska sedan beräkna summan av talen, beräkna talens medelvärde ("exakta") samt ta reda på vilket av talen som är störst respektive minst. Exempel på hur utskriften kan se ut (inmatning från tangentbordet i fetstil):

Hur många heltal vill du mata in (max 20) ? 5
4
5
3
7
6
Summa: 25
Medelvärde: 5.0
Minsta värde: 3
Största värde: 7

detta är vad jag har, än så länge

import java.util.Scanner; public class MataHeltal { public static void main(String[]args) { Scanner scan = new scannner(System.in); System.out.println("Hur många heltal vill du mata in(max 20)?: "); int inmatning = Scan.nextInt(); System.out.println("Mata in " + inmatning +" tal: "); int Tal = Scan.nextInt(); if inmatning == 1( int Summa = Tal; int Medelvärde = Summa; int minVärde = Summa; int störstaVärde = Summa; System.out.println(Summa, Medelvärde, minVärde, störtsaVärde); ) else if inmatning == 2( int SummEtt = Tal; int MedelvärdeEtt = Summa; int minVärdeEtt = Summa; int störstaVärdeEtt = Summa; System.out.println(SummaEtt, MedelvärdeEtt, minVärdeEtt, störtsaVärdeEtt); )

Permalänk
Hedersmedlem

Beskriv vad du har för specifikt problem; alltså vad det är du undrar över. Utan en fråga är det inte lätt för någon att hjälpa.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Nu kan jag visserligen inte Java, men tanken är nog inte att du ska göra ett villkor för varje möjligt tal (1-20). Det blir mycket redundant kod!

Börja med att läsa in dina tal i en datastruktur (tex i en array) genom att använda en loop (kanske finns snyggare sätt i Java?). När du har lyckats med det gör du en generell lösning för beräkning och utskrift av summa, medelvärde, minsta värde och största värde.

Dessutom måste du hantera inmatning av värden som inte är giltiga, tex tal över 20 eller under 1.

Permalänk
Medlem

Jag vet att man istället för att skriva 20 stycken näst intill likadana villkor så borde man använda en loop som körs så många gånger som första inmatningen anger.
Men hur gör jag loopen?

Permalänk
Medlem
Skrivet av wurt:

Jag vet att man istället för att skriva 20 stycken näst intill likadana villkor så borde man använda en loop som körs så många gånger som första inmatningen anger.
Men hur gör jag loopen?

for(int i = 0 ; i < inmatning ; i++){
//läs in nytt tal
//hantera nya talet
}
//utför slutliga beräkningar samt printa svar

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem

det lät avancerat, måste jag använda mig utav det?

Permalänk
Skrivet av wurt:

Hej, har fastnat lite här och behöver hjälp med en uppgift.

den lyder:
Skriv ett program där användaren skriver in ett antal heltal.
Hur många tal ska den som kör prorgammet själv bestämma, dock max 20.

Programmet ska sedan beräkna summan av talen, beräkna talens medelvärde ("exakta") samt ta reda på vilket av talen som är störst respektive minst. Exempel på hur utskriften kan se ut (inmatning från tangentbordet i fetstil):

Hur många heltal vill du mata in (max 20) ? 5
4
5
3
7
6
Summa: 25
Medelvärde: 5.0
Minsta värde: 3
Största värde: 7

detta är vad jag har, än så länge

import java.util.Scanner; public class MataHeltal { public static void main(String[]args) { Scanner scan = new scannner(System.in); System.out.println("Hur många heltal vill du mata in(max 20)?: "); int inmatning = Scan.nextInt(); System.out.println("Mata in " + inmatning +" tal: "); int Tal = Scan.nextInt(); if inmatning == 1( int Summa = Tal; int Medelvärde = Summa; int minVärde = Summa; int störstaVärde = Summa; System.out.println(Summa, Medelvärde, minVärde, störtsaVärde); ) else if inmatning == 2( int SummEtt = Tal; int MedelvärdeEtt = Summa; int minVärdeEtt = Summa; int störstaVärdeEtt = Summa; System.out.println(SummaEtt, MedelvärdeEtt, minVärdeEtt, störtsaVärdeEtt); )

Tänk efter vad du behäver för de olika sakerna som ska matas ut, hur gör man ett medlevärde, hur märker du vilket tal som är minst (än så länge), hur märker du vilket tal som är störst (än så länge), hur får du farm summan. Och sedan kan jag ge ett tips, en for-sats kulle nog hjälpa dig en del med den här uppgiften...

Skrivet av wurt:

det lät avancerat, måste jag använda mig utav det?

Eftersom du inte vet hur många gånger du ska läsa in ett tal måste du ha antingen en while-sats eller en for-sats, tror inte det finns några andra alternativ.

Visa signatur

Corsair Vengeance LPX 4x8GB DDR4 2666MHz CL16 | Intel Core i7 6700 3,4 GHz 8MB | MSI Z170A KRAIT GAMING | Corsair Force Series 3 120 GB | Seagate SSHD Desktop 2 TB 7200 RPM 3,5" | Creative Sound Blaster Z PCIe | Western Digital 500 GB | Samsung Writemaster | Corsair TX750 V2 750 W | EVGA GeForce GTX 970 4GB SSC ACX 2.0+| Fractal Design Define R5 (Svart)

Permalänk
Medlem

Asså jag är verkligen lost, skulle ingen kunna rätta till min kod så jag sedan kan se hur man gör?

Permalänk
Medlem

Ska se om jag kan hjälpa dig utan att lösa uppgiften helt åt dig.
Kolla på arrayer i java http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arra...
while/do Loopar http://docs.oracle.com/javase/tutorial/java/nutsandbolts/whil...
For loopar http://docs.oracle.com/javase/tutorial/java/nutsandbolts/for....
if-satser http://docs.oracle.com/javase/tutorial/java/nutsandbolts/if.h...

Lite små tips nedan..

int tal[] = new int[20]; inmatning = scan.nextInt(); for(int i = 0; i < inmatning; i++) temp = scan.nextInt(); if(temp > störst){ störst = temp; } medelvärde = sum / inmatning;

Hoppas detta hjälper dig lite att komma vidare..

MVH NP^

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem
Skrivet av wurt:

det lät avancerat, måste jag använda mig utav det?

Avancerat? Ta fram din kurslitteratur och läs igenom kapitlet om loopar så kanske du förstår. Om inte använd google.
Om du efter det fortfarande anser att en loop är för avancerat så bör du nog byta kurs/program på vad det nu är du läser.

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem

Lär dig att använda for-loopar
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/for....

enkelt exempel på for-loop:
for(int i = 0; i < 10; i++) {
System.out.print(i + " ");
}
//skriver ut 0 1 2 3 4 5 6 7 8 9

Permalänk
Medlem
Skrivet av wurt:

Asså jag är verkligen lost, skulle ingen kunna rätta till min kod så jag sedan kan se hur man gör?

Allt du behöver veta står i kurslitteraturen, om du öppnar boken och läser så kommer du förr eller senare att förstå hur det hänger i hop. Att någon här som redan förstår uppgiften och har lagt ner lite tid på det hjälper dig kommer garanterat leda till att du dyker upp nästa vecka med en ännu svårare uppgift som du inte klarar.

Tänk genom hur du vill lösa uppgiften. Skriv psudokod (låtsatkod) för de snuttar du inte vet hur man formulerar i Java. Sedan kan du komma och fråga om dessa enskilda bitar.

Permalänk
Medlem
Skrivet av weghuz:

import java.util.*;
public class idiot {
[...]
}

Fränt namn på klassen där ;o

För övrigt skall det inte ges kompletta lösningar när det gäller skoluppgifter och dyl.

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem

Om man ger en komplett lösning är det i alla fall roligare om man obfuskerat den ordentligt i likhet med denna tråden: https://thunked.org/programming/code-golfing-round-i-t79.html

Permalänk
Hedersmedlem

Tog bort ett inlägg som hade fullständig lösning. Det är för att forumet inte ska bli ett ställe där vi gör andras läxor. Här ska diskuteras och läras.

Permalänk
Medlem

Enklast är väll att använda for-sats som alla andra har skrivit. Ett annat tips är att använda += som gör att det läggs till i en variabel

Permalänk
Medlem

Enda jag tänker på är "facepalm".
Detta är grundläggande programmering som alla programmerare måste kunna och förstå och lösa på egen hand.
Denna uppgift innebär, inläsning via konsollen (andra saken man lär sig i programmering, första är att skriva i konsollen "hello world"), logik (if/else satser), samt loopar (while/for).

Jag säger bara detta. Vill du lära dig programmering, så ska du försöka lösa uppgiften själv,
att be om hjälp på en så grundläggande uppgift är löjligt, och säger mer att du bryr dig inte om att lösa eller förstå vad du ska göra,
utan du vill bara fuska dig genom allting.

Innom programmering så vinner man ingenting genom att ta genvägar.
Man måste lära sig grunderna ordentligt och tänka ut lösningar själv.
Att ta genvägar, speciellt så grundläggande som denna uppgiften är,
kommer bara förstöra för dig längre fram.
Genvägar tar man senare då man väl förstått grunderna, och ex. istället för att skapa en egen sorteringsalgoritm, så använder man de färdiga algoritmerna som redan finns. Men man behöver fortfarande lära sig teorin bakom detta, så man förstår hur det fungerar.

Grunderna innom programmering är att förstå skriva och läsa in data, logik samt loopar.
Oavsätt vad man gör, så kommer dessa fyra delar alltid återkomma då du kodar.
Det är som att förstå addition, subtraktion, multiplikation och division på matten,
fuskar man genom det så kommer man bara få problem längre fram.

Permalänk
Inaktiv

Här kommer lite pseudokod som kanske kan hjälpa dig på vägen

Kontrollera hur många tal användaren vill mata in.

Loopa lagom många gånger
Läs in tal
Summera tal
Kolla om talet är minst
Kolla om talet är stöst
Slutloop

Skriv ut resultat

Lösning bortredigerad
Permalänk
Hedersmedlem

*Lösning bortredigerad*

Se moderator Shimonus inlägg, #15 i tråden.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Inaktiv

Som många andra här redan skrivit; Läs på om loopar! Den här typen av övningar (speciellt denna) är en riktigt bra nybörjarövning för att lära sig basics, men bara om du vågar lära dig själv och klura ut en logisk lösning

Programmering är ju i grunden bara problemlösning, gäller bara att lära sig verktygen så man vet HUR man kan lösa sina problem! Just nu står du och ska spika en spik men vägrar lära dig att använda en hammare, hur bra snickare tror du att du blir då ?

Permalänk
Medlem

Använd rekursion

Skrivet av gaminggirl:

Tänk efter vad du behäver för de olika sakerna som ska matas ut, hur gör man ett medlevärde, hur märker du vilket tal som är minst (än så länge), hur märker du vilket tal som är störst (än så länge), hur får du farm summan. Och sedan kan jag ge ett tips, en for-sats kulle nog hjälpa dig en del med den här uppgiften...

Eftersom du inte vet hur många gånger du ska läsa in ett tal måste du ha antingen en while-sats eller en for-sats, tror inte det finns några andra alternativ.

Det finns ett alternativ till vilket är rekursion. Eftersom jag inte känner för att skriva Java kod (dels för att jag inte får skriva hela lösningar) så ger jag ett exempel i Clojure istället, det kör också på JVM:en så det i princip samma sak (Fast mycket snyggare än Java).

Du kan mata in följande kod rad för rad med "lein repl" ifall du installerar http://leiningen.org/

;; Läs n värden till en lista (defn read-n [n] (if (= n 0) '() ;; läs inga fler värden (cons (read) (read-n (- n 1))))) ;; läs ett värde och hämta nästa ;; Beräkna summa, medel, min, max (defn do-work [numbers] (list (reduce + numbers) ;; Summa (/ (reduce + numbers) (count numbers)) ;; Medel = Summa / Antal värden (reduce min numbers) ;; Minsta i listan (reduce max numbers))) ;; Största i listan ;; Hjälp funktioner (defn third [x] (nth x 2)) (defn fourth [x] (nth x 3)) (println "Antal nummer att läsa:") (let [result (do-work (read-n (read)))] (println "Summa" (first result)) (println "Medel" (second result)) (println "Minsta" (third result)) (println "Största" (fourth result)))

Denna kod göra följande in och utmatning:

Antal nummer att läsa:
#_=> 5
#_=> 4
#_=> 5
#_=> 3
#_=> 7
#_=> 6
Summa 25
Medel 5
Minsta 3
Största 7

Permalänk
Skrivet av lz.:

Det finns ett alternativ till vilket är rekursion. Eftersom jag inte känner för att skriva Java kod (dels för att jag inte får skriva hela lösningar) så ger jag ett exempel i Clojure istället, det kör också på JVM:en så det i princip samma sak (Fast mycket snyggare än Java).

Du kan mata in följande kod rad för rad med "lein repl" ifall du installerar http://leiningen.org/

;; Läs n värden till en lista (defn read-n [n] (if (= n 0) '() ;; läs inga fler värden (cons (read) (read-n (- n 1))))) ;; läs ett värde och hämta nästa ;; Beräkna summa, medel, min, max (defn do-work [numbers] (list (reduce + numbers) ;; Summa (/ (reduce + numbers) (count numbers)) ;; Medel = Summa / Antal värden (reduce min numbers) ;; Minsta i listan (reduce max numbers))) ;; Största i listan ;; Hjälp funktioner (defn third [x] (nth x 2)) (defn fourth [x] (nth x 3)) (println "Antal nummer att läsa:") (let [result (do-work (read-n (read)))] (println "Summa" (first result)) (println "Medel" (second result)) (println "Minsta" (third result)) (println "Största" (fourth result)))

Denna kod göra följande in och utmatning:

Antal nummer att läsa:
#_=> 5
#_=> 4
#_=> 5
#_=> 3
#_=> 7
#_=> 6
Summa 25
Medel 5
Minsta 3
Största 7

Visst ja, glömde rekursionen. Förstår inte koden helt men vet vad rekursion är och håller med om att det också hade kunnat fungera i det här fallet. Även om det inte känns som ett självklart rekursionsfall, tycker fortfarande en loop passar bäst.

Och lite sådär vid sidan om så kan jag säga att jag själv tycker Java är snyggare utifrån det du visade mig av clojure, men smaken är som baken.

Visa signatur

Corsair Vengeance LPX 4x8GB DDR4 2666MHz CL16 | Intel Core i7 6700 3,4 GHz 8MB | MSI Z170A KRAIT GAMING | Corsair Force Series 3 120 GB | Seagate SSHD Desktop 2 TB 7200 RPM 3,5" | Creative Sound Blaster Z PCIe | Western Digital 500 GB | Samsung Writemaster | Corsair TX750 V2 750 W | EVGA GeForce GTX 970 4GB SSC ACX 2.0+| Fractal Design Define R5 (Svart)

Permalänk
Medlem

Rekursion är mer avancerad programmering. Kan man inte grunderna med logik och loopar, så ska man inte ge sig in på rekursion (stack overflow någon?!).

Som tidigare nämnts, läs in dig på användandet av loopar.
Loopar är en mycket viktig del av programmering, och en sak som man måste förstå.

Permalänk
Medlem
Skrivet av NickoB:

Rekursion är mer avancerad programmering. Kan man inte grunderna med logik och loopar, så ska man inte ge sig in på rekursion (stack overflow någon?!).

Som tidigare nämnts, läs in dig på användandet av loopar.
Loopar är en mycket viktig del av programmering, och en sak som man måste förstå.

Det är inte alls "mer avancerad programmering", det är ett annat tankesätt.

Rekursion är mycket vanligt i matematik, ett tal n ur Fibonacci-talföljden beräknas enligt: F(n) = F(n-1) + F(n-2)
Funktionen bygger på rekursion och har inte nödvändigtvis något med programmering att göra.

I Haskell kan man skriva en (ooptimerad) Fibonacci-funktion så här:

fib 0 = 0 fib 1 = 1 fib n = fib n-1 + fib n-2

Det ser väl inte så konstigt ut? Prova att skriva en likvärdig funktion med loopar

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Killen skrev att han tyckte ett en enkel for-loop (0-19) såg avancerad ut och ni börjar skriva rekursion!
Om det står i tidningen imorgon att en programmeringselev tagit livet av sig så får ni fan känna er skyldiga!;)

Ta och låta tråden 'ta livet' av sig kanske med tanke på att den är övergiven av TS iaf?;o

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Hedersmedlem
Skrivet av Gnejs:

Killen skrev att han tyckte ett en enkel for-loop (0-19) såg avancerad ut och ni börjar skriva rekursion!
Om det står i tidningen imorgon att en programmeringselev tagit livet av sig så får ni fan känna er skyldiga!;)

Ta och låta tråden 'ta livet' av sig kanske med tanke på att den är övergiven av TS iaf?;o

Rekursion är ju liknande tankesätt som loopar bara lite baklänges. Det var bland det första vi fick lära oss på universitetet, innan vi lärde oss loopar. Så känner du att rekursion är svårt behöver det inte betyda att alla andra tycker det.

Permalänk
Medlem
Skrivet av Shimonu:

Rekursion är ju liknande tankesätt som loopar bara lite baklänges. Det var bland det första vi fick lära oss på universitetet, innan vi lärde oss loopar. Så känner du att rekursion är svårt behöver det inte betyda att alla andra tycker det.

Jag har inge större problem med rekursion även om loopar oftast känns mer naturliga, däremot har de flesta mycket svårare för rekursion än för loopar. Så om man bortser från dig och mig och tänker på andra så är generellt loopar enklare än rekursion.. -.-

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem
Skrivet av Gnejs:

Jag har inge större problem med rekursion även om loopar oftast känns mer naturliga, däremot har de flesta mycket svårare för rekursion än för loopar. Så om man bortser från dig och mig och tänker på andra så är generellt loopar enklare än rekursion.. -.-

Håller med fullt ut.
Själv då jag gick in i programmeringsvärlden så lärde vi oss först enkla "do"/"while" loopar, senare "for" loopar, efter det "foreach" loopar.
Det var inte förrens långt senare då vi började gå in på mer avancerade algoritmer som vi lärde oss rekursion. Och jag kan säga detta, det var mycket lättare att gå från funktion/strukturerad programmering till objektorienterad programmering, än att börja lära sig använda rekursiva algoritmer. Och jag hade använt mig av funktion/strukturerad programmering i flera år innan dess. För att citera en av mina lärare, nybörjare inom programmering har det mycket lättare att byta till den objektorienterade paradigmen, än för de som under en längre tid använt sig av tidigare paradigmer.

Jag tänker såhär. Läraren har i detta fallet beslutat att först introducera loopar istället för rekursiva algoritmer. Detta troligen för att läraren anser att det är enklare för eleverna. Uppgiften i detta läget är om att använda sig av loopar, och därav kommer läraren mycket troligen inte gå in på rekursiva algoritmer över huvud taget under kursens gång. Och om detta är fallet, varför ens nämna detta begrepp, då syftet med kursen inte är att lära sig rekursion, utan att lära sig grunden med loopar.
Lämnas uppgiften in med en rekursiv algoritm, så kommer läraren mycket troligen underkänna den, för det var inte syftet med uppgiften, och tills uppgiften är löst med en enkel loop, så kommer inte uppgiften bli godkänd, och samma sak vid tentan/provet.
Ibland är det lätt att göra folk en björntjänst (försöker hjälpa, men förstör mer för personen genom att hjälpa), fastän man vill hjälpa personen.
Så, wurt, ska uppgiften lösas med en enkel do/while/foreach loop, eller ska du använda rekursiva algoritmer? Och svaret är en enkel loop, så alla, sluta diskutera rekursion! Ni orsakar bara mer förvirring för wurt.