Priklady C - pre zaciatocnikov

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
Loloone
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1369
Dátum registrácie: 29 Aug 2010, 00:00
Bydlisko: the Sered DC
Vek: 51

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa Loloone » 03 Máj 2016, 18:02

dneska len opakujem doterajsie prikazy:
if, else
do, while, for
break, continue a switch...

nova uloha:
Napíšte program, ktorý načíta dve celé čísla a vypíše všetky párne čísla, ktoré ležia
medzi nimi. (Pre vstup 3 a 8 vypíše čísla 4, 6 a 8. Pre vstup 6 a 3 vypíše čísla 4 a 6. Pre
vstup 3 a 3 nevypíše nič.)


to bude zas nejaka pekelna logika :-)
0
"sukani je pro decka ...chlapi si vypijou"

DPS pre stavbu programatora - UsbPicProg alebo AVR-USBasp

Používateľov profilový obrázok
zen
Stály člen
Stály člen
Príspevky: 484
Dátum registrácie: 22 Nov 2013, 14:33
Bydlisko: Cadca

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa zen » 04 Máj 2016, 01:04

Zakladom by mohol byt for:

Kód: Vybrať všetko

for(i1=a+a%2; i1<=b; i1=i1+2) printf("%d ",i1);
Hadam, ze a+a%2 ti zatial moc nepoveda, tak si to budeme muset zrobit:

Kód: Vybrať všetko

  int a1=a/2;
  int a2=a1*2;
  int a3=a-a2;
  a=a+a3;
(Ak zistis, ako to funguje, tak to zjednodusis.)

Este mame problem, ze cisla mozu byt zadane a>b. Najjednoduchsie je swap(a,b) - prakticky funkcia, ktora robi:

Kód: Vybrať všetko

  int temp=a;
  a=b;
  b=a;
Teraz uz si to poskladas. Nepomohol bych ti, ked bych dal hotove riesenie.

Skoda, ze si este nemal funkce, take elegantne riesenie by bolo dat for loop do funkce a volat ji:

Kód: Vybrať všetko

my_func(min(a,b),max(a,b));
Hadam, ze si domyslis, ako by to fungovalo.
0
Samozřejmě, že dědeček nemá kapesní hodinky poháněné elektřinou. Takový nesmysl si může vymyslit jen Saturnin. (Zdenek Jirotka, 1942)

Používateľov profilový obrázok
Loloone
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1369
Dátum registrácie: 29 Aug 2010, 00:00
Bydlisko: the Sered DC
Vek: 51

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa Loloone » 04 Máj 2016, 11:03

operator % uz poznam :-) je to zvysok po deleni nejakym cislom (v tomto pripade dvojkou),
cize napr.: 8 % 3 je 2 alebo 8 % 2 je 0

cize ak:

Kód: Vybrať všetko

a % 2 == 0
to znamena ze a je parne cislo

ja som skusal vselico mozne (samozrejme mi to nefungovalo) uvazoval nad tym takto nejak :

pomocou scanf naplnit dve premenne nejakymi cislami
potom pomocou podmienky If-else zistit ktora premenna je mensia alebo rovna
a cyklom while alebo for vypisovat parne cisla v danom rozsahu...

vdaka za tip, idem to skusit poskladat :thumbup:
0
"sukani je pro decka ...chlapi si vypijou"

DPS pre stavbu programatora - UsbPicProg alebo AVR-USBasp

Používateľov profilový obrázok
lh
Pokročilý člen
Pokročilý člen
Príspevky: 715
Dátum registrácie: 23 Mar 2013, 14:02
Bydlisko: z južnej strany Poľany
Vek: 46

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa lh » 04 Máj 2016, 12:34

Nuž, dá sa to aj tak...
Ale je čas na ďalší krok, ktorý Ti pomôže aj pri mikročipoch.

Využiješ to, že párne číslo má v binárnom tvare na prvom mieste sprava jednotku. Teda ak máš vstup int cislo; tak každé číslo, ktoré je v tvare *******1 je párne (* môže byť 0 alebo 1). Keď použiješ bitový operátor &, tak výraz cislo & 1 je pravda, ak je číslo nepárne, a nepravda ak je párne.

napr.
nepárne:
A.... 10100111
B.... 00000001
A&B 00000001
párne:
A.... 10100110
B.... 00000001
A&B 00000000

Kód: Vybrať všetko

#include <stdio.h>

int main()
{
    int cislo;
    
    scanf("%d", &cislo);
    
    if(cislo & 1)
    {
        printf("Cislo %d je neparne\n", cislo, cislo);
    }else
    {
        printf("Cislo %d je parne\n", cislo, cislo);
    }

    return 0;
}
edit> a ten predchádzajúci príklad si vyriešil?
0

Používateľov profilový obrázok
Loloone
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1369
Dátum registrácie: 29 Aug 2010, 00:00
Bydlisko: the Sered DC
Vek: 51

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa Loloone » 04 Máj 2016, 12:49

takze zatial takto s cyklom for:

Kód: Vybrať všetko

#include <stdio.h>

main()
{
int a, b, c;
printf("zadaj cislo: ");
scanf("%d",&a);
printf("zadaj dalsie: ");
scanf("%d",&b);

if (a < b)
  {
    c=b;
    for (c=a+a%2; c<=b; c=c+2)
    printf("%d \n",c);
  }
else
  {
    c=a;
    for (c=b+b%2; c<=a; c=c+2)
    printf("%d \n",c);
  }
}
a s while

Kód: Vybrať všetko

#include <stdio.h>

main()
{
int a, b, c;
printf("zadaj cislo: ");
scanf("%d",&a);
printf("zadaj dalsie: ");
scanf("%d",&b);

if (a < b)
  {
    c=b;
    c=a+a%2;
    while (c<=b)
    {
    printf("%d \n",c);
    c=c+2;
    }
  }
else
  {
    c=a;
    c=b+b%2;
    while (c<=a)
    {
    printf("%d \n",c);
    c=c+2;
    }
  }
}
edit: este maly rozbor cyklu:
premennu c naplnime hodnotou a+zostatok po deleni dvoma (to moze byt 1 alebo 0),
cyklus vytlaci hodnotu c a potom ju zvacsi o 2, pobezi dovtedy kym plati ze hodnota c <= a

ale nefunguje to uplne spravne so zapornymi cislami a nulou, to este skusim osetrit dalsou podmienkou if
este sa v to trocha porypem , hned jak prebadam to riesenie od lh :thumbup:
0
"sukani je pro decka ...chlapi si vypijou"

DPS pre stavbu programatora - UsbPicProg alebo AVR-USBasp

Používateľov profilový obrázok
Loloone
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1369
Dátum registrácie: 29 Aug 2010, 00:00
Bydlisko: the Sered DC
Vek: 51

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa Loloone » 04 Máj 2016, 14:05

bitovy sucin & je asi o nieco rafinovanejsi a jednoduchsi na zapis ale inak je to asi jedno:

Kód: Vybrať všetko

if (cislo & 1)
alebo

Kód: Vybrať všetko

if (cislo % 2 == 1)
lh @ neviem uz ktory priklad myslis? vcera som este skusal nejake dalsie veci a snazil som sa opakovat...
pokial si pamatam predposledne zadanie bolo splnene akurat som tam este nieco "vylepsoval" tusim

edit:
aha uz viem :-)
chcel som ten vystup vsetko v jednom riadku ale som sa na to vykaslal a uz som sa k tomu nevratil
ako by sa to dalo?
0
"sukani je pro decka ...chlapi si vypijou"

DPS pre stavbu programatora - UsbPicProg alebo AVR-USBasp

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa peterple » 04 Máj 2016, 19:46

Je a nie je to jedno. Logický súčin urobí aj ten najprihlúpejší procesor v najkratšom možnom čase. Zvyšok po delení už taká jednoduchosť nie je lebo sa musí použiť delenie a to už je operácia ktorá hlavne na slabších procesoroch zaberie nejaký čas. Alebo ako je to napríklad u AVR tak vôbec nie je k dispozícii a preto sa musí vykonávať programovo. Leda že by to opäť zachránil prekladač a zbadal že sa delí dvomi a môže použiť rotáciu.

