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++.
Fórum › C / C++
Průběžné dotazy
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
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?
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;
}
#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 ) ...
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;
}
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
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.
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
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;
}
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é. :-)
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:
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
Smaž ty uvozoky uvnitř podmínky, tedy
if ( cislo >= '25' && cislo <= '38' )
změň naif ( cislo >= 25 && cislo <= 38 )
C++ nedělám, ale tohle je jediné, co se mi zdá špatně:)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
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;
}
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...
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:\".
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
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.
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..
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(); ;-)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 ;-)
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...
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.
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
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;
}
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
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
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'.
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.
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;
}
}
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
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.
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).
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;
}
Niekde sa priam vyžaduje aby bol znak int, lebo sa očakáva EOF.Datlik napsal:
je tohle vubec mozny?
int c = '*';
Ja už toto fórum môžem ..., je to tu celé posr...!!
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 )
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ý...
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;
}
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.
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;
}
Něco jako dynamické pole. Třída obsahuje ukazatel na první a poslední prvek. A v každém prvku se nachází obsah, ukazatel na předchozí a následující prvek.
Viz http://javaalgoritmy.wz.cz/spojsez.htm nebo http://www.algoritmy.net/index.html?str=18
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ť ;-)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Průběžné vypisování stránky — založil fix
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