Diskuze: Pomozte udělat program

C# .NET .NET (C# a Visual Basic) Pomozte udělat program American English version English version

Avatar
Amatérr
Neregistrovaný
Avatar
Amatérr:

Zdarec,
Jsem amatér a potřeboval bych návod na udělání pár prográmků:

1, Objem a povrch válce
2, Výpočet přepony pravoúhlého trojúhelníku
3, Zadat trojciferné číslo, vypsat počet 100,10,1
4, Přečíst trojciferné číslo a vypsat ho pozpátku
Předem všem Děkuji!

 
Odpovědět 12.11.2012 19:48
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Amatérr
David Čápka:

Takhle to nepůjde, budeš se muset taky trochu snažit :) Nejprve se zamysli nad tím, jak bys ty úlohy dělal jako člověk, my ti pomůžeme na to napsat program.

Nahoru Odpovědět 12.11.2012 21:02
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Amatérr
Neregistrovaný
Avatar
Odpovídá na David Čápka
Amatérr:

Jo zkoušel jsem, první dva mi fungují, ale myslím, že je nemám zcela správně :(
tady je ten obvod a obsah kružnice:
double cisloPI = Math.PI;
Console.Write("Za­dej poloměr kružnice : ");
string polomer = Console.ReadLine();
double polomer1h1 = Convert.ToDou­ble(polomer);

Console.Write("Ob­vod kruhu je: ");
Console.WriteLine(2 * cisloPI * polomer1h1);

Console.Write("Ob­sah kruhu je: ");
Console.Write(cis­loPI * polomer1h1 * polomer1h1);

a tady ten válec:

Console.Write­Line("Toto je program pro výpočet objemu a povrchu válce:");

double polomerV, vyskaV, valecV, valecS;

Console.Write("Za­dejte poloměr válce: ");
polomerV = Convert.ToDou­ble(Console.Re­adLine());

Console.Write("Za­dejte výšku válce: ");
vyskaV = Convert.ToDou­ble(Console.Re­adLine());

valecV = Math.PI * Math.Pow(polomerV, 2) * vyskaV;
valecS = 2 * Math.PI * polomerV * vyskaV;

Console.Write­Line("Objem válce je: " + valecV);
Console.Write­Line("Povrch válce je: " + valecS);
Console.ReadKey();

Ale víc jsem bohužel už nevyplodil vůbec netuším jak ty ostatní řešit :(

 
Nahoru Odpovědět 12.11.2012 21:36
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Třetí příklad asi zcela nechápu co má dělat. A co se týče čtvrtého, koukni se na tutoriály - cykly,pole apod. Jinak tenhle kod, jak jsem rychl přelít, správně ale pár rad

int=Convert.ToInt32(Console.ReadLine())

ti uloží hodnotu z klávesnice, tedy nemusíš dělat zvlášť string a poté jej konvertovat, jenom taková rada :). A amatér ? Vůbec ne ;). Stač íse tomu věnovat a přijdeš na to

Nahoru Odpovědět 12.11.2012 21:44
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Fugiczek
Redaktor
Avatar
Fugiczek:

No vypadá to jako úkoly do školy :-D
3. a 4. příklad zkus popřemýšlet nad %(modulem) nebo druhá možnost je převést na String a po jednotlivých znacích to zpracovat.

 
Nahoru Odpovědět 12.11.2012 21:48
Avatar
Kit
Redaktor
Avatar
Odpovídá na Petr Nymsa
Kit:

Člověk může být současně amatérem (dělat to rád) i profesionálem (dělat to za peníze). Pokud to Amatérr nedělá rád, není amatérem.

Nahoru Odpovědět 12.11.2012 21:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Amatérr
David Čápka:

K zadávání zdrojových kódů prosím používej ikonku "Vložení zdrojového kódu", takhle se to čte opravdu hrozně. Nebudu komentovat úpravu kódu, ale první vypadá dobře. U druhého máš v povrchu jen plášť, je třeba ještě přičíst 2x obsah podstavy. To jistě hravě opravíš, nezkoušel jsem to, ale připadá mi, že to vypadá docela dobře. Místo convert se používá parse, když načítáš číslo z textové podoby, viz můj příklad dále, ale nikdo ti za to v úkolu asi nevyhubuje.

Pomohu ti s těmi dalšími.

Zadat trojciferné číslo, vypsat počet 100,10,1

Mělo by stačit načíst normální string z konzole a převést ho na int. Když bude větší než 999 a menší než 100, můžeš uživateli vyhuboat, že není trojciferné, ale to není přímo v zadání. Každopádně zadané číslo stačí přeci jen vydělit 100 a máš kolik v něm je stovek, vydělit 10 a máš desítky, jednotek tam je tolik, kolik je hodnota toho čísla :) Malý hint:

int cislo = int.Parse(Console.ReadLine());
Console.WriteLine("Stovek: {0}", cislo / 100);

Pokud dělíš 2 integery, dělení bude celočíselné, což ty potřebuješ.

Přečíst trojciferné číslo a vypsat ho pozpátku

Nevím, co se myslí tím přečíst. Číslo si zadáš jako string a poté ho převrátíš. Jde to udělat for cyklem, ale i velmi jednoduše. String si převedeš na pole znaků. Pole má metodu Reverse, ta ho otočí. Z pole poté uděláš zpátky string:

char[] arr = s.ToCharArray();
Array.Reverse(arr);
Console.Write(new string(arr));

Kdyby ti to přišlo moc složité, můžeš to udělat tím cyklem, projedeš zadaný text a po písmenkách vypíšeš pozpátku

Console.WriteLine("Zadej číslo:");
string s = Console.ReadLine();
for (int i = s.Length - 1; i >= 0; i--)
{
Console.Write(s[i]);
}
Editováno 12.11.2012 21:55
Nahoru Odpovědět 12.11.2012 21:53
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Amatérr
David Čápka:

Ještě mi došlo že u 3. příkladu to u desítek nepůjde tak jednoduše. Můžeš od toho čísla odečíst 100 x (cislo / 100) a zbyde ti kolik tam je desítek a jednotek. Výsledek vydělíš deseti. Nebo by to šlo i přes to modulo.

Nahoru Odpovědět 12.11.2012 22:01
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Lepší by asi bylo použít obrácené Hornerovo schéma, ale výsledek by se musel před vypsáním obrátit.

Nahoru Odpovědět 12.11.2012 22:08
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na David Čápka
Petr Nymsa:

Chci se zeptat proč je lepší používat Parse než Convert ?

Nahoru Odpovědět 13.11.2012 6:59
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Kit
Redaktor
Avatar
Odpovídá na Petr Nymsa
Kit:

Parse je o chlup rychlejší a kvalitněji zpracuje vadný vstupní řetězec. Convert vrátí 0 a o víc se nestará.

Nahoru Odpovědět 13.11.2012 7:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Amatérr
Neregistrovaný
Avatar
Amatérr:

Děkuji všem za rady snad to nějak splácám o_O, Jinak ano je to úkol do školy učíme se programovat teprve chvíli ale od učitele jsem to prostě nepochopil a to nejsem sám :(
Jo a ještě se vrátím k výpočtu přepony prav. trojúhelníka jak to bude z mocninami?

 
Nahoru Odpovědět 13.11.2012 13:55
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Amatérr
Fugiczek:
Math.Pow(3, 2); // tři na druhou
Math.Pow(9, 1/2); //odmocnina z devíti
 
Nahoru Odpovědět 13.11.2012 15:06
Avatar
Kit
Redaktor
Avatar
Odpovídá na Fugiczek
Kit:

Místo druhé mocniny je často výhodnější použít násobení a místo uvedené druhé odmocniny metodu Math.Sqrt().

Nahoru Odpovědět 13.11.2012 16:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Kit
Fugiczek:

Tak to určitě v tomto případě je, ale kdyby něco bylo x10 nebo třetí odmocnina, tak je pro mě pohodlnější používat Math.Pow().

 
Nahoru Odpovědět 13.11.2012 16:34
Avatar
matesax
Redaktor
Avatar
Odpovídá na Fugiczek
matesax:

Jemu nejde o pohodlnost, ale o zátěž... Tedy jako je to s internetem - nejrychlejší cesta nebývá ta nejkratší.

Editováno 13.11.2012 16:47
 
Nahoru Odpovědět 13.11.2012 16:46
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na matesax
Fugiczek:

Nevím jak je tomu v c# ale v Javě jsou všechny metody v Math nativní, tj. že se to nepočítá v JVM ale v Cečku bo C++ (nejsem si teď jistý který z těch dvou to je, ale myslím že Céčko), takže je to podstatně rychlejší než kdybych vypisoval třeba ** a * a * a * a * a * a * a * a * a * a **.

Editováno 13.11.2012 17:16
 
Nahoru Odpovědět 13.11.2012 17:15
Avatar
Amatérr
Neregistrovaný
Avatar
Amatérr:

Díky něco jsem splácal akorát teď nevím jak dál viz.níže

Console.Write("Zadej stranu A: ");
          int zKlavesnice = Convert.ToInt32(Console.ReadLine());

          Console.Write("Zadej stranu B: ");
          int zKlavesnice2 = Convert.ToInt32(Console.ReadLine());

          Console.Write("Přepona je: ");
          Console.Write(Math.Pow(zKlavesnice, 2) + Math.Pow(zKlavesnice2, 2));

          Console.ReadKey();
 
Nahoru Odpovědět 13.11.2012 17:34
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Amatérr
Fugiczek:

Podle pythagorovi věty ti to tuším chybí akorát odmocnit:

Math.sqrt(Math.Pow(zKlavesnice, 2) + Math.Pow(zKlavesnice2, 2))
 
Nahoru Odpovědět 13.11.2012 17:39
Avatar
Amatérr
Neregistrovaný
Avatar
Odpovídá na Fugiczek
Amatérr:

Díky moc, nevěděl jsem jak to mám odmocnit.

 
Nahoru Odpovědět 13.11.2012 17:45
Avatar
Kit
Redaktor
Avatar
Odpovídá na Fugiczek
Kit:

V manuálu C# je doporučeno Math.Pow() používat jen pro obecné umocňování kvůli horšímu výkonu. Pokud se Pythagorova věta používá velmi často (např. při určování vzdálenosti ve 2D či 3D), doporučuje se použít násobení a odmocňování. Výraz by pak vypadal takto:

Math.Sqrt(zKlavesnice*zKlavesnice + zKlavesnice2*zKlavesnice2)
Nahoru Odpovědět 13.11.2012 20:03
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Kit
Fugiczek:

Nedalo mi to a musel jsem si to v Javě vyzkoušet, obdržel jsem celkem nemilé výsledky, metoda pow() je asi 100x pomalejší. Po tomhle jsem usoudil že některé metody v Math asi nebudou nejlépe přizpůsobené na výkon a nativní metody budou nejlepší asi na dlouhé rozsáhlé výpočty a pro komunikaci přímo se systémem.
Jinak kód na kterém jsem to zkoušel:

public static void main(String[]args){
                double a;
                double b;
                long start;
                long end;
                start = System.nanoTime();
                a = 5*5;
                end = System.nanoTime();
                System.out.println(end-start);
                start = System.nanoTime();
                b = Math.pow(5, 2);
                end = System.nanoTime();
                System.out.println(end-start);
        }

No a jelikož je C# kopií Javy tak předpokládám že zde to bude stejné nebo aspoň podobné.

Editováno 13.11.2012 20:26
 
Nahoru Odpovědět 13.11.2012 20:25
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Fugiczek
David Čápka:

Takové měření je velmi nespolehlivé, měl bys to spočítat v nějakém cyklu třeba 1000x a pak z hodnot udělat průměr. Jelikož Java je VM, chovají s enějaké funkce při prvním volání jinak, než po volání opětovném. Tím nevylučuji tvůj výsledek, dost možná to vyjde stejně, ale v budoucnu bys mohl tímto způsobem dojít zcela jistě ke špatnému výsledku.

Nahoru Odpovědět 13.11.2012 20:30
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na David Čápka
Fugiczek:

Hodil jsem to do cyklu 1 000x, a poté ještě do 10 000x opakovaném cyklu a metoda pow() byla pokaždé s relativně malou odchylkou 10x pomalejší. Když jsem to meřil pouze jednou vznikaly velké odchylky. Jinak díky za poznámku, nějak mi nedošlo že ve VM je první načtení je nejdelší.

 
Nahoru Odpovědět 13.11.2012 20:37
Avatar
Kit
Redaktor
Avatar
Odpovídá na Fugiczek
Kit:

Tomu bych vůbec nevěřil, protože kompilátor běžně nahrazuje výraz '5*5' výrazem 25 už v preprocesoru. Raději to dej jako parametr funkci a jak naznačil David Čápka, nechej to uvnitř projet cyklem alespoň 1000×.

Nahoru Odpovědět 13.11.2012 20:41
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Kit
Fugiczek:

Dobře, tak se vracím ke svému starému a správnému tvrzení, že metody nativní jsou nejrychlejší :-D
Podle mého finálního měření jsou nativní metody 3x rychlejší.
Kód:

public class Test {

        public static void main(String[]args){
                double cislo;
                double cislo2;
        long []a = new long[1000];
        long []b =  new long[1000];
        long start;
        long end;
        for(int i=0;i<1000;i++){
                start = System.nanoTime();
                cislo = naDruhou(5);
                end = System.nanoTime();
                a[i] = end-start;
        }
        for(int i=0;i<1000;i++){
                start = System.nanoTime();
                cislo2 = Math.pow(5, 2);
                end = System.nanoTime();
                b[i] = end-start;
        }

        System.out.println(secti(a)/1000);
        System.out.println(secti(b)/1000);

        }

        private static double naDruhou(double cislo){
                return cislo*cislo;
        }

        private static long secti(long[]pole){
                long soucet=0;
                for(int i =0;i<pole.length;i++){
                        soucet+=pole[i];
                }
                return soucet;
        }

}
 
Nahoru Odpovědět 13.11.2012 20:53
Avatar
Kit
Redaktor
Avatar
Odpovídá na Fugiczek
Kit:

Zase to měříš divně. Cyklus musí být uvnitř funkce a měření času mimo cyklus. Měříš to i s časem volání funkce.

Mně teď vyšlo, že násobení je 10× rychlejší i při umocňování na desátou. Ovšem většinou se umocňuje jen na druhou, vyšší mocniny bývají výjimečné.

Nahoru Odpovědět 13.11.2012 21:03
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Kit
Fugiczek:

Kdybych dal měření uvnitř funkce tak násobení bude rychlejší o něco, protože do nativní metody měření nedám, takže u mocnění by se měřilo volání a u násobení ne a tím pádem násobení by mělo úlevy.

 
Nahoru Odpovědět 13.11.2012 21:08
Avatar
Kit
Redaktor
Avatar
Odpovídá na Fugiczek
Kit:

Však při běžném násobení ty úlevy má. Použij to ve stejném režimu, v jakém se to obvykle používá. Ta funkce je potřebná jen kvůli vyloučení optimalizace preprocesorem, aby k tomu násobení skutečně došlo. Klidně do té jedné funkce dej oba způsoby.

Nahoru Odpovědět 13.11.2012 21:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Kit
Fugiczek:

I po úlevách je nativní metoda několikrát rychlejší.
Kód:

package org.fugiczek.f_walk;

public class Test {

    public static void main(String[]args){
     double cislo;
     long []a = new long[1000];
     long []b =  new long[1000];
     long start;
     long end;

     for(int i=0;i<1000;i++){
            a[i] = naDruhou(5);
     }
     for(int i=0;i<1000;i++){
            start = System.nanoTime();
            cislo = Math.pow(5, 2);
            end = System.nanoTime();
            b[i] = end-start;
     }

     System.out.println("Násobení: " + secti(a)/1000);
     System.out.println("Mocnění: " + secti(b)/1000);

    }

    private static long naDruhou(double cislo){
                long start, end;
                double vysledek;
                start = System.nanoTime();
            vysledek = cislo*cislo;
            end = System.nanoTime();
            return end-start;
    }

    private static long secti(long[]pole){
            long soucet=0;
            for(int i =0;i<pole.length;i++){
                    soucet+=pole[i];
            }
            return soucet;
    }

}
 
Nahoru Odpovědět 13.11.2012 21:28
Avatar
Kit
Redaktor
Avatar
Odpovídá na Fugiczek
Kit:

Zajímavé. Když jsem si zkopíroval tvůj kód, násobení mi vyšlo 2× rychlejší.

Nahoru Odpovědět 13.11.2012 21:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Kit
Fugiczek:

Nejspíš záleží na více faktorech, napadá mě že možná na různých OS volání nativní metody trvá odlišnou dobu.

 
Nahoru Odpovědět 13.11.2012 21:54
Avatar
Kit
Redaktor
Avatar
Odpovídá na Fugiczek
Kit:

Můžeme mít odlišnou verzi JRE. Mám 1.6.0_22. Také moc nevěřím nanosekundovému měření času, protože mezitím může dojít ke spoustě asynchronních událostí, které měření zkreslí.

Nahoru Odpovědět 13.11.2012 22:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

JVM je prý optimalizovaný pro unixové operační systémy, mohou zde být velké rozdíly.

Nahoru Odpovědět 13.11.2012 22:09
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Kit
Fugiczek:

No odlišnou verzi máme určitě, já používám nejnovější buildy z JDK 8. Navíc mezi JRE 6 a JRE 7 jsou celkem podstatné změny. Probíhaly změny i ve JVM. Doporučil bych udělat alespoň upgrade na JRE 7 update 9 (poslední stabilní verze), JRE 6 má celkem dost bezpečnostních děr.

 
Nahoru Odpovědět 13.11.2012 22:13
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Je to možné. Také je možné, že bych po dvou letech a půl mohl konečně upgradovat svůj OS, ve kterém bude i nová verze JVM. Pořád váhám, který systém vybrat. Je to dost stará mašina s 1 GB RAM.

Nahoru Odpovědět 13.11.2012 22:15
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Fugiczek
Kit:

Javu skoro nepoužívám. Upgrade jednotlivých aplikací dělám jen při upgrade OS. Až na výjimky, do kterých JVM nespadá. Dělám jen pravidelné updaty systému, se kterými se updatují i ty aplikace.

Nahoru Odpovědět 13.11.2012 22:20
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Amatérr
Neregistrovaný
Avatar
Amatérr:

Ještě jeden menší dotaz ohledně převrácení čísla jde to udělat ještě jinak než těmi dvěma způsoby?

char[] arr = s.ToCharArray();
Array.Reverse(arr);
Console.Write(new string(arr));
onsole.WriteLine("Zadej číslo:");
string s = Console.ReadLine();
for (int i = s.Length - 1; i >= 0; i--)
{
Console.Write(s[i]);
}
 
Nahoru Odpovědět 14.11.2012 15:05
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Amatérr
Fugiczek:
int puvodni=1234, prevracene=0, tmp=0;

while(puvodni>0){
  tmp = puvodni%10;
  prevracene = prevracene*10+tmp;
  puvodni = puvodni/10;
}

Na konci cyklu bude v proměnné puvodni 4321

 
Nahoru Odpovědět  +1 14.11.2012 15:13
Avatar
BrotherHeczko
Neregistrovaný
Avatar
BrotherHeczko:

Jednoduchý program na výpočet povrchu a objemu válce bych udělal asi takto:

using System;
using System.Collec­tions.Generic;
using System.Linq;
using System.Text;
using System.Threadin­g.Tasks;

namespace Výpočet_Obsahu_A_Po­vrchu_Válce
{
class Program
{
static void Main(string[] args)
{

start:
double vyska;
Console.Write­Line("Program Na Vypočítání Povrchu A Objemu Válce");
Jedna:
Console.Write­Line("Zadejte Prosím Výšku Válce");
vyska = double.Parse(Con­sole.ReadLine());
if (vyska <= 0)
{
Console.Write­Line("Zadána Chybná hodnota: {0}", vyska);
goto Jedna;
}
else
{
double polomer;
Dva:
Console.Write­Line("Nyní Prosím Zadejte Poloměr Válce");
polomer = double.Parse(Con­sole.ReadLine());
if (polomer <= 0)
{
Console.Write­Line("Zadána Chybná Hodnota: {0}", polomer);
goto Dva;
}
else
{
double povrch;
povrch = (3.14159265358­979323846264338327950288­419716939937510582097494­459230781640628620899862­803482534211706798214808­651328230664709384460955­058223172535940812 * 2) * polomer * (polomer + vyska);
double obsah;
obsah = 3.14159265358­979323846264338327950288­419716939937510582097494­459230781640628620899862­803482534211706798214808­651328230664709384460955­058223172535940812 * (polomer * polomer) * vyska;

Console.Write­Line("Polomer = {0}", polomer);
Console.Write­Line("Výška = {0}", vyska);
Console.Write­Line("Obsah Válce : {0}", obsah);
Console.Write­Line("Povrch Pláště Válce: {0}", povrch);
Console.Write­Line("Pokud chcete znovu vypočítat povrch a objem válce zadejte číslo 666 pokud nechcete zadejte jiné číslo");
double i;
i = double.Parse(Con­sole.ReadLine());
if (i == 666)
{
goto start;
}

else
{
goto konec;
}

}

}

konec:
Console.Write­Line("Konec Programu");
}
}
}

 
Nahoru Odpovědět 18.12.2012 13:39
Avatar
Luboš Běhounek (Satik):

Ehm, par poznamek :)

  1. Pouzivej tag code, at se to da cist.
  2. Čísla typu double mají přesnost maximálně na 16 desetinných míst, to co tam máš navíc se stejně odřízne (a vypadá to hrozně)
  3. Když nějaké číslo (jako ty třeba 3.1415...) používáš vícekrát, vytáhni si ho někam nahoru jako konstantu.
  4. Goto nepoužívej, většina jazyků ho sice ještě umožňuje, ale programátorská konvence je ho nepoužívat, kód je pak strašně nepřehledný.
Editováno 18.12.2012 13:55
Nahoru Odpovědět 18.12.2012 13:55
:)
Avatar
Kit
Redaktor
Avatar
Nahoru Odpovědět 18.12.2012 14:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Ano, C++ i C# mají goto, java ma myslim nejakou obdobu se slovickem break.

Jsou extrémní případy, kdy je řešení s goto efektivnější a přehlednější než bez, ale to jsou vyjímky (pochopil bych to třeba když máte v sobě zanořené 4 cykly a chcete z nich hned vyskočit těsně za ně) a i překladače kód s goto většinou nedokážou tak dobře optimalizovat.

Nahoru Odpovědět 18.12.2012 14:36
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

Vím to, ale nikdy jsem goto nepoužil.

Nahoru Odpovědět 18.12.2012 14:39
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Kit
Petr Nymsa:

Goto mi s prominutím přijde jako největší prasárna. Nejen že to dělá občas neplechu, ale prostě se to nepoužívá, nebo jsem neviděl u nikoho v C# použít goto

Nahoru Odpovědět 18.12.2012 15:22
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Luboš Běhounek (Satik):

Ano, je to prasárna, ale jsou situace, kdy je to elegantnější než cokoliv jiného, i když jsou tak řídké, že se to skoro nepoužívá.

Nahoru Odpovědět 18.12.2012 15:55
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

Ty řídké situace vznikají nesprávným rozborem problému. Od doby, kdy existují klíčová slova break, continue, return a throw, není goto vůbec potřebné. Obešel jsem se bez něj i v době, kdy tato klíčová slova nebyla k dispozici.

Nahoru Odpovědět 18.12.2012 16:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Lukáš Hruda (Luckin):

Používání goto pro posunutí v kódu směrem dopředu (dolů) je prasárna asi vždycky, já to používam občas když sem zahrabanej v nějakých podmínkách nebo cyklech a potřebuju se tam odsud dostat někam zpátky, většinou na začátek funkce. Většinou to používam jenom v main, když v nějakých výjimečných situacích potřebuju aby program začal od znova. Přijde mi to přehnednější než to dělat rekurzí, nebo nějakym velkym cyklem.

 
Nahoru Odpovědět 18.12.2012 16:25
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Tak takovou situaci si vůbec nedovedu představit. Nevidím důvod, proč bych se měl vracet na začátek funkce.

Některé jazyky goto vůbec nemají. Jiné neumožňují ani přepsat hodnotu proměnné a přesto se v nich dá napsat vše.

Nahoru Odpovědět 18.12.2012 16:31
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Samozřejmě se místo goto dá snad všude použít některá z variant break, continue, return a vyjímky, ale pokud jde někde třeba o rychlost, tak goto může přispět ke značné optimalizaci.

A opravdu jsou situace, kdy je i goto přehlednější, než výše zmiňovaná klíčová slova, ale je to opravdu velmi zřídka.

EDIT: A jeho používání jinak taky považuji za prasárnu, ale prostě jsou místa, kde i goto má své opodstatnění.

Editováno 18.12.2012 16:44
Nahoru Odpovědět 18.12.2012 16:42
:)
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Neřikam že to nejde udělat jinak, ale je to podle mě přehlednější a jednodušší. Potřeba vracet se na začátek funkce (ale ne uplně na začátek) se u mě čas od času objeví, většinou u her.

 
Nahoru Odpovědět 18.12.2012 16:46
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

Je to hodně o způsobu uvažování programátora. Ten, který goto nepoužívá, uvažuje stylem: "Budu ten požadavek na data opakovat, dokud nedostanu správný vstup". Programátor, který goto používá, uvažuje: "Načtu data ze vstupu a pokud je v nich chyba, vrátím se na začátek".

Argument rozdílu rychlostí je úplně mimo. Kompilátor v obou případech vygeneruje podobný kód. Pokud budu potřebovat něco skutečně rychlého (například DCT, RK4 apod.), místo C/C++ sáhnu raději po Fortranu, ve kterém se goto také už moc nepoužívá.

Nahoru Odpovědět 18.12.2012 16:53
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Luboš Běhounek (Satik):

Zrovna v tehle situaci je goto prasarna.

Resit se to da treba takhle:

...
while (maFunkce()) {}
...

...
bool maFunkce()
{
    // nejaky kod, ktery neco dela

    // pokud chci tenhle kod nechat bezet znova od zacatku, tak jen zavolam
    return true;

    // pokud jsem dosel na konec a uz ho znova vykonat nechci, tak
    return false;
}
...
Editováno 18.12.2012 16:54
Nahoru Odpovědět 18.12.2012 16:53
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

Uvedený kód mi také nepřijde moc elegantní. To už bych raději použil

for(;;) {
    // nejaky kod, ktery neco dela

    // pokud chci tenhle kod nechat bezet znova od zacatku, tak jen zavolam
    continue;

    // pokud jsem dosel na konec a uz ho znova vykonat nechci, tak
    break;
}
Nahoru Odpovědět 18.12.2012 17:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Luboš Běhounek (Satik)
Lukáš Hruda (Luckin):

V týhle situaci bych goto nepoužil. To cos ty tu napsal je jenom obyčejnej cyklus opakující se dokud funkce vrací true. Myslel sem to tak že když máš nekonečnej cyklus například (v nějaký hře), v tom cyklu jsou různý větvení a jenom z určitý větve se potřebuješ vrátit zpátky, někam na začátek funkce. Můžeš tu funkci zavolat rekurzivně, ale to mi nepřipadá moc přehledný, navíc pokud se nechceš vrátit uplně na začátek, tak bys musel řešit přeskočení tý části kterou nechceš vykonat, myslim že goto je v tomhle případě jednodušší.

 
Nahoru Odpovědět 18.12.2012 17:08
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Co by bylo elegantnejsi zalezi na situaci, i kdyz ten tvuj je asi trosku elegantnejsi.

Co se tyce toho goto - ktery kod ti prijde hezci a rychlejsi?

S goto

public static void Goto(int w, int h)
        {
            for (int i = 0; i < h; i++)
            {
            DalsiRadek:
                for (int j = 0; j < w; j++)
                {
                    for (int k = 0; k < i; k++)
                    {
                        for (int l = 0; l < j; l++)
                        {
                            // tady treba nejaky vypocty

                            if (vysledekvypoctu splnuje nejakou podminku)
                                goto DalsiRadek;
                        }
                    }
                }
            }
        }

Bez goto

public static void Goto2(int w, int h)
        {
            bool breakni = false;

            for (int i = 0; i < h; i++)
            {
                for (int j = 0; j < w; j++)
                {
                    for (int k = 0; k < i; k++)
                    {
                        for (int l = 0; l < j; l++)
                        {
                            // tady treba nejaky vypocty

                            if (vysledekvypoctu splnuje nejakou podminku)
                            {
                                breakni = true;
                                break;
                            }
                        }

                        if (breakni) break;
                    }
                    if (breakni)
                    {
                        breakni = false;
                        break;
                    }
                }
            }
        }
Nahoru Odpovědět 18.12.2012 17:15
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Nekonečný cyklus ... větvení ... vyskočení z cyklu ... To lze i pomocí for, continue a break. Pokud skáčeš na začátek pokaždé jinam, je to prasárna.

Nahoru Odpovědět 18.12.2012 17:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Nahoru Odpovědět 18.12.2012 17:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Kdyz se ti nelibi ani jeden, tak jak by jsi to resil? :)

Nahoru Odpovědět 18.12.2012 17:26
:)
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Pokaždý na stejný místo ale ne uplně na začátek třeba (jelikož tam je například nějaká inicializace která se znova provádět nemá). Tak samozřejmě že to de řešit jinak, třeba breaknout se ven z toho nekonečnýho cyklu a ten dát do nějakýho do while cyklu kterej začíná v tom místě kam se chci vracet. Tim pádem by mě to z toho nekonečnýho cyklu vyhodilo za něj, a ten do while cyklus by mě vrátil zpátky. To mi ale přijde jako zbytečný psaní navíc a v případě úprav by to mohlo znamenat přepisování větší části kódu. V některých případech je prostě daleko přehlednější a jednodušší jednou napsat goto start.

 
Nahoru Odpovědět 18.12.2012 17:28
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Petr Nymsa:

Bez znalostí objektového programování jsem opravdu dělal programy stylem čím víc cyklů a podmínek tím víc programátor a nejlépe by se hodilo "And we need go to deeper" :D. Tudíž jsem potřeboval nějaký části kódu opakovat i na více místech. Takové byly začátky

Nahoru Odpovědět 18.12.2012 17:54
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Lukáš Hruda (Luckin):

Já když sem psal svuj první větší program tak sem neměl páru o funkcích. Byl to poker v konzoli, hráč vs. AI. Mělo to pár chyb, ale vesměs to fungovalo. Akorát co celý bylo ve funkci main a kód měl přes 8 tisíc řádek. Ještě pořád to tu někde mam.

 
Nahoru Odpovědět 18.12.2012 18:00
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Petr Nymsa:

Ano takto jsem dělali různé aplikace. To byly časy :D

Nahoru Odpovědět 18.12.2012 18:29
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

Například bych vnitřní 3 cykly měl ve funkci, která by vykonávala nějaký logický celek. Z něj bych vyskakoval buď returnem, anebo výjimkou podle toho, zda by to bylo běžné řízení programu nebo chyba. Vně funkce bych na tyto události reagoval a řídil podle nich další zpracování.

To, co jsi tady předvedl, je tzv. předčasná optimalizace. Která, jak známo, vede do pekel. Kromě toho to máš v obou případech chybně. Dojde k zacyklení.

Nahoru Odpovědět 18.12.2012 19:59
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Totéž jako u Luboš Běhounek (Satik)a. Mé algoritmy mě nikdy nedostanou do situace, kdy bych potřeboval takové obskurní řešení ať již s goto nebo bez něho. Možná je to použitelné u assembleru, ale do vyšších programovacích jazyků takové zlozvyky nepatří.

Nahoru Odpovědět 18.12.2012 20:03
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Luboš Běhounek (Satik):

Kdyz by to skakani bylo treba jen pred druhej cyklus, a vnitrni cykly treba casto behaly jen do malych cisel, tak by ta rezie volani funkce uz mohla byt na rychlosti docela znat (obzvlast v nenativnich jazycich). A zachytavani vyjimek ma rezii jeste vetsi. Potom muze mit v kodu svoje misto goto, ktera se do assembleru ve vetsine pripadu prelozi jako jedina instrukce (JMP).

Me optimalizace bavi, uz se mi parkrat stalo, ze jsem zacal funkci kvuli rychlosti prepisovat do assembleru, ale je pravda, ze obcas to uz trochu prehanim :)

A k zacyklení v tech ukazkach nedojde (a stejne to byly jen vymysleny ukazkovy kody)

Nahoru Odpovědět 18.12.2012 20:28
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
Lukáš Hruda (Luckin):

Režije volání funkce se dá eliminovat tak, že ta funkce bude inline. Pokud kód tý funkce jako takový nemá vliv na rychlost.

 
Nahoru Odpovědět 18.12.2012 20:42
Avatar
Luboš Běhounek (Satik):

Nektere jazyky (napr. C#) bohuzel __forceinline neumi, jinak samozrejme pro casove kriticke casti kodu je to super vec a pak ta cast kodu muze byt i ve funkci.

Nahoru Odpovědět 18.12.2012 20:45
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

Od té doby, kdy jsem se vykašlal na optimalizace, jsou mé programy rychlejší. Asi proto, že svou pozornost nesoustřeďuji na pochybné optimalizace, ale na algorimus úlohy.

Je úplně zbytečné snažit se optimalizovat něco, co je mimo vnitřní cykly.

Editováno 18.12.2012 20:54
Nahoru Odpovědět 18.12.2012 20:52
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Luboš Běhounek (Satik)
Lukáš Hruda (Luckin):

Je to docela hodně znát. Třeba když sem pro quick sort v C++ používal na prohození hodnot funkci, pokud nebyla inline zabralo řazení skoro 2x víc času.

 
Nahoru Odpovědět 18.12.2012 21:00
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

A divíš se? Proč myslíš, že nesnáším primitivní gettery a settery?

Nahoru Odpovědět 18.12.2012 21:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Settery a gettery dělam zásadně inline. V C++ je každá členská funkce definovaná v bloku třídy automaticky inline a takhle krátky funkce se uvnitř většinou definujou, takže na to ani nemusíš myslet.

 
Nahoru Odpovědět 18.12.2012 21:11
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

A já ty primitivní pro jistotu nedělám vůbec. Nikdy nepotřebuji nastavit jednu hodnotu a nikdy nepotřebuji přečíst jednu hodnotu.

Například u souřadnic je hloupost nastavovat zvlášť setX(x) a setY(y), když to můžu nastavit naráz setXY(x,y). Je například chybné psát

x=obj.getX();
x=x+rychlostX;
obj.setX(x);
y=obj.getY();
y=y+rychlostY;
obj.setY(y);

když můžu udělat daleko pohodlněji

obj.addXY(rychlostXY);

Na takových primitivních operacích se ztrácí nejvíc času.

Nahoru Odpovědět 18.12.2012 21:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 73 zpráv z 73.