Další způsoy vyplnění pole?   zodpovězená otázka

VB.NET

Dobrý den.

Nevím jestli se to spíš nevztahuje do Offtopicu.

Mam dotaz a vůbec mě nenapadá žádné elegantní řešení (než to předdefinovat ručně)

Normálně pole vyplnit umím.

např:

for y=0 to 7
 for x=0 to 7

Pole(x,y) = N

next
next

Ale když bych stejné pole chtěl vyplňovat jinak než po řádcích, ale například ve šneku. Od okraje, nebo zevnitř. Tak si vůbec nevím rady.

Případně jestli existují nějaké další typické způsoby vyplňování pole, tak bych byl rád za každý nápad, či připomínku.

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Omlouvám se za překlep v nadpisu :(

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud chcete vyplňovat pole nějakým nestandardním způsobem tak použijete rovněž cyklus For nebo While v němž budete mít algoritmus pro výpočet souřadnic X a Y. Ten vám zde ovšem nikdo vymýšlet nebude...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nechápu sice smysl Vašeho počínání, ale máte-li nadeklarované pole je jeho vyplnění pouze otázkou vhodné funkce, která projde všechny prvky Vašeho pole Vámi vymyšlenou cestou.

Nevím, co si od toho slibujete, proto je těžké něco i navrhnout.

Třeba ta "dostředná spirála" by se dala celkem "jednoduše" algoritmizovat, ostatní možnosti jsou pouze otázkou Vaší představivosti.

Ta spirála by mohla vypadat třeba nějak takto:

Public Class Form7
    Private pole(10, 10) As Integer

    Private Sub Form7_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim rmin, rmax, slmin, slmax, num As Integer

        rmax = pole.GetLength(1) - 1
        slmax = pole.GetLength(0) - 1



        Do While True


            For i As Integer = slmin To slmax
                num += 1
                pole(i, rmin) = num
            Next
            rmin += 1
            If rmax < rmin Then Exit Do

            For j As Integer = rmin To rmax
                num += 1
                pole(slmax, j) = num
            Next
            slmax -= 1
            If slmax < slmin Then Exit Do

            For i As Integer = slmax To slmin Step -1
                num += 1
                pole(i, rmax) = num
            Next
            rmax -= 1
            If rmax < rmin Then Exit Do

            For j As Integer = rmax To rmin Step -1
                num += 1
                pole(slmin, j) = num
            Next
            slmin += 1
            If slmax < slmin Then Exit Do
        Loop

        '' kontrolní výpis
        '' na ploše textbox1 s nastavením MultiLine= true
        With TextBox1
            .Text = ""
            For j As Integer = 0 To pole.GetLength(1) - 1
                For i As Integer = 0 To pole.GetLength(0) - 1
                    .Text &= pole(i, j) & vbTab
                Next
                .Text &= vbNewLine
            Next
        End With
    End Sub
End Class

Toto je přístup, kdy řídíte posloupnost procházených prvků a plníte je daty.

Další možností by byl postup opačný, kdy byste pole sice plnil klasicky (po řádcích a sloupcích), ale pro každý prvek byste počítal jeho hodnotu jako funkci závislou na souřadnicích (třeba "vzdálenost od středu").

Např.:

Public Class Form7
    Private pole(10, 10) As Integer

    Private Sub Form7_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        
        Dim pulx = (pole.GetLength(0) - 1) / 2
        Dim puly = (pole.GetLength(1) - 1) / 2

        For j As Integer = 0 To pole.GetLength(1) - 1
            For i As Integer = 0 To pole.GetLength(0) - 1
                pole(i, j) = CInt(Math.Sqrt((i - pulx) * (i - pulx) + (j - puly) * (j - puly)))
            Next

        Next



        '' kontrolní výpis
        '' na ploše textbox1 s nastavením MultiLine= true
        With TextBox1
            .Text = ""
            For j As Integer = 0 To pole.GetLength(1) - 1
                For i As Integer = 0 To pole.GetLength(0) - 1
                    .Text &= pole(i, j) & vbTab
                Next
                .Text &= vbNewLine
            Next
        End With
    End Sub
End Class

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Děkuji za odpověď.

Docela jsem se obával, že to nebude jednoduché.

To už nožná bude snadnější nadefinovat X a Y ručně.

Jde o to, že v některém kroku je třeba se vrátit k předchozímu políčku. A to při složitějších algoritmech v daný okamžiku nedokážu ošeřit.

Jdu se prolouskat vaší ukázkou, možná se mi to povede dostat do provozu :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

nejlepší je to zprovoznit a pak třeba krokovat.

Oba příklady stačí zkopírovat do kódu samostatného Formu, na který si umístěte TextBox s názvem TextBox1 a tomu Textboxu nastavte Multiline na True.

Jenom si v tom kódu opravte název Formu (já to plácám do jednoho souboru, tak tam mám Form7

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback