Strängar och tecken

Att visa text på fönstret går naturligtvis med det kräver oftast lite programkod runt omkring. För att slippa det använder vi i början endast console-fönstret (svart ruta under kodfönstret). Vi använder instruktionen

- println() (med radbyte)
- print() (utan radbyte)

för utskrift i detta fönster!.

För hantering av enstaka bokstäver finns en speciell variabel:

char

En sådan variabel kann håller ett tecken. Det kan utöver bokstäver vara vilket tecken som helst. TEX skickas alla tangentslag från tangentbordet som tecken. Ett par exempel hur sådana variabel deklareras och initialiseras. OBS! enkla citationstecken!

    char tecken;
    char bokstav = 'A';  // OBS! enkla citationstecken!
    char tab = '\t'; // motsvara tabulator
    char nyRad = '\n'; // Radbyte
    char citTecken = '\"'; // Om det behövs ett citationstecken i texten

I grunden kan datorer hantera bara tal. Att det blir bokstäver kräver en tolkning. det sker enligt språkspecifika tabeller. De första 128 tecken är lika för alla länder. Kolla den här tabellen för detaljer, särskild kolumnerna Decimal och char. Det är tal som finns i datorns minne, varje program som vill visa bokstäver på skärmen tolka det enligt tabellen.

Åtkomst till teckenkoden

det är faktiskt ganska lätt att konvertera en bosktav till sitt motsvarande talvärde. Dessutom kan man 'räkna' med bokstäver dvs talvärdet enligt tabellen. Testa det här. Utskrift i konsollfönstret:

import java.util.Random;

Random rnd = new Random();

void setup(){

    // Ex. 1
    char teck = 'A';  // Initialisera teck
    println(teck);      // skriv ut 

    int tCode = teck;   // överför till en int. Då används tabellen
    println(tCode);     // kolla decimal i tabellen  för A 

    // Ex 2: Räkna med tecken 
    teck++;         // hoppa fram i tabellen ett steg, A blir B
    println(teck);

    teck+= 32;      //hoppa fram 32 steg i tabellen
    println(teck);

    //Ex 3: Slumpvald stor bokstav
    int slmp = rnd.nextInt(25)+ 65;
    char slmpChar = (char) slmp;   //typkonvertering int --> char
    print(slmp + ": " +  slmpChar); 
}

Övning

a) Vilken tecken kod har \t och \n dvs tabstopp och radbyte? Kolla tabellen men testa själv med ett program (kolla första exempel).

b) Slumpa fram en liten bokstav. (Se sista exempel)

Typkonvertering char

Att kommer åt teckenkoden går genom att överföra en char till en int. ( int tCode = teck; ). Här görs en sk implicit typkonvertering. Typkonvertering innebär att ett värde överförs till en variabel av en annan typ, här char till int. Andra hållet kräver en sk explicit typkonvertering char slmpChar = (char) slmp;. Denna rad läses från höger till vänster:

värdet från slmp överförs via typkonvertering (char) till variabeln slmpChar som är av typen char.

Implicit betyder inte klart utsagd, underförstådd. Explicit betyder uttryckligt, uttryckligen, tydliggjort.

Varför implicit på det ena hållet men explicit åt andra? Java (som andra språk) försöker hjälpa programmerare. Det krävs explicit konvertering om det finns risk att information går förlöra. Talvärdet för en char-variabel ligger mellan 1 och 2^16=65536 för att det reserveras två bytes ( 2 x 8-bit) för en sådan och det kan spara i alla fall in en int-variabel. Tvärtom kan det finnas tex 7203422 i en int variabel och då tappas information vid överföring till en char med 16-bitar plats. I regel kan man säga att det krävs en explicit konverting vid risk av förlorad information. Andra hållet kan det går utan explicit konvertering. Ett par exempel:

float fTal = 12.25;  
int iTal = (int) fTal; // expl. konvertering, allt efter komma klipps bort. 
fTal = iTal;           // impl. konvertering. Alla heltal kan sparas i en float; 

double dTal = 12.25; 
fTal = (float) dTal;  // en double kan innehålla mer info än float (32-bitar) ffa fler decimaler. 

Stränger

en sträng är en variabel som innehåller flera tecken. Den kan har vilken längd som helst men läggs fast när man tilldela ett värde. För att lägga in fast text i programkod sätts texten mellan dubbla citationstecken:

String namn = "Erik Dahlbergsgymnasiet"; 

Nu har vi en sträng (String) som innehåller 23 tecken, mellanslag räknas med. String har ingen fast längd men för varje bokstav krävs två byte. En sådan sträng är 'immutable' det kan inte ändras enstaka bokstäver efter initialisering. Ändå finns det vissa operationer som kan genomföras:

String namn = "Erik Dahlbergsgymnasiet"; 
String gata = "Föreningsgatan 2"; 

String adress = namn + ", " + gata;  // lägga ihop namn  ", " och gata till ny sträng adress;
adress += " 55502 Jönköping" ; // lägg till "55502 Jönköping" till strängen adress.

println(adress); // hela adressen skrivs ut 

Plustecken i samband med strängar kallas konkatenering. konkatenering innebär att lägga ihop två strängar. Det händer i tredje och fjärde raden i koden ovan.

3: namn och ", " läggs ihop. Resultatet läggs ihop med innehållet av gata.

4: adress förlängs med " 55502 Jönköping" . Det verka som om det 'immutable' sträng adress har ändrats. I praktiken läggs de två ihop på ett nytt ställe i minnet och detta ställe kallas igen adress. Kolla den här bilden för mer

konkatenering fungera även vid blandningar av string med int, float, double. Om det finns flera 'plus' så sker utvärdering vänster till höger. Mellan två taltyper är det addition, mellan sträng och tal blir konkatenering. Beakta skillnaden i utskrift:

int a = 10;
int b = 5; 
char ms = ' ';
println("Resultat:" + ms + a + b);  // blir  Resultat: 105
println(a + b + " är resultatet!: "); // 15 är resultatet!
println(a + ms + b);  // ms motsvarar här 32. däför blir det 10 + 32 + 5 = 47!!! 

Typkonvertering String

Det finns även möjlighet till typkonvertering från String till tal (int, double, float). Oftast nödvändig när användaren får mata in. Det är i första läge en sträng dvs en följd av tecken. Även om det är tal som programmet ska räkna med. Vid inmatning överförs tecken efter tecken. så om användaren mata in 1337 så är det tecken 49 51 51 55 (kolla den här tabellen igen. För att tolka det till ett tal datorn kan räkna med finns det en del metoder beroende på typ:

String textTal = "1337";
  int iTal = Integer.parseInt(textTal);

  String paj = "3.142459";
  float fTal = Float.parseFloat(paj);
  double dTal = Double.parseDouble(paj);

Strängar har metoder

Strängar är objekt i Java och det finns en hel del metoder och egenskaper som följer med på köpet. Man kan komma åt enstaka tecken tecken, delar av strängen eller om ett viss tecken är med:

String namn = "Erik Dahlbergsgymnasiet";

char femte = namn.charAt(5);
println("Bokstav på index=5: " + femte );  // 'D' för att index börja på 0!
int ndx = namn.indexOf('e');
println("Första 'e' är på index " + ndx);
int len = namn.length(); 
println("Strängen har " + len + " tecken.");

// En sträng kan splitras i delar vid angiven skiljetecken, här mellanslag
// Resultatet är ett fält av strängar (ord)
String mening = "My brain has too many tabs open";
String[] ord = mening.split(" ");  //

  for (String o : ord) {
    println(o);
  }

  //eller
  for(int i = 0; i < ord.length;i++){
  println(ord[i]);
  }

  //Från sträng till tal
  String talsamling = "12;45;35;65;77;16;51";
  String[] talStrangar = talsamling.split(";");  // splitrar strängen talsamling till FÄLTET talStrangar.

  for (int i = 0; i < talStrangar.length; i++) {
    print(talStrangar[i] + "\t");
    int tal = Integer.parseInt(talStrangar[i]);  // tolka till heltal
    println(tal * 10); // bara visa tt man kan räkna med tal
  }


Laboration 1

Laboration 1

I konsollfönstret

1 Skriv ett program som skriver ut alla tecken från 32 till 255 (med en for-sats). Gör det i en loop som skriver ut talet och sedan motsvarande tecken. Vilka tal motsvara å ö ä eller Å Ö Ä?

2 Ett program som fråga efter ett namn/ord och skriver ut den med extra mellanrum så tex Stefan blir S t e f a n. Så i en loop skriv ut ett tecken åt gången och ett mellanslag. Använd här print() i stället för println(), (Se längs upp på sidan för farklaringen)

3 Ett program skriver ut namnet/ord vertikal dvs en bokstav per rad

4 Ett program som kolla om en inmatad mailadress är godkänd dvs om ett @ är med. Metoden .indexOf( char ) hälper här!

5 Ett program som genererar ett slumpaktik lösenord. Du kan göra så här:

String charPool = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#";

Du kan nu välja tex 10 av dessa tecken med hjälp av ett slumptal som kan tas fram med rnd.nextInt( charPool.length()

6 Ett program som frågar efter en mening och skriver ut orden i baklänges ordning. Så "Hej jag heter Peter" blir "Peter heter jag hej".

Extrauppgift: Kolla om '>' eller '<' fungera i samband med char och String.



I det vanliga grafikfönstret

Vi kan visa text med instruktionen text( text,x,y); så till exempel text("en bit text",10,50); eller text('A',10,50); men även text(namn.charAt(5),10,50);

7 Ett program skriver ut namnet/ord vertikal.

8 Skriv ut ett ord så att bokstäver blir större och större. Första med 12px, andra med 13px , tredje med 14px, ....

9 Ett program som skriver namnet/ordet i en ring. Använda rotate och translate på rätt sätt. Se till att bokstäverna för delas på hela ringen. Kolla igen på kapitlet Koordinatsystem hur vi gjorde med klockan.