Gnurk! Skrevet 24. oktober 2011 Del Skrevet 24. oktober 2011 hey, MÅ bli ferdig med en grunnleggende programmering oppgave, men vet ikke helt hvordan jeg skal løse 1 (eller muligens 2) av problemene, oppgaven lyder slik: OBS: jeg SPØRR ikke om hjelp til hele oppgaven, for å hjelpe meg trenger du ikke lese oppgaveteksten rett under, hopp ned til neste OBS. Lag en tegntabell på 7000 elementer. Fyll denne med tilfeldige bokstaver, f.o.m. A t.o.m. G. Bare store bokstaver! Bruk Math.random(), som gir en uniform fordeling av tall mellom 0.0 og 1.0. • Så skal innholdet i tabellen sorteres i alfabetisk rekkefølge. Bruk ferdig en definert metode i klassen Arrays i java.util-biblioteket. Her finner du dokumentasjonen for klassen: http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html PS: Husk å skrive følgende import deklarasjon: import java.util.Arrays; • Etter sorteringen: Søk etter et element som inneholder en A og skriv ut indeksverdien til dette elementet, søk så etter et element som inneholder en B og skriv ut indeksverdien, søk etter en C, osv. Søkingen skal gjøres på en effektiv måte! Bruk en metode fra Arrayklassen også her. • Se på indeksverdien: Indeksverdien for en A skal være i området 0 til ca. 1000, indeksverdien til en B skal være i området ca. 1000 til ca. 2000, osv. Indeksverdien for en G skal være i området ca. 6000 til 6999. OBS: teksten over er IKKE viktig for å svare på spørsmålet, kun for de nysgjerrige jeg har naturligvis starter med å mekke charsene A B C D E F G, mekket meg en tabel int tab=new tab[7000]; lagd med math.random koden for å få tallene fra 0->7000 (tror jeg da, men d er ikke dette som er viktig uansett) DET jeg lurer på er: hvordan kan jeg tildele disse charene til arrayet på en slik måte at de ikke overkjører hverandre om og om igjen? finner ingen måte å gjøre slik at de ikke fyller et slot som allerede er opptatt. er det eventuelt en måte å tildele dem vor man unngår denne problemstillinga? setter stor pris på rask respons :9 Lenke til kommentar
geir_a Skrevet 24. oktober 2011 Del Skrevet 24. oktober 2011 (endret) Kan det hende du har misforstått oppgaven litt? Her er ca slik jeg ville ha løst den (det er lenge siden jeg programmerte i Java, så dette blir sikkert ikke helt riktig når det gjelder syntaks): char[] bokstaver = {'A', 'B', 'C', 'D', 'E', 'F', 'G'}; char[] tabell = new char[7000]; for (int i = 0; i < 7000; i++) { tabell[i] = bokstaver[(int)(Math.random() * 8)]; } Poenget med "Math.random() * 8" er å gi et tilfeldig tall mellom 0 og 7 (fra 'A' til 'G'). Jeg er litt usikker på om jeg bruker Math.random() riktig her. For å sortere kan du vel bruke Array.sort()...? Håper jeg ikke er helt på viddene. Ble du noe klokere? :-) Endret 24. oktober 2011 av geir_a 1 Lenke til kommentar
Gnurk! Skrevet 24. oktober 2011 Forfatter Del Skrevet 24. oktober 2011 måtte gi fra meg pc'n jeg programmerer på, men d lager mye mer mening dette løser mitt "overkjørings" problem værtfall tusen tusen takk skal absolutt jobbe utifra dette i morgen Lenke til kommentar
Gnurk! Skrevet 25. oktober 2011 Forfatter Del Skrevet 25. oktober 2011 sånn da var det i boks, tusen takk for hjelpen, brukte din kode som grunn, håper det er greit her er løsninga om noen i fremtiden skulle trenge den : package minePrograms; import java.util.*; public class oppgave7a { public static void main(String[] args) { char[] tabell=new char[7000]; char[] bokstaver={'A', 'B', 'C', 'D', 'E', 'F', 'G'}; double fix; double fix2; int fix3; for (int i = 0; i < 7000; i++) { fix=Math.random(); fix2=fix*7; fix3=(int)fix2; tabell = bokstaver[fix3]; } Arrays.sort(tabell); char searchValue = 'A'; int intResult = Arrays.binarySearch(tabell,searchValue); System.out.println(intResult); char searchValueB = 'B'; int intResultB =Arrays.binarySearch(tabell, searchValueB); System.out.println(intResultB); char searchValueC = 'C'; int intResultC =Arrays.binarySearch(tabell, searchValueC); System.out.println(intResultC); char searchValueD = 'D'; int intResultD =Arrays.binarySearch(tabell, searchValueD); System.out.println(intResultD); char searchValueE = 'E'; int intResultE =Arrays.binarySearch(tabell, searchValueE); System.out.println(intResultE); char searchValueF = 'F'; int intResultF =Arrays.binarySearch(tabell, searchValueF); System.out.println(intResultF); char searchValueG = 'G'; int intResultG =Arrays.binarySearch(tabell, searchValueG); System.out.println(intResultG); } } Lenke til kommentar
_dundun_ Skrevet 25. oktober 2011 Del Skrevet 25. oktober 2011 (endret) Ser jo greit nok ut, men jeg ville laget en funksjon for søket. Når noe skal gjøres flere ganger i et program er det en god regel å generalisere det til en funksjon. System.out.println(findChar("A",tabell)); System.out.println(findChar("B",tabell)); System.out.println(findChar("C",tabell)); System.out.println(findChar("D",tabell)); System.out.println(findChar("E",tabell)); System.out.println(findChar("F",tabell)); System.out.println(findChar("G",tabell)); private int findChar(String character, table tabell) { int output = Arrays.binarySearch(tabell, character); return output; } Eventuelt kan du jo kjøre output i funksjonen også, men da blir den litt ubrukelig til generell bruk findChar("A",tabell); findChar("B",tabell); findChar("C",tabell); findChar("D",tabell); findChar("E",tabell); findChar("F",tabell); findChar("G",tabell); private void findChar(String character, table tabell) { int output = Arrays.binarySearch(tabell, character); System.out.println(output); } Jeg ville også renset opp litt i mainmetoden: public static void main(String[] args) { char[] tabell=new char[7000]; char[] bokstaver={'A', 'B', 'C', 'D', 'E', 'F', 'G'}; for (int i = 0; i < 7000; i++) { fix= (int)(Math.random()*7); tabell[i] = bokstaver[fix]; } Sikkert masse syntaksfeil her, over ti år siden sist jeg kodet java Endret 25. oktober 2011 av kvasbo Lenke til kommentar
etse Skrevet 25. oktober 2011 Del Skrevet 25. oktober 2011 (endret) En lite tips jeg kan komme med er at du ikke trenger å bruke mange variabler i en slik utregning. Du kan gjerne bruke kun 1 og overskrive den samme, eller bare ta enkel utregning i en linje. F.eks. kan du skrive om: double fix; double fix2; int fix3; fix=Math.random(); fix2=fix*7; fix3=(int)fix2; til noe så enkelt som: int tall; tall = int(Math.random()*8); Koden blir da mye lettere å lese. Endret 25. oktober 2011 av etse Lenke til kommentar
Gnurk! Skrevet 25. oktober 2011 Forfatter Del Skrevet 25. oktober 2011 har et spørsmål angående neste del av oppgaven (oppgave B) da skal man søke etter første gang i den sorterte tabellen vi får se B, også C osv. har funnet 2 alternative løsninger på det, ingen fungerer (får feil i koden, vet ikke hva jeg gjør feil) int indexOf(int ch) var den første metoden String tabell2=new String(tabell); int indexOf(tabell2 'A'); forsøkte å gjør tabellen om til string etter den var sortert for så å lete etter første gang A kom frem, dette fungerte ikke i det hele tatt ettersom, ser jo at jeg fyller inn feil men nettsiden som ga meg den ga veldig lite mening :\ http://www.tutorialspoint.com/java/java_string_indexof.htm har noen en grei metode å lete i denne tabellen min UTEN å lage en haug med index variabler, står nemlig i oppgaven at man skal lage søkingen så "Lettvint" som mulig og.... ? :\ Lenke til kommentar
etse Skrevet 25. oktober 2011 Del Skrevet 25. oktober 2011 se på denne siden: http://leepoint.net/notes-java/data/arrays/70sorting.html Lenke til kommentar
srbz Skrevet 25. oktober 2011 Del Skrevet 25. oktober 2011 (endret) hva med en egen metode som gjør det for deg med en enkel while-løkke? noa ala public static int indeksTilForste(char c) { int i = 0; while(bokstaver[i] != c){ i++; } return i; } Du får selv finne en måte å håndtere problemet som oppstår dersom c ikke eksisterer Da vil forsåvidt løkken bli uendelig, så kanskje det er bedre med en for-løkke isteden. bokstaver[] er forresten ikke en feltvariabeli koden din foreløpig, så enten må du deklarere den utenfor main-metoden, eller så må du gi den som parameter til søkemetoden, hvis du vil bruke en egen metode til dette. Endret 25. oktober 2011 av srbz Lenke til kommentar
Gnurk! Skrevet 25. oktober 2011 Forfatter Del Skrevet 25. oktober 2011 ah lol tusentakk skal jobbe utifra dette når jeg får laptopen tilbake senere i dag Lenke til kommentar
srbz Skrevet 25. oktober 2011 Del Skrevet 25. oktober 2011 (endret) Skrev et forslag til hele kildekoden basert på det du selv har gjort: package minePrograms; import java.util.*; public class oppgave7a { private static char[] tabell=new char[7000]; private static char[] bokstaver={'A', 'B', 'C', 'D', 'E', 'F', 'G'}; public static void main(String[] args) { for (int i = 0; i < tabell.length; i++) { tabell[i] = bokstaver[(int) (Math.random()*7)]; } Arrays.sort(tabell); for (int i = 0; i < bokstaver.length; i++){ System.out.println("Indeks til tilfeldig '" + bokstaver[i] + "': " + Arrays.binarySearch(tabell, bokstaver[i])); } for (int i = 0; i < bokstaver.length; i++){ int temp = indexToFirstEntry(bokstaver[i]); if(temp >= 0) System.out.println("Indeks til første '" + bokstaver[i] + "': " + temp); else System.out.println("'" + bokstaver[i] + "' finnes ikke!"); } } public static int indexToFirstEntry(char c){ for (int i = 0; i < tabell.length; i++){ if (tabell[i] == c) return i; } return -1; } } MEN! Arrays.binarySearch(char[] a, char key) krever at tabellen er sortert på forhånd. Jeg fikk endel negative verdier ved kjøring. Jeg forsøkte å gjøre tabell[] om til en ArrayList<Character>, men metoden godtar bare tabeller av typen char[]. Med mindre noen kjenner til kjappe løsninger for å sortere en char[]-tabell må du nesten implementere en sorteringsalgoritme for å kunne bruke denne metoden. Eller så kan du lage en for-løkke som teller gjennom hele tabellen, det er vel kanskje det greieste Meh, du hadde jo en Arrays.sort() der, må ha vært litt rask på avtrekkeren med å fjerne den. Lurer forøvrig litt på hvordan Arrays.binarySearch() funker. Jeg får samme verdier for disse tallene ved hver kjøring, enda tabellen genereres tilfeldig. Endret 25. oktober 2011 av srbz Lenke til kommentar
_dundun_ Skrevet 25. oktober 2011 Del Skrevet 25. oktober 2011 hva med en egen metode som gjør det for deg med en enkel while-løkke? noa ala public static int indeksTilForste(char c) { int i = 0; while(bokstaver[i] != c){ i++; } return i; } Du får selv finne en måte å håndtere problemet som oppstår dersom c ikke eksisterer Da vil forsåvidt løkken bli uendelig, så kanskje det er bedre med en for-løkke isteden. bokstaver[] er forresten ikke en feltvariabeli koden din foreløpig, så enten må du deklarere den utenfor main-metoden, eller så må du gi den som parameter til søkemetoden, hvis du vil bruke en egen metode til dette. Dette er en grusomt ineffektiv metode for å søke i en sortert liste. Om man skal lage dette manuelt ville jeg heller kjørt en "splitt og sjekk"-algoritme som starter i midten og ser om den er over eller under (eller på, som blir samme som over) rett bokstav, for så å dele arrayet på to igjen og gjenta prosedyren. Generelt er imidlertid de innebyggede søkemetodene i språk veien å gå for normale søk - de er stort sett meget gode. Lenke til kommentar
Gnurk! Skrevet 25. oktober 2011 Forfatter Del Skrevet 25. oktober 2011 (endret) sånn, tusen takk for all hjelpen bare del C igjen nå forøvrig løste jeg oppgave B ved den løkka du gav meg, tusen tusen takk her er løsningen min om noen skulle være intereserte /ha samme oppgave i fremtiden: package minePrograms; import java.util.*; public class oppgave7b { public static void main(String[] args) { char[] tabell=new char[7000]; char[] bokstaver={'A', 'B', 'C', 'D', 'E', 'F', 'G'}; double fix; double fix2; int fix3; for (int i = 0; i < 7000; i++) { fix=Math.random(); fix2=fix*7; fix3=(int)fix2; tabell = bokstaver[fix3]; } Arrays.sort(tabell); String tabell2=new String(tabell); int iB=0; int iC=0; int iD=0; int iE=0; int iF=0; int iG=0; while(tabell[iB]!= 'B'&&tabell[iB]<7001){ iB=iB+1; } while(tabell[iC]!= 'C'&&tabell[iB]<7001){ iC=iC+1; } while(tabell[iD]!= 'D'&&tabell[iB]<7001){ iD=iD+1; } while(tabell[iE]!= 'E'&&tabell[iB]<7001){ iE=iE+1; } while(tabell[iF]!= 'F'&&tabell[iB]<7001){ iF=iF+1; } while(tabell[iG]!= 'G'&&tabell[iB]<7001){ iG=iG+1; } System.out.println(iB); System.out.println(iC); System.out.println(iD); System.out.println(iE); System.out.println(iF); System.out.println(iG); } } Endret 26. oktober 2011 av Gnurk(homesmasher) Lenke til kommentar
Gnurk! Skrevet 26. oktober 2011 Forfatter Del Skrevet 26. oktober 2011 (endret) beklager for alt maset(er ikke særlig individualistisk tydeligvis) men siste oppgave er Lag et program som lar brukeren taste inn flere ord etter hverandre med mellomrom imellom. Ordene skal så skrives ut igjen på skjermen i leksikografisk orden. Brukeren skal få prøve flere ganger, helt til han/ hun ikke vil mer. Eks. på programutførelse: Tast inn flere ord: alle fugler små de er kommer nå tilbake Sortert: alle de er fugler kommer nå små tilbake og jeg lurer bare på en ting: hvordan kan jeg se på ord for ord i et string? kan jo gjør string om til et Array og se på bokstav for bokstav, men ord for ord blir jo litt vanskeligere? finnes det et "metode" som gjør dette for deg? edit: innser at jeg må bruke array og slå sammen når man kommer til " ", men fortsatt er det en pre-defined method for dette som kan importes? Endret 26. oktober 2011 av Gnurk(homesmasher) Lenke til kommentar
geir_a Skrevet 26. oktober 2011 Del Skrevet 26. oktober 2011 (endret) Du kan bruke String.split() for å dele en tekststreng. Du kan da angi at tekststrengen skal deles der hvor mellomrommene er. Resultatet blir en array hvor hvert element er ett ord fra setningen. Ta en titt i Java API-doc'en, så finner du nok ut av det. Endret 26. oktober 2011 av geir_a Lenke til kommentar
Gnurk! Skrevet 26. oktober 2011 Forfatter Del Skrevet 26. oktober 2011 tror jeg har løsninga nå ja, tusen takk, brukte split før bare glemte å sette et mellom ledd array blir noe slik tenker jeg, alt jeg må finne ut er den if testen og hvordan jeg sammenligneri med at det er siste ledd i tabell så er jeg i land :9 String input=A.next(); String[] tabell=input.split(" "); int i=0; boolean check=false; while(check=false){ System.out.print(tabell); i++; if(i==tabell){ check=true; } } Lenke til kommentar
Gnurk! Skrevet 26. oktober 2011 Forfatter Del Skrevet 26. oktober 2011 den .split fungerer foresten dårlig, jeg testet bare med å gjør: Scanner A=new Scanner(System.in); String input=A.next(); String[] tabell=input.split(" "); Arrays.sort(tabell); int i=0; System.out.print(tabell); boolean check=false; og når jeg skriver f.eks "hei pei jeg meg" så får jeg utskriften: "[Ljava.lang.String;@1a758cb" Lenke til kommentar
Gnurk! Skrevet 26. oktober 2011 Forfatter Del Skrevet 26. oktober 2011 (endret) snipp Endret 26. oktober 2011 av Gnurk(homesmasher) Lenke til kommentar
geir_a Skrevet 26. oktober 2011 Del Skrevet 26. oktober 2011 Hjelper det hvis du skriver: System.out.print(java.util.Arrays.toString(tabell)); Hvis du importerer java.util.* kan du sløyfe det i koden over. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå