Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Studentský problém s ukolem

Zdravím,
letos studuji první rok na VŠ, kde máme programování (kvůli tomu jsem tam šel). Nyní jsem však narazil na problém u jednoho z ukolu. K tomuto dotazu přiložím i zadání. Chci se zeptat, jak v daném kodu docilit toho aby na kazdem radku nebyl posledni znak mezera.
Meli jsme zde take pouzit int.TryParse. Nevim zda jsem pouzil dobre. Muj "program" funguje tak jak ma. Stale má však jen 40 bodu ze 100 nerozumim tomu proc. Jinak kod je v c sharpu.

Předmět Autor Datum
Proč sem to dáváš jako obrázek a ne přímo kód? Console.Write(y + " "); Ti za každým prvkem vypíše…
Wikan 30.10.2016 16:24
Wikan
uplne nevim jak by ta podminka mela vypadat, protoze promenny jsou zavisly na vstupu od uzivatele. T…
roadicek 30.10.2016 16:36
roadicek
To je přece jedno, jak jsou velké. Poslední prvek snad můžeš poznat vždy. Pokud uživatel zadá pouze…
Wikan 30.10.2016 16:41
Wikan
nevim jak mam poznat posledni prvek. Jsme teprve na zacatku. Minul hodinu jsme brali podminky. a goo…
roadicek 30.10.2016 16:51
roadicek
Když tam máš for cyklus, který běží dokud je y > x. Jaký je poslední prvek? Na to nepotřebuješ žádné…
Wikan 30.10.2016 16:58
Wikan
no dokud y = x :D ale jak to zapsat... ze pokud je prvek vetsi o 1, že nemá psát mezeru.
roadicek 30.10.2016 17:16
roadicek
y = x nebude nikdy. if (y == x + 1) ...
Wikan 30.10.2016 17:19
Wikan
ach :( stydím se
roadicek 30.10.2016 17:20
roadicek
dobra... takze kod jsem predelal takto: using System; using System.Collections.Generic; using Syste…
roadicek 30.10.2016 17:57
roadicek
Dvě zadaná čísla: řádky, sloupce Tři zadaná čísla: počet opakování, řádky, sloupce Takže opakování…
Wikan 30.10.2016 18:05
Wikan
jojo to s tím číslem (první, poslední) jsem si teď taky uvědomil. Snažím se na to nějak přijít, zkou…
roadicek 30.10.2016 18:26
roadicek
Úplně ošetřené to nemáš, vypisují se tam zbytečně prázdné řádky.
Wikan 30.10.2016 18:38
Wikan
Tip 2: Poslední řádek ve výstupu je prázdný řádek. i v jeho ukazkovych vystupech jsou jednotlive vy…
roadicek 30.10.2016 18:42
roadicek
O tom nemluvím. Ty jich tam ale vypíšeš víc.
Wikan 30.10.2016 18:44
Wikan
coz to je jedno... muj hlavni problem je ted poprehazet hodnoty promennych podle toho kolik zada tec…
roadicek 30.10.2016 18:57
roadicek
dobra ukol poresen :D na 100 bodu using System; using System.Collections.Generic; using System.Linq…
roadicek 30.10.2016 19:55
roadicek
A zase tam ten výpis máš dvakrát. Hodnotit to já, tak dostaneš 0. else if (prohozeni == true) Ta p…
Wikan 30.10.2016 19:57
Wikan
Musis si uvedomit že je to zacatecnicky cviceni, kdy mame vychazet z toho co jsme brali. Ano vypis j…
roadicek 30.10.2016 22:29
roadicek
Opakování kódu je jedna z nejhorších chyb, jakých se můžeš při programování dopustit. if (prohozeni…
Wikan 30.10.2016 22:37
Wikan
takhle jsem to zkousel, prohodit hodnoty v tom ifu. Ale nefungovalo to. Mozna to bude tim ze tam mas…
roadicek 31.10.2016 10:24
roadicek
Chceš se něco naučit? Tak si zvykni, že tě někdo bude upozorňovat na chyby. A ne jen první měsíc, ne…
Wikan 31.10.2016 10:32
Wikan
Ne, to me spatne chapes :) vubec mi nevadi, ze me upozornujes na chyby. Ba naopak, jak jsem napsal p… poslední
roadicek 31.10.2016 12:40
roadicek
Na 100 % asi ne. Stále tam nemáš ošetřeno: V případě, kdy na vstupu bude počet řádků větší než poče…
ws79 30.10.2016 20:20
ws79
if (index != pole.length -1) pis mezeru
MaSo v číně 30.10.2016 17:20
MaSo v číně
OT: jaká je kuchyně? :-)
touchwood 30.10.2016 19:00
touchwood
Po dvou tydneh uz leze krkem. Ryzi a nudle nechci videt, tak dva roky...:-) Uz se vracim zpet. Cekam…
MaSo v číně 30.10.2016 19:25
MaSo v číně

Proč sem to dáváš jako obrázek a ne přímo kód?

Console.Write(y + " ");

Ti za každým prvkem vypíše mezeru. Tak si tam dej podmínku, aby to u posledního prvku vypsalo bez mezery.

TryParse bys měl používat pokaždé, když převádíš řetězec na číslo. A podle výsledku se rozhodnout, jestli je to zadané správně, nebo je potřeba zadání opakovat

Kód pro výpis trojúhelníku tam máš dvakrát, to je samo o sobě zásadní chyba.

uplne nevim jak by ta podminka mela vypadat, protoze promenny jsou zavisly na vstupu od uzivatele. Tudis jsou pokazde jinak velke.
TryParse jsem tam pouzil a do zavorek za to jsem vlozil znovu ten kod, ktery to spusti kdyz je hodnota false... Alespon tak rozumim ty funkci. Kdyz v tech zavorkach ten kod neni tak to potom blbne, bud to vypisuje o jeden trojuhelnik vic a nebo pri vynechani opakovani nevypise vubec. Podle toho zda u cyklu mam => nebo v int opakovani = 1 nebo 0. Nikdy se mi nepovede aby to fungovalo oboji. Jsem uz bezradny.

dobra... takze kod jsem predelal takto:

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

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            int opakovani = 1;
            int radky = Convert.ToInt32(Console.ReadLine());
            int sloupce = Convert.ToInt32(Console.ReadLine());
            string opacko = Console.ReadLine();
            int x = 0;
            int o = 0;
            bool pokus = int.TryParse(opacko, out opakovani);
            if (pokus == false)
            {
                opakovani = 1;
            }
            while (opakovani > 0)
            {
                x = 0;
                for (int i = radky; i > 0; i--)
                {
                    for (int y = sloupce; y > x; y--)
                    {
                        if (y == x + 1)
                        {
                            Console.Write(y);
                        }
                        else
                            Console.Write(y + " ");
                    }
                    x++;
                    Console.WriteLine();
                }
                Console.WriteLine();
                opakovani--;
            }
        }
    }
}

stale jen 65 bodu... pritom si myslim ze to zadani splnuje ze vsech stran.

Dvě zadaná čísla: řádky, sloupce
Tři zadaná čísla: počet opakování, řádky, sloupce

Takže opakování (pokud je zadané) je první číslo. Ale ty to bereš jako poslední.

Taky si nejsem jistý, že splňuješ tohle:

V případě, kdy na vstupu bude počet řádků větší než počet sloupců, program sám opraví počet řádků na platnou hodnotu.

dobra ukol poresen :D na 100 bodu

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

namespace cisty_stit
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = 0;
            int o = 0;
            int opakovani_sloupce;
            int radky_opakovani = Convert.ToInt32(Console.ReadLine());
            int sloupce_radky = Convert.ToInt32(Console.ReadLine());
            string menic = Console.ReadLine();
            bool prohozeni = int.TryParse(menic, out opakovani_sloupce);
            if (prohozeni == false)
            {
                opakovani_sloupce = 1;
                x = 0;
                for (int i = radky_opakovani; i > 0; i--)
                {
                    for (int y = sloupce_radky; y > x; y--)
                    {
                        if (y == x + 1)
                            Console.Write(y);
                        else
                            Console.Write(y + " ");
                    }
                    x++;
                    Console.WriteLine();
                }
            }
            else if (prohozeni == true)
            {
                while (radky_opakovani > 0)
                {
                    x = 0;
                    for (int i = sloupce_radky; i > 0; i--)
                    {
                        for (int y = opakovani_sloupce; y > x; y--)
                        {
                            if (y == x + 1)
                                Console.Write(y);
                            else
                                Console.Write(y + " ");
                        }
                        x++;
                        Console.WriteLine();
                    }
                    Console.WriteLine();
                    radky_opakovani--;
                }
            }
        }
    }
}

Musis si uvedomit že je to zacatecnicky cviceni, kdy mame vychazet z toho co jsme brali. Ano vypis je tam dvakrat, kvuli odradkovani o kterem se pise v zadani, bez nej je to zase chyba.
ta true podminka plati kdyz uzivatel zada to cislo ne? Tudiz kdyz zada 3ti cislo, probehne cyklus v podmince, ktery poprehazi hodnoty tak aby opakovani bylo 1. atd... jinak probehne cyklus ktery ma ty hodnoty zase jinak.
No zadani jsem ocividne splnil, takze parada. Nevim co se ti na tom nezda a proc musis "rypat" ale dik za "rady"...

Opakování kódu je jedna z nejhorších chyb, jakých se můžeš při programování dopustit.

if (prohozeni == false)
{
...
}
else if (prohozeni == true)

Proměnná typu bool může mít pouze dvě hodnoty: true nebo false. Takže pokud to neprojde ifem, automaticky to znamená, že prohození = true a není tam nutné psát další if.
A zápis toho ifu je sice funkční, ale v praxi se s ním asi nesetkáš. Mnohem obvyklejší je:

if (!prohozeni)

Pokud ti jde pouze o splnění zadání a ne o to, aby tvůj kód byl kvalitní, tak by ses o programování radši ani neměl pokoušet.

Celé se to dá napsat např. takhle:

var opakovani = Convert.ToInt32(Console.ReadLine());
var radky = Convert.ToInt32(Console.ReadLine());
int sloupce;
if (!int.TryParse(Console.ReadLine(), out sloupce))
{
    sloupce = radky;
    radky = opakovani;
    opakovani = 1;
}
radky = Math.Min(sloupce, radky);
while (opakovani > 0)
{
    for (var r = 0; r < radky; r++)
    {
        var posledni = r + 1;
        for (var s = sloupce; s > r; s--)
        {
            Console.Write(s);
            if (s > posledni) Console.Write(" ");
        }
        Console.WriteLine();
    }
    Console.WriteLine();
    opakovani--;
}

takhle jsem to zkousel, prohodit hodnoty v tom ifu. Ale nefungovalo to. Mozna to bude tim ze tam mas var a nebo je to v ty podmince. Nevim. Take nevim proc porad ty ustepecne poznamky. Musim rict ze me to urazi. Ocenuju tvoje prispevky, dost jsem se dozvedel ale opravdu nechapu ty neustale hroty. Muzes mi rict jak vypadali tvoje kody? Po mesici kodovani?
Jo jasne jsi lepsi a pravdepodobne se tim i zivis ale proc se vozit po nekom kdo tolik zkusenosti nema? Jako ze bych ani nemel programovat atp.?

Chceš se něco naučit? Tak si zvykni, že tě někdo bude upozorňovat na chyby. A ne jen první měsíc, nebo první rok, ale celý život. Na tom není nic urážlivého, protože jen tím, že se dozvíš o chybách se můžeš posunout někam dál.
A to že bys neměl programovat nebylo rozhodně myšleno tak, že na to nemáš. Správný programátor neustále přemýšlí o tom, jestli by se něco nedalo napsat lépe. Pokud se tohohle přístupu vzdáš hned na začátku, tak to nikam daleko nedotáhneš.

Ne, to me spatne chapes :) vubec mi nevadi, ze me upozornujes na chyby. Ba naopak, jak jsem napsal předtím, cením si toho a jsem rád, protože se dozvím něco jiného. Jediné co mi vadilo byly ty poznamky. Budu rád když tu na sebe ještě narazíme a těším se na každou další radu ;) (předpokládám že se ještě na pár věcí zeptám).

Na 100 % asi ne. Stále tam nemáš ošetřeno:

V případě, kdy na vstupu bude počet řádků větší než počet sloupců, program sám opraví počet řádků na platnou hodnotu.

Dále zbytečná proměnná

int o = 0;

A na tomto program sletí pokaždé, když nebude zadané číslo:

int radky_opakovani = Convert.ToInt32(Console.ReadLine());
int sloupce_radky = Convert.ToInt32(Console.ReadLine());

Zpět do poradny Odpovědět na původní otázku Nahoru