To Jura : Nj pravda to 45er8.. Já počítal jenom s celýma číslama :) Pak souhlas, že pokud to chce mít maximálně ošetřený, tak načíst do řetězce a pak konvertovat na double.. Ještě by to šlo udělat hrubou silou a načítat znak po znaku, ale to by nebylo zrovna elegantí řešení :smile5:
Příspěvky odeslané z IP adresy 147.229.197.–
To Jura : S timhle souhlasím: "Jen si je dobré uvědomit, jak funguje scanf - bere znaky jen po první bílý znak, mezi které patri i '\n'", ale s timhle už ne: "který přečte a pak zahodí". Já myslim, že ho nezahodí. Jak by moh potom fungovat kód dole?
To Koja : Buď nevim, co přesně chceš, nebo si to zkoušel blbě, pač mě to funguje.. Viz kód, do pole se načítaj zadaný čísla, po Entru se provede výpočet a když dáš Ctrl+D tak program skončí..
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int PocetPrvku, c, pocitadlo = 0, pole [100];
double cislo;
while ((PocetPrvku = scanf("%lf", &cislo)) != EOF)
{ /* scanf zpracovava vstup podle specifikovane konverze,
jakmile konverzi vstup neodpovida, skonci */
if (PocetPrvku == 0) // chybne zadane cislo
{ //nejaka chybova hlaska
printf("Chybny vstup\n");
return EXIT_SUCCESS;
}
pole[pocitadlo++] = cislo;
printf("obsah pole: ");
for (int i = 0; i < pocitadlo; i++)
printf("%d ", pole[i]);
printf("\n");
// neni nahodou za vstupem ktery zpacoval scanf konec radku?
if ((c = getchar()) == '\n')
{ // ANO, tak zavolame si zavolame nejakou funci..
printf("vypocet..\n");
}
}
return EXIT_SUCCESS;
}
Jinak překládáno na WinXP pomocí GCC verzi nevim (součást IDE Code::Blocks) a funguje tak jak píšu..
Aha když to chceš odchytit obojí, tak to jde napsat třeba takhle:
while ((PocetPrvku = scanf("%lf", &cislo)) != EOF)
{ // scanf zpracovava vstup podle specifikovane konverze (%d%lff..), jakmile konverzi vstup neodpovida, skonci
if (PocetPrvku == 0) // chybne zadane cislo
{ //nejaka chybova hlaska
return EXIT_SUCCESS;
}
pole[pocitadlo++] = cislo;
if ( (c = getchar) == '\n')
{ // neni nahodou za vstupem ktery zpacoval scanf konec radku?
// ANO, tak zavolame si zavolame nejakou funci..
}
}
Stiskem Enter odřádkuješ, takže vlastně "napíšeš" znak novýho řadku, kterej se v C zapíše jako '\n'. Místo EOF si hlídej ten novej řádek...
Jen pro zajímavost a když už sem se do toho pustil.. Tohle mi přijde lepší v tom smyslu, že se provede jen nezbytně nutnej počet porovnání, min 2 a max 3. V kódu od Frenzyho je to min 2 a max 8. Třeba při výpisu čísla 3 se provede spousta stejnejch, takže zbytečnejch porovnání.. Ale zase pro někoho to může bejt názornější :)
if (a < b)
{ // pořadí podle velikosti a-b, no a co c?
if (c > b) printf("%d", b); // b prostřední
else
{ // b je určitě největší, jak malé/velké je a vůči c?
if (a < c) printf("%d", c); // c prostřední
else printf("%d", a); // a prostřední
}
}
else
{ // pořadí podle velikosti b-a, no a co c?
if (c > a) printf("%d", a); // a prostřední
else
{ // a je určitě největší, jak malé/velké je b vůči c?
if (b < c) printf("%d", c); // c prostřední
else printf("%d", b); // b prostřední
}
}
gets ZASADNE nepouzivat!! Na to uz dokonce upozornuji prekladace. Co kdyz je velikost nacitanyho retezce vetsi nez velikost toho pole?!! Lepsi je pouzit
char * fgets (char *s, int count, FILE *stream), ktera nacte maximalne count - 1 znaku a ulozi je do s. Zastavi se, kdyz narazi na konec radku, pricemz znak novyho radku ulozi do s a s ukonci znakem '\0'. Vrati s (vse OK) nebo NULL, pokud narazi na nejakou chybu nebo konec souboru.
Misto nejakyho souboru (FILE *stream) muzem pouzit stdin a pak bude cist ze standardiho vstupu..
char array [10];
fgets(array, 10, stdin); // nacte max 9 znaku a ulozi do array i s konovym znakem retezce
To o-lox: Přesně tak, jenom bych to napsal tak jak se to běžně v céčku píše :smile1:
int n; // počet načtených prvků
while ((n = scanf("%lf", &cislo)) != EOF)
{
if (n == 0)
{ // chybný vstup programu
printf("Zadavej cisla amatere!!\n");
exit(1); // ukončí celý program s chybovým kódem 1
}
pole[x++] = cislo;
/* Nechápu na co je ten kód pod komentářem. Každopádně když
* načteš něco jiného než číslo, scanf ti do "cislo" nic neuloží
* To je ten segemtation fault.. */
c = cislo;
if ((isspace(c)) && (c == '\n'))
{
printf("\n");
}
}
To Koja : Najdi si help k funkci scanf, tam se doctes, neco v tom smyslu, ze vraci pocet spravne nactenych prvku specifikovanych formatovacim retezcem (%d %i atd...). Takze, kdyz chces nacist long double a na vstupu je retezec, tak scanf nic nenacte (POZOR, ale sebere ti to z vyrovnavaci pameti pro vstup-vystupni operace nebo jak se to jmenuje, ted nevim ja ted volam pres skype a to uz je na me moc veci najednou :-D)
To Spectator : Za to se omlouvam, po odeslani prispevku se jmeno vlozit uz bohuzel nedalo.
OT
To Earl Cash: Clovece, mas muj obdiv!! :smile2: Ja bych pana dc195 po jeho druhym dotazu nekam poslal.. Aby mu to clovek udelal veschno sam a jeste mu k tomu postavil u baraku bazen aby se pan nenudil:)
To dc195: Jestli to s progamovanim myslis vazne, tak tvuj silne pasivni pristup co nejrychlejs zmen! Jinak se nikdy aspon na trochu solidni urovni programovat nenaucis. Nehlede na to, ze te pak na foru misto odpovedi na tvuj dotaz casto nekam poslou..
btw: Jenom takovej navrh pro moderatory/autory webu.. Podle typu dotazu se tu vyskytuje asi dost uplnych zacatecniku, takze by asi nebylo spatny napsat pro ne navod jak se na foru ptat, kde hledat, ze podstatna je vlastni aktivita atd.
Jinak srry za to stourani.
Sorry za ten double post, ale v Operu to asi moc nebere :( BTW Zajimavy ze je tady rubrika, kritika webu.
Proc chces seradit dve cisla, ktery mas ulozeny jenom v promennych moc nechapu (kdyby byly ulozeny v poli, seznamu atd. tak proc ne), ale jestli chces vypsat nejdriv to mensi cislo a potom to vetsi tak co treba takhle:
var a,b: integer;
begin
write('Napis prvni cislo: '); readln(a);
write('Napis druhe cislo: '); readln(b);
if a>b then
write(b, ' ', a)
else
if a=b then write('Cisla jsou stejna')
else write(a, ' ', b);
readln;
end.
Nevim jestli je to syntakticky spravne, pac sem Pascal uz dlouuho nevidel.. :)
Proc chces seradit dve cisla, ktery mas ulozeny jenom v promennych moc nechapu (kdyby byly ulozeny v poli, seznamu atd. tak proc ne), ale jestli chces vypsat nejdriv to mensi cislo a potom to vetsi tak co treba takhle:
var a,b: integer;
begin
write('Napis prvni cislo: '); readln(a);
write('Napis druhe cislo: '); readln(b);
if a>b then
write(b, ' ', a)
else
if a=b then write('Cisla jsou stejna')
else write(a, ' ', b);
readln;
end.
Nevim jestli je to syntakticky spravne, pac sem Pascal uz dlouuho nevidel.. :)