Anonymní profil Anonymní uživatel – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Anonymní uživatel – Programujte.comAnonymní profil Anonymní uživatel – Programujte.com

 

Příspěvky odeslané z IP adresy 147.229.197.–

Romi
C / C++ › Ošetření vstupu
4. 11. 2008   #89092

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:

Romi
C / C++ › Ošetření vstupu
4. 11. 2008   #89088

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..

Romi
C / C++ › Ošetření vstupu
4. 11. 2008   #89082

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..
}
}

Romi
C / C++ › Ošetření vstupu
3. 11. 2008   #89065

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...

Romi
C / C++ › Výběr proměnné podle hodnoty
3. 11. 2008   #89062

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í
}
}

Romi
C / C++ › HELP_řetězec
29. 10. 2008   #88657

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

Romi
C / C++ › C - převod parametru
21. 10. 2008   #88023

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");
}
}

Romi
C / C++ › C - převod parametru
21. 10. 2008   #88014

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)

Romi
C / C++ › Otevření
8. 10. 2008   #86858

To Spectator : Za to se omlouvam, po odeslani prispevku se jmeno vlozit uz bohuzel nedalo.

Anonymní uživatel
C / C++ › Otevření
8. 10. 2008   #86854

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.

Nahodny Kolemjdouci
Delphi › Delphi - umí zde někdo ?
6. 10. 2008   #86678

Sorry za ten double post, ale v Operu to asi moc nebere :( BTW Zajimavy ze je tady rubrika, kritika webu.

Nahodny Kolemjdouci
Delphi › Delphi - umí zde někdo ?
6. 10. 2008   #86677

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.. :)

Nahodny Kolemjdouci
Delphi › Delphi - umí zde někdo ?
6. 10. 2008   #86675

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.. :)

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý