» »

Resne težave z razumevanjem osnov programiranja

Resne težave z razumevanjem osnov programiranja

«
1
2

RatedR ::

Lep pozdrav, pišem iz odločnosti in obupa, ker imam po pol leta drgnenja vgnezdenih for zank še vedno velike težave z razumevanjem...

Lani sem imel pri predmetu programiranja nezadostno oceno za vgnezdene for naloge (NE-gnezdene for razumem) in se odločno spravil k učenju tega...po par dneh sem videl da ne gre to nikamor.

Začeli smo s klasiko:
*
**
***
****
Kodo sem drgnil toliko časa da sem jo znal na pamet, kar je seveda narobe, a ko vidiš na testu da moraš to napisat ne gre drugače kot da jo samo napišeš saj jo namreč znaš na pamet...

Pol je pa prišlo recimo tako:
4321
432
43
4

In nimam več pojma, res nevem kam grejo vsi poskusi profesorjev da bi mi vbili to v glavo ampak stvari jaz neznam spisat po pol leta najmanj...

Vsakič ko se spravim učit in vidim različne verzije teh pravokotnih trikotnikov ostanem brez idej...imam resno težavo ki trenutno ogroža ocene pri tem predmetu, letos pa sledijo npr. take stvari:

*+++++++++++++*
**+++++++++++**
***+++++++++***
****+++++++****
*****+++++*****
******+++******
*******+*******

In če me razumete bom pogorel, profesorju pa nemorem rečt da teh osnov neznam.

Prosim za KATERIKOLI nasvet.
  • spremenilo: RatedR ()

ragezor ::

Tko na hitro se mi ne zdi, da rabis vgnezdene zanke pri teh primerih

RatedR ::

Ja, ampak saj veš pri programiranju je nešteto rešitev, vsak lahko reši po svoje...mi moramo pa s "pomočjo" vgnezdenih for zank.

videc ::

Mislim, da tukaj ni problem v razumevanju for zank ampak v razumevanju zadanega problema.

ragezor ::

ok, se popravljam

ce hoces resiti brez raznih pomagal in v jeziku, ki ni dober v "skrivanju" zank rabis

x = 4
l = map(str, range(x, 0, -1))
for i in range(x, 0, -1):
    print(''.join(l[:i]))


recimo tukaj ti join() metoda skrije zanko

s cim rabis pomoc bodi bolj specificen. probaj resiti kaksno nalogo in povej kje se ti ustavi? predstavi svoj miselni tok do takrat, ko se ti ustavi cim bolj podrobno. le tako lahko drugi vidijo tvoje napake v razumevanju in jih popravijo.

korenje3 ::

sej tut jz ne vem kva je razlika med "vgnezdenimi" in "nevgnezdenimi" ^^

sam programirat pa znam :p
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

Yacked2 ::

Glede tega:

*+++++++++++++*
**+++++++++++**
***+++++++++***
****+++++++****
*****+++++*****
******+++******
*******+*******

Jaz bi to rešil tako, da bi pognal zanko od [1,MAX(7)], na začetku izpišeš i krat * in nato MAX-i krat + nato pa še enkrat + ter še enkrat MAX-i krat + ter nato spet i krat *.
Korak naprej ni vedno ustrezen...sploh če si na robu prepada!

krneki0001 ::

vseh = 15
z(zvezdica)=1

pišeš pa
1xz + 15-2x(z) + 1xz (1x zvezdica + (15 - 2x zvezdica) + 1x zvezdica)
in v for stavku povečuješ z = z + 1, dokler ni z večji od 7

for (int z = 1 ; z > 7 ; z++)
{ 
    piši 1xz + 15-2x(z) + 1xz  --- ni koda, kodo je treba napisat, da bo dala ven prave znake
}

Zgodovina sprememb…

urli ::

RatedR je izjavil:



*+++++++++++++*
**+++++++++++**
***+++++++++***
****+++++++****
*****+++++*****
******+++******
*******+*******


Tkole sem na hitro napisal v php. Postopoma, verjetno bi pa kakšen stručkoti to lepš napisal. Ni pa ta primer neki težek. Najprej maš i zanko, ki izpiše "taglavnih" 7 vrstic, znotraj pa jasno daš še j zanko, ki pač izpiše */+. i gre od 1 do 7 in hitro vidiš, da se ta vrednost ujema s ševilom zvezdic ;) torej koj i=1 je v 1. vrstici levo (&desno) po 1 zvezdica, i=2, 2 zvezdici itd. In to je to.
<?php
    for ($i = 1; $i < 8; $i++) {
        for ($j = 1; $j < 16; $j++) {
            echo '*';
        }
        echo '<br />';
    }
    ?>

    <br />
    <br />

    <?php
    for ($i = 1; $i < 8; $i++) {
        for ($j = 1; $j < 18; $j++) {
            if ($j <= $i)
                echo '*';
            else
                echo '+';
        }
        echo '<br />';
    }
    ?>

    <br />
    <br />

    <?php
    for ($i = 1; $i < 8; $i++) {
        for ($j = 1; $j < 16; $j++) {
            if (($i >= $j) OR ( (16 - $i) <= $j))
                echo '*';
            else
                echo '+';
        }
        echo '<br />';
    }
    ?>


***************
***************
***************
***************
***************
***************
***************


*++++++++++++++++
**+++++++++++++++
***++++++++++++++
****+++++++++++++
*****++++++++++++
******+++++++++++
*******++++++++++


*+++++++++++++*
**+++++++++++**
***+++++++++***
****+++++++****
*****+++++*****
******+++******
*******+*******

Zgodovina sprememb…

  • spremenil: urli ()

imagodei ::

@All,

sej je fino, da se pohvalite, kako vi znate rešit omenjene primere, ampak mislim, da OP ni imel tega v mislih. Ne more se na pamet naučit vseh nalog, ki mu jih lahko zastavi profesor.

@OP,

Jaz ti svetujem, da profesorju pač poveš, da res ne razumeš, da si že precej časa posvetil učenju, pa ne gre in da bi rabil pomoč. Pravijo, da lepa beseda lepo mesto najde. Razen tega imaš pa dokaj malo opcij. Lahko iščeš gradivo in se učiš toliko časa, dokler ti vendarle ne bo prebilo. Lahko bi npr. poiskal nek tutorial na netu (iščeš nekaj v stilu "How nested for loops work"). Ena varianta, ki bi morda delovala (odvisno, kakšen tip človeka si) je, da delujoč program od sošolca poženeš tako, da se izvaja po korakih (Step Into).

Primeri, ki vam jih daje profesor, po mojem mnenju niso ravno najbolj preprosti za učenje logike gnezdenih for zank. Osnovno vprašanje, ki si ga moraš znati odgovoriti, je, kaj je sploh namen zank oziroma čemu jih uporabljamo?
- Hoc est qui sumus -

RatedR ::

Mislim da je večina (razen upor. imagodei) zgrešila kaj vam hočem povedat, jaz ne rabim rešitve za primer ki sem ga kopiral sem, rabim nasvet kako se od začetka lotit teh zank in osvojit to logiko za njimi.

Moj cilj: Želim si da bi za začetek znal brez večjih problemov spisat kaj takšnega:

*
**
***
****

1
12
123
1234

4321
432
43
4

ipd.

Torej nočem da mi pišete rešitve, ker vsi vemo da copy paste programerji niso res programerji, temveč vaš nasvet kako rešit problem in osvojit logiko.

Stil pisanja teh oblik imamo pa samo en, in to je z dvema vgnezdenima for zankama: http://pastebin.com/pdGnp8TA

Uporaba funkcij in ostalih metod nažalost ne pride v poštev.

Zgodovina sprememb…

  • spremenilo: RatedR ()

pegasus ::

Manjka ti prepoznavanje vzorca v danem problemu, analiza tega vzorca in razmislek o implementaciji algoritma, ki bi izdelal tak izpis. "Programiranje" na koncu je samo izvedba, obrtniška dejavnost.

FTad ::

Jaz sem tudi na zacetku imel tezave z razumevanjem vgnezdenih zank. Nastudiral sem jih tako, da sem resil veliko razlicnih nalog s temi zvezdicami na 1001 nacin.

Predstavljaj si zanko in vgezdeno zanko tako, da ti vgnezdena zanka predstavlja znake (npr zvezdice), ki se zapisujejo v ravni vrstici (npr x-os) in zunanja zanka (torej ne-vgnezdena) predstavlja znake, ki spremeni vrstico, torej v navpicni smeri (y-os).

lukapivk ::

Iskreno se grdo sliši, ampak če po 6 mesecih ne razumeš tega, bi mogoče blo dobro premislit če je to sploh zate.

mojca ::

Nightta, naloge rešuješ tako, da jih razbiješ na podprobleme. Poskušaj rešiti naslednjo nalogo (ostali prosim ne pišite rešitev) in prilepi svojo kodo.

Recimo, da moraš izpisati naslednji trikotnik:

4321
432
43
4

Namesto tega trikotnika napiši program z eno for zanko, ki izpiše naslednje:

Izpisati moram 4 števila od 4 do 1.
Izpisati moram 3 števila od 4 do 2.
Izpisati moram 2 števila od 4 do 3.
Izpisati moram 1 števila od 4 do 4.

Ko prilepiš rešitev za tole, gremo dalje.

mdural ::

Meni je pomagalo to, da sem problem dal na list papirja in čisto v človeški jezik prevedel problem in našel rešitev.
Torej:
4321
432
43
4

Tukaj se torej ob prehodu v novo vrstico zbriše najbolj desno število.
Na prvo roko bi si naredil tabelico in bi potem ob vsakem prehodu zanke izpisal en element manj. Rešitev je malo neumna in daleč od optimalne a deluje. Ko ti enkraat deluje se lahko vprašaš za boljšo rešitvijo, če ne gre imaš še vedno delujočo rešitev.

Zgodovina sprememb…

  • spremenil: mdural ()

jype ::

Vgnezdene zanke so samo zanke ena v drugi.

Vsaka ponovitev zunanje zanke izpiše npr. eno vrstico, vsaka ponovitev notranje zanke pa en znak v tej vrstici. Notranja zanka se izvede tolikokrat, kolikor znakov izpiše, zunanja zanka pa tolikokrat, kolikor je vrstic v izpisu.

Najbolje si to lahko predstavljaš tako, da se s programom poskusiš sprehajat po dvodimenzionalni tabeli, kjer sta številka stolpca in številka vrstice naslov posamezne celice v njej, z eno zanko se sprehodiš po vseh stolpcih, z drugo, vgnezdeno zanko, pa po vseh vrsticah vsakega stolpca.

Fino je tudi, če kodo prebereš v svojem jeziku: "Za vsak X od ena do sto ponovi za vsak Y od ena do sto ponovi izpis celice na naslovu X, Y."

Ti to kaj pomaga?

ragezor ::

ragezor je izjavil:


s cim rabis pomoc bodi bolj specificen. probaj resiti kaksno nalogo in povej kje se ti ustavi? predstavi svoj miselni tok do takrat, ko se ti ustavi cim bolj podrobno. le tako lahko drugi vidijo tvoje napake v razumevanju in jih popravijo.

Zgodovina sprememb…

  • spremenil: ragezor ()

stalker ::

Imaš tole kodo z dvema vgnezdenima zankama:
for(i=1, i<5, i++)
{
   for(j=1, j<5, j++)
   {
       izpiši ("i=", i);
       izpiši (" j=", j);
       preidi v novo vrstico;
   }
   preidi v novo vrstico;
}

Najprej se izvede zanka s spremenljivko i enkrat (i=1).
Potem se izvede zanka s spremenljivko j (j=1) in se izvaja, dokler j ne doseže vrednosti 4.
Za tem se spet izvede zunanja for zanka, takrat ima spremenljivka i vrednost 2.
Potem se spet izvede notranja zanka, ki veča vrednost spremenljivki j od 1 do 4.
In tako naprej: i=3, j postane 1, potem 2 itd. do 4.

Izpis na zaslonu je tak:
i=1 j=1
i=1 j=2
i=1 j=3
i=1 j=4

i=2 j=1
i=2 j=2
i=2 j=3
i=2 j=4

i=3 j=1
i=3 j=2
i=3 j=3
i=3 j=4

i=4 j=1
i=4 j=2
i=4 j=3
i=4 j=4

Jerry000 ::

lukapivk je izjavil:

Iskreno se grdo sliši, ampak če po 6 mesecih ne razumeš tega, bi mogoče blo dobro premislit če je to sploh zate.

A to da je tip po 6 mesecih zelo vztrajen, ima željo po znanju kljub težavi pa spregledaš? Zato pa je tko kot je na faksih...

Zgodovina sprememb…

  • spremenil: Jerry000 ()

urli ::

Očitno maš ti res težave z razumevanje zank in ti spoh ni jasno kaj se znotraj dogaja in v kakšne vrstnem redu se vse skupaj izvede.

Evo ti par primerov.

for (i = 1; i < 8; i++) {
izpiši vrednost i;
preidi v novo vrstico
}


V zgornji kodi imaš zanko kjer smo zapisali, da se naj ta prične pri i = 1 in se izvaja vse dokler i ni manjši od 8 (vrednost integer povečujemo - i++). Torej najprej računalnik/program vzame i = 1, pogleda znotraj zanke in vidi, da mora izpisati vrednost za i, torej izpiše 1. Potem vzame i = 2, pogleda znotraj zanke in vidi, da mora zopet izpisati vrednost i, ki je v tem primeru 2 in vse to do številke 7. Torej zgornja koda izpiše
1
2
3
4
5
6
7

Sedaj pa znotraj "i zanke" dodajmo še "j zanko"

for (i = 1; i < 8; i++) {
izpiši vrednost i ter pomišljaj
for (j = 1; j < 8; j++) {
izpiši vrednost j;
}
preidi v novo vrstico
}


V tem primeru je podobno. Program najprej vzame i = 1 ter pogleda znotaj zanke in kaj vidi tu? Tokrat pa znotraj vidi novo znako in kaj narediti zdaj? Ja nič, najprej bo potrebno izvesti celotno zanko j. Torej najprej dodeli j = 1 in pogleda kaj je zdaj znotraj te zanke in vidi, da je tu zapis kjer naj izpiše j. Potem (ker mora najprej izvesti celotno j zanko!) vzame za j = 2 in ponovno pogleda kaj mora tokrat izpisati, ja nič, izpisati mora enako kot prej, le da je vrednost za i še vedno 1, vrednost za j je pa tokrat 2 in tako naprej. Ko tako pride do vrednosti za j = 8 pa se ta notranja zanka ustavi in kaj pa sedaj? Ja prvotne zanke i sploh še nismo zaključili in je še vedno v izvajanju, torej dodelimo vrednost i = 2 in ponovimo postopek...

Program tokrat torej izpiše
Vrednost pred pomišljajem je i, vrednosti za so j
1-1234567
2-1234567
...
7-1234567

Primer kjer imamo znotraj j zanke še "k zanko"...

for (i = 1; i < 8; i++) {
izpiši vrednost i ter pomišljaj
for (j = 1; j < 8; j++) {
izpiši vrednost j ter pomišljaj;
for (k = 1; k < 8; k++) {
izpiši vrednost k;
}
preidi v novo vrstico
}
preidi v novo vrstico
}


Zgornji primer deluje po enakem principu. Najprej poskusi izvesti zanko i, vrednosti i dodeli 1, ko to požene, vidi, da je znotraj i zanke še "j zanka" tako, da mu ne preostane drugega, kot da začne z izvajanjem te in to pri vrednosti za j = 1. Ko začne z izvajanjem te zanke (j = 1) pa vidi, da ima znotraj še eno zanko, torej k zanko in jasno bo potrebno izvesti še to, torej nadaljuje z izvedbo te zanke in dodeli vrednost k = 1. Znotraj k zanke pa "na srečo" ni več nobene znamke torej lahko lepo izpiše vrednos k = 1, ter nato k=2 in vse tako naprej. Ko pride do 8 se ta k zanka konča ampak jasno se j zanka pri tem še ni končala ampak smo na zadnje zaključili pri vrednosti za j = 1 torej, nadaljujemo z j = 2 pri kateri izvedemo spet celotno k zanko, in vse tako do j=8 kjer se j zanka ustavi ampak i zanka pa se še ni, torej nadaljujemo i = 2 in ponovimo zgornji postopek (vse od začetka, ker sta se j in k zanki jasno že zaključili v primeru i = 1)... Ves postopek se ponovi do vrednosti i = 8 kjer se zanka in s tem program ustavi.

Izpis

(i)-(j)-(kkkkkkk)
1-1-1234567
1-2-1234567
...
1-7-1234567

za i = 2 vse ponovimo
2-1-1234567
2-2-1234567
...
2-7-1234567

za = 3...
...

.
.
.

7-1-1234567
7-2-1234567
...
7-7-1234567

P.S. Saj ti si v srednji šoli, ne?

Zgodovina sprememb…

  • spremenil: urli ()

urli ::

OMG kok je to urejanje na slo-tech zateženo. Par minut mine pa že več ne moreš urejati sporočila. điz nooooo!!

Evo tole sem mislil še zgoraj dodati...

Je pa to zgoraj zelo po domače povedano, ker nisem nikoli hodil na kak računalniški faks/srednjo in tudi s temi zadevami se ne ukvarjame prav dosti. Za kakšno bolj pedagoško razlago se boš moral obrniti na koga drugega. :P Drugače si pa to zgoraj lahko predstavljaš na več načinov. Moraš tu tudi malo abstraktno razmišljati. Recimo za i, j zanko si lahko komot predstavljaš kot n(x)m kvadrat ali pa še bolj abstraktno recimo kot kolo od mlina na vodo :P Recimo pokočno kolo ima v "predalčkih" spravljene vrednosti od 1 do 7 (i), potem imamo pa še eno ležeče kolo, ki je fiksno "pripopano" na to kolo v sredini (ležeč položaj). Tukaj so tudi spravljene vrednosti od 1 - 7, vrednost za "j". Začnemo pri i = 1, potem za 360 stopinj obrnemo ležeče kolo, da se izpišemno vse cifre (torej kolo i = 1, kolo j samo pa zavrteli za 360 stopinj in tako izpisali vse vrednosti od j = 1 do j =7). Potem za eno stopničko premaknemo i kolo na vrednost 2 in ponovno zavrtimo ležeče kolo za 360 za izpišemo vse vrednosti od 1 do 7 itd. Pač zadevo si lahko predstavljaš zelo obstraktno, če ti bo tako lažje.

Recimo primer kjer imaš še k zanko, si lahko predstavljaš pa kot 3d kocko z majhnimi kvadratki. Izhodišče je zgoraj levo (kot 3d koordinatni sistem). Navzdol je koordinata i, v desno smer koordinata j, v globino pa gre koordinata k. To veliko kocko sestavlja 7x7x7 manjših kock in sedaj ko zaženemo zanko iz tretjega primera zgoraj imamo najprej i=1, j=1 potem pa najprej poberemo vse kocke v globini k. Nato spet i=1 j=2 in spet poberemo vseh 7 kock iz globine za k. Ne vem, če čsito točn veš kaj mislim, ker malo bluzim v tri dni. Evo ti sliko..

(kocka 4x4x4)
 http://shrani.si/f/38/oP/3NvZRPXO/kocka.jpg

http://shrani.si/f/38/oP/3NvZRPXO/kocka.jpg



Slike mlina ti pa ne morem narisat, ker bi se moral preveč matrati :))

Drugače pa če imaš še več zank pa si lahko poskušaš vse skupaj predstavljati kot drevesasto strukturo z neomejeno vejami oz. neomejeno globino. Pač več načinov je, moraš malo "abstraktno" razmišljati.

Če boš vedel kaj se gre v ozadju pri teh zankah po moje res ne bi smel imeti težav kako rešiti zgornje naloge, ker je potem vse skupaj le še v detajlih,. Enkrat so integerji naraščujoči (i++), drugič padajoči (i--) in pač še postavljaš razne meje in dodatne pogoje znotraj posameznih zank tako kot zahteva posamezna naloga.

Zgodovina sprememb…

  • spremenil: urli ()

Baja ::

predvidevam da si trenutno 2. letnik SŠ. V 1. letniku ste verjetno imeli nek predmet iz algoritmov, kjer ste risali diagrame poteka. Priporočam ti, da prosiš nekoga, ki je to risal z levo roko, da ti razlaga tako dolgo, da boš razumel in sam risal te diagrame z levo roko.

Z osvojitvijo teh diagramov se dejansko naučiš kako računalniki "razmišljajo" in zgornje maloge bodo mala malca.

videc ::

jype je izjavil:

Vgnezdene zanke so samo zanke ena v drugi.

Vsaka ponovitev zunanje zanke izpiše npr. eno vrstico, vsaka ponovitev notranje zanke pa en znak v tej vrstici. Notranja zanka se izvede tolikokrat, kolikor znakov izpiše, zunanja zanka pa tolikokrat, kolikor je vrstic v izpisu.

Najbolje si to lahko predstavljaš tako, da se s programom poskusiš sprehajat po dvodimenzionalni tabeli, kjer sta številka stolpca in številka vrstice naslov posamezne celice v njej, z eno zanko se sprehodiš po vseh stolpcih, z drugo, vgnezdeno zanko, pa po vseh vrsticah vsakega stolpca.

Fino je tudi, če kodo prebereš v svojem jeziku: "Za vsak X od ena do sto ponovi za vsak Y od ena do sto ponovi izpis celice na naslovu X, Y."

Ti to kaj pomaga?
Tole (glede ponovitev zanke) ti mora še najbolj pomagati in pa to o diagramih poteka ter razumevanju algoritmov. Če tega ne "zapopadeš" boš imel težave celo srednjo šolo.

XsenO ::

Sam sem se teh smrekic učil, tako da sem na raznorazne načine spreminjal kodo, vstavljav na čimeč lokacij outpute, tako da sem lahko pri izpisu opazoval kaj je delalo kaj. Enostavno namesto, da se učiš se igračkaj z kodo in pregleduj izpise.
1 + 1 = 1

DOOM_er ::

imel identičen problem ter ga rešil. Sam sem se vsedel, vzel list v roke in napisal diagram poteka programa. Zvezdico po zvezdico, naglas greš čez vsak korak v diagramu poteka ter razumi kaj želiš zraven narediti in kaj se bo zgodilo, počasi. Sam ko sem poštekal za eno smrekico s tremi vrsticami zvezdic na ta način, sem poštekal vse. Vendar se res vsedi in na listu reši problem z diagramom poteka. Potem vzemi snov kjer ste risali diagrame poteka za for zanke in boš videl podobnost in se boš naučil razbrati kdaj uporabiti kaj. Vse zanke lahko tečejo od 0 do n pa od n do 0. Pusti računalnik in ne trudi se z s programiranjem ene zanke na tisoč in en način, ampak predno boš začel karkoli programirat razumi kako deluje for.
V grobem bom tako rekel. Za vsako vrstico smrekce potrebuješ en cikel zunanje for zanke, ter za vsako zvezdico v vrstici en cikel vgnezdene for zanke. Za tiste + ki jih delate pa letos pa razmisli kako se mesebojno spreminjata število zvezdic in število plusov.
Robots will steal your job. But that's OK

Zgodovina sprememb…

  • spremenil: DOOM_er ()

RatedR ::

Hvala vam za množičen in pozitiven odziv.

urli je izjavil:

P.S. Saj ti si v srednji šoli, ne?

Da.

mojca je izjavil:


Recimo, da moraš izpisati naslednji trikotnik:

4321
432
43
4

Namesto tega trikotnika napiši program z eno for zanko, ki izpiše naslednje:

Izpisati moram 4 števila od 4 do 1.
Izpisati moram 3 števila od 4 do 2.
Izpisati moram 2 števila od 4 do 3.
Izpisati moram 1 števila od 4 do 4.

Ko prilepiš rešitev za tole, gremo dalje.


Tako stvar razumem:



Kar se pa tiče poimenovanja spremenljivk sem pa tako vajen, v šoli pišemo vse z madžarsko notacijo kar se mi zdi še huje.

blackbfm ::

poglej to sliko če ti je kaj bolj jasno.. zeleni kvadratki so prva zanka, zelena puščica pa potek izvajanja..za rdečo velja pa isto, samo da gre za notranjo zanko.. na notranji zanki delaš preračunavanje in izpis

Looooooka ::

Ti sam beri tisto, kar je jype napisal če je problem v RAZUMEVANJU.
Ko boš razumel je tako kot si napisal...n-načinov kako to rešiti. Od enovrstičnih do 100 vrstičnih(odvisno od znanja in stila).
Ampak za razumevanje zadostuje jypetov post.

Gregor5816 ::

Mislim da imaš ti probleme z razumevanjem problema in ne s programiranjem. Najprej preberi, kar je zgoraj napisal jype.

RatedR je izjavil:

*
**
***
****


V 1. vrsti imaš 1 zvezdico.
V 2. vrsti imaš 2 zvezdici.
V 3. vrsti imaš 3 zvezdice.
V 4. vrsti imaš 4 zvezdice.

Opaziš vzorec?

Torej za rešitev z 2 vgnezdenima for zankama:
- zunanja zanka naj ti hodi po vrsticah
- notranja zanka naj ti izpisuje zvezdice
- po koncu notranje zanke izpišeš še "\n" za prehod v novo vrstico

RatedR je izjavil:

1
12
123
1234


Isti problem kot zgoraj, le da tu izpisuješ števila namesto zvezdic.

V 1. vrsti imaš 1.
V 2. vrsti imaš 12.
V 3. vrsti imaš 123.
V 4. vrsti imaš 1234.

Zunanja zanka gre spet po vrsticah, notranja zanka ti izpisuje števila.

RatedR je izjavil:

4321
432
43
4


Ponovno isti problem, le da je obrnjen na glavo.

V 1. vrsti imaš 4321.
V 2. vrsti imaš 321.
V 3. vrsti imaš 21.
V 4. vrsti imaš 1.

Zunanja zanka gre spet po vrsticah, notranja zanka ti izpisuje števila v obratnem vrstnem redu kot pri prejšnji nalogi.


Probaj najprej rešit prvo z zvezdicami. Ko boš znal tega, boš znal tudi naslednja dva. Tudi če ti ne uspe, objavi tu svoj program oz. kar si uspel napisati, da vidimo kje se ti ustavi.

111111111111 ::

RatedR je izjavil:

Hvala vam za množičen in pozitiven odziv.

urli je izjavil:

P.S. Saj ti si v srednji šoli, ne?

Da.

mojca je izjavil:


Recimo, da moraš izpisati naslednji trikotnik:

4321
432
43
4

Namesto tega trikotnika napiši program z eno for zanko, ki izpiše naslednje:

Izpisati moram 4 števila od 4 do 1.
Izpisati moram 3 števila od 4 do 2.
Izpisati moram 2 števila od 4 do 3.
Izpisati moram 1 števila od 4 do 4.

Ko prilepiš rešitev za tole, gremo dalje.


Tako stvar razumem:



Kar se pa tiče poimenovanja spremenljivk sem pa tako vajen, v šoli pišemo vse z madžarsko notacijo kar se mi zdi še huje.


Še moja verzija vgnezdenih zank. :D

Mislim da imaš težave že v začetni obliki. Zato najprej osnovne gnezdene zanke:

Imaš 5 ljudi in 25 jabolk. Vsakemu moraš dati 5 jabolk. Ravno to je real life gnezdena zanka. Vzameš košaro in se postaviš k prvemu človeku (zunanja zanka) našteješ mu 5 jabolk z notranjo zanko.

Tako da za začetek pusti naloge iz šole in najprej napiši rešitev za sledeči niz.

Program izpiše:
12345
12345
12345
12345
12345

POtem pa ti bomo pomagali nadgraditi to lahko vgnezdeno zanko, da boš razumel robne pogoje itd...

Ker kar ti trenutno rešuješ, je že malo napredna vgnezdena zanka.

Zgodovina sprememb…

boolsheat ::

jype je super napisal.

Če zastopiš for zanko, potem zastopiš tudi vgnezdeno for zanko.

Torej, a for zanko zastopiš?

RatedR ::

boolsheat je izjavil:


Če zastopiš for zanko, potem zastopiš tudi vgnezdeno for zanko.

Torej, a for zanko zastopiš?

Da, razumem brez problemov, težavo imam skupaj spravit oz. dobit idejo...ubistvu je tako, ko se mi enkrat nekje zatakne je mind block in negre več naprej

111111111111 je izjavil:


Tako da za začetek pusti naloge iz šole in najprej napiši rešitev za sledeči niz.
Program izpiše:
12345
12345
12345
12345
12345

Rešitev:
http://pastebin.com/6WDXuY74

Smo že malo bližje, pravokotnik ni prevelik problem, pravokotni trikotniki so.

stalker ::

Za trikotnik pa moraš v drugi for zanki stevec2 primerjat s stevec1.
Namesto
for(stevec2 = 1; stevec2 <=5; stevec2++)
uporabi
for(stevec2 = 1; stevec2 <=stevec1; stevec2++)

;)

Zgodovina sprememb…

  • spremenilo: stalker ()

imagodei ::

@Nightta,

v prejšnjem postu sem ti zastavil eno vprašanje, pa nisi odgovoril nanj (vsaj javno - mogoče sebi si):
Osnovno vprašanje, ki si ga moraš znati odgovoriti, je, kaj je sploh namen zank oziroma čemu jih uporabljamo?


Lahko ti poskusim pomagat zastopit, ampak rad bi, da najprej odgovoriš na to vprašanje.
- Hoc est qui sumus -

111111111111 ::

RatedR je izjavil:


111111111111 je izjavil:


Tako da za začetek pusti naloge iz šole in najprej napiši rešitev za sledeči niz.
Program izpiše:
12345
12345
12345
12345
12345

Rešitev:
http://pastebin.com/6WDXuY74

Smo že malo bližje, pravokotnik ni prevelik problem, pravokotni trikotniki so.


OK. Super. Sedaj imamo pa 15 jabolk in 5 ljudi. Prvi jih dobi 5, drugi 4, tretji 3...

Torej izpis:
12345
1234
123
12
1

Če pogledava tvojo kodo:
for(stevec1 = 1; stevec1 <= 5; stevec1++)
    {
                for(stevec2 = 1; stevec2 <=5; stevec2++)
                {
                            printf("%d", stevec2);
                            }
                            printf("\n");
                }


V števcu 1 spreminjaš število ljudi in šteješ od 1 do 5. To ostane isto. Še vedno moraš dobiti 5 vrstic, ker imaš še vedno 5 ljudi. Sedaj moraš potuhtati kako spremeniti notranjo zanko, da ti ne daje 5 jabolk v eno vrsto. Ko gradiš trikotnik se spreminja število jabolk, ki jih deliš. Se pravi da je številka 5 v drugi zanki preveč statična, da bi ustrezala trikotniški rešitvi, zato moraš notri vstavit nekaj kar ti bo dinamično spreminjalo dolžino vrstice. Torej ne boš šel vsakič do 5 ampak boš šel enkrat do 5 drugič do 4 itd... Poskusi rešit.

boolsheat ::

RatedR je izjavil:

boolsheat je izjavil:


Če zastopiš for zanko, potem zastopiš tudi vgnezdeno for zanko.

Torej, a for zanko zastopiš?

Da, razumem brez problemov, težavo imam skupaj spravit oz. dobit idejo...ubistvu je tako, ko se mi enkrat nekje zatakne je mind block in negre več naprej


Ok, super torej veš kako lahko ponavljaš nek segment. Zdaj pa pusti kodo, vzemi list papirja in svinčnik in tam najdi rešitev (algoritem) brez, da razmišljaš o kodi, v kodo boš spravil pozneje.

RatedR ::

imagodei je izjavil:

@Nightta,
v prejšnjem postu sem ti zastavil eno vprašanje, pa nisi odgovoril nanj (vsaj javno - mogoče sebi si):
Osnovno vprašanje, ki si ga moraš znati odgovoriti, je, kaj je sploh namen zank oziroma čemu jih uporabljamo?

Lahko ti poskusim pomagat zastopit, ampak rad bi, da najprej odgovoriš na to vprašanje.

Namen zank je da si olajšamo delo, primer uporabe zank na spletni strani si recimo, vsako novo leto pošlješ uporabnikom neko voščilo za novo leto,
1.) lahko vsakemu posebi pišeš
2.) uporabiš zanko in si prihraniš čas

Torej ja, to osnovo razumem.

111111111111 je izjavil:


Torej izpis:
12345
1234
123
12
1

Tu se mi malo zatakne, naredil sem to:
http://pastebin.com/ws6bqYb1

Izpiše pravokotni trikotnik a ni ta ki si mi ga zastavil, pri takšnih stvareh se mi bolj ko ne ustavi...tu nimam ravno ideje kako naredit to nalogo brez da gledam po spletu.

icurk ::

S prvo for zanko pojdi od 5 proti 1, torej zmanšuj števec, saj vidiš da imaš v prvi vrstici 5 elt, v drugi 4 elt itd.
Torej vidiš da imaš po vsakem koraku (po zaključeni notranji for zanki) en člen manj za izpisat.

jype ::

Nightta> Namen zank je da si olajšamo delo, primer uporabe zank na spletni strani si recimo, vsako novo leto pošlješ uporabnikom neko voščilo za novo leto,
Nightta> 1.) lahko vsakemu posebi pišeš
Nightta> 2.) uporabiš zanko in si prihraniš čas

No, zdaj si pa predstavljaj, da moraš vsako leto vsem poslat: 0 - voščilo, 1 - obračun dohodnine, 2 - poračun za elektriko in 3 - razglednico s Triglava.

Vsi ljudje so oštevilčeni podobno kot dokumenti v primeru zgoraj. Kako se boš tega lotil?

anarho ::

ce mors nardit z dvemi zankami potem je ocitno da je ena zanka za stetje vrstic in druga (notranja) zanka za pisanje stevilk znotraj ene vrstice,

torej prva zanka za stetje vrstic bi bla neki takega v javi
for(int i = 0; i < 5; i++)

notranja zanka pa pri vsaki novi iteraciji mora steti za eno stevilko manj kot v prejsnji iteraciji. torej bi napisal drugo for zanko nekako tako ...
for(int j = 1; j <= (5 - i); j++)


znotraj druge zanke izpisujes stevilke ...
print(j);

znotraj prve zanke (za drugim for-om) se prestavis v novo vrstico s
println("");


upam da ti kej pomaga ...
lp

RatedR ::

http://pastebin.com/ijRLPezE
Recimo da določene naloge približno znam, imam pa vprašanje glede sledeče naloge:
vzorec:

54321 http://pastebin.com/5eWuF3KZ
4321
321
21
1
___________________________________________________________________________________
Neznam spremenit v spodnje pa sem probal velikokrat spreminjat števce, pogoje
54321
5432
543
54
5

Zgodovina sprememb…

  • spremenilo: RatedR ()

theanswer3 ::

RatedR je izjavil:

http://pastebin.com/ijRLPezE
Recimo da določene naloge približno znam, imam pa vprašanje glede sledeče naloge:
vzorec:

54321 http://pastebin.com/5eWuF3KZ
4321
321
21
1
___________________________________________________________________________________
Neznam spremenit v spodnje pa sem probal velikokrat spreminjat števce, pogoje
54321
5432
543
54
5

V pogoju for zanke imaš trenutno, da je recimo števec >= 0. Če bi namesto te ničle uporabil spremenljivko x bi pogoj zgledal števec >= x. Če nadaljujeva naprej če rečeš da je v prvi iteraciji ta x = 1 boš izpisoval dokler bo števec >= 1. Ob koncu iteracije x povečaš za 1 in ko gre zanka čez boš spet izpisoval dokler bo števec >= 2 itd. Jasno? :)

anarho ::

Nightta ... ocitno moras drugo zanko zaceti s 5 in zmanjsevati stevec glede na vrstico v kateri si, zato da na koncu izpises samo eno petico.

for (int i = 1; i <= 5; i++) {
   for (int j = 5; j >= i; j--) {
      print(j);
   }
   print("\n");
}

sebastjan28 ::

Ali pa "outside the box" preprosto spremeniš številko v string in nato v vsaki iteraciji odstraniš zadnji znak :)

Neznam spremenit v spodnje pa sem probal velikokrat spreminjat števce, pogoje
54321
5432
543
54
5

theanswer3 ::

sebastjan28 je izjavil:

Ali pa "outside the box" preprosto spremeniš številko v string in nato v vsaki iteraciji odstraniš zadnji znak :)

Neznam spremenit v spodnje pa sem probal velikokrat spreminjat števce, pogoje
54321
5432
543
54
5

LOL! :))

Al pa pol kr printf-aš celoten vzorec pa sploh ne rabiš zank :D

Zgodovina sprememb…

anarho ::

najbolje bos razumel ce se navidezno sprehodis skozi zanke in si izpisujes na papir stanje spremenljivk in izpisa na zaslon.

nevem kako se ze temu rece ampak vcasih smo si naredili tabelo s stolpci v katerih so bile spremenljivke, in potem za vsak nov korak napises vrednosti teh spremenljiv in izpis na zaslon.

npr ...
KORAK | I | J | ZASLON
1. korak: i == 1; j == 5; izpises 5
2. korak: i == 1; j == 4; izpises 4
3. korak: i == 1; j == 3; izpises 3
4. korak: i == 1; j == 2; izpises 2
5. korak: i == 1; j == 1; izpises 1
6. korak: i == 1; j == 0; pogoj druge zanke ni izpolnjen zato smo izstopili in izpisali 'novo vrstico'
7. korak: i == 2; j == 5; izpises 5
8. korak: i == 2; j == 4; izpises 4
9. korak: i == 2; j == 3; izpises 3
10. korak: i == 2; j == 2; izpises 2
11. korak: i == 2; j == 1; pogoj druge zanke ni izpolnjen zato smo izstopili in izpisali 'novo vrstico'
itn ...

Zgodovina sprememb…

  • spremenil: anarho ()

Gregor5816 ::

RatedR je izjavil:


Neznam spremenit v spodnje pa sem probal velikokrat spreminjat števce, pogoje
54321
5432
543
54
5

Mislim, da ti je iz tega jasno, da moraš v tem primeru notranjo zanko začeti s 5 (ker se vsaka vrstica začne s 5) in potem zmanjšuješ ta števec. Torej notranja zanka bo izgledala nekako tako:
for (stevec2 = 5; stevec2 >= <pogoj>; stevec2--)


Najti moraš le še ta pogoj, kdaj se notranja zanka zaključi. Do tega pogoja pa prideš v zunanji zanki, ki gre po vrsticah.

Hint: Namesto da v zunanji zanki šteješ navzdol, štej navzgor. Če pogledaš zadnjo številko v posamezni vrstici, boš videl, da je to kar številka vrstice.

sebastjan28 ::

theanswer3 je izjavil:

sebastjan28 je izjavil:

Ali pa "outside the box" preprosto spremeniš številko v string in nato v vsaki iteraciji odstraniš zadnji znak :)

Neznam spremenit v spodnje pa sem probal velikokrat spreminjat števce, pogoje
54321
5432
543
54
5

LOL! :))

Al pa pol kr printf-aš celoten vzorec pa sploh ne rabiš zank :D



Ne top ne velja, ker verjetno v navodilih piše, da moraš uporabiti for zanko. :)

videc ::

Brez uporabe stringov.
«
1
2


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Vsota določenih elementov matrike [C]

Oddelek: Programiranje
10995 (683) RatedR
»

Izris lika - ideja

Oddelek: Programiranje
233755 (2790) RatedR
»

Spreminjanje vrednosti v polju [C]

Oddelek: Programiranje
102173 (1972) specing
»

Izris zvezdic v C (strani: 1 2 )

Oddelek: Programiranje
817219 (5803) SimplyMiha
»

Algoritmi - diagrami poteka

Oddelek: Šola
222208 (1909) lebdim

Več podobnih tem