C vstup

Sekcia o programovaní, programovacích jazykoch...
Používateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: C vstup

Príspevok od používateľa marko365 »

Ctrl+z je simulovanie EOF ?
A

Kód: Vybrať všetko

int i=0;
 int v[99];
 
 while (v[i]!=EOF){
   scanf("%d",&v[i]);
   i++;

	 }
pyta sa ci je zobrany vstup koniec vstupu a ak ano tak to zapis do v. Dobre tomu rozumiem?
Používateľov profilový obrázok
crux2005
VIP
VIP
Príspevky: 10030
Dátum registrácie: So 18. Jún, 2005, 20:00
Bydlisko: Nové Zámky

Re: C vstup

Príspevok od používateľa crux2005 »

Skôr CTRL + C a nič to nesimuluje. Pošle to signál ukončenia vstupu, ktorý sa interpretuje ako znak konca vstupu...

1.) C nekontroluje medze polí
2.) program sa vykonáva sekvenčne, ergo na začiatku sa pozrie čo je v, ktoré nie je inicializované a náhodou tam môže byť -1 == EOF
3.) scanf ti imho nezoberie &v
---------------------------------------------

celé je to v podstate zlé... najdi si najlepšie nejaký example kód, ako to napísať a/alebo hľadaj na http://www.cplusplus.com/ (popis, vysvetlenia, ukážky kódov k C/C++ funkciám), man pages atď...
s pozdravom, crux.
Používateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: C vstup

Príspevok od používateľa marko365 »

1.Este otazka ak by na vstupe bolo -1 tak to berie ako EOF neberie to nahodou vtedy kedy uz nema vstup?
2.Preco by scanf nemohol zobrat vstup ?
3." C nekontroluje medze polí " tomu nerozumiem.
A neviem preco ked si krokujem program a dan ctrl+c tak ho ukocni si si isty.
Používateľov profilový obrázok
pEpinko
Používateľ
Používateľ
Príspevky: 850
Dátum registrácie: Po 19. Máj, 2008, 09:31
Bydlisko: BA/NR

Re: C vstup

Príspevok od používateľa pEpinko »

1. Problem je v tom, ze scanf s %d hlada cislo napisane v texte a snazi sa ho konvertovat zo znakov na cislo. Ked mu podstrcis znak Control+C (ci Control+D, alebo neviem aky este...) tak ho nevie konvertovat na cislo, preto ulozi 0. Co nieje EOF, ktory je pravdepodobne definovany ako -1 (fakt teraz neviem ci je aj v standarde -1, alebo to zelezi na implementacii).

Mohol by si to ale urobit podla navratovej hodnoty scanf, ta je totiz počet tokenov v formatovacom retazci, ktore sa podarilo sparsovat (pripadne -1 ak je chyba). Co znamena, ze ak si zadal cislo, tak tvoj scanf vracia 1, ak si zadal necislo, tak vracia 0.

3. Znamena to, ze sa nemozes spolahnut na to, ze nebudes citat/pisat za tvojim polom. Vo svojom priklade mas 99 prvkove pole a niekde nekontrolujes, ci niekto nezadava toho viac. Co je zle. Pokial nezadas viacej ako 99 prvkov, tak sa to funkcnosti neprejavi, ak zadas viac, uz to moze mat vseliaky efekt.
Používateľov profilový obrázok
crux2005
VIP
VIP
Príspevky: 10030
Dátum registrácie: So 18. Jún, 2005, 20:00
Bydlisko: Nové Zámky

Re: C vstup

Príspevok od používateľa crux2005 »

marko365 napísal:A neviem preco ked si krokujem program a dan ctrl+c tak ho ukocni si si isty.
Celkom nechápem otázke. Avšak to aká kombinácia klávesov ukončí beh programu/vstupu, záleží od OS. Windows: CTRL + Z (ak sa nemýlim), Linux: CTRL + C.

K samotnému kódu: ak nevieš aký budeš mať dlhý vstup a potrebuješ ho nutne zapamätávať, tak sa v Cčku nevyhneš dynamickej alokácii pamäti. Aby si ju lepšie pochopil, potrebuješ mať aj nejaké informácie o pozadí - pamäti... a ukazovateloch. V tvojom prípade je ale jednoduchšia cesta s obmedzením lepšia. Spravíš statické pole a pomocou modula alebo if<statement> zaručíš, aby sa následne kruhovo zapisovalo len to pamäti ktorá ti patrí.

Ďalšia vec je, že nevieme čo má ten mini program robiť. Možno by sa to dalo inak riešiť. Ale keď je to len tebou vymyslené "zadanie", ktoré chceš naprogramovať a tak sa učiť C, tak to nie je IMHO správna cesta. Samozrejme, treba programovať, ale musíš mať aj naštudované nejaké vedomosti. Bez toho to nejde. Z toho dôvodu by som ti odporučil knihu od Herouta - Jazk C. Okrem vysvetlenia a systematickej náväznosti obsahuje aj mnohé ukážky kódov. Existuje v 2 častiach. Stačí ti ale 1. časť. 2. je len taká príručka.
s pozdravom, crux.
Používateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: C vstup

Príspevok od používateľa marko365 »

Tak rad by som naprogramoval program v ktorom by som zadal najviac 99 cifier (no mohlo by ich byt aj 9) a aby mi vypisalo najväcsie cislo cele by sa to malo zmestit do casoveho limiyu 1000ms. Program mam, len vstup mi roby problemi a malo by to ist aj na Windowse aj na Linuxe. Kedze z EOF mi berie vstup dalej(pokracuje aj ked uz nema vstup) tak som chcel vynulovat pole ale potom som to nezvladal casovo. Este skusim si nieco nastudovat o alokatore pamäti a uvidim.
Používateľov profilový obrázok
crux2005
VIP
VIP
Príspevky: 10030
Dátum registrácie: So 18. Jún, 2005, 20:00
Bydlisko: Nové Zámky

Re: C vstup

Príspevok od používateľa crux2005 »

aby ti našiel program najväčšie zadané číslo, nepotrebuješ vôbec ukladať celý zadaný vstup

int max = 0;
zadané čísla porovnávaš s maximom, ak je zadané číslo väčšie ako maximum, prepíšeš hodnotu maxima a nakoniec vrátiš maximum/vypíšeš ho

EOF treba kontrolovať ako int...
ukáž kód, ako to máš, lebo dalo by sa to spraviť pomocou načítavania po znakoch, ale ak by si potom chcel povoliť -1/-1 a pod. musel by si to viac prepracovať. Jednoduchá verzia je len s celými číslami 0-9...

:)
s pozdravom, crux.
Používateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: C vstup

Príspevok od používateľa marko365 »

Tu je môj kod;

Kód: Vybrať všetko

//---------------------------------------------------------------------------

#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
 int v[99];
 int i=0;
 int t=0;
 int f=0;

 while (v[i]!=EOF){

 scanf("%d",&v[i]);
	i++;
                            }
	 
 for (t = 0 ;t < i; t++) {
   if (v[t]>=f)
	 f=v[t];
                               }

 printf ("%d",f);

 
		 return 0;
}
//---------------------------------------------------------------------------
Používateľov profilový obrázok
crux2005
VIP
VIP
Príspevky: 10030
Dátum registrácie: So 18. Jún, 2005, 20:00
Bydlisko: Nové Zámky

Re: C vstup

Príspevok od používateľa crux2005 »

tak argc/v nepotrebuješ, lebo nepracuješ s parametrami prík. riadku
ďalej, ako som písal, nepotrebuješ si pamätať celý vstup, len maximum

v obsahuje konkrétnu hodnotu int a nebude obsahovať nikdy EOF (-1), lebo to scanf neprečíta
okrem toho je to zase náchylné na tie problémy čo som ja a pEpinko spomenuli

pozri sa čo ti vracia scanf a podľa toho uprav while podmienku
zdá sa mi, že ti vracia počet načítaných znakov... skús teda while(scanf("%d", &num))...
s pozdravom, crux.
Používateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: C vstup

Príspevok od používateľa marko365 »

Myslis ze by si nemal pamätat vsetok vstup iba to najväcsie cislo a potom ho iba napisat takze nieco take :

int v;
int i;

while (scanf ("%d",&v)) { // tu by asi malo ist nieco ako EOF ci ?
if (v >= i)
i=v;
}
printf ("%d",i)
A EOF neviem pouzit ked hovoris ze ho scanf neprecita tak ako ho mam zakomponovat ?
Používateľov profilový obrázok
pEpinko
Používateľ
Používateľ
Príspevky: 850
Dátum registrácie: Po 19. Máj, 2008, 09:31
Bydlisko: BA/NR

Re: C vstup

Príspevok od používateľa pEpinko »

EOF nepouzijes nijak. Ten cyklus while ti skonci akonahle nezadas na vstup cislo, ale nejaky iny znak/retazec. Inak spravnejsie by malo byt while (scanf ("%d",&v) > 0), lebo scanf vracia -1 ak sa vyskytne chyba.
Používateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: C vstup

Príspevok od používateľa marko365 »

Tak uz to ide vdaka vsetkym, pritom to bolo take jednoduche ja tomu nerozumiem preco som na to neprisiel sam ale dobre a este raz vdaka. :OO= :D

Návrat na "Programovanie"