Ohjelmointi++ 2002/ 18.3

Demo 9


Huom! Tästä demosta alkaa demojakso 2, eli jokainen lähtee 0%:sta liikkeelle. Katsokaa työkirjan kaavasta, miten nämä loput demot vaikuttavat arvosanaan! Jaksossa jokaisen kerran maksimina lasketaan 8 tehtävää, eli enää ei ole mahdollista kerätä yli 100%.

Huom! Tämän demon tehtävät ovat tehtävät 6-10, B1-2 + välikokeen 25.3.1998 tehtävät 1-5 (demoissa saa vastata tietysti kaikkiin). Tehtävä 5 on vaihdettu vuoden -99 välikokeen tehtävään, koska -98 tehtävä 5 on jo tehty aikaisemmissa demoissa. Liitteena on vielä vuoden -98 mallivälikoe ja sen vastaukset, josta voi treenata itseään. Oikeassa välikokeessa EI tarvitse osata tehdä pelkkiä C-ohjelmia, eikä tarvitse osata C/C++ eroja, vaan tehtävät ovat mieluummin muotoa: "kirjoita C++-ohjelma...". Tietorakeneet voivat olla esim. samanlaisia kuin tehtävän 7 taul_d.cpp -tehtävässä. Yleensä pyrin laittamaan ainakin yhden "omatoimista soveltamista" mittaavan tehtävän, eli vähän erilaisen kuin näissä harjoituksissa - kuitenkin kurssin sisältöön liittyvän.


6*
Tee aliohjelma
    int poista(int taulukko[],int lkm,int n)
joka poistaa taulukosta kaikki luvun n esiintymät.
   int t[]={4,7,6,3,6,2};
   int lkm=6;

lkm = poista(t,lkm,6); /* => t = {4,7,3,2}, lkm = 4 */



7*.
Kirjoita taul_d.cpp (ks. moniste 16.5) taulukolle metodi sijoita, jolla voidaan sijoittaa taulukkoon toinen taulukko:
...
int main(void)
{
  cTaulukko luvut(7);
  luvut.lisaa(0); luvut.lisaa(2);
  cout << luvut << endl;
  cTaulukko taul;
  taul.sijoita(luvut);   // tai jopa  taul = luvut;
  cout << taul << endl;  // tulostaa saman kuin edellä
  return 0;
}
8.
Kirjoita cTaulukko -luokalle 1. tehtävää (tehtävä nro 6) vastaava metodi poista. Mitä parametrejä tämä metodi tarvitsee?
9*.
Pääteohjauksessa 1.5 piti kirjoittaa seuraava tiedosto:
000 En enää turhaan kirjoita!
001 En enää turhaan kirjoita!
002 En enää turhaan kirjoita!
003 En enää turhaan kirjoita!
...
099 En enää turhaan kirjoita!
Tee nyt ohjelma, joka kirjoittaa tiedoston puolestasi. Mitä ohjelma voisi kysellä käyttäjältä?

10.
kassa2.cpp:n tehtävä 8: lue_tiedosto.
B1-2
Kirjoita C++-kieliset luokkamäärittelyt, joilla saat seuraavan näköiset rakenteet sekä kirjoita vastaavien muuttujien määrittelyt ja sijoituslauseet jotta rakenteessa olisi samat tiedot kuin kuvassa:
 +-------------+ 
 |     7       |
 |     3       |
 |      o------+----------------------------------------+ 
 |      o------+-----------------+                      |
 |      o      |                 |                      |
 +------+------+                 v                      |
        |                    +--------------+           v
        v             +----->|Kassinen Katto|        +-----+
  +----------+        |      |Katto         |        |  5  | 0
0 |     o----+--------+      |3452          |        +-----+
  +----------+               |       o------+------->|  9  | 1
1 |     o----+--------+      +--------------+        +-----+
  +----------+        +----->+-------------+         |  3  | 2
2 |     o----+-------------->|Susi Sepe    |         +-----+
  +----------+               |Takametsä    | +------>|  2  | 3
3 |          |               |-            | |       +-----+
  +----------+               |       o-----+-+       |  1  | 4
4 |          |               +-------------+         +-----+
  +----------+                                       |  0  | 5
5 |          |                                       +-----+
  +----------+              
6 |          |              
  +----------+                                                


OHJELMOINTI+ -98 1. Välikoe Ke 25.3.1998

Vastaa 4 tehtävään (yht. max 24 pistettä). Jos vastaat useampaan, arvostellaan 4 huonointa. Jos ohjelmatehtävissä käytät standardifunktioita tai metodeja, muttet muista tarkkaan funktin tai metodin nimeä, kirjoita "Kuvittelemasi" esittely funktiolle tai metodilla. Aikaa 4 tuntia.

1a) Pöytätesti

Mitä seuraava ohjelma tulostaa? Tutki PÖYTÄTESTIN avulla! (4p)
#include <iostream.h>
#include <iomanip.h>
/* 01 */
/* 02 */ int a = 199;
/* 03 */
/* 04 */ class cJemma {
/* 05 */   int j;
/* 06 */ public:
/* 07 */   cJemma()  { j = a; a += 10; }
/* 08 */   ~cJemma() { a = j; cout << "moikka\n"; }
/* 09 */ };
/* 10 */
/* 11 */ int Ali(int *p)
/* 12 */ {
/* 13 */   a = 33;
/* 14 */   cJemma j;
/* 15 */   *p = a;
/* 16 */   return a > 100;
/* 17 */ }
/* 18 */
/* 19 */ int main(void)
/* 20 */ {
/* 21 */    int u = a;
/* 22 */    cJemma jm;
/* 23 */    cout << setw(3) << u << endl;
/* 24 */    cout << setw(3) << Ali(&u) << endl;
/* 25 */    cout << setw(4) << u << setw(4) << a << endl;
/* 26 */    return 0;
/* 27 */ }

1b) Esikääntäjä

Miten esikääntäjä kääntää seuraavan koodin: (2p)
#include <iostream.h>
#include <iomanip.h>

#define N_S(s) s,sizeof(s)

int main(void) { char s[30]; cin.getline(N_S(s),'\n'); return 0; }


2. Silmukat ja merkkijonot

Kirjoita funktio pisin_nouseva, joka palauttaa C++ merkkijonosta pisimmän pelkästään kasvavan (samoja tai aakkosissa aina edeltäjäänsä "suurempia" merkkejä sisältävän) merkkijoukon pituuden
Esimerkki:
  "abajiuxac"   => 3  (eli iux)
  "kissa"       => 3  (eli iss) 

a)
Kirjoita ensin algoritmi, saat jakaa ongelman pienempiinkin osiin :-).(2p)
b) Toteuta em. algorimi C++ -kielellä.(4p)

3. Tiedostot

Kirjoita ohjelma (kieli vapaa), joka lukee tiedostoa, jossa on välilyönnein toisistaan erotettuja lukuja ja sanoja, ja kopioi toiseen tiedostoon ne rivit, joiden alussa on luku, joka on suurempi kuin 30.(6p)
Tiedostosta:             tulee tiedosto:   
-----------------------------------------------------
33 hiljaa 1 hiipii       33 hiljaa 1 hiipii
hyvä 33 tulee            36 1 3 5 55      
36 1 3 5 55
nyt 33 riittää         
-----------------------------------------------------

4. C/C++ -viat

Mitä vikaa on seuraavissa (C++)- ohjelman osissa, selvitä lause lauseelta ja perustele jokainen väittämäsi lyhyesti:
... edellä jotakin, muttei mitään kaakka -viittaavaa ...
/* 01 */ void kääkkä(char *p,int d);
/* 02 */ {
/* 03 */   p = "Kissa";
/* 04 */   if ( p ) p++;
/* 05 */   cout << p;
/* 06 */   d = 1/5;
/* 07 */   printf("%3.2lf",d);
/* 08 */   char s[1] = "A";
/* 09 */   if ( s = 'A' ) cout >> "Oli A";
/* 10 */ )
/* 11 */
/* 12 */ class cUskomaton tentti (
/* 13 */ puplic:
/* 14 */   int i = 5;
/* 15 */ }
/* 16 */
/* 17 */ Int paa(cUskomaton_tentti u = 3; d = 5.1)
/* 18 *) {
/* 18 */   int urpo;
/* 19 */   if ( u ) return u->i;
/* 20 */   if ( d == 5.3 ) return 9; /* Aika iso
/* 21 */   string a("Kissa");
/* 22 */   int oikein = kaakka(a);    
/* 23 */   if ( oikein ) 
/* 24 */     *d = 3;
/* 25 */     return a[3];
/* 26 */   long turbo = urpo;
/* 27 */   if urpo && turpo then return 'Nyt riittää'
/* 28 */ }

5. Luokat (vuoden -99 välikokeesta)

Kirjoita luokka cEhdokas, jota voidaan käyttää kuten seuraavassa pääohjelmassa. Kirjoitettava koko luokka (attribuutit, kaikki metodit yms.)(6p)
int main(void)
{
  cEhdokas ehd1(100000.0,0),ehd2(20000.0,300);
  ehd1.tulosta();  // Tulostaa: Rahaa 100000, ääniä 0
  ehd2.tulosta();  // Tulostaa: Rahaa 20000, ääniä 300
  ehd1.osta(200,100.0);  // Ostaa 200 ääntä, 100 mk/kpl
  ehd1.tulosta();  // Tulostaa: Rahaa 80000, ääniä 200
  int virhe = ehd2.osta(300,100);
  if ( virhe != 0 ) cout << "Rahat ei riitä :-)" << endl;
  ehd2.tulosta();  // Tulostaa: Rahaa 20000, ääniä 300
  if ( ehd1.vertaa(ehd2) > 0 ) cout << "Ehdokas 1 voitti!\n";
  if ( ehd1.vertaa(ehd2) < 0 ) cout << "Ehdokas 2 voitti!\n";
  if ( ehd1.vertaa(ehd2) == 0 ) cout << "Taspeli!\n";
  // Vertailu tehdään äänimäärien perusteella.
  // Esimerkissä tulostuu : Ehdokas 2 voitti!
  return 0;
}


Välikoe 2001

Treenausta varten vuoden-01 mallivalikoe ja sen vastaukset:
http://www.mit.jyu.fi/~vesal/kurssit/ohjelmointi2001/tulokset/