Gå till innehåll

Programmeringsuppgift i Java, hjälp!


Recommended Posts

Postad

Läser A-kursen i programmering, och har fått i uppgift att skriva ett dekrypteringsprogram. Själva krypteringen ska ske genom att programmet läser in ett antal filer, räknar ut ett procentvärde för hur ofta varje bokstav uppträder i texterna, och sedan ersätter alla tecken med samma procentvärden i en krypterad text.

 

Programmet ska vara objektorienterat, och använda sig av bl.a. File, FileReader och BufferedReader.

 

Mitt problem är att jag inte har en aning om vad det olika metoderna som jag skrev ovan har för uppgifter, och därför vet jag inte hur jag ska skriva. Det skulle vara perfekt om någon som kan det här förklarar för mig vad de gör, och kanske till och med skriver ett litetet kodexempel på var och en av dem.

 

Tack på förhand.

Johan

Postad

Programmering A? :shock: Låter som att du eller din lärare har lite väl för höga ambitioner för vad ni ska kunna i den kursen.

 

http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html

http://java.sun.com/j2se/1.5.0/docs/api/java/io/FileReader.html

http://java.sun.com/j2se/1.5.0/docs/api/java/io/BufferedReader.html

 

Där har du länkar till klasserna i API:n. Har inte tid just nu att gå in på vad de olika klasserna gör, men det kan du läsa dig till i API:n.

Postad

ja det var ju lite häftigt.

 

Du får ju läsa in filen tecken för tecken och förslagsvis har du en array där du lagrar frekvenserna. För att slippa köra en massa if else satser eller en stor case så gör en method som sätter in värdena i arrayen. Tex förslagsvis gör du om alla bokstäver till gemener och sedan gör du om dem till deras ASCII kod värde och drar bort 97 (då får a värdet 0, dvs första platsen i arrayen) alltså tar du bara arrayen[bokstavens värde - 97]++. Väldigt smidigt. Glöm inte att ha en räknare för totala antalet bokstäver också. Du måste även ha en koll på att talet du får ut ligger i arrayen. Läser du tex in specialtecken så kommer dessa att hamna utanför och ska inte tas med. Hoppas det här gav lite ideer om hur du kan gå till väga.

Postad

Normalt skulle det även vara effektivast att använda readLine (eller något som läser in ännu mer av filen på en gång) eller liknande eftersom du inte vill behöva accessa disken för varje bokstav du läser men bufferedReader buffrar filen åt dig så du behöver inte tänka på detta utan kan använda dig av read() direkt

Postad

Ursäkta spydigheten, men är det här ett skämt eller? "Metoderna ovan"? Det är klasser du refererar till där, i typ core API:t. Men SÅ mycket dokumentation.

 

Testa ett java-forum kanske?

Postad
Ursäkta spydigheten, men är det här ett skämt eller? "Metoderna ovan"? Det är klasser du refererar till där, i typ core API:t. Men SÅ mycket dokumentation.

 

Testa ett java-forum kanske?

 

Du har givetvis rätt, det är klasser jag refererar till, men eftersom att jag är ny till programmering så har jag ännu inte fått riktigt grepp om terminologin. Klarar mig för övrigt utan spydigheten. Varför skulle jag skämta? Kan du inte bara snällt notera för mig att det ligger till på ett visst sätt?

 

I övrigt, tack för tipsen, ska nog kunna sno ihop nåt som funkar.

Postad
Kan du inte bara snällt notera för mig att det ligger till på ett visst sätt?

 

Jo, faktiskt. Jag ber om ursäkt. Jag borde hållt käften, helt enkelt. Jag har ju faktiskt också varit nybörjare.

 

Du borde komma långt på att läsa bara java-API:t. Får du nåt problem med nåt specifik så kan du PM:a mig, så kan jag säkert hjälpa dig. Även om det var ett par år sen jag jobbade i java.

 

Lycka till!

Postad
Kan du inte bara snällt notera för mig att det ligger till på ett visst sätt?

 

Jo, faktiskt. Jag ber om ursäkt. Jag borde hållt käften, helt enkelt. Jag har ju faktiskt också varit nybörjare.

 

Du borde komma långt på att läsa bara java-API:t. Får du nåt problem med nåt specifik så kan du PM:a mig, så kan jag säkert hjälpa dig. Även om det var ett par år sen jag jobbade i java.

 

Lycka till!

 

Ingen fara, ursäkt godtagen. Precis som du säger så borde jag kunna komma långt med det jag har nu, men skulle det krisa sig så känns det bra att det finns hjälp tillgänglig även utanför skoltid.

Postad

Det verkar verkligen som att din lärare har fått lite fnatt och gått ett steg för långt.

A-kursen i programering ska verkligen inte handla om något sånt här utan snarare om grundläggande saker inom programmering.

Har ni redan läst en annan programmeringskurs, så som c++, så ska ni inte behöva läsa Java A, utan direkt gå på Java B. Detta för att alla A-kurser inom programmering inte har något direkt med ett speciellt språk att göra.

Postad

Jag gjorde också ett sådant här program när jag läste första "riktiga" kursen i MATLAB.

 

Jag gjorde helt enkelt så att jag läste in hela texten som en matris och konverterade alla bokstäver till små bokstäver och sedan till asciikoder för att sedan räkna antalet av varje bokstav. Sedan "föreslog" programmet att den bokstaven som förekommer oftast ska ersättas med "e" och de andra bokstäverna flyttas lika många steg (alltså.. adderar "flyttstegen" till asciinumret och sedan gör en procedur som börjar om vid "a" efter "ö". Till sist konverterades ascii-koderna tillbaka till tecken och tadaaaaa :D

Postad

import java.io.*;

 

public class Decryptor //

{

public static void main(String[] argv){

 

FileReader("corpus/kalle_sandare.txt");

FileReader("corpus/gomfrovaxter.txt");

FileReader("corpus/gustav_iv_adolf.txt");

FileReader("corpus/kapuciner.txt");

FileReader("corpus/shirley_bassey.txt");

FileReader("corpus/sonett.txt");

FileReader("corpus/tradfallning.txt");

 

}

 

public static void FileReader(String corpus){

 

try{

FileReader file = new FileReader(corpus);

BufferedReader reader = new BufferedReader(file);

String ref;

while((ref = reader.readLine()) !=null){

 

ref = ref.toLowerCase();

 

charCount(ref);

}

 

}

catch(IOException e){

System.out.println("Error! Could not read files. Perhaps you haven't put them in the right directory?");

}

}

 

public static void charCount(String ref) {

 

char[] refArray = ref.toCharArray();

char[] engAlfa = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

int[] amount = new int[26];

for(int i=0; i<26; i++) {

amount=0;

}

 

for(int i=0; i<refArray.length; i++) {

for(int x=0; x<engAlfa.length; x++) {

if(engAlfa[x]==refArray) {

 

amount[x]++;

}

}

 

}

 

}

 

}

 

 

Detta är vad jag har skrivit hittils. Funkar dock inte riktigt som jag vill att det ska. De två arrayerna engAlfa och amount verkar inte fyllas med värden som jag tycker de borde göra. Känns som att det är något ganska basic, och att en erfaren java-programmerare borde kunna se felet och hjälpa mig rätta till det. :D

Postad

För att slippa leta vore det inte bättre att ha en array av integers som är 26 lång och inkrementera 0 för A osv, du har ju en naturlig kodning mellan siffror och bokstäver via ascii-tabellen.

Postad
För att slippa leta vore det inte bättre att ha en array av integers som är 26 lång och inkrementera 0 för A osv, du har ju en naturlig kodning mellan siffror och bokstäver via ascii-tabellen.

 

Det där låter jättesmart, men vi har inte gått igenom det så jag har ingen aning om hur man går till väga. :(

Postad
För att slippa leta vore det inte bättre att ha en array av integers som är 26 lång och inkrementera 0 för A osv, du har ju en naturlig kodning mellan siffror och bokstäver via ascii-tabellen.

 

Det där låter jättesmart, men vi har inte gått igenom det så jag har ingen aning om hur man går till väga. :(

 

Annars går det utmärkt att använda en map för detta.

Postad

Vet inte om det är standard praxis i Java, men som inbiten C++ kodare så reagerar jag på att du har funktioner som heter samma som en klass (FileReader).

 

Sen ser det ut som om arrayen amount nollställs för varje ny rad du läser in och är dessutom lokal i scopet för funktionen CharCount.

Postad
Vet inte om det är standard praxis i Java, men som inbiten C++ kodare så reagerar jag på att du har funktioner som heter samma som en klass (FileReader).

 

Förstår att du reagerar, men i java kan man göra just så där.

 

Sen ser det ut som om arrayen amount nollställs för varje ny rad du läser in och är dessutom lokal i scopet för funktionen CharCount.

 

Jo, min lärare tyckte att jag skulle skriva en loop som gav alla platser i arrayen värdet noll innan de får nya värden i och med blocket som är skrivet efter. Det var nåt om att kompilatorn skulle klaga.

Postad
Det sista gäller för övrigt även engAlfa. Dvs när du är utanför funktionen CharCount så har engAlfa och amount odeklarerade värden, och när du är inne i funktionen har de glömt bort gamla resultat.

 

Ok, men hur gör jag så att arrayerna får behålla sina värden? Jag vill ju att varje plats i engAlfa har en motsvarande i amount, och där amount ökar om engAlfa och amount är lika.

Postad

Bara för att man kan så behöver man inte göra det. Men det är väl en läxa du lär dig senare. ;)

 

Som sagt, Java är lite för nytt för mig men du bör titta på referenser i förhållande till funktionsanrop. Du behöver alltså deklarera variablerna i Filereader funktionen och sedan skicka dem som indata till CharCount.

Postad
Vet inte om det är standard praxis i Java, men som inbiten C++ kodare så reagerar jag på att du har funktioner som heter samma som en klass (FileReader).

 

Det har inget med C++ att göra - utan med design. I bra objektorienterad design så är normalt klasser substantiv och funktioner verb.

Postad
För att slippa leta vore det inte bättre att ha en array av integers som är 26 lång och inkrementera 0 för A osv, du har ju en naturlig kodning mellan siffror och bokstäver via ascii-tabellen.

 

Det där låter jättesmart, men vi har inte gått igenom det så jag har ingen aning om hur man går till väga. :(

 

skrev ju lite om det i mitt inlägg tidigare

Postad

Hade inget att göra så jag slängde ihop en klass som räknar förekomsten av a-z i textfiler. Lite kluven hurvida jag skulle posta den eller inte var jag eftersom jag inte vill att du ska copy-pasta rakt av men lite exempelkod har väl aldrig skadat.

 

/*
* Count.java
*
* Created on den 10 oktober 2005, 23:32
*
*/

package crypto;

import java.io.*;

/**
*The class that handles the counting of letters in a series of textfiles
* @version 1.0
* @author kydyl
*/
public class Count {

   private int[] totalNumber =new int[26]; //The array that hold the result

   /** Creates a new instance of Count */
   public Count() {
      for (int i = 0; i < totalNumber.length; i++){    //Init the array
           totalNumber[i]=0;
      }

   }


   /**
    * This methods counts the occurences of each
    * letter (a-z) in the files given in
    * files. And returns the result.
    * @param files The paths to the files that are to be examined,
    * seperated by semicolon (;)
    * @return An array containing the number of occurences each
    * letter (a-z) had in the files
    */
   public int[] countIt(String files){
       String[] filePaths = files.split(";"); //each filepath is now
                                              //an element in filePaths

       FileReader myFileReader = null;
       BufferedReader myBuReader = null;
       int readChar;
       for (int i = 0; i < filePaths.length; i++){    //loops for every file
           readChar = 0; //must reset each loop
           try{
               myFileReader = new FileReader(filePaths[i]);
           }
           catch (Exception e){
               System.out.println(e.getMessage());
           }
           myBuReader = new BufferedReader(myFileReader);
           while (readChar != -1){   //loops for every char in a file
               try{
                   readChar = myBuReader.read(); //reads one char in the file
               }
               catch(Exception e){
                   System.out.println(e.getMessage());
               }
               if (readChar >= 97  && readChar <= 122){     //handles lowercase
                   totalNumber[readChar -97]++;  //increments that chars by one
               }
               else if(readChar >= 65 && readChar <= 90){ //handles uppercase
                   totalNumber[readChar -65]++;  //increment that char by one
               }

           }
       }
       return totalNumber;
   }

}

 

äsh, forumet är ju för smalt för att man ska kunna posta kod. ser ju skit ut

Postad

för övrigt är "e" den överlägset vanligast förekommande bokstaven i en engelsk version av bibeln med 404140 förekomster. På god tvåa kom "o" med 262349 förekomster. Och "q" tar jumboplatsen utan problem med bara 958 förkomster.

 

totalt ca 4 miljoner tecken i den versionen jag hittade.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gäst
Svara i detta ämne...

×   Du har klistrat in innehåll med formatering.   Ta bort formatering

  Endast 75 max uttryckssymboler är tillåtna.

×   Din länk har automatiskt bäddats in.   Visa som länk istället

×   Ditt tidigare innehåll har återställts.   Rensa redigerare

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Skapa nytt...