» »

Resne težave z razumevanjem osnov programiranja

Resne težave z razumevanjem osnov programiranja

1
2
»

sebastjan28 ::

videc je izjavil:

Brez uporabe stringov.


Lahko bi tudi delil z 10 in nato ostanek zaokrožil zavzdol:)

Jaz saj vem, da je smisel teh neživljenskih nalog nekje povsem drugje,...

RatedR ::

theanswer3 je izjavil:

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? :)

Ja delno, če lahko mi pokaži z for zanko ki ni vgnezdena.

Kar se pa tiče načinov izvedbe imamo pa samo eno pravilo, vgnezdene for zanke brez ovinkarjenja.
___________________________________________________________________________________________________________________
Torej nekaj pomembnega kar sem pokapiral je kako napisat for za določene oblike (to kako so obrnjeni trikotniki)
Rešitev za zgornjo: http://pastebin.com/5uphX26G

Okej recimo da lahko rešim take naloge s poskušanjem ko mi compila kodo in sproti popravljam, kaj pa pri testu ko pišemo na list pa se ti zaustavi?

Recimo kakšen bi bil vaš pristop ko greš en korak nazaj in probaš rešit problem z mojega stališča?

Gregor5816 ::

Ko vidiš nalogo, bi se ti moralo že svitat, približno kako zgleda rešitev. Moj predlog je, da rešiš čimveč podobnih nalog, ker boš potem tudi hitreje znal prepoznat problem in boš vedel, kaj moraš storiti. Zunanja zanka gre vedno po vrsticah, torej če mora biti v izpisu 6 vrstic, bo zunanja zanka izgledala
(stevec1 = 1; stevec1 <= 6; stevec1++)
ali
(stevec1 = 6; stevec1 >= 1; stevec1--)

Notranja zanka je odvisna od števila izpisov v posamezni vrstici.

Probaj rešit še naslednje:
1
22
333
4444
55555

5
44
333
2222
11111

55555
4444
333
22
1

11111
2222
333
44
5

Janac ::

Pri vseh ostaja zunanja for zanka vedno ista, ker imamo 5 vrstic ne?

RatedR ::

Janac je izjavil:

Pri vseh ostaja zunanja for zanka vedno ista, ker imamo 5 vrstic ne?

To je pa odvisno, naloge se lahko reši na več načinov in vsak jo reši drugače.

@Gregor, ko rešim bom objavil pa vprašal če bo kakšna težava.

Zgodovina sprememb…

  • spremenilo: RatedR ()

boolsheat ::

Janac je izjavil:

Pri vseh ostaja zunanja for zanka vedno ista, ker imamo 5 vrstic ne?



Ne se omejit na neko fiksno številom - program naj ti deluje za vsako poljubno vneseno številko.

Janac ::

Za primer:

54321
5432
543
54
5

sem sestavil recimo tole:

int iStevec1=0; int iStevec2; int iIzpis=1;
	
	for(iStevec1=1; iStevec1<=5; iStevec1++)
	{
		for(iStevec2=5; iStevec2>=iIzpis; iStevec2--)
		{
			printf("%i", iStevec2);
			
		}
		printf("\n");
		iIzpis++;
	}


Je algoritem sam po sebi učinkovit al je kaj narobe?

deluje vem da prav...

Zgodovina sprememb…

  • spremenil: Janac ()

Gregor5816 ::

>al je kaj narobe?

Če dela prav potem ni narobe...:D Se ga pa da malenkost poenostavit. Primerjaj, kakšni vrednosti imata iIzpis in iStevec1 ob vsaki iteraciji.

Janac ::

Gregor5816 je izjavil:

>al je kaj narobe?

Če dela prav potem ni narobe...:D Se ga pa da malenkost poenostavit. Primerjaj, kakšni vrednosti imata iIzpis in iStevec1 ob vsaki iteraciji.


Ja, oba se povečujeta :) Za ena, kar pomeni da lahko iIzpis odstranim in nadomestim s iStevec1 in privačrujem na pomnilniku :D

Zgodovina sprememb…

  • spremenil: Janac ()

Yacked2 ::

sebastjan28 je izjavil:

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. :)


Printf-aš vzorec nato pa še for(int i = 0; i < -1; i++) {printf("muhah");}
Korak naprej ni vedno ustrezen...sploh če si na robu prepada!

RatedR ::

@Gregor5861

Evo po nekaj časa špilanja sem jih naredil: http://pastebin.com/vkhPbeA1

Janac ::

Jst pa delam tak trikotnik:

_ _ _ _ *
_ _ _ **
_ _ ***
_ ****
*****

3 for zanke ja. Prva je za vrstice, katerih je 5, 2 zanka šteje zvezdice in je omejena s prvim števcem, za presledke sem pa uvedel novo spremenljivko, saj nobena spremenljivka nima začetne vrednosti 5....skratka, nekaj ni prav, lahko kdo pogleda?

for(iStevec1=1; iStevec1<=iVnos; iStevec1++)
	{
		for(iStevec2=1; iStevec2<=iStevec1; iStevec2++)
		{
			for(iStevec3=1; iStevec3<iIzpis; iStevec3++)
			{
				printf(" ");
				
		    }
		    
		    
		    printf("*");
		    iIzpis--;
		}  
		    
		printf("\n\n");
		}


iVnos in iIzpis imata začetno vrednost 5...

Zgodovina sprememb…

  • spremenil: Janac ()

Gregor5816 ::

RatedR je izjavil:

@Gregor5861

Evo po nekaj časa špilanja sem jih naredil: http://pastebin.com/vkhPbeA1


Probaj sedaj še enkrat rešit podobne naloge s prejšnje strani, potem pa še tak trikotnik iz zvezdic:
    *
   ***
  *****
 *******
*********


@Janac: razmisli, kolikokrat moraš izpisat kakšen znak in temu prilagodi postavitev zank.

Janac ::

#include <stdio.h>

int main (void)
{
	int iStevec1, iStevec2, iStevec3, iStevec4;
	
	for(iStevec1=1; iStevec1<=9; iStevec1++)
	{
		for(iStevec2=1; iStevec2<=9; iStevec2++)
		{
			printf("*");
			
			if(iStevec1>1&&iStevec1<9)
			{
				if(iStevec1<=4)
				{
					for(iStevec3=1; iStevec3<=iStevec1-1; iStevec3++)
					{
						printf("*");
						
					}
				}
				else
				{
					for(iStevec4=1; iStevec4<=iStevec2-iStevec1; iStevec4++)
					{
						printf("*");
						
					}
				}
				
					
			}
		}
		
		printf("\n\n");
		
		
	}
	
	return(0);
}


sem bližje...resno, prosim povejte mi kje sem zgrešil. delam od 15ih do sedaj in še mi se vedno ne sanja.

boolsheat ::

Uporabi 2 for zanke - klasično, ena za vrstice, druga za znake v vrstici. Za ločevanje med presledki in _ pa uporabi ostanek pri deljenju z 2, se pravi imaš if else za " " ali "_".

Gregor5816 ::

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


Za takle trikotnik rabiš 3 for zanke: prva ti bo izpisovala vrstice, druga presledke, tretja pa zvezdice. Tvoja napaka je, da si tretjo zanko vgnezdil v drugo. Ti dve zanki morata biti zaporedni. Za vsako vrstico moraš najprej izpisati presledke, potem s presledki končaš in nato nadaljuješ z zvezdicami.

Janac ::

o, hvala vama.

sem zdaj še sam rešil tak primer in mi je mal dvignilo voljo :)

*_*******
**_******
***_*****
****_****
*****_***
******_**
*******_*

#include <stdio.h>

int main (void)
{
	int iStevec1, iStevec2, iStevec3, iVisina=7;
	
	for(iStevec1=1; iStevec1<=7; iStevec1++)
	{
		for(iStevec2=1; iStevec2<=iStevec1; iStevec2++)
		{
			printf("+");
			
		}
		
			printf(" ");
		
		for(iStevec3=1; iStevec3<=iVisina; iStevec3++)
		{
			printf("*");
			
		}
		iVisina--;
		
		printf("\n");
	}
	
	return(0);
}

boolsheat ::

Gregor5816 je izjavil:

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


Za takle trikotnik rabiš 3 for zanke: prva ti bo izpisovala vrstice, druga presledke, tretja pa zvezdice. Tvoja napaka je, da si tretjo zanko vgnezdil v drugo. Ti dve zanki morata biti zaporedni. Za vsako vrstico moraš najprej izpisati presledke, potem s presledki končaš in nato nadaljuješ z zvezdicami.


Ne rabiš treh for zank:
            for (int i = 1; i <= x; i++)
            {
                for (int j = x; j > 0; j--)
                {
                    if (i >= j)
                    {
                        Console.Write('*');
                    }
                    else
                        Console.Write(" ");
                }
                Console.WriteLine();
            }

Zgodovina sprememb…

boolsheat ::

Janac je izjavil:

o, hvala vama.

sem zdaj še sam rešil tak primer in mi je mal dvignilo voljo :)

*_*******
**_******
***_*****
****_****
*****_***
******_**
*******_*



            for (int j = 0; j < x; j++)
            {
                for (int i = 0; i < x; i++)
                {
                    if (j == i-1)
                        Console.Write("_");
                    else
                        Console.Write("*");
                }
                Console.WriteLine();
            }


Ali ne smeš uporabljati if stavkov? :)

Gregor5816 ::

@boolsheat: seveda se da tudi drugače, ampak mislim da je za začetnike bolj razumljivo, če uporabijo eno for zanko za presledke in drugo za zvezdice. Mislim da je to tudi namen takih nalog, da se naučimo, kdaj mora biti zanka vgnezdena in kdaj ena zanka sledi drugi. Tako kot je zgoraj Janac spoznal svojo napako, ko je imel 3 zanke vgnezdene eno v drugi. Na ta način, ki ti rešuješ, se bodo pa verjetno ob kakšnih šahovnicah učili:)

boolsheat ::

Pri pri drugem primeru mi je bolj pregledna rešitev z dvema zankama. Je pa ok, da začetnik vidi in naštudira tudi druge rešitve - itak sam mora priti do rešitve, potem pa preveriti še druge možnosti, da si razširi malo obzorje. :) Zdaj pa potrenirat še sintakso drugih zank, za vrhunec pa probat naloge rešit z rekurzijo...

Malo samo obujam spomine samo ne te zabavne naloge. :)

Zgodovina sprememb…

Nerdor ::

Diagonala iz desne proti levi ;)

*******_
******_*
*****_**
****_***
***_****
**_*****
*_******
_*******

for (int j = 0; j < x; j++)
{
     for (int i = 0; i < x; i++)
	{
	    if (j == x-i-1)
	        Console.Write("_");
	    else
	        Console.Write("*");
	}
	Console.WriteLine();
}
... for lifetime!

Zgodovina sprememb…

  • spremenil: Nerdor ()

RatedR ::

Pri težjih nalogah se mi ustavi in ne znam več, prosim za pomoč

Želim izpisat tole:



Z mojo kodo (http://pastebin.com/mzWdUsPu) pa dobim tole in nimam ideje:

Zgodovina sprememb…

  • spremenilo: RatedR ()

sebastjan28 ::

RatedR je izjavil:

Pri težjih nalogah se mi ustavi in ne znam več, prosim za pomoč

Želim izpisat tole:



Z mojo kodo (http://pastebin.com/mzWdUsPu) pa dobim tole in nimam ideje:



Na prvo žogo(na podlagi slike), bi rekel, da moraš obe notranji for zanki(eno za levo stran drevesa in eno za desno stran) postaviti vsporedno eno za drugo. Predvidevam, da sedaj vsako napačno glezdiš v samostojni for za vrstice.

jype ::

Saj to je že praktično to, samo še zanke moraš "zmešat".

Naj ti pomagam najprej v slovenskem jeziku:

Imaš Y vrstic, v vsaki od njih je dvakrat Y znakov. V vrstici Y=1 je prvi in zadnji znak *, ostali so presledki, v vrstici Y=2 sta prvi in drugi in zadnji in predzadnji *, ostali so presledki, torej:

Za vsak Y od 1 do (na primer) 10 (recimo temu N) je treba:
Izpisati skupno 2*N znakov, od tega Y zvezdic, potem 2*N minus 2*Y presledkov, potem pa še Y zvezdic - skupaj se to pravilno sešteje v 2*N.

Še koda (v Pythonu 3):

N=10
# z zankami
for Y in range(N): # pri tej zanki gre Y od 0 do 9, ne od 1 do 10, zato je spodaj povsod Y+1
    for z in range(Y+1):
        print('*', end='')
    for z in range((2*N)-((2*(Y+1))):
        print(' ', end='')
    for z in range(Y+1):
        print('*', end='')
    print()

# ali krajše
for Y in range(N):
    print((Y+1)*'*' + ((2*N)-(2*(Y+1)))*' ' + (Y+1)*'*')

Zgodovina sprememb…

  • spremenilo: jype ()

RatedR ::

@jype
Hvala za trud ampak ne razumem razlage niti Python kode ker je sintaksa drugačna (telo for zank itd.)

technolog ::

Še krajše in manj zamotno:

for i in range(1, N+1):
   a = '*'*i + ' '*(N-i)
   print(a, a[::-1])

Yacked2 ::

Ali na faksu (FRI UN) pri programiranju lahko programe tudi zaganjaš, a je tako kot na RTKju, kjer samo pišeš in ne smeš program tudi potestirati ?
Korak naprej ni vedno ustrezen...sploh če si na robu prepada!

l0g1t3ch ::

RatedR je izjavil:

@jype
Hvala za trud ampak ne razumem razlage niti Python kode ker je sintaksa drugačna (telo for zank itd.)


Pa si poskusil z pisanjem na papir ?
Torej da na papir simuliraš izvajanje zanke, v tabelo si pišeš vrednosti števca ali števcev zanke in zraven rišeš zvezdice in tako vidiš kako se izvaja ?

jype ::

Nightta> Hvala za trud ampak ne razumem razlage niti Python kode ker je sintaksa drugačna (telo for zank itd.)

OK, dajmo še enkrat, brez čudnih črk, na konkretnem primeru. Če želiš izrisat deset vrstic veliko risbo take oblike, moraš postopat takole:

Prva vrsta ima dvajset znakov: Prvi je zvezdica, potem je osemnajst presledkov, potem je zopet zvezdica. To še razumeš? Razlog je, da je slika simetrična, da je široka dvakrat toliko, kot je visoka in da se vsaka vrstica v sliki začne s toliko zvezdicami, kolikor vrstic je že izpisanih, nadaljuje z nekaj presledki in konča z novo ponovitvijo istega števila zvezdic - koliko je vseh znakov pa vnaprej vemo, zato lahko tudi število presledkov izračunamo.

Matematično to zapišemo tako kot sem razložil zgoraj, v praksi pa računalnik to stori s konkretnimi števili. Če je vrstic deset, potem v prvo vrstico izpiše eno zvezdico, devet presledkov, še devet presledkov in še eno zvezdico - potem pa gre v novo vrstico. To v splošnem stori s tremi zankami: Prva zanka izpisuje zvezdice, dokler števec ni tako velik, kot je zaporedna številka trenutne vrstice, potem druga izpisuje presledke, dokler ne izpiše ustreznega števila presledkov (2*10 je vseh znakov, od tega mora pa odšteti še dve zvezdici v prvi vrstici, štiri zvezdice v drugi, šest v tretji in tako dalje, tako da mora v prvi vrstici izpisati 18 presledkov, v drugi 16, v tretji 14 in tako dalje). Tretja zanka je enaka prvi in še enkrat ponovi izpis zvezdic z začetka vrstice (slika je simetrična, torej je vedno na obeh straneh enako zvezdic).

Ko pride do zadnje, desete vrstice, izpiše levih deset zvezdic, potem nič presledkov (ker je 2*10 presledkov minus 2*10 zvezdic enako 0 presledkov), potem pa še de desnih deset zvezdic - ter novo vrstico, potem pa se program zaključi.

Je zdaj bolj jasno?

Zgodovina sprememb…

  • spremenilo: jype ()

RatedR ::

jype je izjavil:

Nightta> Hvala za trud ampak ne razumem razlage niti Python kode ker je sintaksa drugačna (telo for zank itd.)

OK, dajmo še enkrat, brez čudnih črk, na konkretnem primeru. Če želiš izrisat deset vrstic veliko risbo take oblike, moraš postopat takole:

Prva vrsta ima dvajset znakov: Prvi je zvezdica, potem je osemnajst presledkov, potem je zopet zvezdica. To še razumeš? Razlog je, da je slika simetrična, da je široka dvakrat toliko, kot je visoka in da se vsaka vrstica v sliki začne s toliko zvezdicami, kolikor vrstic je že izpisanih, nadaljuje z nekaj presledki in konča z novo ponovitvijo istega števila zvezdic - koliko je vseh znakov pa vnaprej vemo, zato lahko tudi število presledkov izračunamo.

Matematično to zapišemo tako kot sem razložil zgoraj, v praksi pa računalnik to stori s konkretnimi števili. Če je vrstic deset, potem v prvo vrstico izpiše eno zvezdico, devet presledkov, še devet presledkov in še eno zvezdico - potem pa gre v novo vrstico. To v splošnem stori s tremi zankami: Prva zanka izpisuje zvezdice, dokler števec ni tako velik, kot je zaporedna številka trenutne vrstice, potem druga izpisuje presledke, dokler ne izpiše ustreznega števila presledkov (2*10 je vseh znakov, od tega mora pa odšteti še dve zvezdici v prvi vrstici, štiri zvezdice v drugi, šest v tretji in tako dalje, tako da mora v prvi vrstici izpisati 18 presledkov, v drugi 16, v tretji 14 in tako dalje). Tretja zanka je enaka prvi in še enkrat ponovi izpis zvezdic z začetka vrstice (slika je simetrična, torej je vedno na obeh straneh enako zvezdic).

Ko pride do zadnje, desete vrstice, izpiše levih deset zvezdic, potem nič presledkov (ker je 2*10 presledkov minus 2*10 zvezdic enako 0 presledkov), potem pa še de desnih deset zvezdic - ter novo vrstico, potem pa se program zaključi.

Je zdaj bolj jasno?

Bo kar ja, hvala.
Verjetno bo ratal sam po dolgem času, če naletim na kakšno težavo bom pa napisal.
1
2
»


Vredno ogleda ...

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

Vsota določenih elementov matrike [C]

Oddelek: Programiranje
10989 (677) RatedR
»

Izris lika - ideja

Oddelek: Programiranje
233730 (2765) RatedR
»

Spreminjanje vrednosti v polju [C]

Oddelek: Programiranje
102147 (1946) specing
»

Izris zvezdic v C (strani: 1 2 )

Oddelek: Programiranje
817182 (5766) SimplyMiha
»

Algoritmi - diagrami poteka

Oddelek: Šola
222180 (1881) lebdim

Več podobnih tem