Neste kapittel

Introduksjon til programmering

Forord

Den følgende introduksjonen tar ikke mål av seg til å være en lærebok i programmering. Den tar bare sikte på å være et supplement til en lærebok. Den er spesielt skrevet med tanke på det opplegget vi har i kurset Programmering og den lærebok vi der bruker: Java How to Program av Deitel & Deitel. Håpet er at denne introduksjonen skal bidra til å gjøre det lettere å komme i gang med programmeringen.

En fortsettelse av disse kursnotatene finnes i notatene for kurset Programutvikling.

Innhold

Kapittel 1 — Innledning
Kapittel 2 — Introduksjon til java-applikasjoner
Kapittel 3 — Introduksjon til klasser og objekter
Kapittel 4 — Kontrollstrukturer, del 1
Kapittel 5 — Kontrollstrukturer, del 2
Kapittel 6 — Mer om metoder
Kapittel 7 — Arrayer (tabeller)
Vindusbaserte programmer
Mer om arrayer
Kapittel 8 — Mer om klasser og objekter
Kapittel 9 — Objektorientert programmering: arv
Kapittel 10 — Objektorientert programmering: polymorfisme

Kapittel 1 — Innledning

Hva er et program?

Generelt kan vi si at et program er en serie av instruksjoner. Med instruksjon så menes angivelse av en arbeidsoppgave som skal utføres. For å konkretisere dette kan det være nyttig å bruke analogier med fenomener som vi kjenner fra tidligere, som

Alle disse er kjennetegnet ved at de beskriver en serie av instruksjoner som må utføres for å oppnå et bestemt resultat. Hovedforskjellen mellom disse og et program er i grunnen bare at i tilfellene ovenfor er det et menneske som skal utføre instruksjonene, mens det i tilfelle program er en datamaskin som skal utføre instruksjonene. Det er ikke noe i veien for at vi kan oppfatte de nevnte ting som programmer. Skal de virke etter hensikten, må de være skrevet i et språk som vi kan forstå. Det kan være vanlig norsk (eller tilsvarende), eventuelt supplert med noen spesialuttrykk. I tilfelle musikkstykke må vi bruke noteskrift. For strikkeoppskrift brukes andre spesialsymboler. Sammenlikningen mellom oppgavene ovenfor og et dataprogram holder ganske bra for dataprogrammer i sin enkleste form, det vil si programmer som er laget for å kunne utføre én bestemt oppgave. Dataprogrammer er imidlertid som regel laget for å kunne kommunisere med brukeren, slik at resultatet av hva programmet gjør avhenger av hva brukeren har foretatt seg med bruk av knapper og andre skjermkomponenter. For et slikt program passer ikke analogien med oppgavene på lista ovenfor like godt.

En datamaskin forstår ikke noen av de språk som er nevnt for arbeidsoppgavene på lista ovenfor. Et data-program må derfor skrives i et annet språk — et språk som datamaskinen er konstruert til å forstå. I ytterste konsekvens er datamaskinen bare konstruert til å forstå det som kalles maskinspråk og som er bygget opp av bare to tegn, samt grupperinger av slike. Vi mennesker pleier vanligvis å representere de to tegnene med tallene 0 og 1, og kalle disse for biter eller bits. (I virkeligheten svarer symbolene til at det enten går eller ikke går strøm i en elektrisk leder.) Det er imidlertid svært lite praktisk å skrive programmer uttrykt med bare 0 og 1, selv om det i prinsippet går an. Isteden er det konstruert såkalte programmeringsspråk. Disse består av et lite utvalg av engelske ord, noen spesielle symboler (blant annet forskjellige typer parenteser og skilletegn), og bestemte regler for hvordan uttrykk kan bygges opp. Alt i alt gir det et språk som er mye enklere enn norsk, engelsk og et hvilket som helst annet "vanlig" språk.

Vi skal bruke programmeringsspråket java. Det er nå til dags verdens mest brukte programmeringsspråk. Når et program skrevet i java utføres, eller "kjøres" som vi sier, må det først oversettes til maskinspråk, slik at datamaskinen kan forstå det. Til dette brukes blant annet et eget oversetterprogram som kalles kompilator. Vi sier at vi kompilerer programmet vårt. Da blir det samtidig sjekket om det er skrevet i overensstemmelse med java-språkets regler, dets grammatikk. Ingen feil tolereres! For den aller minste feil blir det skrevet ut en feilmelding på skjermen. Alle feil må rettes opp før vi får utført programmet.

Java som programmeringsspråk

Vi skal, naturlig nok, starte med å lage små programmer. Etter hvert vil de bli noe større. Mange av de programmene vi bruker til daglig, for eksempel tekstbehandlingsprogrammet Word, er svært store. Word er på mer enn 400 000 linjer. Det sier seg da selv at dersom en ikke skal miste oversikten fullstendig, er det helt avgjørende å strukturere og dele opp programmet på en fornuftig måte. Det finnes mange prinsipper å bygge på for å gjøre dette. Noen av mulighetene blir bestemt av selve programmeringsspråket som brukes. I de seinere år har såkalte objektorienterte programmeringsspråk blitt mer og mer dominerende. De gjør det mulig å gi programmet en struktur som svarer til virkeligheten slik vi opplever den, nemlig i form av objekter: hus, biler, bøker, biblioteker etc. Java er et slikt objektorientert programmeringsspråk. I java beskrives alle objekter i form av det som kalles klasser. Et java-program består derfor av en samling av klassedefinisjoner. En klasse beskriver hvilke egenskaper en bestemt type objekt skal ha.

Dersom vi for eksempel tenker på bøker i et bibliotek, så har de en del felles trekk. Alle har blant annet en bestemt tittel og er utgitt på et bestemt forlag. Vi kan tenke på dette som noen av bøkenes egenskaper. I tillegg er det visse operasjoner som kan utføres på bøkene i et bibliotek: de kan lånes ut, vi kan sjekke om de er utlånt, og de kan mottas for innlevering etter et utlån. Men selv om bøkene er karakterisert ved felles egenskaper og operasjoner som kan utføres på dem, er de likevel forskjellige. De har forskjellige titler etc.

I et java-program kan vi beskrive en bok i form av en klasse. De enkelte, konkrete bøkene representerer vi i form av objekter (eller instanser, som det også kalles) av denne klassen. Ut fra én enkelt klassedefinisjon kan vi opprette så mange objekter som vi bare vil.

En klasse, som altså skal beskrive en bestemt type objekt, må nettopp beskrive objektets egenskaper og hvilke operasjoner som skal kunne utføres på det. Egenskapene blir bestemt av det som kalles klassens datafelter eller instansvariable. Operasjonene som kan utføres på objektene blir bestemt av det som kalles klassens metoder. For å definere en klasse må vi dessuten bruke noen av java-språkets nøkkelord og symboler, for å markere at det dreier seg om en klassedefinisjon. En klassedefinisjon får dermed følgende struktur:

public class Klassenavn
{
  //her kommer klasseinnholdet:
  //  - datafelter (variable og konstanter)
  //  - metoder (operasjoner som skal kunne utføres på objektene som
  //                        klassen definerer)
}

Tegnene // signaliserer at resten av linja er en kommentar. Det betyr at det er noe som ikke blir lest av datamaskinen og tatt med som en del av det som programmet skal utføre. Vi tar med kommentarer for at programmet skal være lettere å lese og forstå for mennesker. I dette tilfellet forteller kommentaren i generelle vendinger hva klassen inneholder. Klasseinnhold avgrenses av krøllparenteser { }. Generelt avgrenser krøllparenteser det som i java kalles en blokk.

Ordene public og class er to av javas nøkkelord. Nøkkelord kan ikke brukes til for eksempel navn på variable. I klassenavn bruker vi stor forbokstav. På nesten alt annet bruker vi liten forbokstav. Dermed blir det i et program lett å se hva som er klassenavn og hva som ikke er det. For øvrig bør du bruke navn som er selvforklarende, det vil si som indikerer hvilken rolle det som blir navngitt skal spille i programmet. Da blir programmet både lettere å skrive og lettere å forstå. En klasse som skal definere bok-objekter er det for eksempel naturlig å kalle Bok:

