using System;

/// @author  Vesa Lappalainen
/// @version 26.10.2012
/// <summary>
/// Tutkitaan muuttujinen näkyvyyttä
/// </summary>
public class MuuttujienNakyvyys
{
    /// <summary>
    /// Missä pääohjelman muuttujat näkyvät
    /// </summary>
    /// <param name="args">ei käytössä</param>
    public static void Main(string[] args)
    {
        int luku = 9;   // Näkyy vain pääohjelmassa
        double d = 5.5;  // Näkyy vain pääohjelmassa
        int[] luvut = { 1, 2, 3 }; // Näkyy vain pääohjelmassa, mutta viitteen kautta aliohjelmakin voi muuttaa
        Muuta(luvut, 2, luku);
        {                          // apulohko, jossa omia muuttujia
            int uusi = 3;          // muuttuja joka näkyy vain tässä lohkossa
            Console.WriteLine(uusi);
        }                          // nyt uusi-muuttuja lakkaa olemasta
        // Muuttujaa uusi ei ole enää olemassakaan

        // Täytetään taulukkoa
        int edellinen = 0;
        for (int i = 0; i < luvut.Length; i++)
        {
            int nyt = luvut[i];     // on olemassa silmukan sisällä
            int iso = 3 * nyt;      // on olemassa silmukan sisällä
            luvut[i] += iso;
            edellinen = nyt + luku; // silmukan ulkopuolella määritelty muuttuja
        }

        Console.WriteLine($"{d} {edellinen}");
    }


    /// <summary>
    /// Laitetaan taulukon luvut paikkaan uusi luku
    /// </summary>
    /// <param name="luvut">taulukko jota muutetaan, aliohjelman oma viite, mutta viitteen kautta voi muuttaa myös kutsuvan ohjelman taulukkoa</param>
    /// <param name="paikka">paikka jota muutetaan, näkyy vain aliohjelmassa, muuttaminen ei vaikuta kutsuvaan ohjelmaan</param>
    /// <param name="luku">uusi arvo, näkyy vain aliohjelmassa, sama nimi ei haittaa, muuttaminen ei vaikuta kutsuvaan ohjelmaan</param>
    public static void Muuta(int[] luvut, int paikka, int luku)
    {
        luvut[paikka] = luku; // viitteen ansiosta pääohjelman taulukko muuttui
        paikka--;             // ei vaikuta pääohjelmaan
        int uusiarvo;         // aliohjelman lokaali muuttuja
        uusiarvo = luku + 3;
        luvut[paikka] = uusiarvo; // muuttaa pääohjelman taulukkoa
        // ReSharper disable once RedundantAssignment
        luku = 12;            // ei vaikuta pääohjelmaan
    }
}