Teknolog-1 Skrevet 20. september 2012 Del Skrevet 20. september 2012 Hei, jeg sitter fast igjen med en oppgave, en meget kompleks en sådan. Jeg lurer på om noen kunne hjulpet meg med koden i denne (trenger ikke nødvendigvis klient), er helt blank pr nå. Oppgave I denne oppgaven skal du lage en klasse for tekstanalyse. Teksten er et objekt av klassen String, og du får tak i tegnet på en bestemt posisjon ved å bruke metoden charAt(). Lengden av teksten er gitt ved metoden length(). Følgende kodebit illustrerer bruken av metodene charAt() og length() og gir også tips om hvordan resten av oppgavene kan løeses (a-z og A-Z ligger etter hverandre i Unicode-tegnsettet): for (int i = 0; i < tekst.length(); i++) { //Posisjonene nummereres fra 0 og oppover char tegn = tekst.charAt(i); int verdi = tegn; //Omforming fra Char til Int System.out.println("Unicode-verdien til tegnet " + tegn + " på posisjon " + i + " er" + verdi); } Som objektvariabel i klassen Tekstanalyse skal du ha en tabell av int: int[] antallTegn = new int[30]; I denne tabellen gjelder at indeks 0-28 inneholder antall forekomster i en tekst av bokstavene a-å, mens indeks 29 inneholder antall forekomster av alle andre tegn enn bokstaver, for eksempel mellomrom, komma og punktum. Vi skiller ikke mellom store og små utgaver av en bokstav. Konstruktøren skal ta den aktuelle teksten som argument og fylle opp tabellen antallTegn med antall tegn av hver type. Etter at tabellen antallTegn er fylt opp, skal en klient kunne få utført følgende tjenester: Finn antall forskjellige bokstaver i teksten. Her ser vi altså bort fra alle andre tegn enn bokstaver. Finn totalt antall bokstaver i teksten. Hvor stor del av teksten (prosent) er ikke bokstaver? Finn antall forekomster av en bestemt bokstav. Bokstaven skal være parameter til metoden. Hvilken - eller hvilke, om det er flere som forekommer like ofte - bokstaver forekommer oftest i teksten? Lag et klientprogram som går i løkke. I hvert løkkegjennomløp skal klienten skrive inn en tekst, og resultatet av alle analysene foran skal skrives ut. På forhånd takk! Lenke til kommentar
Matsemann Skrevet 20. september 2012 Del Skrevet 20. september 2012 Hva har du prøvd selv? Kommer ikke til å gjøre oppgaven for deg, men kan prøve og gi deg et lite hint. Du får et hint om at a-z ligger etter hverandre i verdi i oppgaveteksten. Du vet at 'a' gir en int, men du bør prøve å få den inten til å være 0-28. Det kan du gjøre ved å ta 'a' - 'a' som blir 0, 'b' - 'a' blir 1 osv. Så kan du øke den posisjonen i antallTegn[] med 1, altså antallTegn[tegn - 'a']. Dette er ikke alt du trenger, men litt på vei. 1 Lenke til kommentar
Teknolog-1 Skrevet 21. september 2012 Forfatter Del Skrevet 21. september 2012 Takk for tips. Holder på med den nå og sålangt er dette det jeg har kommet opp med: import static javax.swing.JOptionPane.*; class Tekstanalyse1 { private String[] tekst = new String[28]; private int[] antallTegn = new int[30]; public Tekstanalyse1(String[] tekst, int[] antallTegn) { this.tekst = tekst; this.antallTegn = antallTegn; } public void antallFb() { } } Jeg tror at tankegangen er rett med å lage en metode for hver operasjon men har foreløpig ikke funnet noen god løsning på konstruktør mm. Lenke til kommentar
ekun Skrevet 21. september 2012 Del Skrevet 21. september 2012 Tenk enkelt du. Trenger ikke å gjøre ting verre enn det er. 1 Lenke til kommentar
SkoMedHull Skrevet 21. september 2012 Del Skrevet 21. september 2012 (endret) Dette er ikke en grusomt vanskelig oppgave hvis man bare tar det ett skritt av gangen. Det eneste du trenger å tenke på i første omgang er å fylle opp antallTegn[] korrekt. Fremgangsmåten blir ikke noe verre enn å gå igjennom hvert tegn i strengen, og bruke tegnet i hver posisjon som en addresse til en plass i antallTegn[](dette har du allerede fått hint om hvordan gjøres). Endret 21. september 2012 av SkoMedHull 1 Lenke til kommentar
jonny Skrevet 21. september 2012 Del Skrevet 21. september 2012 (endret) Her er en måte å gjøre det på (har brukt standard inn/ut her, må endre litt hvis du skal ha grafisk brukergrensesnitt). public class StringAnalyzer { private final static String alphabetStr = "abcdefghijklmnopqrstuvwxyzæøå"; private final static char[] alphabet = alphabetStr.toCharArray(); /** * Returns the index of <code>c</code> if one of the characters in * <code>alphabet</code>. If not, <code>alphabet.length</code> is * returned. * * @param c character to get index for * * @return index of character if it's found in <code>alphabet</code> */ private static int charIndex(char c) { if (c >= 'a' && c <= 'z') { return c - 'a'; } if (c >= 'A' && c <= 'Z') { return c - 'A'; } switch(c) { case 'æ': case 'Æ': return 'z' - 'a' + 1; case 'ø': case 'Ø': return 'z' - 'a' + 2; case 'å': case 'Å': return 'z' - 'a' + 3; default: return alphabet.length; } } /** * Returns an int-array of size <code>alphabet.length + 1</code>, which * contains the number of characters in <code>text</code> equal to the * character in <code>alphabet</code> with the same index. The last entry * in the int-array contains the number of characters in <code>text</code> * which is not found in <code>alphabet</code>. * * @param text the text used when counting characters * * @return an int-array with the number of different characters in * <code>text</code> */ private static int[] charCount(String text) { int[] result = new int[alphabet.length+1]; for (char c : text.toCharArray()) { result[charIndex(c)]++; } return result; } /** * Gathers some statistics from an int-array with number of characters of * different types and print them to standard out. The int-array must * be of size <code>alphabet.length + 1</code>. * * @param charCount int-array to use for statistics * @param chosenLetter a chosen letter for some additional statistics */ private static void printStatistics(int[] charCount, char chosenLetter) { // number of unique letters in the text int noOfUniqueLetters = 0; // total number of letters in the text int totalNoOfLetters = 0; // list of letters that are most used char[] maxCountChars = new char[alphabet.length]; // number of elements in maxCountChars int maxCountCharsNo = 0; // how often the letter(s) in maxCountChars are used int maxCount = 0; // loop through the charCount array to set // noOfUniqueLetters, totalNoOfLetters and // maxCount/maxCountChars/maxCountCharsNo for (int i = 0; i < charCount.length-1; i++) { if (charCount[i] > 0) { noOfUniqueLetters++; totalNoOfLetters += charCount[i]; if (charCount[i] > maxCount) { // found letter which are more often used than // current letter(s) in maxCountChars, set // maxCount and reset maxCountChars maxCount = charCount[i]; maxCountCharsNo = 0; } if (charCount[i] == maxCount) { // letter is most-often-used, add to maxCountChars maxCountChars[maxCountCharsNo++] = alphabet[i]; } } } int totalNoOfChars = totalNoOfLetters + charCount[charCount.length-1]; // amount of non-letter characters double otherCharsAmount = (double) (1000 * charCount[charCount.length-1] / totalNoOfChars) / 10.0; // count of a specific letter int noOfChosenLetter = charCount[charIndex(chosenLetter)]; // print statistics System.out.println("Number of unique letters: " + noOfUniqueLetters); System.out.println("Total number of letters: " + totalNoOfLetters); System.out.println( "Amount of non-letters: " + otherCharsAmount + " %"); if (charIndex(chosenLetter) == alphabet.length) { System.out.println("There are " + noOfChosenLetter + " non-letters in the text"); } else { System.out.println("The letter '" + alphabet[charIndex(chosenLetter)] + "' is used " + noOfChosenLetter + " times"); } System.out.print( "Most used letter(s) (used " + maxCount + " times): "); for (int i = 0; i < maxCountCharsNo; i++) { System.out.print(maxCountChars[i] + " "); } System.out.println(); } /** * Enters an inifinite loop for the user to enter text, and then prints * statistics about this text. Terminates when the user presses RETURN * without entering any text. * * @param args command-line arguments, these are ignored */ public static void main(String[] args) { String line; String selectedChar; java.util.Scanner scan = new java.util.Scanner(System.in); while (true) { System.out.print("\nWrite some text: "); line = scan.nextLine(); if (line.length() == 0) break; System.out.print("Enter a letter: "); do { selectedChar = scan.nextLine().trim(); if (selectedChar.length() == 1) { break; } else { System.out.print( "Invalid input, please enter a single letter: "); } } while (true); System.out.println(); int[] charcnt = charCount(line); printStatistics(charcnt, selectedChar.charAt(0)); } System.out.println("\nGoodbye!"); } } Endret 21. september 2012 av jonny 1 Lenke til kommentar
Teknolog-1 Skrevet 24. september 2012 Forfatter Del Skrevet 24. september 2012 Det var mer komplisert enn jeg hadde trodd, flere kommandoer her jeg ikke kjenner til. Takk for løsningsforslag, nå gjelder det bare å forstå. 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å