Behöver hjälp med programmeringsuppgift (matematik)

Permalänk

Behöver hjälp med programmeringsuppgift (matematik)

hej
jag jobbar nu med en uppgift om programmering och behöver hjälp.
uppgiften är att man ska skriva ett program som läser in ett antal heltal från terminalen och sedan skriver ut de två största och de två minsta samt medelvärdet av talen ? jag har bötjat med det och ska skriva koden här ! men det jag behöverhjälp med a
är att jag får ut bara det minsta och det största talet och i själva frågan så ska man få ut Två största och två minsta talen.

så här långt har jag kommit:

import java.util.Scanner; public class HelloWorld { public static void main(String[] args) { int max = 0; int min = Integer.MAX_VALUE; int sum = 0; int count = 0; int number = 0; Scanner input = new Scanner(System.in); System.out.print("Mata in ett tal (avsluta med 0): "); number = input.nextInt(); while (number != 0) { count++; sum = sum + number; if (number > max) max = number; if (number < min) min = number; System.out.print("Mata in ett tal (avsluta med 0): "); number = input.nextInt(); } System.out.println("Största: " + max); System.out.println("Minsta: " + min); System.out.println("Medelvärde (avrundat): " + (sum/count)); } }

Lade till [code]-taggar
Permalänk
Avstängd

Du skriver ju bara ut två värden (max och min) så då är det inte så konstigt att det bara kommer ut två. Enklaste sättet att lösa detta är väl att ha två max-variabler (säg max1 och max2) och två min- (min1 och min2) och kolla mot båda så att om det inmatade är större än max1 så blir det max1 och max1 blir max2, är det inte större än max1 så jämförs det med max2 och är det större än max2 så sätts max2 till det. Typ:

if (number > max1) { max2 = max1; max1 = number; } else if (number > max2) { max2 = number; }

osv.

Jag kanske hade gjort det mer nästlat men något åt det hållet i alla fall.

Lade till [code]-taggar
Permalänk

Borde man inte bara kunna skapa en max-heap och en min-heap?
Man lägger in alla talen i de två heaparna tills att man stöter på en nolla. Senare plocka ut två tal ur vardera heap och skriva ut dem.

Permalänk
Medlem

Borde det inte vara lättar att lägga in alla tal i en array, och sen bara göra en sort och plocka ut de 2 översta och de 2 understa talen?

http://viralpatel.net/blogs/java-tip-how-to-sort-array-in-jav...

Visa signatur

Ei bor i stockholm och tar inget ansvar för allt som han säger
7900, 64 gig ram, radeon r290
Solna arbetscenter

Permalänk

tack för hjälpen

Permalänk
Skrivet av snajk:

Du skriver ju bara ut två värden (max och min) så då är det inte så konstigt att det bara kommer ut två. Enklaste sättet att lösa detta är väl att ha två max-variabler (säg max1 och max2) och två min- (min1 och min2) och kolla mot båda så att om det inmatade är större än max1 så blir det max1 och max1 blir max2, är det inte större än max1 så jämförs det med max2 och är det större än max2 så sätts max2 till det. Typ:

if (number > max1) { max2 = max1; max1 = number; } else if (number > max2) { max2 = number; }

osv.

Jag kanske hade gjort det mer nästlat men något åt det hållet i alla fall.

Hej igen !
jag gjorde som du sa men får ut bara största1 (max1) och största2 (max2) men inte det minsta1 (min1) och minsta2 (min2) så ser koden ut:

import java.util.Scanner; public class HelloWord { public static void main(String[] args) { int max1 = 0; int max2 = 0; int min1 = Integer.MAX_VALUE; int min2 = Integer.MAX_VALUE; int sum = 0; int count = 0; int number = 0; Scanner input = new Scanner(System.in); System.out.print("Mata in ett tal (avsluta med 0): "); number = input.nextInt(); while (number != 0) { count++; sum = sum + number; if (number > max1) { max2 = max1; max1 = number; } if (number > min1) { min2 = min1; min1 = number; } System.out.print("Mata in ett tal (avsluta med 0): "); number = input.nextInt(); } System.out.println("Största1: " + max1); System.out.println("Största2: " + max2); System.out.println("Minsta1: " + min1); System.out.println("Minsta2: " + min2); System.out.println("Medelvärde (avrundat): " + (sum/count)); } }

vart ligger felet ??

Permalänk
Medlem
Skrivet av forza_inter17:

Hej igen !
jag gjorde som du sa men får ut bara största1 (max1) och största2 (max2) men inte det minsta1 (min1) och minsta2 (min2) så ser koden ut:

import java.util.Scanner; if (number > max1) { max2 = max1; max1 = number; } if (number > min1) { min2 = min1; min1 = number; }

vart ligger felet ??

Där ligger felet, dvs så sparar du min1 och min2 när talet är större än min1.

Edit: Programmet kommer fortfarande inte göra det du vill men du kommer antagligen märka vad som är fel och kunna fixa till det lätt.

Permalänk
Avstängd
Skrivet av forza_inter17:

Hej igen !
jag gjorde som du sa men får ut bara största1 (max1) och största2 (max2) men inte det minsta1 (min1) och minsta2 (min2) så ser koden ut:
KOD...

vart ligger felet ??

Som Ophe säger så kollar du ifall numret är större än minimi, vilket inte är rätt. Sen måste du också kolla ifall numret är större än det näst största ifall det inte är större än det största och samma sak på minsta.

Permalänk

Som andra påpekat finns det brister i din kod.

Du har valt fel operator på min.
Du tar endast värden större/mindre än max1/min1 och inte för max2/min2. Det vill säga om max1 = 7 och max2 = 3. Vad händer om man skickar in 5?
De två största/minsta talen kan int vara densamma ifall ett tal skickas in mer än en gång vilket de borde kunna vara.

Mindre fel är att du aldrig stänger din scanner! Stäng alltid dina in och utströmmar när du är klar då du kan få massor av knasiga fel annars. Kanske inte för simpla program som detta men för andra.

input.close();

För övrigt tycker jag du ska kolla på komentaren Ei skrev.

Skrivet av Ei:

Borde det inte vara lättar att lägga in alla tal i en array, och sen bara göra en sort och plocka ut de 2 översta och de 2 understa talen?

Detta skulle vara den absolut lättaste metoden för program som använder "rimliga" mängder indata.

Permalänk
Medlem
Skrivet av forza_inter17:

Hej igen !
jag gjorde som du sa men får ut bara största1 (max1) och största2 (max2) men inte det minsta1 (min1) och minsta2 (min2) så ser koden ut:

...
vart ligger felet ??

Du har ju inte gjort det han skrev. Kolla igen vad han har skrivit och fundera över varför han har den där elseif:en där.

Att använda arrayer till en en sån här uppgift skulle jag vilja påstå är overkill. Om man ändå vill använda sig av den metoden så är nog länkade listor mer lämpliga då indatats storlek är okänd.

Permalänk
Skrivet av Flat:

Du har ju inte gjort det han skrev. Kolla igen vad han har skrivit och fundera över varför han har den där elseif:en där.

Att använda arrayer till en en sån här uppgift skulle jag vilja påstå är overkill. Om man ändå vill använda sig av den metoden så är nog länkade listor mer lämpliga då indatats storlek är okänd.

Anser att det inte är ett problem att använda arrayer till detta. Använd bara ArrayList som är psuedo-dynamisk och omvandla den till en array med toArray() när allt är inlagt och du vet längden. Då kan du använda javas inbyggda sort i Arrays klassen och du är i princip klar.

Permalänk
Skrivet av vmattsson:

Anser att det inte är ett problem att använda arrayer till detta. Använd bara ArrayList som är psuedo-dynamisk och omvandla den till en array med toArray() när allt är inlagt och du vet längden. Då kan du använda javas inbyggda sort i Arrays klassen och du är i princip klar.

Håller jag med om att det är vettigare och lättare att utnyttja arrayer, tycker dock att detta endast gäller när man redan kan en del om programmering. Jag skulle säga att meningen med uppgiften inte är att lära hur man på bästa sätt programmeringsmässigt kan lösa problemet utan snarare lära ut hur man ska tänka när man programmerar och få lite syntaxkänsla för programmering, en nybörjaruppgift helt enkelt.

Permalänk
Medlem
Skrivet av vmattsson:

Anser att det inte är ett problem att använda arrayer till detta. Använd bara ArrayList som är psuedo-dynamisk och omvandla den till en array med toArray() när allt är inlagt och du vet längden. Då kan du använda javas inbyggda sort i Arrays klassen och du är i princip klar.

Det är inte ett problem men det behövs verkligen inte när det går att lösa väldigt enkelt utan.

Skrivet av equals(null):

Håller jag med om att det är vettigare och lättare att utnyttja arrayer, tycker dock att detta endast gäller när man redan kan en del om programmering. Jag skulle säga att meningen med uppgiften inte är att lära hur man på bästa sätt programmeringsmässigt kan lösa problemet utan snarare lära ut hur man ska tänka när man programmerar och få lite syntaxkänsla för programmering, en nybörjaruppgift helt enkelt.

Vettigare hur? Det ger sämre körningsprestanda och större minnesanvändning.

Permalänk
Skrivet av Flat:

Det är inte ett problem men det behövs verkligen inte när det går att lösa väldigt enkelt utan.

Vettigare hur? Det ger sämre körningsprestanda och större minnesanvändning.

Självklart att det ger sämmre prestanda men inte mycket. Prestandan med if-sats metoden ger en prestanda på O(n) med en konstant beroende på antalet if-satser och den med sorteringen ger oss O(nlogn) utan någon direkt konstant eftersom vi inte behöver if-satserna. Tiderna för dessa är båda inom komplexitetsklassen P och ger mer än duglig tid. Endra problemet är när input börjar nå stort antal tal (~100000). Då blir logn för stor för att väga upp de extra konstanterna i den andra.

Förutom detta är koden mer användningsbar med sorteringen eftersom om man skulle vilja ha ut tre tal istället slipper vi skriva två extra if-satser utan hämtar bara två extra tal.

Efter några år på högskola har jag lärt mig att snabb kod sällan är bra kod. Det är viktigare att göra kod som är användbar.
Till exempel titta på dessa hello worlds.

import java.io.IOException; public class hello { public static void main(String[] args) throws IOException{ System.out.write(new byte[]{(byte)0x48,(byte)0x65,(byte)0x6c,(byte)0x6c,(byte)0x6f,(byte)0x20,(byte)0x57,(byte)0x6f,(byte)0x72,(byte)0x6c,(byte)0x64,(byte)0x21,(byte)0x0a}); } }

public class hello { public static void main(String[] args){ System.out.println("Hello World!\n"); } }

Den första är knappt läslig och jobbig att skriva om till "hejsan svejsan" medans den nedre är väldigt enkel att ändra.
Körtiden? Övre tar 0.052002s (ja, 6 decimaler) och den nedre 0.148009s inkluderat tiden att starta JVM för båda.

Vill man ha snabb kod skriv i C++ eller liknande språk.

#include <iostream> int main() { std::cout << "Hello World!" << std::endl; }

Denna kod kör i 0.000000s det vill säga snabbare än tidtagningen kan räkna.

Tiderna är tagna utav tjänsten KATTIS för KTH som kör programmen, noterar korrekt svar och leverar en körtid.

Ps. Med dagens ökande minnesmängder blir det gammla unix talesättet nära på sant. "Unused RAM is wasted RAM".

Permalänk
Medlem
Skrivet av vmattsson:

Självklart att det ger sämmre prestanda men inte mycket. Prestandan med if-sats metoden ger en prestanda på O(n) med en konstant beroende på antalet if-satser och den med sorteringen ger oss O(nlogn) utan någon direkt konstant eftersom vi inte behöver if-satserna. Tiderna för dessa är båda inom komplexitetsklassen P och ger mer än duglig tid. Endra problemet är när input börjar nå stort antal tal (~100000). Då blir logn för stor för att väga upp de extra konstanterna i den andra.

Förutom detta är koden mer användningsbar med sorteringen eftersom om man skulle vilja ha ut tre tal istället slipper vi skriva två extra if-satser utan hämtar bara två extra tal.

Efter några år på högskola har jag lärt mig att snabb kod sällan är bra kod. Det är viktigare att göra kod som är användbar.
Till exempel titta på dessa hello worlds.

import java.io.IOException; public class hello { public static void main(String[] args) throws IOException{ System.out.write(new byte[]{(byte)0x48,(byte)0x65,(byte)0x6c,(byte)0x6c,(byte)0x6f,(byte)0x20,(byte)0x57,(byte)0x6f,(byte)0x72,(byte)0x6c,(byte)0x64,(byte)0x21,(byte)0x0a}); } }

public class hello { public static void main(String[] args){ System.out.println("Hello World!\n"); } }

Den första är knappt läslig och jobbig att skriva om till "hejsan svejsan" medans den nedre är väldigt enkel att ändra.
Körtiden? Övre tar 0.052002s (ja, 6 decimaler) och den nedre 0.148009s inkluderat tiden att starta JVM för båda.

Vill man ha snabb kod skriv i C++ eller liknande språk.

#include <iostream> int main() { std::cout << "Hello World!" << std::endl; }

Denna kod kör i 0.000000s det vill säga snabbare än tidtagningen kan räkna.

Tiderna är tagna utav tjänsten KATTIS för KTH som kör programmen, noterar korrekt svar och leverar en körtid.

Ps. Med dagens ökande minnesmängder blir det gammla unix talesättet nära på sant. "Unused RAM is wasted RAM".

Ännu bättre kan ju vara att skriva i c
Testa printf("Hello World\n");
cout och endl är ganska sega.

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
Skrivet av NoPaiN^:

Ännu bättre kan ju vara att skriva i c
Testa printf("Hello World\n");
cout och endl är ganska sega.

Ska göra det
Antar däremot att jag inte kan få mycket bättre resultat om inte KATTIS räknar med fler decimaler. Är inte direkt någon c/c++ programmerare själv men alltid roligt att testa!

Permalänk
Medlem
Skrivet av vmattsson:

Ska göra det
Antar däremot att jag inte kan få mycket bättre resultat om inte KATTIS räknar med fler decimaler. Är inte direkt någon c/c++ programmerare själv men alltid roligt att testa!

Kör det i en loop på nån miljon och jämför för att få ut nåt att beräkna på.
Eller använd CPU-time och dylikt.

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

Hejsan !

Ser ut som detta är bland de första programmen du skriver, så antar ni inte gått igenom så mycket än (arrayer, funktioner, klasser, felhantering etc).

Lite pointers:
Ser att du fortfarande har kvar namnet ifrån din första labb "HelloWorld", kan alltid vara bra att döpa ditt program/klass till vad den gör

Nedan följer ett lösningsförslag endast med de funktioner du redan använt (sånär som på else och "eller" operatorn.

import java.util.Scanner; public class SimpleMath{ public static void main(String[] args) { int max1 = 0; int max2 = 0; int min1 = Integer.MAX_VALUE; int min2 = Integer.MAX_VALUE; int sum = 0; int count = 0; int number = 0; Scanner input = new Scanner(System.in); System.out.print("Mata in ett tal (avsluta med 0): "); number = input.nextInt(); while (number != 0) { count++; sum += number; if (number > max1 || number > max2) { if (max2 > max1) { max1 = number; } else max2 = number; } } if (number < min1 || number < min2) { if (min2 < min1) { min1 = number; } else { min2 = number; } } System.out.print("Mata in ett tal (avsluta med 0): "); number = input.nextInt(); } System.out.println("Största1: " + max1); System.out.println("Största2: " + max2); System.out.println("Minsta1: " + min1); System.out.println("Minsta2: " + min2); System.out.println("Medelvärde (avrundat): " + (sum/count)); } }

När du kodar, börja gärna rita lite på papper eller försök tänka i banorna på vad du matar in och vad som behövs i dina villkor för att koden gör det du vill.

I detta fallet när det gäller din variabler för max/min värden.
Du skall alltså kolla 2 variabler emot ditt inmatade tal. Om vi tar fallet med dina 2 max värden, så vill du alltså spara de 2 största.
Första kontrollen är alltså: Är det inmatade talet större än något av mina sparade värden, det kan du göra i en if sats med hjälp av "eller" variablen
dvs: är number > än max 1 eller nummber > max2 så är villkoret sant och man kör koden innan för.
Nästa kontroll är och se vilket av talen du vill sätta number i.
Då får du försöka visualisera dig att du matat in ett gäng tal, anta nu att max1 = 7 och max2 = 3, talet du matar in är 5.
Enklaste sättet är ytterligare en if, där du kollar vilket av talen som är minst, och sen sparar över det.
Medelvärdet verkar du ha koll på så ingen kommentar på den.
Och vad det gäller min, så är det så klart samma sak fast tvärtom på tecknen.

Visa signatur

They say a little knowledge is a dangerous thing, but it's not one half so bad as a lot of ignorance
- Terry Pratchett
_____________________________

Permalänk
Medlem

När du tror du har fått programmet att fungera prova att bara mata in negativa tal, och kontrollera om du får rätt svar.