Pääteohjaus 4
Tässä ohjauksessa harjoitellaan osiinjaetun tiedoston kääntämistä ja itse valmiiksi kirjoitettujen aliohjelmakirjastojen käyttöä.
Projekti
Mene omaan hakemistoosi KOVALEVYLLÄ ja luo sen alle hakemisto nimeltä KERHO ja vaihda itsesi sinne.
Kopioi KERHO-ohjelma omaan hakemistoosi:
C:\MyTemp\ohj\vesal\KERHO>copy n:\kurssit\cpp\kerho\etsilaj.5\*.*[RET]
Käynnistä Borland-C (BC[RET]).
Aloita uusi projekti ([Alt-P] ja Open Project).
Anna projektin nimeksi KERHO.
Avaa tiedosto kerhomai.cpp ja laita projektiin ne tiedostot,
jotka tiedoston kerhomai.cpp kommenteissa pyydetäään laittamaan projektiin (lisäämistä varten paina [Ins]):
tulkitse esim CPP\ALI\MJONOT.C => N:\KURSSIT\CPP\ALI\MJONOT.C
Katso, että kohdan Options|Directories kohdassa Include
Directories lukee (älä hävitä rivin alkua!):
....INCLUDE;N:\KURSSIT\CPP\ALI
Jollei lue, niin lisää viimeinen hakemisto.
Kokeile ajaa ohjelmaa (valmiina on kerho KELMIT). Toimiiko
kuten suunniteltu?
Breakpoint
Otetaan lyhyt debuggerin kertausharjoitus. Debuggerilla ohjelmaa pystyttiin ajamaan mm. askel kerrallaan. Oikeassa
ohjelmassa kukaan ei jaksa kahlata koko ohjelmaa tällä tavoin läpi. Pitää keskittyä vain olennaisuuksiin.
Tämän vuoksi debuggerissa on mahdollisuus laittaa keskeytyskohtia, eli paikkoja joihin tultaessa pysähdytään, muuten
ohjelmaa ajetaan normaalisti. Keskeytyskohtia voidaan laittaa myös ehdollisesti hyvinkin monipuolisesti. Kaikkein
hienoimmissa systeemeissä keskeytys saadaan jonkin tietyn
muuttujan saadessa tietyn arvon (tai yleensä muuttuessa)
missä tahansa kohti ohjelmaa.
Epäilet, että metodi cNaytto::kysy_tiedot ei toimi. Toimimattomuus ilmenee (ilmenisi esimerkiksi, koska nyt toimii)
jotenkin henkilön lisäämisessä. Epäilet erityisesti aliohjelmaa kysy_kentta (NAYTTO.CPP).
Avaa tiedosto NAYTTO.CPP (esimerkiksi näyttämällä tiedoston
nimeä projekti-ikkunassa tai painamalla [F3]).
Etsi aliohjelma kysy_kentta ([Ctrl-Q]F kysy_kentta[RET]). Mikäli ei löydy 1. yrittämällä, niin [Ctrl-L] etsii uudelleen.
Siirry aliohjelmassa riville jolla lukee
if ( paluu < OLETUS ) return TOIM_LOPETA;
ja laita riville keskeytyskohta (breakpoint, joko [Ctrl-F8] tai [Alt-D] ja Toggle breakpoints).
Lisää watch-ikkunaan aliohjelman kannalta mielenkiintoisia
arvoja:
paluu
toim
apu
jono
viesti
Aja ohjelma [Ctrl-F9] siten, että yrität lisätä jotakin tietoa. Kun ohjelma pysähtyy, aja askel kerrallaan joko suorittaen tai ylittäen aliohjelmat. (Huom! Koska mjonot.c
tiedostoa ei kannata debuta, pitää sinne kuuluvat kutsut
ajaa [F8]-nappulalla!). Seuraa muuttujien arvon käyttäytymistä. Kun olet "steppaillut" ulos epäilemästäsi
aliohjelmasta paina taas [Ctrl-F9]. Jatka tätä
kunnes "Olet saanut vian selville". Sitten voit poistaa
keskeytyskohdan vastaavasti kuin sen asetitkin. Huom!
Keskeytyskohtia voi olla useitakin.
Kokeile joitakin muita kohtia vastaavasti (mielellään sellaisia, joista itse olet kiinnostunut, esimerkiksi metodia
lue_tiedostosta tiedostossa kerho.cpp ).
Näin voit aina menetellä, mikäli ohjelmastasi löytyy toimimattomia (tai epäilyttäviä) kohtia jonkin pitkän rämeikön
takaa. Muista sitten joskus lopuksi myös poistella keskeytyskohdat!
lue_jono_oletus
HUOM!: Kannattaa ehkä tehdä seuraavna kohdan (string-luokka) ohjelma
Kokeillaan lue_jono_oletus aliohjelman toimintaa.
Sulje kaikki ikkunat.
Aloita uusi projekti nimellä lue.
Lisää projekti-ikkunaan vielä kirjoittamaton tiedosto lue.c.
Lisää myös n:\kurssit\cpp\ali\mjonot.c (voit myös kopioida
aliohjelmat omaan hakemistoosi ja laittaa vain mjonot.c).
Kirjoita seuraava pääohjelma tiedostoon lue.c:
#include <stdio.h>
#include "mjonot.h"
int main(void)
{
char nimi[40]="Minä";
int paluu;
paluu = lue_jono_oletus("Anna nimesi",17,33,nimi,nimi,sizeof(nimi));
if (paluu == OLETUS) printf("Et muuttanut nimeä!\n");
printf("Nimesi oli %s\n",nimi);
return 0;
}
Jos ohjelma ei käänny, niin tarkista että kohdan
Options|Directories kohdassa Include Directories lukee:
....INCLUDE;N:\KURSSIT\CPP\ALI
Jollei lue, niin lisää viimeinen hakemisto.
Kokeile käyttää ohjelmaa siten, että kirjoitat joskus uuden
nimen ja joskus vastaat pelkän [RET].
Muuta ohjelmaa siten, että nimi muutetaan isoiksi
kirjaimiksi ennen tulostamista ja kokeile.
Muuta ohjelmaa siten, että nimi muutetaan alku-isoiksi
kirjaimiksi ennen tulostamista ja kokeile.
Muuta ohjelmaa siten, että kaikki turhat välilyönnit
poistetaan ja kokeile.
Kokeile mitä merkitystä on parametrien 17 ja 33 muuttamisella.
Kokeile korvata ensimmäinen kutsussa oleva nimi-parametri
vakiolla "Kalle".
Poistu käyttöjärjestelmään ja kopioi hakemiston
n:\kurssit\cpp\ali sisältö omaan hakemistoosi.
Käynnistä jälleen Borland-C ja luo nyt uusi projekti nimelle
lue2.
Lisää projektiin tiedostot lue.c ja mjonot.c (ei tarvitse
nyt polkua).
Käännä ohjelma. Siis aliohjelmakirjastot voi joko kopioida
omaan hakemistoon tai käyttää tietystä hakemistosta. Levyaseman nimeä ei kuitenkaan mielellään saa laittaa polkuihin!
string-luokka
Tee uusi projekti luecpp, lisää siihen lue.cpp:
#include <iostream.h>
#include "mjonotpp.h"
int main(void)
{
string nimi("Minä");
int paluu;
paluu = lue_jono_oletus("Anna nimesi",17,33,nimi);
if (paluu == OLETUS) cout << "Et muuttanut nimeä!\n";
cout << "Nimesi oli " << nimi << endl;
return 0;
}
Lisää vielä projektiin mjonot.c ja mjonotpp.cpp (sekä
string.cpp jos käytät jotakin vanhempaa kääntäjää < BC 4.5?)
Muuten tee samat tehtävät kuin edellisessä kohdassa.
pvm
Mene komentoriville ja kopioi hakemiston
n:\kurssit\cpp\demot sisältö omaan hakemistoosi.
Käynnistä Borland-C ja luo projekti nimeltä pvm_test. Lisää
projektiin tiedostot t_pvm.c ja pvm.c.
Katso, että tiedosto t_pvm.c on seuraavanlainen seuraavasti
(korjaa jollei ole):
#include <stdio.h>
#include "pvm.h"
...
int main(void)
{
/* tayta_kk_1(KK_1); */
testaa_kv();
/* testaa_pvm(); */
return 0;
}
Kokeile ajaa ohjelmaa.
Korjaa tarvittaessa tiedostoa pvm.c.
Kokeile tehdä demotehtäviä ja tee niitäkin varten jonkinlainen testipääohjelma.
avustus (help)
Lue avustuksen käyttämisen ohjeet tiedostosta help.h.
Tee pieni (alle 10 riviä) testipääohjelma avustuksen testaamiseksi.
Kirjoita pieni (muutama aihe) avustustiedosto.
Kokeile ohjelman toimintaa.
Leikkaaminen (cut tai copy) ja liimaaminen (paste)
Aikaisemmissa pääteohjauksessa opeteltiin merkitsemään lohkoja ja siirtämään tai kopioimaan niitä paikasta toiseen.
Helpointahan tämä oli, mikäli käytössä on editori, jolla
voidaan pitää useita ikkunoita auki yhtäaikaa.
Tällöin toimittiin seuraavasti:
Siirry ikkunaan josta haluat leikata.
Maalaa alue:
- joko alueen alkuun ja [Ctrl-K]B ja alueen loppuun [Ctrl-K]K
- tai alueen alkuun tai loppuun, paina ja pidä [Shift]
pohjassa ja siirry alueen toiseen kulmaan
tai maalaa hiirellä siirtymällä alkuun ja painamalla ja pitämällä näppäin pohjassa siirrytään alueen toiseen kulmaan
laita lohko leikekirjaan
[Ctrl-Ins] = kopioi
-
- [Shift-Del] = leikkaa
Siirry ikkunaan (tai paikkaan) jonne haluat tuloksen.
"Liimaa" leikekirjan sisältö haluttuun paikkaan [Shift-Ins]
Mikäli leikekirjaa tai useita ikkunoita ei ole, voidaan aina
menetellä seuraavasti:
Siirry tiedostoon josta haluat palan.
Merkitse lohko.
Kirjoita lohko levylle vaikkapa nimelle A. ([Ctrl-K]WA.[RET])
Siirry tiedostoon jonne haluat tuloksen.
Lue tiedosto A. levyltä ([Ctrl-K]RA.[RET]).
Samassa tiedostossahan lohko pystyttiin siirtämään tai kopioimaan:
Merkitse lohko
Laita lohko leikekirjaan (kopioi tai leikkaa)
Siirry kohtaan johon haluat lohkon.
Paina [Shift-Ins] (liimaa).
Tietysti siirto tai kopiointi käy hienosti myös leikekirjan
kautta, mikäli leikekirja on olemassa. Leikekirjan käytössä
on vielä se etu, että leikekirjan sisältö säilyy muuttumattomana kunnes sinne laitetaan jotain uudestaan.
Merkitse rivin alusta seuraavan rivin alkuun
Yleensä lohkot kannattaa merkitä siten, että alkupaikka merkitään RIVIN ALKUUN ([Home]) ja loppupaikka sen rivin
alkuun, jota ei enää lohkoon haluta. Näin merkittynä lohko
sisältää mukavasti kaikki tarvittavat rivinsiirrotkin!
Tietysti jos haluat leikata vaan osan riviä (esimerkiksi inhottavan muuttujan nimen), niin silloin merkitään tasan haluttu osa!
@comment(
Oma harjoitustyö
Tee omaa harjoitustyötäsi ja kokeile sen kääntämistä yms.
Voit (JA KANNATTAA) leikkailla palasia malliohjelmasta!
Muista edetä vain niin pieni palanen kerrallaan, että se
voidaan heti testata toimivaksi.
)