Začátky s C podle Herouta

Honza1302

Začátky s C podle Herouta
« kdy: 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í.   
:-)))
« Poslední změna: 11. 02. 2013, 12:09:26 od Petr Krčmář »


Honza1302

Re:Začátky s C podle Herouta
« Odpověď #1 kdy: 11. 02. 2013, 12:02:26 »
9.  else
10.   max = c;   
 
 Samozřejmě zde má být x,  a ne max.
Překlep, pardon.

tadeas

Re:Začátky s C podle Herouta
« Odpověď #2 kdy: 11. 02. 2013, 12:04:31 »
Zkus si tam doplnit chlupatý závorky, pak to bude srozumitelnější.

Re:Začátky s C podle Herouta
« Odpověď #3 kdy: 11. 02. 2013, 12:09:42 »
Samozřejmě zde má být x,  a ne max.

Opravil jsem.

Neviditelný

Re:Začátky s C podle Herouta
« Odpověď #4 kdy: 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)


neron

Re:Začátky s C podle Herouta
« Odpověď #5 kdy: 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).

Rax

Re:Začátky s C podle Herouta
« Odpověď #6 kdy: 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]

i

Re:Začátky s C podle Herouta
« Odpověď #7 kdy: 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;
...

marwyn

Re:Začátky s C podle Herouta
« Odpověď #8 kdy: 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));

pedro

Re:Začátky s C podle Herouta
« Odpověď #9 kdy: 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...

bedna

Re:Začátky s C podle Herouta
« Odpověď #10 kdy: 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

Natix

Re:Začátky s C podle Herouta
« Odpověď #11 kdy: 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.

pedro

Re:Začátky s C podle Herouta
« Odpověď #12 kdy: 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...

Natix

Re:Začátky s C podle Herouta
« Odpověď #13 kdy: 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.

pedro

Re:Začátky s C podle Herouta
« Odpověď #14 kdy: 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čí?