Ešte k tomu druhému if. Ten koniec ==1 je tam zbytočný
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
Loloone
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1369
Dátum registrácie: 29 Aug 2010, 00:00
Bydlisko: the Sered DC
Vek: 51

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa Loloone » 04 Máj 2016, 20:55

tu je dalsie riesenie ktore uz pocita spravne aj zaporne cisla :finga:
pouzil som prikaz continue a aj binarny sucin & a len 2 premenne...

Kód: Vybrať všetko

#include <stdio.h>

main()
{
int a, b;

printf("zadaj cislo: ");
scanf("%d",&a);

printf("zadaj dalsie: ");
scanf("%d",&b);

if (a < b)
  {
    for(a++ ; a < b ; a++ )
    {
      if (a & 1)
      continue;
      printf("%d\n",a);
    }
  }
  else
  {
    for(b++ ; a > b ; b++ )
    {
      if (b & 1)
      continue;
      printf("%d\n",b);
    }
  }

  return 0;
}
-- Spojený príspevok 04 Máj 2016, 20:14 --

spravne by sa tam nemala zobrazovat ani nula :-) ale nebudeme malicherny...
na co presne sluzi prikaz return ? program funguje aj bez neho len vypis pri ukonceni je iny
0
"sukani je pro decka ...chlapi si vypijou"

DPS pre stavbu programatora - UsbPicProg alebo AVR-USBasp

Používateľov profilový obrázok
lh
Pokročilý člen
Pokročilý člen
Príspevky: 715
Dátum registrácie: 23 Mar 2013, 14:02
Bydlisko: z južnej strany Poľany
Vek: 46

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa lh » 04 Máj 2016, 21:19

:-)
V dnešnej dobe prebytku výpočtového výkonu a pamäte sa zabúda na efektivitu. Na PC to so 16 jadrovým procesorom a 8G RAM to ani nemáš dôvod riešiť, ale ak chceš programovať MCU, tak si hneď od začiatku zvykni na použitie kódu čo najjednoduchšieho, a tým aj najrýchlejšieho.

return 0; na konci je navratová hodnota funkcie main, ktorá je volaná po spustení programu. Nemusíš ju tam dávať.

edit: v Tvojom poslednom príklade najprv rozhodneš, kt. číslo je menšie. Potom k nemu pripočtavaš 1 a ak je výsledko nepárny (párnosť/nepárnosť zisťuješ v každom kroku), ideš na ďajšiu iteráciu a ak je párny, tak ho vypíšeš.

Optimálnejšie by bolo podľa mňa, rozhodnúť, kt. je menšie, potom zistiť (stačí len raz), či je párne, ak áno, pripočítavať 2 , a ak nie, tak pripočítať 1, a potom zas 2
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa peterple » 04 Máj 2016, 22:39

Mne sa tiež viacej páči to tvoje prvé riešenie. V tom druhom nabeháš dvakrát toľko cyklov ako v prvom. Každý cyklus žerie energiu. Ak máme mobilné zariadenie prvé riešenie by vydržalo bežať dlhšie.

Moje riešenie by vyzeralo takto:

Kód: Vybrať všetko

#include <stdio.h>
main()
{
	int a, b, c;
	printf("zadaj cislo: ");
	scanf("%d",&a);
	printf("zadaj dalsie: ");
	scanf("%d",&b);
	if (a > b){
		c=b; b=a; a=c;
	}
    for (a+=(a & 1); a<=b; a+=2)
    	printf("%d \n",a);

}
Príkaz return slúži na ukončenie funkcie a vrátenie hodnoty (ak funkcia nieco vracia). V jazyku C je všetko funkcia. V skutočnosti je main deklarovaná dosť zložitejšie ako si zatiaľ používal.

Kód: Vybrať všetko

int main(int argc, char* argv[]);
Pomaličky môžeš začať vzdelávanie aj týmto smerom. Zatiaľ iba k tomu int na začiatku (pred main).
Hovorí to čo funkcia vráti keď skončí. Teda funkcia main keď skončí vracia nejaké číslo. Dúfam že to v tebe vyvolá zopár otázok na ktoré sa pokúsiš nájsť odpovede.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
Loloone
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1369
Dátum registrácie: 29 Aug 2010, 00:00
Bydlisko: the Sered DC
Vek: 51

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa Loloone » 04 Máj 2016, 23:27

plne si uvedomujem ze moj sposob pisania kodu je (zatial) dost chaoticky :mrgreen:
asi viete preco je to tak... je to taky ten zaciatocnicky sposob "lepenia" kodu, napr, zoberiem nejaky cyklus a abych ho spustil vrazim pred neho podmienku a potom to takto dopadne

akurat citam ohladom funkcii tu: http://www.sallyx.org/sally/c/c04.php ...trosku sa v tom zacinam motkat, neviem ci je to moc dobre ked preskakujem z jedneho kurzu do druheho, popri tom sa snazim citat Herouta ked som offline ale idem asi prilis po povrchu
asi som trochu netrpezlivy, ale dufam ze sa mi to zacne v tej hlave uz coskoro tak nejak ukladat do spravnych suplikov lebo inak neviem co bude :rolleyes:
0
"sukani je pro decka ...chlapi si vypijou"

DPS pre stavbu programatora - UsbPicProg alebo AVR-USBasp

Používateľov profilový obrázok
zen
Stály člen
Stály člen
Príspevky: 484
Dátum registrácie: 22 Nov 2013, 14:33
Bydlisko: Cadca

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa zen » 04 Máj 2016, 23:30

peterple napísal:Moje riešenie by vyzeralo takto:

Kód: Vybrať všetko

#include <stdio.h>
main()
{
	int a, b, c;
	printf("zadaj cislo: ");
	scanf("%d",&a);
	printf("zadaj dalsie: ");
	scanf("%d",&b);
	if (a > b){
		c=b; b=a; a=c;
	}
    for (a+=(a & 1); a<=b; a+=2)
    	printf("%d \n",a);

}
Ja som mal na mysli toto:

Kód: Vybrať všetko

#include <stdio.h>
main()
{
   int a, b;
   printf("zadaj cislo: ");
   scanf("%d",&a);
   printf("zadaj dalsie: ");
   scanf("%d",&b);
   if (a > b){
      int c=b; b=a; a=c; //c definovane len ked ho treba
   }
    for (a+=(a & 1); a<=b; a+=2)
       printf("%d \n",a);
}
V interpreted BASIC by bol takyto kod optimalnejsi. Akoze C je compiled, meni to cosi?
0
Samozřejmě, že dědeček nemá kapesní hodinky poháněné elektřinou. Takový nesmysl si může vymyslit jen Saturnin. (Zdenek Jirotka, 1942)

Používateľov profilový obrázok
Loloone
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1369
Dátum registrácie: 29 Aug 2010, 00:00
Bydlisko: the Sered DC
Vek: 51

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa Loloone » 04 Máj 2016, 23:38

posledna verzia od petrple je zatial najlepsie :thumbup: akurat v podmienke cyklu for (stredny chlievik) treba miesto a<=b dat a<b...
inak sa v rade parnych cisel na konci zobrazi aj samotna premenna pokial je jej hodnota parna
edit: oprava - a<=b je spravne, zle som cital zadanie :-)
0
Naposledy upravil/-a Loloone v 05 Máj 2016, 11:20, upravené celkom 1 krát.
"sukani je pro decka ...chlapi si vypijou"

DPS pre stavbu programatora - UsbPicProg alebo AVR-USBasp

Používateľov profilový obrázok
budvar10
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1029
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa budvar10 » 05 Máj 2016, 07:59

Kód: Vybrať všetko

int c=b; b=a; a=c; //c definovane len ked ho treba
Premenná c bude "definovaná len keď ju treba" aj keď bude na začiatku funkcie. Toto je len komfort C++ kódu, ktorý tiež ale môže byť problémom napr. ak je definícia v časti , ktorá nie vždy musí byť dosiahnuteľná pri behu programu (prekladač by ale také mal odhaliť a upozorniť naň). Ak je zapnutá optimalizácia kódu, tak pre lokálne premenné sa kľudne použije ten istý register, ak ich nie je potrebné držať súčasne v RAM. Samozrejme preklad vždy závisí od typu CPU prípadne OS a aj od typu a verzie C.
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa xmilos » 05 Máj 2016, 10:07

mno mala inspiracia:
printf("zadaj cisla: ");
scanf("%d %d",&a, &b);
0

Používateľov profilový obrázok
Loloone
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1369
Dátum registrácie: 29 Aug 2010, 00:00
Bydlisko: the Sered DC
Vek: 51

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa Loloone » 05 Máj 2016, 13:22

vdaka za inspiraciu :thumbup:

posledne 2 zadania nez sa pohnem dalej

Napíšte program, ktorý pozostáva iba z dvoch príkazov (omáčička a deklarácia
premenných sa nerátajú) a ktorý načíta číslo a v prípade, že je to číslo párne, vypíše
z neho polovicu a inak vypíše jeho trojnásobok zväčšený o 1.


miesto if - else som pouzil ? :

Kód: Vybrať všetko

#include <stdio.h>
main()
{

int i;

printf("zadaj cislo: ");
scanf("%d" ,&i);

printf("%d",(i&1) ? (i*3)+1 : i/2);

}

Napíšte program, ktorý načíta číslo a opakuje s ním operáciu z predošlej úlohy, až kým
nedostane jedničku. Čísla priebežne vypisuje. (Teda pre vstup 3 vypíše čísla 3, 10,
5, 16, 8, 4, 2, 1.) Mimochodom – myslíte, že takýto program vždy skončí?
0
"sukani je pro decka ...chlapi si vypijou"

DPS pre stavbu programatora - UsbPicProg alebo AVR-USBasp

Používateľov profilový obrázok
Loloone
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1369
Dátum registrácie: 29 Aug 2010, 00:00
Bydlisko: the Sered DC
Vek: 51

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa Loloone » 05 Máj 2016, 15:54

funkcne riesenie:

Kód: Vybrať všetko

#include <stdio.h>

main()
{
int i;

printf("zadaj cislo: ");
scanf("%d" ,&i);

while(i!=1)
  {
  if(i&1)
    {
    i=(i*3)+1; printf("%d \n",i);
    }
else
    {
    i=i/2; printf("%d \n",i);
    }
  }
}


mimochodom - nevidim dovod preco by program nemal skoncit :-)
0
"sukani je pro decka ...chlapi si vypijou"

DPS pre stavbu programatora - UsbPicProg alebo AVR-USBasp

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa peterple » 05 Máj 2016, 20:06

V tvojom programe sa dá ušetriť jeden príkaz. Len také logické cvičenie ak chceš premýšlať. Ja dôvod na zacyklenie vidím. Stačí ak sa mu nejakým spôsobom podarí vrátiť sa na to isté nepárne číslo. V tvojom prípade začal z 3. Keby sa bol dostal na číslo 6 to by ho poslalo na číslo 3 a to zase nahor a tak dokola. Lenže on sa dostal na 5 a potom už to išlo k jednotke.

Ale to už je prudká matematika a z tej v mojom veku používam iba + - * /. Počkám si až to mladé čerstvé mozgy rozlúsknu.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
Loloone
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1369
Dátum registrácie: 29 Aug 2010, 00:00
Bydlisko: the Sered DC
Vek: 51

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa Loloone » 05 Máj 2016, 20:39

aby sa to zacyklilo muselo by to hadzat vzdy neparne cislo, ale ku kazdemu neparnemu cislu sa pripocitava 1 takze nasledne dostaneme parne cislo ...ci?
0
"sukani je pro decka ...chlapi si vypijou"

DPS pre stavbu programatora - UsbPicProg alebo AVR-USBasp

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Priklady C - pre zaciatocnikov

Príspevok od používateľa peterple » 05 Máj 2016, 20:48

Ale párne deleno 2 môže byť aj nepárne. Napr 6/2 10 / 2, atd.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok