Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

Diskusia – 4. diel - Viacrozmerné polia v C# .NET

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Marek Dvořák:9.4.2019 16:21

Nemáte tam chybu? První hodnota matice jsou řáky a ne sloupce.

 
Odpovedať
9.4.2019 16:21
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Marek Dvořák
David Hartinger:9.4.2019 16:21

Cituji článek:

samozřejmě si to můžeme určit i obráceně, např. matice v matematice se zapisují opačně

Takže ne, nemáme.

Odpovedať
9.4.2019 16:21
New kid back on the block with a R.I.P
Avatar
David
Člen
Avatar
David:21.3.2020 23:36

Ahoj, díky za článek. ;-) Chtěl bych se zeptat, jak lze lépe vyřešit výpis zubatého pole než jsem to udělal já. Nevím jak vypsat po řádcích pole, které má proměnnou délku sloupce, proto jsem to vypisoval po sloupcích, které jsem vypsal do řádku.

// Zkrácená inicializace vícerozměrných polí
int[][] zubatePole = new int[][]
{
    new int[] {15, 2, 8, 5, 3},
    new int[] {3, 3, 7},
    new int[] {9, 1, 16, 13},
    new int[] {},
    new int[] {5}
};
// Získání velikosti pole
int sloupcu = zubatePole.Length;
int[] radku = new int[zubatePole.Length];
for (int i = 0; i < zubatePole.Length; i++)
{
    if (sloupcu != 0)
    {
        radku[i] = zubatePole[i].Length;
    }
}
// Výpis
for (int j = 0; j < sloupcu; j++)
{
    Console.Write("Sloupec {0}: ", j);

    for (int i = 0; i < radku[j]; i++)
    {
        Console.Write(zubatePole[j][i].ToString().PadLeft(3));
    }
    Console.WriteLine();
}
Console.ReadKey();
 
Odpovedať
+1
21.3.2020 23:36
Avatar
Dominik Němeček:11.7.2020 20:49

Parádní článek, děkuji! :)

 
Odpovedať
11.7.2020 20:49
Avatar
Bambinot
Člen
Avatar
Bambinot:8.2.2021 23:56

Ahoj,
neměl by být kód spíše takovýto:

int[, ,] kinosaly = new int [4, 4, 3];

aby odpovídal obrázku https://www.itnetwork.cz/…/3d_pole.png ?

 
Odpovedať
8.2.2021 23:56
Avatar
Lukáš Lakota:24.2.2021 21:12

Ahoj, prosím jak je následující citát myšlen?

První číslice udává počet sloupců, druhá počet řádků (samozřejmě si to můžeme určit i obráceně, např. matice v matematice se zapisují opačně).

C# Multidimensional Arrays tady je jasně řečeno, že se to zapisuje opačně, což jsem si ve VS ověřil. :-)

 
Odpovedať
24.2.2021 21:12
Avatar
Václav Dachs:21.3.2021 22:28

Ahoj, super článek! :-D Hned jsem zkoušel vícerozměrná pole využít pro Morseův kodér/dekodér.
Aplikace automaticky rozeznává text a morseovku, dále rozeznává všechny standardizované znaky (včetně @) a speciální signály.

Tady je výsledek:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace _074_MorseCode2
{
    class Program
    {
        static void Main(string[] args)
        {
            //výpis názvu aplikace
            Console.ForegroundColor = ConsoleColor.DarkCyan; //nastavení tamě tyrkysové barva textu
            Console.WriteLine("**************"); //rámeček
            Console.Write("* "); //rámeček
            Console.ForegroundColor = ConsoleColor.Green; //nastavení zelené barva textu
            Console.Write("MORSE CODE"); //název aplikace
            Console.ForegroundColor = ConsoleColor.DarkCyan; //nastavení tamě tyrkysové barva textu
            Console.WriteLine(" *"); //rámeček
            Console.WriteLine("**************"); //rámeček



            //deklarace vzorových polí
            string[][] charakters = new string[][] {
                //latinka bez diakritiky, arabské číslice, interpunkce
                new string[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ",", ".", ":", ";", "?", "!", "-", "/", "+", "=", "_", "\"", "(", ")", "'", "@", " " },
                //odpovídající znaky v morseovce
                new string[] { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "--..--", ".-.-.-", "---...", "-.-.-.", "..--..", "--...-", "-....-", "-..-.", ".-.-.", "-...-", "..--.-", ".-..-.", "-.--.", "-.--.-", ".----.", ".--.-.", "" }
            };

            string[][] specialSignals = new string[][] {
                //speciální signály latinkou
                new string[] { "zacatek vysilani", "konec vysilani", "nerozumim", "rozumim", "pomaleji", "cekejte", "omyl", "opakuji", "sos" },
                //speciální signály morseovkou
                new string[] { "-.-.-.-.", "...-.-", ".......", "----.-", "-.-.-..", ".-...", ". . . . . .", ".. .. .. .. .. ..", "...---... " },
                //ekvivalenty speciálních signálů po překódování z latinky
                new string[] { "--.. .- -.-. .- - . -.-  ...- -.-- ... .. .-.. .- -. ..", "-.- --- -. . -.-.  ...- -.-- ... .. .-.. .- -. ..", "-. . .-. --- --.. ..- -- .. --", ".-. --- --.. ..- -- .. --", ".--. --- -- .- .-.. . .--- ..", "-.-. . -.- . .--- - .", "--- -- -.-- .-..", "--- .--. .- -.- ..- .--- ..", "... --- ...  " },
                //ekvivalety speciálních signálů překódovaných z morseovky
                new string[] {"eeeeee", "iiiiii"}
            };

            string[,] diacriticalChars = new string[,] {
                //znaky s diakritikou
                { "á", "č", "ď", "é", "ě", "í", "ň", "ó", "ř", "š", "ť", "ú", "ů", "ý", "ž" },
                //ekvivalenty znaků bez diakritiky
                { "a", "c", "d", "e", "e", "i", "n", "o", "r", "s", "t", "u", "u", "y", "z" }
            };

            //vytvoření regulárního výrazu pro zjištění jestli jde o morseovku
            Regex r = new Regex("[a-z0-9,!?:;+-/@()=]");

            //cyklus pokrčování programu
            bool toContinue = true; //deklarace řídící proměnné pro pokračování programu
            while (toContinue) //dokud je v continue true bude opakovad chod programu
            {
                //reset barev
                Console.ResetColor();

                //načtení zprávy ke zpracování
                Console.ForegroundColor = ConsoleColor.Green; //nastavení tmavě zelené barvy textu
                Console.Write("\nZadejte zprávu ke zpracování: "); //výpis textu
                Console.ResetColor(); //nastavení bílé barvy textu
                string message = Console.ReadLine().Trim().ToLower(); //deklarace proměnné + uložení vstupu od uživatele + ustřihnutí mezery před a za řetězcem + převod řetězce na malé znaky

                //automatické rozpoznání textové a morseovy zprávy + zpracování
                if (r.IsMatch(message)) //pokud jde o zprávu textovou
                {
                    //incializace proměnné pro uložění zakódované zprávy
                    string morseCodeMessage = "";

                    //cyklus nahrazujicí diakritické znaky nediakritickými
                    for (int i = 0; i < diacriticalChars.GetLength(1); i++)
                    {
                        message = message.Replace(diacriticalChars[0, i], diacriticalChars[1, i]);
                    }

                    //výpis upravené zprávy
                    Console.ForegroundColor = ConsoleColor.Green; //nastavení tmavě zelené barvy textu
                    Console.Write("Vaše zpráva po úpravě k převodu do morseovky: ");
                    Console.ResetColor(); //nastavení bílé barvy textu
                    Console.WriteLine(message);

                    //založení pole pro uložení jednotlivých znaků zprávy
                    string[] messageCharakters = new string[message.Length]; //založí pole s velikostí podle délky zprávy

                    //rozbití zprávy na jednotlivé znaky
                    for (int i = 0; i < message.Length; i++) //pro všechny pozice v poli
                    {
                        messageCharakters[i] = message[i].ToString(); //vloží znak převedený na string z pozice i v message na pozici i v poli charakters
                    }

                    //iterace znaky abecedy čisel a interpunkce
                    foreach (string alphabeticChar in messageCharakters) //pro každý znak v poli znaka
                    {
                        string morseCodeChar = "#"; //deklarace proměnné + uložení výchozího znaku - použije se pokud znak není ve vzorovém poli
                        int index = Array.IndexOf(charakters[0], alphabeticChar); //deklarace proměnné + uložení indexu pozice znaku ve vzorovém poli
                        if (index >= 0) //pokud je znak nalezen ve vzorovém poli
                        {
                            morseCodeChar = charakters[1][index]; //vložení znaku ze vzorového pole do proměnné morseCodeChars
                        }
                        morseCodeMessage += morseCodeChar + " "; //přičte do zprávy znak
                    }

                    //cyklus nahrazující sekvenci znaků za zvláštní signál
                    for (int i = 0; i < specialSignals[2].Length; i++)
                    {
                        if (morseCodeMessage.Contains(specialSignals[2][i])) //pokud najde sekvenci znaků v pomocném poli
                        {
                            morseCodeMessage = morseCodeMessage.Replace(specialSignals[2][i], specialSignals[1][i]); //nahrazení přeložené sekvence standardizovanými sekvencemi
                        }
                    }

                    //výpis morseovy zprávy
                    Console.ForegroundColor = ConsoleColor.Green; //nastavení tmavě zelené barvy textu
                    Console.Write("Zakódovaná zpráva: ");
                    Console.ForegroundColor = ConsoleColor.DarkCyan; //nastavení tmavě tyrkysové barvy textu
                    Console.WriteLine(morseCodeMessage);
                }
                else //pokud jde o zprávu v morseovce
                {
                    //deklarace proměnné pro uložení dekódované zprávy
                    string alphabeticMessage = "";

                    //rozbití zprávy na jednotlivé znaky
                    string[] messageCharakters = message.Split(' ');

                    //iterace znaky morseovky
                    foreach (string morseCodeChar in messageCharakters) //pro každý morseův znak v poli messageCharakters
                    {
                        string alphabeticChar = "#"; //deklarace proměnné + uložení výchozího znaku - použije se pokud znak není ve vzorovém poli
                        int index = Array.IndexOf(charakters[1], morseCodeChar); //deklarace proměnné + uložení indexu pozice znaku ve vzorovém poli
                        if (index >= 0) //pokud je znak nalezen ve vzorovém poli
                        {
                            alphabeticChar = charakters[0][index]; //vložení znaku ze vzorového pole do proměnné alphabeticChar
                        }
                        else //pokud není nalezen znak v poli alphabetNumericChars
                        {
                            index = Array.IndexOf(specialSignals[1], morseCodeChar); //uložení indexu pozice speciálního signálu
                            if (index >= 0) //pokud je znak nalezen ve vzorovém poli
                            {
                                alphabeticChar = specialSignals[0][index]; //vložení speciálního signálu
                            }
                        }
                        alphabeticMessage += alphabeticChar; //přičte do zprávy znak
                    }

                    //kontrola speciálního signálu omyl
                    if (alphabeticMessage.Contains("eeeeee")) //pokud dekódovaná zpráva obsahuje sekvenci znaků signálu omyl
                    {
                        alphabeticMessage = alphabeticMessage.Replace("eeeeee", "omyl"); //nahradí sekvenci slovem
                    }

                    //kontrola speciálního signálu opakuji
                    if (alphabeticMessage.Contains("iiiiii")) //pokud dekódovaná zpráva obsahuje sekvenci znaků signálu opakuji
                    {
                        alphabeticMessage = alphabeticMessage.Replace("iiiiii", "opakuji"); //nahradí sekvenci slovem
                    }

                    //výpis dekódované zprávy
                    Console.ForegroundColor = ConsoleColor.Green; //nastavení tmavě zelené barvy textu
                    Console.Write("Dekódovaná zpráva: ");
                    Console.ForegroundColor = ConsoleColor.DarkCyan; //nastavení tmavě tyrkysové barvy textu
                    Console.WriteLine(alphabeticMessage);
                }

                //cyklus hlídající platnost vstupu od uživatele
                bool validChoice = false; //deklarace + nastavení hodnoty řídící proměnné
                while (!validChoice) //dokud validChoice není nastaveno na true
                {
                    //dotaz na pokračování
                    Console.ForegroundColor = ConsoleColor.Green; //nastavení tmavě zelené barvy textu
                    Console.Write("Chcete pokračovat další zprávou? [a/n]: ");
                    Console.ResetColor();
                    switch (Console.ReadKey().KeyChar.ToString().ToLower())
                    {
                        default:
                            Console.ForegroundColor = ConsoleColor.Red; //nastavení červené barvy
                            Console.WriteLine("\nNeplatná volba!");
                            break;
                        case "a":
                            validChoice = true;
                            toContinue = true;
                            break;
                        case "n":
                            validChoice = true;
                            toContinue = false;
                            break;
                    }

                    //odřádkování
                    Console.WriteLine();
                }
            }
            //výzva k ukončení aplikace
            Console.ForegroundColor = ConsoleColor.DarkCyan; //nastavení tyrkysové barvy textu
            Console.WriteLine("\nDěkuji za použití aplikace MORSE CODE. Aplikaci ukončíte stiskem libovolné klávesy.");

            //čekání na stisk klávesy
            Console.ReadKey();
        }
    }
}
Odpovedať
+1
21.3.2021 22:28
S úsměvem jde všechno lépe :-)
Avatar
Odpovedá na Václav Dachs
Václav Dachs:22.3.2021 8:36

Koukám, že jsem přehlédl nějaké chybky v komentářích, které vznikly, když mi do jejich psaní zasahoval synátor :-) no co už :-P

Odpovedať
22.3.2021 8:36
S úsměvem jde všechno lépe :-)
Avatar
Odpovedá na David
Václav Dachs:6.4.2021 21:28

Já výpis zubatého pole řešil takto:

//deklarace a inicializace zubatého pole
int[][] zubatePole = new int[][] {
   new int[] {15,2,8,5,3},
   new int[] {3,3,7},
   new int[] {9,1,16,13},
   new int[] {},
   new int[] {5}
};

//výpis zubatého pole vodorovně
Console.WriteLine("\nVýpis zubatého pole:");
for (int i = 0; i < zubatePole.Length; i++) { //zubatePole.Length vrátí počet polí v poli
   //výpis obsahu každého pole v poli
   Console.Write($"Sloupec {i}:");
   for (int j = 0; j < zubatePole[i].Length; j++) //zubatePole[i].Length vrátí počet položek v aktuálním poli
      Console.Write(zubatePole[i][j].ToString().PadLeft(3)); //výpis položky
   Console.WriteLine(); //odřádkování
}
Odpovedať
6.4.2021 21:28
S úsměvem jde všechno lépe :-)
Avatar
Odpovedá na David
Václav Dachs:6.4.2021 22:08

případně ještě výpis pole svisle:

//deklarace a inicializace zubatého pole
int[][] zubatePole = new int[][] {
   new int[] {15,2,8,5,3},
   new int[] {3,3,7},
   new int[] {9,1,16,13},
   new int[] {},
   new int[] {5}
};

Console.WriteLine("\nVýpis zubatého pole svisle:");
int zarovnani = 5;
//zjištění indexu nejdelšího pole v poli
int index = 0;
for (int i = 0; i < zubatePole.Length; i++) {
   if (zubatePole[i].Length > index)
      index = i;
}
//výpis
for (int j = 0; j < zubatePole[index].Length; j++) {
   for (int i = 0; i < zubatePole.Length; i++) {
      if (j < zubatePole[i].Length)
         Console.Write(zubatePole[i][j].ToString().PadLeft(zarovnani));
      else {
         for (int k = 0; k < zarovnani; k++)
            Console.Write(" ");
      }
   }
   Console.WriteLine();
}

//ukončení aplikace
Console.ReadKey();
Odpovedať
6.4.2021 22:08
S úsměvem jde všechno lépe :-)
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 34.