Průběžné dotazy – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Průběžné dotazy – C / C++ – Fórum – Programujte.comPrůběžné dotazy – C / C++ – Fórum – Programujte.com

 

!_UK@$0
Newbie
11. 5. 2009   #1
-
0
-

Zdravím,
jsem začínající programátor v C (učim se od začátku dubna), a chtěl bych vás poprosit, jestli byste mi pomáhali řešit různé problémy a nejasnosti, na které narážím a budu narážet.

Momentálně nevím, proč mi nefunguje tento program:

#include <stdio.h>

int main()
{
float f, g; /* dve kladna realna cisla. */
int i; /* celociselna promenna */
printf("Zadejte dve kladna realna cisla");
scanf("%f\n%f\n", &f, &g);

if ( f < 0.0 )
f = -f;
if ( g < 0.0 )
g = -g;

printf("Cisla v intervalu ( f , g ) jsou:\n");

for ( i = 0; i < g; i + 2 ) {
if (( i > f ) && ( i < g ))
printf("%d ", i );
}

printf("");
scanf("%d");
return 0;
}

Mělo by to načíst dvě reálná čísla a vytisknout všechny sudá celá čísla v intervalu (první reálné číslo, druhé reálné číslo). Dělá to to, že zobrazí výzvu, načte dvě čísla a pak čeká a čeká. Pozn.: Kompiloval jsem v Dev-C++.

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
Datlik0
Návštěvník
11. 5. 2009   #2
-
0
-

hele v c se nevyznam ale napada me proc mas #include <stdio.h>
nemelo by to byt #include <studio.h>

Nahlásit jako SPAM
IP: 85.13.98.–
KIIV
~ Moderátor
+43
God of flame
11. 5. 2009   #3
-
0
-

kdyz nacitas v scanf tak tam nesmis davat zadny smeti - proste takto: scanf("%f%f", &f, &g);
moooozna jeste s mezerou ale ta tam muze delat ten samej efekt

EDIT: a samozrejme, jak je v nasledujicim prispevku zmineno: nedelat nekonecny cykly :D

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Bald3rr0
Super člen
11. 5. 2009   #4
-
0
-

To Datlik : ne, <stdio.h> je spravne
To !_UK@$ :

for ( i = 0; i < g; i + 2 ) // promenou i nikde neikrementujes, zkus 

for(i=0; i < g; i+= 2)

Nahlásit jako SPAM
IP: 85.13.107.–
Nemo_0010
Newbie
11. 5. 2009   #5
-
0
-

S největší pravděpodobností ti řeknu to co už víš, ale nezapomeň zadávat čísla ve tvaru float tzn. 1 jako 1.0, 25 jako 25.0 . BTW stdio je správně.

Nahlásit jako SPAM
IP: 85.71.98.–
!_UK@$0
Newbie
11. 5. 2009   #6
-
0
-

Tak díky moc, opravil jsem to i += 2 a to scanf("%f%f") a funguje to :-)

EDIT: Mám ještě jeden problém: V Dev-C++ mi nefungujou znaky < a >, musim je tam dávat přes copy/paste, což je docela dost nepohodlný. Nevíte co s tim?

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
KIIV
~ Moderátor
+43
God of flame
11. 5. 2009   #7
-
0
-

To !_UK@$ : pravej alt + > a < --- funguje to ale az kdyz zrusis klavesove zkratky co sou pod ctrl-shift-, a .

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
!_UK@$0
Newbie
11. 5. 2009   #8
-
0
-

Tak další dotaz: Proč nefunguje tohle?:

#include <stdio.h>

int main()
{
int i, j;
int vetsi, mensi;
printf("Zadejte dve cela cisla:\n");
scanf("%d%d", &i, &j);

( i > j ) ? i = vetsi : i = mensi

printf("Mensi cislo: %d", mensi);

printf("");
scanf("%d");
return 0;
}

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
KIIV
~ Moderátor
+43
God of flame
11. 5. 2009   #9
-
0
-

#include <stdio.h>


int main()
{
int i, j;
int vetsi, mensi;
printf("Zadejte dve cela cisla:\n");
scanf("%d%d", &i, &j);

( i > j ) ? i = vetsi : i = mensi;

printf("Mensi cislo: %d", mensi);

printf("");
scanf("%d");
return 0;
}


minimalne chybi ten strednik... krom toho nechapu na co tadle konstrukce: ( i > j ) ? i = vetsi : i = mensi
a uz vubec nechapu proc si prepisujes "i" tema neinicializovanejma promennejma ("vetsi" nebo "mensi")...
pouzij spis if ( i>j ) ...

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
m->29+6
Super člen
11. 5. 2009   #10
-
0
-

Tipujem to na medzeru v scanf("%d %d", &i, &j); - bere ti to ako jedno cislo.

#include <stdio.h>


int main()
{
int i, j;
int vetsi, mensi;
printf("Zadejte dve cela cisla:\n");
scanf("%d %d", &i, &j);

mensi = ( i > j ) ? j : i;

printf("Mensi cislo: %d", mensi);

printf(""); // tymto si co chcel?
scanf("%d"); / a tymto?
return 0;
}

Nahlásit jako SPAM
IP: 147.229.208.–
!_UK@$0
Newbie
11. 5. 2009   #11
-
0
-

Tak jsem to upravil presne podle m->29, a kdyz zadam cisla 5 a 4, tak se vypise "Mensi cislo: 50526172"
Jinak ten konec:
"printf(""); // tymto si co chcel?
scanf("%d"); / a tymto?
return 0; "
tam mam proto, aby se to hned po zobrazeni vysledku nezavrelo

EDIT:
To KIIV :
Ja bych pouzil if, ale tahle uloha se ma vyresit pomoci ternarniho operatoru

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
KIIV
~ Moderátor
+43
God of flame
11. 5. 2009   #12
-
0
-

m->29:

%d%d se urcite nebere jako jedno cislo...

tvuj kod ma jednu vadu... mensi a vetsi nejsou jako obvykle definovany :D

treba:
mensi = ( i>j ? j : i );

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
m->29+6
Super člen
11. 5. 2009   #13
-
0
-

...tam mam proto, aby se to hned po zobrazeni vysledku nezavrelo

Na to ti stačí getchar();
Inak, to ti prekladač nevyhodí chybu alebo aspoň warning? to scanf("%d");

Nahlásit jako SPAM
IP: 147.229.208.–
KIIV
~ Moderátor
+43
God of flame
11. 5. 2009   #14
-
0
-

To m->29 : na to by musel nahodit minimalne -Wall mozna i -pedantic

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
!_UK@$0
Newbie
11. 5. 2009   #15
-
0
-

KIIV napsal:
m->29:

%d%d se urcite nebere jako jedno cislo...

tvuj kod ma jednu vadu... mensi a vetsi nejsou jako obvykle definovany :D

treba:
mensi = ( i>j ? j : i );



No jo no, musíš mě brát s rezervou, jsem úplný začátečník. Jinak už jsem to poupravil podle vašich rad a funguje to.

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
!_UK@$0
Newbie
12. 5. 2009   #16
-
0
-

Tak mám další nefunkční kód:

#include <stdio.h>

int main()
{
int i, j = 0;

while (1) {
if (((i = getchar()) >= 'A' && i <= 'Z') || ( i >= 'a' && i <= 'z' ))
j++;
continue;
if (i == '\n')
break;
}
printf("Pocet velkych a malych pismen, ktere jste zadali, je: %d", j);

printf("");
scanf("%d");
return 0;
}

Zadání je číst čísla až po '\n' a pak vytisknout součet zadaných velkých a malých písmen

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
Wizard0
Stálý člen
12. 5. 2009   #17
-
0
-

To !_UK@$ : pokial pouzijes 'if' bez zatvoriek '{' a '}', beria sa pod neho iba nasledujuca funkcia. Cize 'continue' prebehne vzdy, tot vytvori nekonecnu smycku.

Nahlásit jako SPAM
IP: 85.216.182.–
m->29+6
Super člen
12. 5. 2009   #18
-
0
-

Keď sa na to tak pozerám, nedá mi to...

#include <stdio.h>


int main(void) {
int c = 0, sum = 0;

while((c = getchar()) != '\n') {
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
sum++;
}
printf("Pocet velkych a malych pismen, ktere jste zadali, je: %d", sum);

getchar();

return 0;
}

Nahlásit jako SPAM
IP: 147.229.208.–
!_UK@$0
Newbie
12. 5. 2009   #19
-
0
-

Tak dík no :smile14:

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
m->29+6
Super člen
12. 5. 2009   #20
-
0
-

To nebolo myslené nejak zle. Ono, kým si osvojíš nejaké zaužívané konštrukcie tak to chvíľu trvá. A to si neosvojíš kým si nepopozeráš nejaké kódy druhých ľudí... Ale všeobecne sa drž toho, že nekonečné cykli a break; continue; by si mal používať málo. Hlavne teda tie cyklenia nekonečné. :-)

Nahlásit jako SPAM
IP: 147.229.208.–
!_UK@$0
Newbie
12. 5. 2009   #21
-
0
-

To m->29 :
Já jsem to taky nemyslel takhle schlíple, to ten smajlík v nabídce byl docela usměvavej a tohle z něj vylezlo. Naopak jsem rád, že mi radíte, hodně mi to to učení ulehčuje :smile4:

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
!_UK@$0
Newbie
14. 5. 2009   #22
-
0
-

Tak další vada:

#include <stdio.h>

int main()
{
int pocet; /* Pocet promennych, ktery zada uzivatel */
int i; /* i se bude porovnavat s "pocet" v cyklu for */
int cislo;
int sum = 0; /* Pocet cisel, ktere lezi v intervalu */

printf("Zadejte, kolik chcete zadavat cisel\n");
scanf("%d", &pocet);

for ( i = 1; i <= pocet; i++ ) {
printf("Zadej %d. cislo :", i);
scanf("%d", &cislo );
if ( cislo >= '25' && cislo <= '38' )
sum++;
}
printf("Zadali jste %d cisel v intervalu <25, 38>", sum);

printf("");
scanf("%d");
return 0;
}

Všechno funguje, až na to, že vypíše jako součet 0

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
Chrasty
~ Redaktor
+4
Posthunter
14. 5. 2009   #23
-
0
-

Smaž ty uvozoky uvnitř podmínky, tedy

if ( cislo >= '25' && cislo <= '38' ) 
změň na
if ( cislo >= 25 && cislo <= 38 ) 
C++ nedělám, ale tohle je jediné, co se mi zdá špatně:)

Nahlásit jako SPAM
IP: 193.179.196.–
!_UK@$0
Newbie
14. 5. 2009   #24
-
0
-

Ajo, to je ono. Dík

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
Datlik0
Návštěvník
14. 5. 2009   #25
-
0
-

25 je cislo a '25' je retezec taqk ais proto

Nahlásit jako SPAM
IP: 85.13.98.–
Earl Cash0
Věrný člen
14. 5. 2009   #26
-
0
-

Datlik napsal:
25 je cislo a '25' je retezec taqk ais proto

znak...

Nahlásit jako SPAM
IP: 193.85.177.–
Oh my goodness, shut me down! Machines making machines. How perverse. (C-3PO)
m->29+6
Super člen
14. 5. 2009   #27
-
0
-

Inak, ak začínaš, tak je výborná vec zapať si čo najviac varovaní a upozornení na chyby - dosť to pomáha myslím, nie len začiatočníkom ;-) ja používam gcc, neviem čo ty, ale ak ho používaš tiež, skús to prekladať takto:

gcc -std=c99 -pedantic -Wall -W subor.c -o subor

Nahlásit jako SPAM
IP: 147.229.208.–
!_UK@$0
Newbie
18. 5. 2009   #28
-
0
-

Já to dělám tak, že si chyby píšu do sešitu (jenom na chyby)

Jinak mám další problém:
Opsal jsem jeden příklad z učebnice "Učíme se programovat v jazyce C", a při překladu to sice chyby nehlásí, ale když to pak spustim, tak jenom na okamžik vyskočí okno, který se zase hned zavře. Ten kód vypadá takhle:

#include <stdio.h>

#define SOUBOR "dopis.txt"

FILE *fr;

int main(void)
{
int znak_hl, znak_nal; /* hledany a nalezeny znak */
int pocet = 0, celkem = 0; /* pocet vyskytu hledaneho znaku a celkovy pocet znaku */

if ((fr = fopen(SOUBOR, "r")) == NULL) {
printf("Chyba pri otvirani souboru %s!\n", SOUBOR);
return -1;
}

printf("Zadejte hledany znak: ");
znak_hl = getchar();

while ((znak_nal = getc(fr)) != EOF) {
celkem++;
if (znak_nal == znak_hl)
pocet++;
}

printf("V souboru %s se znak %c vyskytuje celkem %dkrat.\n", SOUBOR, znak_hl, pocet);
printf("Soubor obsahuje celkem %d znaku, takze relativni vyskyt je %5.2f%%.\n", celkem,
(float) 100*pocet/celkem);

if (fclose(fr) == EOF)
printf("Chyba pri zavirani souboru!\n");

return 0;
}

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
KIIV
~ Moderátor
+43
God of flame
18. 5. 2009   #29
-
0
-

To !_UK@$ : spoustej to v prikazovy radce... pripadne se da na konec programu dat jeste nejake cekani na klavesu.. at uz zavolanim externiho programu pause (pouze pro win) nebo nejaky nacitani klavesy...

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
!_UK@$0
Newbie
18. 5. 2009   #30
-
0
-

Tak jsem tam přidal to čekání na klávesu, ale stejně se to hned po spuštění zavírá :-/ A přes příkazovou řádku nevim jak se to spouští.

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
Datlik0
Návštěvník
18. 5. 2009   #31
-
0
-

v c se moc nevyznam a proto nwm jak to tam funguje ale co dat pred return 0; stale se opakujici smycku?

Nahlásit jako SPAM
IP: 85.13.98.–
KIIV
~ Moderátor
+43
God of flame
18. 5. 2009   #32
-
0
-

To !_UK@$ : jeje co se na tech skolach uci? :D cmd.exe a pak pomoci cd se prepnout do spravneho adresare a spustit..

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
!_UK@$0
Newbie
18. 5. 2009   #33
-
0
-

A myslis ze je v tom velkej rozdil, kdyz to spustim prez command line a nebo dvojklikem? A potom: Ty napises "spustit", ale co tam mam napsat, aby se to spustilo. Dejme tomu, že to mám na "D:\".

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
Chrasty
~ Redaktor
+4
Posthunter
18. 5. 2009   #34
-
0
-

KIIV už ti to napsal, otevřeš příkazovou řádku a pomocí příkazu cd se přesuneš kam potřebuješ, takže pokud chceš z déčka spustit soubor program.exe, tak napíšeš tyhle příkazy -

cd D:\
program.exe

Nahlásit jako SPAM
IP: 193.179.196.–
!_UK@$0
Newbie
19. 5. 2009   #35
-
0
-

Tak jsem to zkusil napsat přesně jako ty a píše to chybu: "Vypocet_cetnosti_znaku.exe není názvem vnitřního ani vnějšího příkazu, spustitelného programu nebo dávkového souboru. Připojil jsem screen.

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
KIIV
~ Moderátor
+43
God of flame
19. 5. 2009   #36
-
0
-

To !_UK@$ : tak si udelej u projektu soubor spust.bat a do toho cmd.exe ... spusti se command line v aktualnim adresari..
(vyhoda je ze si ho pak muzes jen rozkopirovat kde potrebujes bez dalsi zmeny)

mimochodem taky sem postrehl ze mi nejak nechce cd menit disky.. v cem to asi je..

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
m->29+6
Super člen
19. 5. 2009   #37
-
0
-

Aby ti to čakalo tak tam musíš dať 2x getchar(); pretože ty načítaš znak, ktorý ti to má hľadať a potom dáš ENTER = znak '\n'. Tento znak '\n' ti potom ostane v buffri a načítaš ho druhým volaním getchar(); na konci - preto ti to nečaká. Už znak totiž zadávať nemusíš, načítalo '\n' :smile16: Čiže, aby som sa dopracoval k riešeniu... :-D treba dať na koniec dvakrát getchar(); asi takto:

#include <stdio.h>


#define SOUBOR "dopis.txt"

FILE *fr;

int main(void) {

...

if (fclose(fr) == EOF)
printf("Chyba pri zavirani souboru!\n");

getchar(); getchar();

return 0;
}
Ešte je možnosť pomocou skriptu teda, ako tu už niekto spomenul. Ak si súbor "run.bat" nakopíruješ do priečinku kde máš súbor "dopis.txt" aj súbor "vypocet_cetnosti_znaku.exe" a spustíš, tak to bude čakať aj bez tých dvoch volaní getchar(); ;-)

Nahlásit jako SPAM
IP: 147.229.208.–
!_UK@$0
Newbie
19. 5. 2009   #38
-
0
-

Tak jsem to spustil a píše to: chyba při otvírání souboru dopis.txt. A přitom tam ten soubor mám, jmenuje se dopis.txt a je v kodovani ANSI. Zvláštní...

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
m->29+6
Super člen
19. 5. 2009   #39
-
0
-

No to už neovplyvním, ale mne to ide - ten "dopis.txt" máš napevno v programe takže tam bude chyba. ten "dopis.txt" musí byť v tom istom priečinku ako ten spustiteľný EXE súbor a na tom poste čo si sem dával ti ho tam nevidím napr. - nakopíruj tam ten súbor a pôjde to ;-)

Nahlásit jako SPAM
IP: 147.229.208.–
!_UK@$0
Newbie
19. 5. 2009   #40
-
0
-

Jestli tim priecinkem myslis slozku, tak ten soubor dopis.txt, tam mam, a je to videt i na tom screenu, co jsem sem poslal. Takze v tom asi chyba nebude

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
KIIV
~ Moderátor
+43
God of flame
19. 5. 2009   #41
-
0
-

koukam nez vysvetlit zaklady prace s prikazovou radkou bude rychlejsi dat pred konec programu system('pause'); // spusti externi program jmenem pause.exe - ten ceka na stisk klavesy...

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
!_UK@$0
Newbie
19. 5. 2009   #42
-
0
-

No ale teď už neni problém v tom, že by to nepočkalo, ale že se nepodaří otevřít soubor dopis.txt

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
KIIV
~ Moderátor
+43
God of flame
19. 5. 2009   #43
-
0
-

To !_UK@$ : musis mit nutne PWD ve stejnem adresari (Program Work Directory) ... pak bacha na \ musi se zapsat jako \\ a tak podobne, kazdopadne chyba bude bud v adresari ve, kterem to spoustis nebo v nazvu souboru, kterej se snazis otevrit.

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
!_UK@$0
Newbie
19. 5. 2009   #44
-
0
-

Tak už jsem na to přišel: Měl jsem vyplé zobrazování přípon u souborů, a napsal jsem dopis.txt, takže ve skutečnosti to bylo dopis.txt.txt. Děkuju všem za trpělivost při řešení tohoto problému, moc si toho vážim :D

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
!_UK@$0
Newbie
28. 5. 2009   #45
-
0
-

Zdravim, tak mam další "zádrhel". Tentokrát je to jenom malá chybka, ale přesto by mě zajímalo proč to tak je. Program otevře soubor a vypíše, kolik v něm bylo řádků, jaká řádka byla nejdelší a jaká nejkratší. Nakonec se zeptá, jestli se má výsledek vypsat i do souboru. A tam je právě ten zádrhel: Musim zadat několik znaků, aby to donutilo ten program zavřít a potom až se vytvoří ten soubor. Přitom v kódu mám zavření souboru před ukončenim. Nevíte v čem je chyba?

#include <stdio.h>


FILE *fr, *fw;

int main(void)
{
int znaku_radku = 0; /* počet znaků na aktuálním řádku */
int max_rad = 0; /* počet znaků nejdelšího řádku */
int min_rad = 0; /* počet znaků nejkratšího řádku */
int pocet_radku = 0; /* počet řádků */
int pocet_celk = 0; /* celkovy počet znaků */
int c; /* znak */
int rozhod = 0; /* pomocny znak pro rozhodnuti, zda se bude tisknout do souboru */

if ((fr = fopen("SOUBOR.TXT", "r")) == NULL) {
printf("Nepodarilo se otevrit SOUBOR.TXT\n");
return -1;
}

while ((c = getc(fr)) != EOF) {
if(c != '\n') {
znaku_radku++;
pocet_celk++;
}
else {
pocet_radku++;
if (pocet_radku == 1) {
max_rad = znaku_radku;
min_rad = znaku_radku;
}
if (znaku_radku < min_rad)
min_rad = znaku_radku;
if (znaku_radku > max_rad)
max_rad = znaku_radku;
znaku_radku = 0;
}
}
printf("V souboru SOUBOR.TXT je celkem %d radku,\nnejdelsi radek ma %d znaku,\nnejkratsi radek ma %d znaku.\n\n", pocet_radku, max_rad, min_rad);

if (fclose(fr) == EOF)
printf("Soubor SOUBOR.TXT se nepodarilo uzavrit");

printf("Chcete vypsat vysledek do souboru? [Y/N]\n");

rozhod = getchar();
while (getchar() != '\n')
;

scanf("%d", &rozhod);
if (rozhod != 'n' || rozhod != 'N') {
if ((fw = fopen("KOPIE.TXT", "w")) == NULL) {
printf("Soubor KOPIE.TXT se nepodarilo otevrit\n");
}
fprintf(fw, "V souboru SOUBOR.TXT je celkem %d radku, nejdelsi radek ma %d znaku a nejkratsi radek ma %d znaku", pocet_radku, max_rad, min_rad);
fclose(fw);
/* if (fclose(fw) == EOF) {
printf("Soubor KOPIE.TXT se nepodarilo uzavrit\n");
} */
}

printf("");
scanf("%d");
return 0;
}

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
!_UK@$0
Newbie
1. 6. 2009   #46
-
0
-

Tak mám další problém: Program by měl vypočítat aritmetický průměr reálných čísel ze souboru CISLA.TXT a vypsat ho na obrazovku. Nefunguje mi to počítání: vypíše jenom 1. cislici jako vysledek.

#include <stdio.h>

int main()
{
double soucet = 0.0; /* soucet vsech cisel */
double cislo; /* promenna pro cislo */
double pocet = 0.0; /* pocet vsech cisel */
FILE *fr;

if ((fr = fopen("CISLA.TXT", "r")) == NULL)
printf("Soubor CISLA.TXT se nepodarilo otevrit");

while ((fscanf(fr, "$%lf", &cislo)) == 1) {
soucet += cislo;
pocet++;
cislo = 0;
}
printf("%f", soucet/pocet);

fclose(fr);
printf("");
scanf("%d");
return 0;
}


EDIT: Tak mě ještě napadlo přidat do scanf \n a funguje to :D

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
!_UK@$0
Newbie
11. 6. 2009   #47
-
0
-

Tak mám další problém, zadání zní takto:
"Napište program, který bude číst 10 celých čísel. Čísla bude číst bud' ze souboru nebo ze souboru CISLA.TXT, kde je každé číslo na nové řádce, a nebo z klávesnice. Při obou způsobech čtení se bude na obrazovku vypisovat např. text:
Zadej 1. cislo:
Určete počet sudých čísel."

No a já mám problém, že při vstupu ze souboru to vypočítá, že tam je 91 sudých čísel (přitom jich tam mám celkem deset). A při vstupu z klávesnice to po desátém číslu spadne. Nevíte co s tim?

#include <stdio.h>


int main(void)
{
int cislo; //nacitane cislo
int sude; //pocet sudych cisel
int rozhod; //rozhodnuti uzivatele, zda ma byt vstup ze souboru nebo ze stdin
int i; //pomocna promenna, aby se zjistilo kolik cisel uz je nacteno
int c; //pomocna promenna pro vyprazdneni bufferu

FILE *fr;

printf("Chcete cisla zadavat sami (1),\nnebo je cist ze souboru CISLA.TXT (2)?");
rozhod = getchar();

while ((c = getchar()) != '\n') //vyprazdneni bufferu
;

if (rozhod == '1' || rozhod == 'l')
fr = stdin;
else {
if ((fr = fopen("CISLA.TXT", "r")) == NULL)
printf("Chyba pri otevirani souboru CISLA.TXT");
}

for (i = 1; i <= 10; i++) {
printf("Zadej %d cislo: \n", i);
fscanf(fr, "%d", &cislo);

if (cislo % 2 == 0)
sude++;
}

if (fclose(fr) == EOF)
printf("Soubor CISLA.TXT se nepodarilo uzavrit");

printf("Celkem bylo precteno %d sudych cisel", sude);

printf("");
scanf("%d");
scanf("%d");
return 0;
}


Obsah souboru CISLA.TXT:
1568462162
1351325486
1535746853
1468123689
1355486521
1351834353
1532158364
3543213543
1385468513
1638543435

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
Bald3rr0
Super člen
11. 6. 2009   #48
-
0
-

To !_UK@$ : proměnnou int sude nemáš nikde inicializovanou, takže už můžu mít nějakou hodnotu a ta hodnota nemusí být nulová

Nahlásit jako SPAM
IP: 82.100.0.–
!_UK@$0
Newbie
11. 6. 2009   #49
-
0
-

Tak to je ono, jsem já to ale lama :D, a ten druhý problém?

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
Bald3rr0
Super člen
11. 6. 2009   #50
-
0
-

To !_UK@$ :

 if (fclose(fr) == EOF) 

printf("Soubor CISLA.TXT se nepodarilo uzavrit");

bych změnil na
if(rozhod == '2') {

if (fclose(fr) == EOF)
printf("Soubor CISLA.TXT se nepodarilo uzavrit");
}

Protože soubor otevíráš jen tehdy, pokud je zvolena možnost '2'.

Nahlásit jako SPAM
IP: 82.100.0.–
!_UK@$0
Newbie
11. 6. 2009   #51
-
0
-

Supr, diky moc, bylo to v tom. Není to náhoda, že máš level odvážlivec :D

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
!_UK@$0
Newbie
15. 6. 2009   #52
-
0
-

Tak mám další nefunkční program, zadání je: "Napište funkci troj(char c, int n), která zobrazí na obrazovce trojúhelník o n řádcích složený ze znaků v c, např.:
*
***
***** První znak na poslední řádce musí být v prvním sloupci.

Můj pokus:

#include <stdio.h>


int c = '*';
int n = 20;

void troj(int c, int n)
{
#if 0
printf("Zadejte, kolik radek ma trojuhelnik mit\n");
scanf("%d", &n);
#endif

int akt_radek = 1;
int mezera;
int pocet_znaku = -1;
int pomoc_k_poctu_znaku;
int pomoc_k_mezere;

while (akt_radek <= n) {
if (akt_radek == 1)
mezera = (n - 1);
else
mezera--;
pocet_znaku += 2;
pomoc_k_mezere = mezera;
while (pomoc_k_mezere > 0) {
printf(" ");
pomoc_k_mezere--;
}

pomoc_k_poctu_znaku = pocet_znaku;
while (pomoc_k_poctu_znaku > 0) {
printf("%c", c);
pomoc_k_poctu_znaku--;
}
printf("\n");
akt_radek++;
}
}

int main(void)
{
void troj(int c, int n);
printf("");
scanf("%d");
return 0;
}


Po spuštění nic nevypíše.

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
milan_m0
Newbie
15. 6. 2009   #53
-
0
-

naco tak zlozito ani som to nedocital:), co takto:

#include <iostream>

using namespace std;

void troj(char c, int n);

int main(int argc, char *argv[])
{
int riadok;
char znak;
cin>>riadok>>znak;
troj(znak,riadok);

system("PAUSE");
return 0;
}

void troj(char c, int n){
int stlpcov=n*2-1;
int i=0;
for(;i<n;i++){
for(int x=0;x<stlpcov/2-i;x++)
cout<<' ';
for(int y=0;y<i*2+1;y++)
cout<<c;
cout<<endl;
}
}

Nahlásit jako SPAM
IP: 78.99.13.–
!_UK@$0
Newbie
15. 6. 2009   #54
-
0
-

Ale ja se ucim C, a tohle mi pripomina spis C++ (pokud to je C tak jsem se jeste nesetkal s <<). A navic jeste neznam knihovnu iostream...

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
KIIV
~ Moderátor
+43
God of flame
15. 6. 2009   #55
-
0
-

To !_UK@$ :
cout << ' '; je to same jako printf(" ");
cout << c; = printf("%c",c);
cout << endl; => printf("\n");

cin >> riadok >> znak; => scanf("%d %c", &riadok, &znak);

a misto iostream hodis stdio.h...
namespace v C neni

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
milan_m0
Newbie
15. 6. 2009   #56
-
0
-

jaj sory som prehliadol ze to chces iba v C. Prepis to presne tak ako uz napisal KIIV a mas to v C

Nahlásit jako SPAM
IP: 195.168.172.–
!_UK@$0
Newbie
15. 6. 2009   #57
-
0
-

Ale me by spis pomohlo, kdybyste mi nasli chybu v tom mym. To ze opisu vas kod mi moc nepomuze.

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
KIIV
~ Moderátor
+43
God of flame
15. 6. 2009   #58
-
0
-

z toho by vznikl velmi dlouhej seznam :)
pro zacatek: proc mas deklaraci funkce uvnitr main? "void troj(int c, int n);"
jestli doufas ze se to takhle zavola tak te zklamu.

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Datlik0
Návštěvník
15. 6. 2009   #59
-
0
-

je tohle vubec mozny?



int c = '*';

Nahlásit jako SPAM
IP: 85.13.98.–
Nosko0
Stálý člen
15. 6. 2009   #60
-
0
-

To Datlik :
Je :smile1: nakoľko sa '*' pri preklade preloží na "číslo", prepokladám ASCII hodnotu
Na škole sme raz mali sútaž o "skompaktnenie" jedného programu a vtedy som prvý krát videl taktúto vec, napr



int pole[' '];

Nahlásit jako SPAM
IP: 84.16.37.–
Datlik0
Návštěvník
15. 6. 2009   #61
-
0
-

aha

Nahlásit jako SPAM
IP: 85.13.98.–
!_UK@$0
Newbie
16. 6. 2009   #62
-
0
-

Tak mi hold nezbejva, nez se ty funkce poradne doucit :-(

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
milan_m0
Newbie
16. 6. 2009   #63
-
0
-

to !_UK@$: Pre zaciatok sa snaz vo vnutri funkcie nic nenacitavat, funkci len odovzdaj parametre ktore potrebuje, funkcia ti potom z tych parametrov nieco vypocita trebars aj nieco vypise a na zaver mozes pomocou mozes zasa odovzdat nejaku hodnotu naspat(ale vtedy nesmie byt deklarovana s void ale s typom ktory chces vracat napr int).

Nahlásit jako SPAM
IP: 95.102.79.–
m->29+6
Super člen
16. 6. 2009   #64
-
0
-

Pozri si aj tú kratšiu verziu a skús ju pochopiť - niečo ti to určite dá ;-)

#include <stdlib.h>

#include <stdio.h>

void troj(int c, int n) {
#if 0
puts("Zadejte, kolik radek ma trojuhelnik mit"); // printf parsuje reťazec atď. (zbytočné)
scanf("%d", &n);
#endif
int akt_radek = 1;
int mezera = n; // rovno sem dáš n a nemusíš tam mať podmienku if(akt_radek == 1) mezera = n-1;
int pocet_znaku = -1;
int pomoc_k_poctu_znaku;
int pomoc_k_mezere;
while(akt_radek <= n) {
mezera--;
pocet_znaku += 2;
pomoc_k_mezere = mezera;
while (pomoc_k_mezere > 0) {
putchar(' '); // načo volať printf keď tlačíš len znak
pomoc_k_mezere--;
}
pomoc_k_poctu_znaku = pocet_znaku;
while (pomoc_k_poctu_znaku > 0) {
putchar(c); // načo volať printf keď tlačíš len znak
pomoc_k_poctu_znaku--;
}
putchar('\n'); // načo volať printf keď tlačíš len znak
akt_radek++;
}
}
int main(void) {
troj('*', 40);

getchar();

return EXIT_SUCCESS;
}
#include <stdlib.h>

#include <stdio.h>

void troj(char c, int n){
int medzier = n-1;

for(int i=0; i<n; i++) {
for(int x=0; x<medzier-i; x++)
putchar(' ');
for(int y=0; y<i*2+1; y++)
putchar(c);
putchar('\n');
}
}

int main(void) {
int riadok;
char znak;

if(scanf("%d %c", &riadok, &znak) != 2) {
fputs("Chybný vstup!!", stderr);
return EXIT_FAILURE;
}

troj(znak,riadok);

system("PAUSE");

return EXIT_SUCCESS;
}

Datlik napsal:
je tohle vubec mozny?



int c = '*';

Niekde sa priam vyžaduje aby bol znak int, lebo sa očakáva EOF.

Ja už toto fórum môžem ..., je to tu celé posr...!!

Nahlásit jako SPAM
IP: 213.151.217.–
!_UK@$0
Newbie
17. 6. 2009   #65
-
0
-

Takže byla chyba jenom v tom volání funkce (Tak to je teda hodne dlouhej seznam, vid KIIVe)

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
KIIV
~ Moderátor
+43
God of flame
17. 6. 2009   #66
-
0
-

To !_UK@$ : to byla ta fatalni chyba :)
pak sou tam jeste dalsi formality.. zbytecny globalni promenny, pro ten ucel zvlastni vyuziti #if (stacilo nahradit komentarem)
+ to co napsal m->29 (veci, kterych si moc nevsimam :) protoze v jednocipech je to pomerne o hubu -resp. preplneni ram )

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
!_UK@$0
Newbie
17. 6. 2009   #67
-
0
-

No jasně že to šlo napsat líp, ale teprv se učim, takže nemůžu hned dělat zázraky. Rozhodně nechci rozpoutávat nějakou hádku, jenom jsem chtěl napsat, že s tima chybama to neni až zas tak horký...

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
!_UK@$0
Newbie
18. 6. 2009   #68
-
0
-

EDIT: Už jsem to vyřešil

Tak dalsi problem: Trochu jsem upravoval program na vypocet diskriminantu, problem bude nejspise v bufferovanem vstupu. Proste mám tam rozhodnutí, a i když nestisknu nic, tak se rozhodne, že se má pokračovat. První rozhodnutí funguje správně, ale to další ne. Nevíte co s tim?

 #include <stdio.h>

#include <math.h>

void zaver(void)
{
printf("*** Dekujeme za pouzivani tohoto nastroje ***\nSve pripominky a napady na zlepseni smerujte\nna e-mail luka.petr@gmail.com\n\n\n");
}

void uvitej(void)
{
printf("*** Kvadraticke rovnice ***\n***** tool by !_UK@$ ******\n\n");
}

void pocitej_quad(void)
{
int h;
float a, b, c;
float d; /* Diskriminant */
float x, y; /*Koren x1 a koren x2*/

printf("Nejprve zadejte hodnotu cisla a:\n");
scanf("%f", &a);
printf("Zadejte hodnotu cisla b:\n");
scanf("%f", &b);
printf("Zadejte hodnotu cisla c:\n");
scanf("%f", &c);


d = b * b - 4 * a * c; /* Zkouska spravneho vypoctu - a = 1, b = -5, c = 6, K = {2,3}*/

if ( d > 0.00 ) { /* kdy ma rovnice 2 koreny */
x = ( -b + sqrt(d)) / 2 * a;
y = ( -b - sqrt(d)) / 2 * a;
printf ("Koren x1 se rovna %6.2f a koren x2 se rovna %6.2f\nDiskriminant se rovna %6.2f\n\n\n", x, y, d);
}
else
if ( d == 0.00 ) {
x = ( -b / 2 * a);
printf("Rovnice ma prave jeden koren a tim je %6.2f\nDiskriminant se rovna 0\n\n\n", x);
}
else
printf("Rovnice nema reseni\n(Diskriminant je %6.2f)\n\n\n", d);

}

int main(void)
{
int rozhod;
uvitej();
pocitej_quad();

while ((rozhod = getchar()) != '\n')
;

while (1) {
puts("Chcete počítat další příklad (y), nebo ne (q)?\n");
rozhod = getchar();
if (rozhod != 'q')
pocitej_quad();
else
break;
}
zaver();
scanf("%d");
return 0;
}

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
!_UK@$0
Newbie
13. 7. 2009   #69
-
0
-

Zdravim, tak po delší době přicházim s dalším dotazem: Nemáte nějaké příklady na procvičení ukazatelů? Právě jsem dodělal kapitolu Ukazatelé (v Heroutovi), ale na konci jsou jenom 3 příklady. Tak kdyby jste někdo o nějakých věděl a napsal je sem, tak bych vám byl povděčnej.

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
KIIV
~ Moderátor
+43
God of flame
13. 7. 2009   #70
-
0
-

udelej obousmernej spojovej seznam :D

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
!_UK@$0
Newbie
13. 7. 2009   #71
-
0
-

Co to je? :-D

Zatim jsem udělal nejvíc tohle:

#include <stdio.h>

#include <stdlib.h>

double *init(int kolikrat)
{
return ( (double *) malloc(kolikrat * sizeof(double)) );
}

int cteni(double *p_f, int kolikrat)
{
int i;
int chyby = 0;

for (i = 0; i < kolikrat; i++) {
printf("Zadejte %d. cislo: \n", i + 1);
if ( (scanf("%lf", p_f + i)) != 1 )
chyby++;
}
return chyby;
}

int secti(double *p_f, int kolikrat, double *soucet)
{
for (kolikrat--, *soucet = *(p_f + kolikrat); --kolikrat >= 0; )
*soucet += *(p_f + kolikrat);
return 0;
}

int main(void)
{
int kolikrat = 0, chyby;
double *p_dbl, soucet;

printf("Zadejte, kolik chcete scitat cisel: ");
scanf("%d", &kolikrat);

if ((p_dbl = init(kolikrat)) == NULL)
printf("Nedostatek pameti\n");

chyby = cteni(p_dbl, kolikrat);
if (chyby != 0)
printf("%d cisel jste zadal spatne", chyby);

secti(p_dbl, kolikrat, &soucet);

printf("Soucet je %.3f", soucet);

scanf("%d");
return 0;
}

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
yaqwsx+9
Posthunter
13. 7. 2009   #72
-
0
-
Nahlásit jako SPAM
IP: 85.160.66.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
!_UK@$0
Newbie
13. 7. 2009   #73
-
0
-

Tak koukal jsem se na ty odkazy, ale nejak z toho nejsem moudrej. Hlavně ještě vůbec neumim pole, ani jednorozměrná, ani více rozměrná.

Nahlásit jako SPAM
IP: 89.176.88.–
Začínající programátor v C Bodoucí programátor Objective-C
m->29+6
Super člen
14. 7. 2009   #74
-
0
-

Naštuduj si polia a potom si užiješ aj ukazovatele :smile1: Môžeš spraviť potom napríklad aj nejaké operácie s maticami (pre začiatok - nie je to totiž moc náročné), ale ten lineárny zoznam je dobrý nápad ;-) a zakončiť by si to mohol hashovacou tabuľkou, čo je vlastne mix pola a zoznamu...:-D Len si to treba dobre naštudovať ;-)

Nahlásit jako SPAM
IP: 213.151.217.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 33 hostů

Podobná vlákna

Průběžné výsledky přes AJAX — založil Nefaritus

Počty-dotazy — založil xjx

Xaml - dotazy — založil milanmichal

Dva dotazy — založil RePRO

Moderátoři diskuze

 

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