avoin/avoin23

# avoin

Huom! TÄMÄ ON AVOIMEN YLIOPISTON SIVU.

Et voi suorittaa kurssia, ellet ole ilmoittautunut täällä.

Ohjelmointi 1, avoin 2023, luento 08

# L08

8. luento: ti 26.9.2023 klo 14:15-16:00: Ehtolauseet, String

Pääteohjaukset

Animaatiot

Etsikää monisteesta Animaatio-tekstiä ja suorittakaan niitä!

# ae_keskiarvo

Animaatio: Tutki funktion kutsua

Askella silmukan suoritusta vihreällä nuolella Tutki funktion kutsua

Versionhallinta

Muutamia yleisimpiä git-versiohallinnan komentoja.
Muutamia yleisimpiä git-versiohallinnan komentoja.
# umlGIT
HUOM! Tätä kuvaa ei pidä tulkita UML:än sekvenssikaavioksi!working directoryindex/stagelocal repositoryremote repositoryworking directoryindex/stagelocal repositoryremote repositoryclone <osoite>Annetaan kerran/koneadd --allKun tiedostot muuttuneetcommit -mpushpull or rebaseKun tasataan kaverin kanssafetchmergecheckout HEADcheckoutdiff HEADdiff

Etäsäilytykseen ei muutoksia kannata tallentaa jokaisen sitoutumisen jälkeen, vaan kokonaisuuksina sitten, kun on varma, että kaikki on kunnossa. Tarvittaessa on helpompi peruuttaa paikallisia muutoksia kuin etäsäilytykseen joutuneita muutoksia.

11 Jun 24

Ehtolauseet

# Plugin1
    public static void Main()
    {
        double kanta1 = Kysy("Anna ekan kolmion kanta", 20);
        double korkeus1 = Kysy("Anna ekan kolmion korkeus", 20);
        double kanta2 = 5;
        double korkeus2 = 6;


        double ala1 = KolmionAla(kanta1, korkeus1); //  kanta1 * korkeus1 * 1/2;  // a b
        double ala2 = KolmionAla(kanta2, korkeus2);

        Console.WriteLine(ala1);
        Console.WriteLine(ala2);

        if (ala1 > ala2) Console.WriteLine("Eka voitti");
        else Console.WriteLine("toka voitti");

    }

 

# k13

Kuva 13: if-rakenne vuokaaviona.

if (ehto) 
{
  lause1;
  lause2;
  ...
  lauseN;
}

Kysymyksiä:

Open plugin

Open plugin

Open plugin

Open plugin

# helloeka

Lukuja

using System;

/// @author Vesa Lappalainen
/// @version 27.09.2011
/// 
/// <summary>
/// Tutkitaan funktioita jotka palauttavat toisen luvuista
/// </summary>
public class Lukuja
{
    /// <summary>
    /// Tutkitaan kumpiko luvuista on toistaan suurempi
    /// </summary>
    public static void Main()
    {
        int a = 5;
        int b = 4;

        //double d = 1.234567;
        //Console.WriteLine("a={0:000} ja d={1:0.00}", a, d); // a=005 ja d=1.23
        //Console.WriteLine("a={0,5:000} ja d={1,10:0.00}", a, d);  // a=  005 ja d=      1.23
        //Console.WriteLine("a={0,-5:000} ja d={1,10:0.00}", a, d); // a=005   ja d=      1.23

        a = Kysy("Anna 1. luku", a);
        b = Kysy("Anna 2. luku", b);

        int iso = Suurempi(a, b);
        int pieni = Pienempi(a, b);

        Console.WriteLine("Suurempi oli: " + iso);
        Console.WriteLine("Pienempi oli: " + pieni);
    }


    /// <summary>
    /// Palauttaa suuremman arvon kahdesta kokonaisluvusta
    /// </summary>
    /// <param name="luku1">1. luku</param>
    /// <param name="luku2">2. luku</param>
    /// <returns>suuremaan luvun arvo</returns>
    /// <example>
    /// <pre name="test">
    ///   Lukuja.Suurempi(2,3) === 3;
    ///   Lukuja.Suurempi(4,1) === 4;
    ///   Lukuja.Suurempi(9,9) === 9;
    /// </pre>
    /// </example>
    public static int Suurempi(int luku1, int luku2)
    {
        if (luku2 > luku1) return luku2;

        return luku1;
    }


    /// <summary>
    /// Palauttaa pienemmän arvon kahdesta kokonaisluvusta
    /// </summary>
    /// <param name="luku1">1. luku</param>
    /// <param name="luku2">2. luku</param>
    /// <returns>suuremaan luvun arvo</returns>
    /// <example>
    /// <pre name="test">
    ///   Lukuja.Pienempi(2,3) === 2;
    ///   Lukuja.Pienempi(4,1) === 1;
    ///   Lukuja.Pienempi(9,9) === 9;
    /// </pre>
    /// </example>
    public static int Pienempi(int luku1, int luku2)
    {
        if (luku2 < luku1) return luku2;

        return luku1;
    }

    /// <summary>
    /// Kysytään käyttäjältä kokonaisluku ja palautetaan se.
    /// Jos syöte ei ole kelvollinen, niin kysytään uudelleen.
    /// Jos käyttäjä painaa pelkän Return, palautetaan oletus
    /// </summary>
    /// <param name="kysymys">Kysymys joka näytetään käyttäjälle</param>
    /// <param name="oletus">arvo joka palautetaan jos annetaan pelkkä tyhjä</param>
    /// <returns>käyttäjän syöttämä luku</returns>
    public static int Kysy(string kysymys, int oletus)
    {
        while (true)
        {
            Console.Write("{0} ({1}) >", kysymys, oletus);
            string vastaus = Console.ReadLine();
            if (vastaus.Length == 0) return oletus;
            int tulos = 0;
            if (int.TryParse(vastaus, out tulos)) return tulos;
            Console.WriteLine("Antamasi syöte '{0}' ei ole hyvä luku, anna uudelleen!", vastaus);
        }
    }

}

 

Merkkijonot

Aliohjelmakutsuihin EI tule tyyppejä (ellei samalla luoda new:llä uusia olioita, mutta siitä myöhemmin). Olisi 'väärin' kirjoittaa seuraavasti.

y = double Math.Sin(double x); // TÄMÄ ON VÄÄRIN!!! Kutsuun ei tule tyyppejä!

Alla oleva on oikein (olettaen että x on hyvin määritelty).

y = Math.Sin(x);
# jonoja1

Merkkijonoja

using System;

/// @author  Vesa Lappalainen
/// @version 29.09.2012
///
/// <summary>
/// Tutkitaan mitä merkkijonoilla voi tehdä
/// </summary>
public class Merkkijonoja
{
    public static void Main()
    {
        // tyyppi muuttuja = arvo;
        int i = 5;

        string mj = "Matti";                // 01234
        int pituus = mj.Length;
        Console.WriteLine(pituus);  // 5
        string mjPienena = mj.ToLower();
        Console.WriteLine(mjPienena);       // matti
    }
}

 

Muista!

  • string on muuttumaton (immutable). Vertaa tienviitta. Teksti ei voi muuttua.
  • jos tarvitsee muuttaa sisältöä, niin valinta on StringBuilder. Vertaa vaikka junan info-taulu.

Arvot muistissa

Muistele robotin muistia

Muistissa voisi olla:

osoite 100:
00000000000000000000000000000101000000000000000000000011110111100000000000000000000000000000010100000000000000000000001111100110
...
osoite: 990:
00000101010011010110000101110100011100110110100100000000000000000000010101101101011000010111010001110011011010010000000000000000

Ihmisen olisi tuota aika vaikea lukea ja siksi jaetaan tavuihin (8bit) ja vielä tavu kahtia ja merkitään samalla miten kääntäjä ja ajon aikainen muistinhallinta olisi voinut jakaa muistia:

i:         100     0000 0000  0000 0000  0000 0000  0000 0101    (5)
mj:        104     0000 0000  0000 0000  0000 0011  1101 1110    (990) 
pituus:    108     0000 0000  0000 0000  0000 0000  0000 0101    (5)
mjPienena  112     0000 0000  0000 0000  0000 0011  1110 0110    (998) 
...
           990     0000 0101  0100 1101  0110 0001  0111 0100    (5 'M' 'a' 't')
           994     0111 0011  0110 1001  0000 0000  0000 0000    ('t' 'i')
           998     0000 0101  0110 1101  0110 0001  0111 0100    (5 'm' 'a' 't')
          1002     0111 0011  0110 1001  0000 0000  0000 0000    ('t' 'i')

Tätäkin on vielä hankala lukea, joten usein 4bit jonoa merkitään vastaavalla heksadesimaalisymbolilla:

00 00 00 05 00 00 03 DE 00 00 00 05 00 00 03 E6 ... 05 4D 61 74 74 69 00 00 05 6D 61 74 74 69 00 00

ja jaettuna miten kääntäjä ja muistinallokointi olisi saattanut paikat nimetä:

i:         100     00 00 00 05    (5)
mj:        104     00 00 03 DE    (990) 
pituus:    108     00 00 00 05    (5)
mjPienena  112     00 00 03 E6    (998) 
...
           990     05 4D 61 74    (5 'M' 'a' 't')
           994     74 69 00 00    ('t' 'i')
           998     05 6D 61 74    (5 'm' 'a' 't')
          1002     74 69 00 00    ('t' 'i')

Tätäkin on aika tylsä ajatella näin ja siksi pyrimme piirtämään saman ajatuksen visuaalisemmin:

Draw.io

# t61

Open JS-frame

 

vars.js

# matt1

vars.js: Lopullinen kuva kerralla

Value i = 5
Ref mj -> New $1 "Matti"
Value pituus = 5
ref mjPienena -> new $2 "matti"

 

# matt2

vars.js: Piirrä itse edellistä matkien

 

# mattianim

vars.js: Animaatio

 

# simpleex2

vars.js: Vaiheittain

Value i
Ref mj
Value pituus
ref mjPienena
i = 5
new $1 "Matti"
mj -> $1
pituus = 5
new $2 "matti"
mjPienena -> $2

 

# mattianim2

vars.js: Animaatio kun sijoitetaan samaan viitemuuttujaan

 

# lumiukko1

Merkkijonoja

using System;

/// @author  Vesa Lappalainen
/// @version 29.09.2012
///
/// <summary>
/// Tutkitaan mitä merkkijonoilla voi tehdä
/// </summary>
public class Merkkijonoja
{
    public static void Main()
    {
        // tyyppi muuttuja = arvo;
        int i = 5;

        // luokka olio(viite)              olio
        string ekaJono = new String(new char[] { 'M', 'a', 't', 't', 'i' });

        string mj = "Matti";                // 01234
        Console.WriteLine(mj);              // Matti
        char eka = mj[0];
        Console.WriteLine(eka);             // M
        eka = 'A';
        Console.WriteLine((int)eka);        // 65
        eka++;
        Console.WriteLine(eka);             // B
        eka = Char.ToLower(eka);
        Console.WriteLine(eka);             // b
        Console.WriteLine(eka - 1);         // 97
        Console.WriteLine(eka);             // b
        eka = (char)(eka - 1);
        Console.WriteLine(eka);             // a

        int montakoMerkkia = mj.Length;
        Console.WriteLine(montakoMerkkia);  // 5

        string mjPienena = mj.ToLower();
        Console.WriteLine(mjPienena);       // matti

        string patka = mj.Substring(2);
        Console.WriteLine(patka);           // tti

        string patka2 = mj.Substring(1, 2); // String ja string samoja (jos on using System)
        Console.WriteLine(patka2);          // at

        string suku = "Meikäläinen";
        string nimi = mj + " " + suku;
        Console.WriteLine(nimi);            // Matti Meikäläinen

        Console.WriteLine(i + mj);          // 5Matti

        string stringLuku = "10";
        int luku = 4;

        Console.WriteLine("" + i + luku + " " + stringLuku + i); // 54 105
        Console.WriteLine("" + (i + luku) + " " + (stringLuku + i)); // 9 105
        int iLuku = int.Parse(stringLuku);
        Console.WriteLine("" + (iLuku + i)); // 15


        Console.Write("Anna jono >");
        string jono = Console.ReadLine();

        Console.WriteLine("Annoit siis: " + jono);

        string osa = AnnaMerkit(mj, 'a');
        Console.WriteLine(osa);
    }


    /// <summary>
    /// Funktio palauttaa merkkijonosta kaikki annettun merkin kohdalla
    /// olevan ja sen jälkeiset kirjaimet
    /// </summary>
    /// <param name="jono">mistä jonosta palautetaan</param>
    /// <param name="kirjain">minkä kirjaimen jälkeiset</param>
    /// <returns>jonon loppuosa</returns>
    /// <example>
    /// <pre name="test">
    ///    Merkkijonoja.AnnaMerkit("Matti", 'a') === "atti";
    ///    Merkkijonoja.AnnaMerkit("Matti", 'm') === "";
    ///    Merkkijonoja.AnnaMerkit("Matti", 'M') === "Matti";
    ///    Merkkijonoja.AnnaMerkit("Matti", 'i') === "i";
    /// </pre>
    /// </example>
    ///
    public static string AnnaMerkit(string jono, char kirjain)
    {
        int paikka = jono.IndexOf(kirjain);
        if (paikka < 0) return "";
        string uusi = jono.Substring(paikka, jono.Length-paikka);
        return uusi;
    }
}

 

# ae_tolower

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.