none
Cyklus for

    Întrebare

  • Zdar.

    Nedávno nám naše kantorka zadala domácí úkol, ve kterém máme vytvořit domácí úkol vytvořit tvar pomocí cyklu for a metod. Výsledek má vypadat asi takto:

    *
    **
    ***
    ****
    ***
    **
    *

    Horní část ještě dokážu vytvořit, ale když chci udělat i tu druhou, tak nevím jak na to. Logicky jsem změnil int i=10 ; i>=0 ; i--
    Zkoušel jsem to udělat podobně jako horní část, asi takto:

    for (int i = 10; i >= 0; i--)
      {
         string h = "*";
         console.writeline(h);
         h-=" ";
      }

    To podtržené je problém - u stringu mohu dát +=, ale -= už ne. Zkoušel jsem i použít h - 1 = h. Výsledek je stejně špatný. Opravdu už nevím jak dál. Došel jsem ke hranici svých schopností a zkušeností. Nikde jsem nenašel žádné rady, asi to hodně lidí - takže doufám, že odpověď nepřijde až za rok.
    PS: používám Microsoft Visual Studio 2008

    17 decembrie 2010 19:28

Răspunsuri

  • Zkus tohle. Určitě to půjde optimalizovat.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int j = 0;
                bool max = true;
                for (int i = 0; i <= 6; i++)
                {
                    if (j == 4) { max = false; }
                    string radek = "";
                    if (max)
                    {
                        j++;
                    }
                    else
                    {
                        j--;
                    }

                    for (int ij = 1; ij <= j; ij++)
                    {
                       radek += "*";
                    }
                    Console.WriteLine(radek);
                }
                Console.Read();
            }
        }
    }

    17 decembrie 2010 23:22
  • Je to ľahké:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ConsoleApplication1
    {
      class Program
      {
        static void Main(string[] args)
        {
          //horne riadky:
          for (int i = 1; i <= 4; i++)
          {
            //Spracovnie i-teho riadku:
            string h ="";
            for (int j = 1; j <= i; j++)
            {
              h = h + "*";//pridanie j-tej * v i-tom riadku
            }
            Console.WriteLine(h);
          }
    
          //dolne riadky:
          for (int i = 3; i >=1 ; i--)
          {
            //Spracovnie i-teho riadku:
            string h = "";
            for (int j = 1; j <= i; j++)
            {
              h = h + "*";//pridanie j-tej * v i-tom riadku
            }
            Console.WriteLine(h);
          }
    
          //koniec
          Console.Read();
        }
      }
    }
    
    28 decembrie 2010 14:02
  • Ahoj, tohle je takový úkol na dva cykly v sobě. Jedno for bude přičítat řádky a v druhým musíš počítat hvězdičky v řádku. První část můžeš použít svoji, ale jak správně píšeš, od řetězce nejde odečíst, měl by si použít cyklus pro přidávání hvězdiček. Celý trik je v tom, že ten vnitřní for nebude vždycky do 10, ale jen do toho na kolikátém řádku jsi (proměnná prvního cyklu).

          string hvezdicka = "*";
          for (int i = 1; i < 10; i++)
          {
            string s = "";
            for (int j = 0; j < i; j++)
            {
              s = s + hvezdicka;
            }
            Console.WriteLine(s);
          }
          for (int i = 10; i > 0; i--)
          {
            string s = "";
            for (int j = 0; j < i; j++)
            {
              s = s + hvezdicka;
            }
            Console.WriteLine(s);
          }
    

    Jak tu kolegové radi, tak je i kratší možnost. V C# existuje funkce PadLeft a PadRight, která zarovná řetězec na zadaný počet znaků nějakým znakem. Například když bys chtěl udělat z 12,50 řetězec 0012,50, použiješ funkci pro zarovnání zleva, takže:

    Console.WriteLine("12,50".PadLeft(7, '0'));

    Tu funkci můžeme použít, abychom dostali nějaký dlouhý řetězec znaků, třeba hvězdiček :) Takže kratší verze:

          for (int i = 1; i < 20; i++)
          {
            Console.WriteLine(
             string.Empty.PadLeft(i < 10 ? i : (20 - i) , '*'));
          }
    

    Tady jsem použil jen jeden cyklus. V tom zkracování řetězce se dá jenom odečíst 20 od pozice v cyklu a jsem na počtu který chci 20 - 10 = 10, 20 - 11 = 9, ..

    Dál jsem použil tzv ternární operátor (je to ten otazník), je to v podstatě podmínka v kódu, píše se takhle:

    <něco co chci otestovat> ? když je to pravda : když to není pravda

    takže v našem případě, když je i ještě míň než 10 (první půlka cyklu, tak použiju jako počet hvězdiček i, jinak použiju druhou část, tj 20 - i, takže tj ten zkracující řetězec.

    Enjoy :)

    31 decembrie 2010 22:35

Toate mesajele

  • Zkus tohle. Určitě to půjde optimalizovat.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int j = 0;
                bool max = true;
                for (int i = 0; i <= 6; i++)
                {
                    if (j == 4) { max = false; }
                    string radek = "";
                    if (max)
                    {
                        j++;
                    }
                    else
                    {
                        j--;
                    }

                    for (int ij = 1; ij <= j; ij++)
                    {
                       radek += "*";
                    }
                    Console.WriteLine(radek);
                }
                Console.Read();
            }
        }
    }

    17 decembrie 2010 23:22
  • Tak pro spodni cast vypis tolik hvezdicek, kolik je hodnota i, ktery odpocitavas ve druhem cyklu. Treba pomoci PadRight.
    18 decembrie 2010 08:46
  • Je to ľahké:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ConsoleApplication1
    {
      class Program
      {
        static void Main(string[] args)
        {
          //horne riadky:
          for (int i = 1; i <= 4; i++)
          {
            //Spracovnie i-teho riadku:
            string h ="";
            for (int j = 1; j <= i; j++)
            {
              h = h + "*";//pridanie j-tej * v i-tom riadku
            }
            Console.WriteLine(h);
          }
    
          //dolne riadky:
          for (int i = 3; i >=1 ; i--)
          {
            //Spracovnie i-teho riadku:
            string h = "";
            for (int j = 1; j <= i; j++)
            {
              h = h + "*";//pridanie j-tej * v i-tom riadku
            }
            Console.WriteLine(h);
          }
    
          //koniec
          Console.Read();
        }
      }
    }
    
    28 decembrie 2010 14:02
  • Vždy jsem zastáncem použití optimálního nástroje pro danou úlohu, takže jen pro zajímavost uvádím, že ve VFP by kód vypadal asi takto:

    FOR i = 1 TO 10
     ? REPLICATE('*',IIF(i<6,i,10-i))
    NEXT 
    

    A možná by bylo lepší použít proměnnou pro počet řádků:

    k = 10
    FOR i = 1 TO k
     ? REPLICATE('*',IIF(i<=k/2,i,k-i))
    NEXT 
    
    
    29 decembrie 2010 13:56
  • Ahoj, tohle je takový úkol na dva cykly v sobě. Jedno for bude přičítat řádky a v druhým musíš počítat hvězdičky v řádku. První část můžeš použít svoji, ale jak správně píšeš, od řetězce nejde odečíst, měl by si použít cyklus pro přidávání hvězdiček. Celý trik je v tom, že ten vnitřní for nebude vždycky do 10, ale jen do toho na kolikátém řádku jsi (proměnná prvního cyklu).

          string hvezdicka = "*";
          for (int i = 1; i < 10; i++)
          {
            string s = "";
            for (int j = 0; j < i; j++)
            {
              s = s + hvezdicka;
            }
            Console.WriteLine(s);
          }
          for (int i = 10; i > 0; i--)
          {
            string s = "";
            for (int j = 0; j < i; j++)
            {
              s = s + hvezdicka;
            }
            Console.WriteLine(s);
          }
    

    Jak tu kolegové radi, tak je i kratší možnost. V C# existuje funkce PadLeft a PadRight, která zarovná řetězec na zadaný počet znaků nějakým znakem. Například když bys chtěl udělat z 12,50 řetězec 0012,50, použiješ funkci pro zarovnání zleva, takže:

    Console.WriteLine("12,50".PadLeft(7, '0'));

    Tu funkci můžeme použít, abychom dostali nějaký dlouhý řetězec znaků, třeba hvězdiček :) Takže kratší verze:

          for (int i = 1; i < 20; i++)
          {
            Console.WriteLine(
             string.Empty.PadLeft(i < 10 ? i : (20 - i) , '*'));
          }
    

    Tady jsem použil jen jeden cyklus. V tom zkracování řetězce se dá jenom odečíst 20 od pozice v cyklu a jsem na počtu který chci 20 - 10 = 10, 20 - 11 = 9, ..

    Dál jsem použil tzv ternární operátor (je to ten otazník), je to v podstatě podmínka v kódu, píše se takhle:

    <něco co chci otestovat> ? když je to pravda : když to není pravda

    takže v našem případě, když je i ještě míň než 10 (první půlka cyklu, tak použiju jako počet hvězdiček i, jinak použiju druhou část, tj 20 - i, takže tj ten zkracující řetězec.

    Enjoy :)

    31 decembrie 2010 22:35