public class Bok
{
  .
  .
  .
}

Når det står nøkkelordet public foran class, klassedefinisjonen ligge i en java-fil som har samme fornavn som klassenavnet. For eksempel må klassen Bok ligge i en fil Bok.java. Navnet må også stemme overens når det gjelder bruken av små og store bokstaver, da java skiller mellom slike.

Klasser og objekter skal vi imidlertid ikke fokusere så mye på i første omgang. Før vi kan begynne å definere våre egne klasser som skal representere bøker og andre ting vi har rundt oss, må vi vite litt om hvordan det som skal stå inni klassene må skrives. Til java-språket er det dessuten knyttet en stor samling av klasser som andre har skrevet. Denne samlingen kaller vi javas klassebibliotek. I alle programmer er vi nødt til å bruke ting fra dette klassebiblioteket. Samtidig som vi lærer om de formelle tingene om klasseinnhold, skal vi derfor lære om hva vi må ta i bruk fra klassebiblioteket og hvordan vi må gjøre dette.

Som tidligere nevnt, består et java-program av en samling av klassedefinisjoner. Når vi skriver et java-program, er vi derfor nødt til å skrive minst én klassedefinisjon. Men de klassedefinisjonene vi skal skrive nå til å begynne med blir bare brukt som en slags innramming til programmet. Vi trenger ikke tenke på dem på den måten at de skal definere et objekt.

Skriving og kjøring av java-programmer

En forutsetning for å kunne utvikle java-programmer, er at Javas programutviklingsverktøy er installert på maskinen. Dette finnes i flere versjoner, som hver har gått gjennom en lang utvikling og i seg selv dermed finnes i flere versjoner. Vi skal i dette kompendiet basere oss på den nyeste versjonen av standardutgaven: Java Standard Edition Development Kit (JDK) 8, kalt Java SE 8. Den kan lastes ned gratis fra adressen http://www.oracle.com/technetwork/java/javase/downloads/index.html. På skolens maskiner skal den allerede være installert, men for å utvikle java-programmer på din egen maskin må du laste den ned og kjøre installasjonsprogrammet. Vi forutsetter i det følgende at JDK 8 er installert på maskinen du bruker.

Når du skal lage et java-program, er det i hovedsak tre forskjellige operasjoner som må utføres etter tur:

  1. Java-koden for programmet må skrives og lagres i en eller flere filer.
  2. Java-koden må kompileres og eventuelle feil må rettes.
  3. Programmet (det vil si den kompilerte koden) kan kjøres.

Det finnes i praksis mange forskjellige muligheter for å få utført de tre skrittene. Et enkelt og greit alternativ å starte opp med, er å bruke programmet TextPad. Det er i utgangspunktet en editor, altså et tekstbehandlingsprogram, men kan i tillegg settes opp til blant annet å kunne kompilere og kjøre javaprogrammer. Vi skal basere oss på å bruke TextPad i dette innføringskurset i programmering.

Merknad Læreboka Java How to Program, Ninth Edition, av Deitel & Deitel, refererer ikke til bruk av TextPad for å utvikle programmer. Framgangsmåten som er beskrevet i det følgende er derfor noe forskjellig fra det som står i avsnitt 1.9 (og videre i avsnitt 2.2) i nevnte lærebok. Dersom du bruker TextPad (eller et av verktøyene nevnt i neste avsnitt), trenger du derfor heller ikke å tenke på det som står om "Setting the PATH Environment Variable" og "Setting the CLASSPATH Environment Variable" foran i boka til Deitel & Deitel.

På markedet finnes det flere forskjellige såkalte programutviklingsverktøy, først og fremst beregnet for mer avanserte programmerere. Disse utviklingsverktøyene er en god del mer kompliserte å bruke enn TextPad. Eksempler på slike verktøy er Eclipse og NetBeans, som for øvrig i seg selv er java-programmer. I tillegg til editor, kompilator og kjøresystem, inneholder disse diverse hjelpeverktøy. For å ha glede av dem, og dessuten skjønne hva som foregår, er det imidlertid en fordel å ha et visst grunnlag i programmering. Derfor venter vi med å ta slike verktøy i bruk.

Følgende bilde viser TextPad-vinduet etter at vi har skrevet inn programkoden til det lille javaprogrammet Velkommen. (I vinduet er det i tillegg noen andre filer som er åpne, blant annet den som inneholder html-koden for dette dokumentet.) En nærmere forklaring på innholdet i programmet Velkommen blir gitt i neste kapittel. Her tar vi bare for oss hvordan vi kan bruke TextPad for å skrive det og kjøre det.

I utgangspunktet vil det ikke være knyttet java-kompilator til TextPad. For å få gjort det, må man gå fram på følgende måte: Under menyen Configure velger man alternativet Preferences.... I det vinduet som man da får opp, klikker man på alternativet Tools, slik det er gjort på følgende bilde.

Dersom man i lista over Tools ikke finner Compile Java, Run Java Application og Run Java Applet, må disse legges til. Man klikker da på knappen Add og velger alternativet Java SDK Commands. I Preferences-vinduet skal du da kunne finne de tre alternativene "Compile Java", "Run Java Application", og "Run Java Applet", slik du kan se på følgende bilde:

Latex og Texify som du ser på bildet, trenger du ikke bry deg om. De har ikke noe med java å gjøre.

For å fullføre valget klikker du OK.

Kompilering

Programkode må lagres i filer. Samtidig som du skriver inn koden, bør du ofte foreta lagring. Da unngår du at du ved et uhell mister mye av det arbeidet du har gjort. Det er bestemte regler for hvordan filnavnene som inneholder programkode må være. Disse reglene blir forklart nærmere i neste kapittel. Programmet som er vist på første bilde ovenfor må lagres på en fil som heter Velkommen.java.

Når vi har skrevet inn programkoden for et program og lagret den i en java-fil, kan vi kompilere det. I TextPad velger vi da menyalternativet Tools/External Tools/Compile Java, som vi også kan få ved hurtigvalget Ctrl-1. En melding om utfallet av kompileringen vil da bli vist nederst i TextPad-vinduet. Neste bilde viser TextPad-vinduet etter kompilering av programmet Velkommen omtalt ovenfor.

I dette tilfelle oppsto det ingen kompileringsfeil. Dersom programmet inneholder såkalte syntaksfeil, som vi kan sammenlikne med grammatikalske feil i vanlig språk, vil disse resultere i det vi kaller kompileringsfeil. Tilbakemeldingen fra kompilatoren vil da inneholde beskrivelser av feilene og angivelse av på hvilken eller hvilke linjer i programkoden de oppsto. Slike feil må rettes opp. Programmet må være uten kompileringsfeil for at vi skal kunne få kjørt det.

Dersom du ikke får vist linjenumre i editoren til TextPad, kan du få det fram på følgende måte: I vinduet som du får fram ved å velge menyalternativet Configure/Preferences... klikker du på View og krysser av for Line numbers, slik du ser det er gjort på bildet under. Deretter klikker du OK.

Kjøre program

Når et program er skrevet inn og er uten kompileringsfeil, kan du i TextPad kjøre det ved å velge menyalternativet Tools/External Toos/Run Java Application, som du også kan få ved hurtigvalget Ctrl-2. Følgende bilde viser resultatet av å kjøre programmet Velkommen. Utskriften blir i dette tilfelle vist i det svarte, såkalte konsollvinduet. De fleste programmene våre skal vi lage slik at vi får utskriften i såkalte grafiske vinduer, som er den "vanlige" vindustypen. (Det er den typen som er vist på alle bildene ovenfor.)

Neste kapittel

Copyright © Kjetil Grønning og Eva Hadler Vihovde, revidert 2014