Subject: Anu Hillerand/demo9/1,3,4,9

From: Anu Maarit Hillebrand <[email-masked]>
Date: Tue, 22 Nov 1994 15:47:23 +0200 (EET)

/***************/
/*  Teht1      */
#include <stdio.h>
#include <string.h>

//****************************************************************************
char *Tilat[] = {"Sammutettu","Sytytetty"};

class kuvio_jolla_kp {
  int  nakyy;            // Sytytetty vai sammutettu
  int  vaihda_paikka(int nx, int ny);
  protected:             // Jos halutaan peri„ luokka, pit„„ yht. osien olla prot
  char nimi[20];         // Nimi, jotta ostataan tulostaa mist„ oliosta kyse
  int x,y;               // Koordinaatit
public:
  kuvio_jolla_kp(char *s="kp",int ix=0,int iy=0) {
    nakyy=0;
    x=ix; y=iy; strcpy(nimi,s);
  }
  virtual ~kuvio_jolla_kp() { sammuta(); }// Poistetaan olio aina lopuksi.
  int nakyvissa() {      // Onko olio n„kyviss„
    return nakyy;
  }
  int sammuta();         // Poistaa olion n„yt”st„
  int sytyta();          // Sytytt„„ olion n„ytt””n
  int siirra(int nx=0,int ny=0);
  virtual int piirra() { // Suorittaa olion todellisen piirt„misen, oma jok.
    printf("Kp : %-10s %-10s:(%02d,%02d)\n",Tilat[nakyvissa()],nimi,x,y);
    return nakyvissa();
  }
};

int kuvio_jolla_kp::vaihda_paikka(int nx, int ny) {
    x = nx; y = ny; return nakyy;
}

int kuvio_jolla_kp::sammuta()
{
  if ( !nakyy ) return 0;
  nakyy=0;
  return piirra();
}

int kuvio_jolla_kp::sytyta()
{
  if ( nakyy ) return 1;
  nakyy=1;
  return piirra();
}

int kuvio_jolla_kp::siirra(int nx, int ny)
{
  if ( !nakyy ) return vaihda_paikka(nx,ny);
  sammuta();
  vaihda_paikka(nx,ny);
  return sytyta();
}

class kuvio_jolla_kp_ja_sade : public kuvio_jolla_kp {
protected:
  int r;
public:
  kuvio_jolla_kp_ja_sade(char *s="kp&sade",int ix=0,int iy=0, int ir=1)
  : kuvio_jolla_kp(s,ix,iy) {;}
  virtual ~kuvio_jolla_kp_ja_sade() { sammuta(); }
  virtual int muuta_koko(int nr) {
    if ( !nakyvissa() ) { r = nr; return 0; }
    sammuta(); r = nr; return sytyta();
  }
};

class piste : public kuvio_jolla_kp {
public:
  piste(char *s="piste",int ix=0,int iy=0) : kuvio_jolla_kp(s,ix,iy){
  }
  ~piste() { sammuta(); }// Poistetaan olio aina lopuksi.
  int piste::piirra() {  // Suorittaa olion todellisen piirt„misen, oma jok.
    printf("Piste : %-10s %-10s:(%02d,%02d)\n",Tilat[nakyvissa()],nimi,x,y);
    return nakyvissa();
  }
};

class ympyra : public kuvio_jolla_kp_ja_sade {
public:
  ympyra(char *s="ympyra",int ix=0,int iy=0, int ir=1)
  : kuvio_jolla_kp_ja_sade(s,ix,iy) {
    r = ir;
  }
  ~ympyra() { sammuta();}

  int ympyra::piirra() {  // Ympyr„n todellinen piirt„minen
    printf("Ympyr„: %-10s %-10s:(%02d,%02d) r=%d\n",
                     Tilat[nakyvissa()],nimi,x,y,r);
    return nakyvissa();
  };
};

class nelio : public kuvio_jolla_kp_ja_sade {
public:
  nelio(char *s="nelio",int ix=0,int iy=0, int ir=1)
  : kuvio_jolla_kp_ja_sade(s,ix,iy) {
    r = ir;
  }
  ~nelio() { sammuta();}

  int nelio::piirra() {  // Ympyr„n todellinen piirt„minen
    printf("Nelio: %-10s %-10s:(%02d,%02d) r=%d\n",
                     Tilat[nakyvissa()],nimi,x,y,r);
    return nakyvissa();
  };
};

//****************************************************************************
int main(void)
{
  printf("---------------------------------------------------------------\n");
  piste  a("a"),b("b",2,5);
  ympyra y("y",3,3); nelio n("n",10,10,11);
  a.sytyta(); y.sytyta(); n.sytyta(); b.sytyta();
  a.siirra(3,3); b.siirra(); y.muuta_koko(7); n.muuta_koko(1);
  return 0;
}

/**************/
/* Teht3      */
Jos ympyra::mahtuuko on kirjoitettu inline-funktioksi, niin kaantaja valittaa
's' ei ole 'nelion' jasen. Funktio voidaan esitella vasta, kun 'nelio'- luokka
on ensin esitelty.

/***************/
/* Teht4       */
Joudutaan muuttamaan ympyra- ja nelioluokkia , koska kolmion testaamiseen
tarvitaan myos keskipisteita.

/***************/
/* Teht9       */
#include <stdio.h>
#include <string.h>

class tiedosto {
  FILE *f;
  char nimi[13];     // tiedoston nimi
  int nro;           // tiedoston numero
public:
  tiedosto(char *s,int k) { strcpy(nimi,s); nro=k; luku=0; f = NULL; }
  int avaa() {
    f = fopen(nimi,"r");
    if (f = NULL) return nro;
    return 0;
  }
  int lue();
  int sulje() { if ( f ) fclose(f); }
  ~tiedosto() { sulje(); }
};

int tiedosto::lue()
{
  int luku;          // mika tiedoston kirjain luettiin
  while (!feof(f)) { luku = fgetc(f); if (luku) break; }
  return luku;
}

int tiedostot(tiedosto &a, tiedosto &b, tiedosto &*c)
{
  int i;
  int s;
  try {
    if ( ( s = a.avaa() ) != 0 ) throw;
    if ( ( s = b.avaa() ) != 0 ) throw;
    if ( ( s = c.avaa() ) != 0 ) throw;
    s =  a.lue() + b.lue() + c.lue(); throw;
  }
  catch (...) {
    c.sulje();
    b.sulje();
    a.sulje();
  }
  return s;
}

int main(void)
{
  int k;
  tiedosto a("tied1.txt",1), b("tied2.txt",2), c("tied3.txt",3);

  k = tiedostot(&a,&b,&c);
  printf("\n\n%d\n",k);

  return 0;
}