Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Honza1302 11. 02. 2013, 11:46:55

Název: Začátky s C podle Herouta
Přispěvatel: Honza1302 11. 02. 2013, 11:46:55
Dobrý den!
Chtěl bych poprosit s jednou banalitou v C jazyku. Jsem začátečník, tak mě prosím šetřete v kritice.  ;)
Jedná se o jeden příklad.  Máme udělat "program", který přečte tři čísla a zobrazí nejvetsí z nich.
v učebnici Pavla Herouta je:

Kód: [Vybrat]
1. int a, b, c, x;
2. printf("zadej tri cela cisla: \n");
3. scanf("%d%d%d", &a, &b, &c);
4.
5. if (a > b)
6.  if (a > c)
7.    x = a;
8.
9.  else
10.   x = c;
11.
12. else
13.  if (b < c)
14.   x = c;
14. else
15.  x = b;
16.
17.printf("Nejvetsi cislo je: %d", x)

Nechci, aby jste se mi smali, ale nenašel by se někdo, kdo by mi to nějak okomentoval. Pripada mi, že na 9. a 10. řádku (else  max = c)je to navic, ale samozrejme to bez toho nefunguje.
 Já věřím, že zde jsou rozumní lidé, že mě nebudete mít za debila, že mi někdo napíše něco přínosneho, nejste přece jako komunita lidí na zpovednici či diskuteri z Novinek.  :D :D

Tento přiklad jsem udelal pomoci podmíněného přikazu, takto mi to pripadne rozumnejsi a chápatelnější:

Kód: [Vybrat]
#include <stdio.h>
#include <stdlib.h>

void main()
{
int a, b, c;
int x;

printf("Zadej tri cisla : \n");
scanf("%d%d%d", &a, &b, &c);

x = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);

printf("Nejvetsi cislo ze zadanych je: %d\n", x);

}

Ale rád bych chtěl 100% rozumět tomu předešlému přikladu z Herouta.
Díky moc za poradění.   
:-)))
Název: Re:Začátky s C podle Herouta
Přispěvatel: Honza1302 11. 02. 2013, 12:02:26
9.  else
10.   max = c;   
 
 Samozřejmě zde má být x,  a ne max.
Překlep, pardon.
Název: Re:Začátky s C podle Herouta
Přispěvatel: tadeas 11. 02. 2013, 12:04:31
Zkus si tam doplnit chlupatý závorky, pak to bude srozumitelnější.
Název: Re:Začátky s C podle Herouta
Přispěvatel: Petr Krčmář 11. 02. 2013, 12:09:42
Samozřejmě zde má být x,  a ne max.

Opravil jsem.
Název: Re:Začátky s C podle Herouta
Přispěvatel: Neviditelný 11. 02. 2013, 12:39:48
Kód: [Vybrat]

int a, b, c, x;
printf("zadej tri cela cisla: \n");
scanf("%d%d%d", &a, &b, &c);

if (a > b) {       /* Je A vetší než B? */
                   /* Ano, porovnej dále A */
    if (a > c) {   /* Je A větší než C? */
        x = a;     /* Ano, nejvyšší číslo je A */
    } else {
        x = c;     /* Není, nejvyšší číslo je C */
    }
} else {
    if (b < c) {
        x = c;
    } else {
        x = b;
    }
}

printf("Nejvetsi cislo je: %d", x)
Název: Re:Začátky s C podle Herouta
Přispěvatel: neron 11. 02. 2013, 13:20:43
Je to jednoduchý, prostě na začátku testuju, jestli je a > b a tim se mi to rozpadne na 2 pripady. V prvnim pripade je nejvetsi bud a nebo c (a je tam vnorena dalsi podminka) a ve druhem pripade je nejvetsi bud b nebo c (zase je tam vnorena podminka). Je vice nez vhodne pouzivat slozene zavorky, tento priklad je toho dukazem, verim ze skoro na vsech projektech je syntaxe if bez slozenach zavorek zakazana (tyka se nejenom C, ale vsech jazyku s obdobnou syntaxi, jako je C#, Java, PHP).
Název: Re:Začátky s C podle Herouta
Přispěvatel: Rax 11. 02. 2013, 14:01:08
Stačí si to přepsat tak jak se to píše normálně a rázem je to jasné. Použitý prasostyl autora skutečně překážkou k pochopení.

Kód: [Vybrat]
int a, b, c, x;
printf("zadej tri cela cisla: \n");
scanf("%d%d%d", &a, &b, &c);

if (a > b)
{
  if (a > c)
  {
    x = a;
  }
  else
  {
    x = c;
  }
}
else if (b < c)
{
  x = c;
}
else
{
  x = b;
}
printf("Nejvetsi cislo je: %d", x)

[/quote]

nebo

Kód: [Vybrat]
int a, b, c, x;
printf("zadej tri cela cisla: \n");
scanf("%d%d%d", &a, &b, &c);

if (a > b)
{
  if (a > c) x = a; else x = c;
}
else if (b < c) x = c; else x = b;

printf("Nejvetsi cislo je: %d", x)

[/quote]
Název: Re:Začátky s C podle Herouta
Přispěvatel: i 11. 02. 2013, 15:37:54
Buďto jsem nepochopil zadání nebo to příliš komplikujete, proč ne takto?

Kód: [Vybrat]
...
x = a;
if (b > x) x =b;
if (c > x) x =c;
...
Název: Re:Začátky s C podle Herouta
Přispěvatel: marwyn 11. 02. 2013, 17:52:56
Kód: [Vybrat]
#define max(x,y) (x ^ ((x ^ y) & -(x < y)))
printf("Nejvetsi cislo je: %d", max(max(a,b),c));
Název: Re:Začátky s C podle Herouta
Přispěvatel: pedro 11. 02. 2013, 19:09:53
Buďto jsem nepochopil zadání nebo to příliš komplikujete, proč ne takto?

Kód: [Vybrat]
...
x = a;
if (b > x) x =b;
if (c > x) x =c;
...

Protože je to špatně pro případ b>c, c>a, b>c...

Kód: [Vybrat]
#define max(x,y) (x ^ ((x ^ y) & -(x < y)))
printf("Nejvetsi cislo je: %d", max(max(a,b),c));
Zamachrovals pěkně, ale z tvé knížky by se (tohle bude nejspíš v kapitole učíme se if-else) nikdo nic nenaučil...
Název: Re:Začátky s C podle Herouta
Přispěvatel: bedna 11. 02. 2013, 19:23:21
Buďto jsem nepochopil zadání nebo to příliš komplikujete, proč ne takto?

Kód: [Vybrat]
...
x = a;
if (b > x) x =b;
if (c > x) x =c;
...

Protože je to špatně pro případ b>c, c>a, b>c...

Kód: [Vybrat]
#define max(x,y) (x ^ ((x ^ y) & -(x < y)))
printf("Nejvetsi cislo je: %d", max(max(a,b),c));
Zamachrovals pěkně, ale z tvé knížky by se (tohle bude nejspíš v kapitole učíme se if-else) nikdo nic nenaučil...
FAIL!  ;D
Název: Re:Začátky s C podle Herouta
Přispěvatel: Natix 11. 02. 2013, 19:30:36
Buďto jsem nepochopil zadání nebo to příliš komplikujete, proč ne takto?

Kód: [Vybrat]
...
x = a;
if (b > x) x =b;
if (c > x) x =c;
...

Protože je to špatně pro případ b>c, c>a, b>c...

Vždyť to má dobře.
Název: Re:Začátky s C podle Herouta
Přispěvatel: pedro 11. 02. 2013, 19:34:22
Buďto jsem nepochopil zadání nebo to příliš komplikujete, proč ne takto?

Kód: [Vybrat]
...
x = a;
if (b > x) x =b;
if (c > x) x =c;
...

Protože je to špatně pro případ b>c, c>a, b>c...

Vždyť to má dobře.
Jakto? Já nejsem programátor, tak tu konstrukci možná úplně nechápu...
Název: Re:Začátky s C podle Herouta
Přispěvatel: Natix 11. 02. 2013, 20:10:09
Buďto jsem nepochopil zadání nebo to příliš komplikujete, proč ne takto?

Kód: [Vybrat]
...
x = a;
if (b > x) x =b;
if (c > x) x =c;
...

Protože je to špatně pro případ b>c, c>a, b>c...

Vždyť to má dobře.
Jakto? Já nejsem programátor, tak tu konstrukci možná úplně nechápu...

1. Do x přiřadím 1. vstupní hodnotu (a).
2. Pokud je 2. vstupní hodnota (b) větší než aktuální hodnota x, přiřadím b do x. Nyní je v x hodnota max(a, b).
3. Pokud je 3. vstupní hodnota (c) větší než aktuální hodnota x, přiřadím c do x. Nyní ve v x hodnota max(max(a, b), c), což se rovná max(a, b, c)
... atd.
Lze induktivně rozšířit na libovolný počet vstupních čísel (např. pole). V podstatě provádím sekvenční redukci pomocí asociativní binární operace maximum.
Název: Re:Začátky s C podle Herouta
Přispěvatel: pedro 11. 02. 2013, 20:22:44
Njn, a ještě to nebylo žádné voodoo, ale prostě jsem si to blbě přečetl :-( Tak beru zpět a navíc připouštím, že je to lepší řešení, než to Heroutovo.
Btw z jaké knížky se na IT takové věci učí?
Název: Re:Začátky s C podle Herouta
Přispěvatel: hawran neprihlaseny 11. 02. 2013, 20:30:57
Ale chlopi, jak to neni reseno pres templejty, je to cele na vykal ...

ps: Jak mam kuwa vedet, kolik trpajzliku patri ke  Snehurce? Treba v nasem state neni mnohozenstvi povoleno. Zatim(?).