Pole

Jak jistě víte, v C# máme proměnné, kam můžeme ukládat hodnoty. Co se ale může hodit jsou pole hodnot, kdy ukládáme do jednoho pole více hodnot. Může se to hodit například, pokud nevíme, kolik těch hodnot budeme zpracovávat.

Zde je příklad, jak vytvořit pole s předepsanými hodnotami:

string[] monthsOfTheYear = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

S těmito hodnotami můžeme pracovat podobně jako se stringy:

monthsOfTheYear[7] = "Srpen";
monthsOfTheYear[8] = string.Empty;
monthsOfTheYear[9] = Console.ReadLine();

Pokud chceme pracovat s každým jedním prvkem pole, můžeme použít foreach. Následující příklad vypíše všechny měsíce z pole výše.

foreach (var item in monthsOfTheYear)
{
    Console.WriteLine(item);
}

foreach funguje tak, že do vnitřní proměnné item (může se jmenovat jakkoliv) vloží první prvek z pole, udělá s ním to co je uvnitř hranatých závorek (v našem případě ho vypíše) a po té udělá to samé s dalším a dalším prvkem.

Pokud chceme vytvořit prázné pole znaků, vytvoříme ho následujícím způsobem:

string[] pole = new string[x];

V tomto kódu musíme x nahradit celým číslem, které vyjadřuje velikost pole. Z tohoto se dá odvodit, že pole má přesně určenou velikost. Tuto velikost můžeme změnit pomocí následujícího kódu:

string[] pole = new string[5];
Console.WriteLine($"Velikost pole: {pole.Length}");

Array.Resize(ref pole, 10 );
Console.WriteLine($"Nová velikost pole: {pole.Length}");

string[] není samozřejmě jediný typ pole, co můžeme použít. Od každého typu proměnné existuje typ pole. Můžeme tam použít například int[] pro pole celých čísel, double[] pro pole čísel s možností desetinných míst, nebo třeba bool[] pro pole true/false.

Zadání: vytvořte program, který si od uživatele vyžádá jím určený počet čísel a poté je sečte.

Console.WriteLine("Kolik čísel chcete zadat?");
int size = Convert.ToInt32(Console.ReadLine());
int[] input = new int[size];

Console.WriteLine("Zadejte čísla:");
int zadano = 0;
while (zadano < input.Length)
{
    input[zadano] = Convert.ToInt32(Console.ReadLine());
    zadano++;
}

int output = 0;
foreach (int i in input)
{
    output = output + i;
}

Console.WriteLine($"Součet vámi zadaných čísel: {output}");

Příliš snadné?

Vytvořte program zvaný stack, který uživateli dovolí spustit následující příkazy:
Push ukládá znak na konec pole
Pop vrací znak z konce pole a odstraňuje jej z pole
Peek vrací znak na na konci pole (nechává jej v poli)
IsEmpty vrací true/false podle toho, zda je či není pole prázdné
PrintStack vypíše na konzoli všechny hodnoty v poli

Zde máte program, který funguje stejně: stack-win64.exe

using System;
using System.Collections.Generic;

namespace _3.stack
{
    class Program
    {
        static void Main(string[] args)
        {

            Stack stack1 = new Stack();

            bool exit = false;

            Console.WriteLine("Commands: push; pop; peek; isempty; printstack; exit; quit; help");

            int helpInfo = 0;
            int easteregg = 0;

            while (exit == false)
            {
                Console.Write("> ");
                string input;
                input = Console.ReadLine();
                string cmd = input.Split(" ")[0];
                if (input == "quit")
                {
                    exit = true;
                }
                else if (input == "exit")
                {
                    exit = true;
                }
                else if (cmd == "push")
                {
                    if (input.IndexOf(" ") == -1)
                    {
                        Console.Write("Input one char: ");
                        char h = Console.ReadLine()[0];
                        stack1.Push(h);
                    }
                    else
                    {
                        var ch = input.Split(" ")[1][0];
                        stack1.Push(ch);
                    }
                    helpInfo = 0;
                }
                else if (input == "pop")
                {
                    bool isempty = stack1.IsEmpty();
                    if (isempty == false)
                    {
                        char x = stack1.Pop();
                        Console.WriteLine(x);
                    }
                    else
                    {
                        Console.WriteLine("error: stack is empty");
                    }
                    helpInfo = 0;
                }
                else if (input == "peek")
                {
                    bool isempty = stack1.IsEmpty();
                    if (isempty == false)
                    {
                        char x = stack1.Peek();
                        Console.WriteLine(x);
                    }
                    else
                    {
                        Console.WriteLine("error: stack is empty");
                    }
                    helpInfo = 0;
                }
                else if (input == "isempty")
                {
                    bool x = stack1.IsEmpty();
                    Console.WriteLine(x);
                    helpInfo = 0;
                }
                else if (input == "printstack")
                {
                    stack1.PrintStack();
                    helpInfo = 0;
                }
                else if (input == "help")
                {
                    Console.WriteLine("Commands: push; pop; peek; isempty; printstack; exit; quit; help");
                    Console.WriteLine("push [x] -> save character to stack");
                    Console.WriteLine("pop -> print last character from stack and delete that character from stack");
                    Console.WriteLine("peek -> print last character from stack (do not delete it like pop)");
                    Console.WriteLine("isempty -> check if stack is empty");
                    Console.WriteLine("printstack -> write all characters in stack");
                    helpInfo = 0;
                }
                else if (input == "")
                {
                    helpInfo++;
                    if (helpInfo == 3)
                    {
                        Console.WriteLine("You should write some command btw. Use help if you don't know.");
                        helpInfo = 0;
                        easteregg++;
                        easteregg++;
                        easteregg++;
                    }
                    if (easteregg == 42)
                    {
                        Console.WriteLine("Are you racist to characters?");
                        easteregg--;
                        easteregg--;
                        easteregg--;
                    }
                }
                else
                {
                    Console.WriteLine("Command not found, use help for help.");
                }

            }
        }
    }
    class Stack
    {
        //List<char> chars = new List<char>();
        //public void Push(char ch)
        //{
        //    chars.Add(ch);
        //}
        //public char Pop()
        //{
        //    char tmp = chars[chars.Count - 1];
        //    chars.RemoveAt(chars.Count - 1);
        //    return tmp;
        //}
        //public char Peek()
        //{
        //    char tmp = chars[chars.Count - 1];
        //    return tmp;
        //}
        //public bool IsEmpty()
        //{
        //    if (chars.Count == 0)
        //    {
        //        return true;
        //    }
        //    else
        //    {
        //        return false;
        //    }
        //}
        //public void PrintStack()
        //{
        //    foreach (char i in chars)
        //    {
        //        Console.WriteLine(i);
        //    }
        //}

        char[] chars = new char[0];
        public void Push(char ch)
        {
            int tmp1 = chars.Length;
            tmp1++;
            Array.Resize(ref chars, tmp1);
            int tmp2 = chars.Length - 1;
            chars[tmp2] = ch;
        }
        public char Pop()
        {
            int tmp2 = chars.Length - 1;
            char tmp = chars[tmp2];
            Array.Resize(ref chars, tmp2);
            return tmp;
        }
        public char Peek()
        {
            int tmp2 = chars.Length - 1;
            char tmp = chars[tmp2];
            return tmp;
        }
        public bool IsEmpty()
        {
            if (chars.Length == 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        public void PrintStack()
        {
            int i = 0;
            while (i < chars.Length)
            {
                Console.WriteLine(chars[i]);
                i++;
            }
        }
    }
}