» »

Izris zvezdic v C

Izris zvezdic v C

«
1
2

Janac ::

Naloga je da trikotnik izrišem takole:

http://sketchtoy.com/63714795

Moj poskus:

#include <stdio.h>

int main (void)
{
	int iStevec1;
	int iStevec2;
	int iStevec3;
	int iVnos;
	
	printf("Vnesite stevilo do katerega zelite izris pravokotnika:\n");
	scanf("%i", &iVnos);
	
	for(iStevec1=1; iStevec1<=iVnos; iStevec1++)
	{
		for(iStevec2=1; iStevec2<=iStevec1; iStevec2++)
		{
			for(iStevec3=iVnos; iStevec3<=0; iStevec3--)	
			{
				
				printf("*");	
			}
			
			printf("*");
			
	
		}
	
	
	printf("\n");
	
	}
	
	
	return (0);
}


Je to pravilno načeloma? Napake mi javi ne...

lebdim ::

kako ti pa nariše trikotnik? če ti nariše trikotnik tako, kot mora, potem je prav.

Janac ::

Izriše mi pravokotnega...

http://sketchtoy.com/63714981

takole...

Zgodovina sprememb…

  • spremenil: Janac ()

Vesoljc ::

2 loopa, prvi za vrstice, drug za zvezdice. rabis se en stevec, ki ga polovico prvega loopa povecujes (vnos/2), nato pa zmanjsujes. ta stevec je stevilo zvezdic.
Abnormal behavior of abnormal brain makes me normal...

Janac ::

Moj poskus je totalno zgrešen?

Mesar ::

Da.

int _tmain(int argc, _TCHAR* argv[])
{
    int n;
     
    printf("Vnesite stevilo do katerega zelite izris pravokotnika:\n");
    scanf("%i", &n);
    
	for(int i=1; i<=n*2-1; i++)
	{
		for(int j=1; j<=(i > n ? n-(i-n) : i);j++) 
		{
			printf("*");
		}
		printf("\n");
	}  
     
	return 0;
}
Your turn to burn!

Janac ::

Zakaj je moj poskus totalno zgrešen? Po logiki bi moglo delat... mah nerazumem. A vi ste si dobesedno zmožni, kako deluje števec, predstavljati?

Mesar ::

Sej si ga lahko izpišeš, če si ga ne predstavljaš...
Your turn to burn!

Janac ::

for(iStevec1=1; iStevec1<=iVnos; iStevec1++)
    {
        for(iStevec2=1; iStevec2<=iStevec1; iStevec2++)
        {


S tem izpišem navaden pravokotni trikotnik. Nato uvedem še eno for zanko, jo inicilaiziram na iVnos-ENA, ter za pogoj določim 0, da ne gre v minus...

Mesar ::

Pa višina?
Your turn to burn!

Janac ::

Mesar je izjavil:

Pa višina?


Kaj če bi še eno zanko dodal?

Mesar ::

Lahko tudi... pa razmišljaj in poskušaj sproti...
Your turn to burn!

Janac ::

#include <stdio.h>

int main (void)
{
	int iStevec1;
	int iStevec2;
	int iStevec3;
	int iStevec4;
	int iVnos;
	
	printf("Vnesite stevilo do katerega zelite izris pravokotnika:\n");
	scanf("%i", &iVnos);
	
	for(iStevec1=1; iStevec1<=iVnos; iStevec1++)
	{
		for(iStevec2=1; iStevec2<=iStevec1; iStevec2++)
		{
			for(iStevec3=1; iStevec3<=iVnos; iStevec3++)	
			{
				for(iStevec4=iVnos; iStevec3>=0; iStevec4--)
				{
				
				printf("*\n");	
			    }
			printf("\n");
			}
			
			
			printf("*\n");
			
	
		}
	
	
	printf("\n");
	
	}
	
	
	return (0);
}


mogoče takole?

Zgodovina sprememb…

  • spremenil: Janac ()

BigWhale ::

WAT?

Janac ::

Mah to je kot jama brez dna, tut če znam ta primer, mi lahko da malce drugačnega in že nimam pojma.

Irbis ::

Postopek si moraš najprej predstavljati v glavi, če ga hočeš sprogramirati.
Nariši zvezdice na roke na papir in se sproti vprašaj, kako ti je to uspelo.
Drugače pa razdeli problem na dva podproblema - najprej je pravokotni trikotnik, potem je pa še na glavo obrnjen pravokotni trikotnik, če znaš rešiti vsakega posebej, potem pač sestaviš ti dve ločeni zanki zapored v en program.

Lahko sicer zapletaš tako kot Mesar zgoraj, ampak pri takih trikih se v resničnosti potem čez nekaj let praskaš po glavi, ko je treba kaj popraviti.

FTad ::

Tako ja, kot je Irbis napisal. Ko smo na faxu reševali takšne primere izrisov trikotnikov in ostalih likov, je bil nasvet tak, da izrisuješ like po kosih in pač temu ustrezno dodaš for zanko ali več.

Janac ::

Res hvala za nasvete, ampak preprosto ne gre.

Mi lahko kdo pove kaj sem tu storil narobe...

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

galu ::

Najprej reši problem v glavi in se potem spravi pisat kode.

Primer:
    int visina = 99;
    for (int i=1; i <= visina; i++)
    {
        int dolzina = (i>(visina/2)) ? -(i-visina-1) : i; // če je preko polovice riše samo "-(i-visina-1)" zvezdic. V nasprotnem primeru (ko še ni na polovici), pa, enostavno, "i" zvezdic.
        for (int j=1; j <= dolzina; j++)
        {
            cout << '*';
        }
        cout << endl;
    }


Tole je C++ koda, ki mora delati tudi v C, če pravilno zamenjaš cout streame s printf funkcijo.
Tako to gre.

Zgodovina sprememb…

  • spremenil: galu ()

SimplyMiha ::

Premisli, po kakšnem postopku prideš do takih trikotnikov. To je že nekakšna psevdokoda, ki jo rabiš samo v C sintaksi napisat.

Vzemimo tak trikotnik, kot je na OP slikci.

Prva vrstica je ena zvezdica.
Druga vrstica sta že dve zvezdici.
Tretja vrstica - tri zvezdice. Ti je znan vzorec?

Pazi to, zdaj gremo v drugo smer:
četrta vrstica - dve zvezdici.
Peta, zadnja vrstica - ena zvezdica.

Kako pridemo do tega?

Najprej poglejmo prvi del - tu lahko opazimo, da število zvezdic narašča sorazmerno z vrsticami, oziroma kar cifra vrstice je enako število zvezdic.

Vzemimo 3 kot izhodišče. Psevdokoda bi bila takole:
cifra je 3
za vsako vrstico do 3 izriši toliko zvezdic, kot je zaporedna cifra vrstice (1,2,3)
nato za vsako vrstico do 2 izriši toliko zvezdic, kot je 2 - zaporedna cifra vrstice (2,1 - tu ignoriramo prvo vrstico, ker že imamo vrh)


Tu lahko vidiš, da sta dva logična dela; prvi, ki izriše naraščajoče zvezdice do tretje vrstice, nato pa se začne drugi, ki izrisuje padajoče vrstice od četrte vrstice naprej, a kot nov loop.

To lahko rešiš tudi tako, da ko število vrstic preseže cifro, obrneš logiko tako da začne odštevati zvezdice (št. vrstic = cifra*2-1 - liho število; if(vrstica >= cifra) { odštevanje.. })

Janac ::

Sem na pravi poti?

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

		}
		
		printf("\n");
   }


Ter hvala...res je bolj preprosto zanke kar fizično ločit...

Zgodovina sprememb…

  • spremenil: Janac ()

Janac ::

Za višino mam ziher prav, ker je itak enaka zanka kot za prvi trikotnik.

Mesar ::

Če je pravokotni trikotnik z enakima stranicama je višina tak na, višina spodnjega pa je n-1 če imaš samo en vrh (uporabiš vrh zgornjega trikotnika).
Potem pa še izpišeš samo spodnji trikotnik pri katerem moreš upoštevat, da je eno vrstico manjši (ker imaš samo eno vrstico za vrh).

Torej enako kot če narišeš...

*
* *
* * *
* * * *

in

* * * *
* * *
* *
*

le da podčrtanih ne narišeš, pri drugem trikotniku začneš z n-1 namesto n in izpišeš n-1 vrstic namesto n.
Your turn to burn!

Zgodovina sprememb…

  • spremenil: Mesar ()

Janac ::

for(iStevec4=iStevec2-1; iStevec4>=0; iStevec4--)


sem dal -1, to misliš?

FTad ::

Janac je izjavil:

for(iStevec4=iStevec2-1; iStevec4>=0; iStevec4--)


sem dal -1, to misliš?


ja probaj v kodi, pa boš videl :)

Janac ::

Ja, ne deluje....:8)

Mesar ::

Zakaj pa ne?
Your turn to burn!

Janac ::

Če pogledam program, ma moral bi izpisat hudiča.

Mesar ::

izpiši trikotnik taki kot si ga imel na začetku...
spodaj izpiši še en isti trikotnik samo drugače obrnjen
zanki za spodnji trikotnik nastavi pogoje tako, da ne izpiše prve vrstice

lahko narediš tudi z 4 zankami...
Your turn to burn!

Janac ::

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

		}
		
		printf("\n");
   }


Mesar, kaj bi moral spremeniti, da bi deloval?

Mesar ::

zakaj je tu: for(iStevec4=iStevec2-1; iStevec4; iStevec4--)

iStevec2 ?
Your turn to burn!

Janac ::

Ker se iStevec2 ustavi na 3, potem pa odštejem 1 da dobim 2, dve * ki se potem izpišeta tik pod prvim trikotnikom...

Mesar ::

....

od celote moreš odštevat... -1, v drugi vrsti -2, v tretji -3, ... pa kakšen imaš pogoj v tej isti vrstici?
Your turn to burn!

Janac ::

od kake celote???

Mesar ::

za padajoč trikotnik (ie iVnos=3) imaš
1. vrstica: iVnos -1 zvezdic
2. vrstica: iVnos -2 zvezdic
3. vrstica: iVnos -3 zvezdic
Your turn to burn!

Janac ::

pogoj je pa tak:

for(iStevec4=iStevec2-1; iStevec4>=0; iStevec4--)


mi je tam zgoraj ušlo...

Mesar ::

	for(iStevec1=1; iStevec1<=iVnos; iStevec1++) // zgornji trikotnik
    {
        for(iStevec2=1; iStevec2<=iStevec1; iStevec2++) // izpis vrstic
        {
            printf("*");
     
        }
		printf("\n");
    }
     
    for(iStevec3=iVnos; iStevec3>=1; iStevec3--) // spodnji trikotnik
    {
     
        for(iStevec4=iStevec3; iStevec4>=1; iStevec4--) // izpis vrstic
        {
			printf("*");
        }
        printf("\n");
	}



in potem rešiš vrh...

	for(iStevec1=1; iStevec1<=iVnos; iStevec1++) // zgornji trikotnik
    {
        for(iStevec2=1; iStevec2<=iStevec1; iStevec2++) // izpis vrstic
        {
            printf("*");
     
        }
		printf("\n");
    }
     
    for(iStevec3=iVnos-1; iStevec3>=1; iStevec3--) // spodnji trikotnik, brez prve vrstice
    {
     
        for(iStevec4=iStevec3; iStevec4>=1; iStevec4--) // izpis vrstic
        {
			printf("*");
        }
        printf("\n");
	}


Ne vem kaj vas učijo v šoli/na faxu če vas takšnih osnov niso.... 8-O

pa če tab uporabljaš tako kot ti ti je sovražnik namesto prijatelj...
Your turn to burn!

Zgodovina sprememb…

  • spremenil: Mesar ()

lebdim ::

+Janac,
mirno pri teh nalogah. kot ti je že nekdo zgoraj napisal. najbolj važno pri programiranju je to, da ko dobiš nek problem, da imaš neko idejo - nek algoritem, ki ga bo rešil.
bistveno pri tem je, da problem dobro razumeš in da si ga predstavljaš. najbolj napačno je, da greš že kar takoj problem programirat. raje najprej analiziraj problem, premisli, kako ga boš rešil, na list papirja napiši idejo programa. ob tem analiziranju razmišljaj, koliko števcev boš potreboval, do kje bodo tekli, kaj bom izpisoval, kakšne ukaze bom uporabil in tako naprej ...
če bi bil jaz profesor za programiranje, bi prej kot samo kodo ocenjeval idejo programa. ker pri programiranju je najbolj važno, da imaš v glavi vsaj približen algoritem, ki bo nek problem, ki ga moraš sprogramirati, rešil. škoda je edino, ker se mnogokrat prehitro začne programirati in se zadevi ne posvetiš dovolj, zato potem nastajajo problemi ...
no, upam, da sem ti povedal kaj pametnega in da boš kakšen nasvet upošteval ...

imam še en komentar: "potem bo pa spet dal nekaj drugega, pa ne bom znal rešiti" - na testu nikoli ne bodo iste naloge, kot ste jih delali v šoli pri pouku. naloge bodo vedno vsebovale vsebine, ki ste jih delali, vendar naloge zagotovo ne bodo iste. v to sem prepričan. pri programiranju je tudi važno, da nek problem razdeliš na več manjših podproblemov, in jih potem združiš. pa na izpitih tudi ni toliko pomembno, če ti zares napišeš čisto delujoč programček, bolj važna je ideja za reševanje problema. bistveno pri vsem pa je, da razumeš osnovne koncepte pri programiranju. ko boš to osvojil, ne bo nobena naloga več tako težka. pri programiranju moraš res veliko vaj naredit.

Zgodovina sprememb…

  • spremenil: lebdim ()

SimplyMiha ::

^ Se podpišem! Bistvo programiranja je analiziranje in reševanje problemov. Programski jezik sploh ni pomemben, ker so vsi bolj ali manj isti - pomembno je samo, da znaš problem razbiti na manjše, osnovne dele, te pa pretvoriti v algoritme.

SimplyMiha ::

Sicer pa je tu še ena možna rešitev:

maxVrstic = iVnos*2 - 1;
for(vrstice=1; vrstice <= maxVrstic; vrstice++) // oba trikotnika
{
    if(vrstice < iVnos)
         zvezdice = vrstice;
    else
         zvezdice = maxVrstic - vrstice;
    for(zvezdica = 1; zvezdica <= zvezdice; zvezdica++)
        printf("*");
    printf("\n");
}



Sicer je možna kakšna napaka, ker tu ne morem preveriti in šibam v službo, a hotel sem prikazati, da se problema lahko lotiš na več načinov. Tu po vrhu odšteva zvezdice glede na razliko med maksimalnim številom vrstic (kar je iVnos * 2 - 1 - liho število) ter trenutnim številom vrstic. Skratka, z uporabo logičnega stikala sem lahko uporabil samo dva loop-a.

Ampak tudi rešitev z dvema trikotnikoma je sprejemljiva - važno je, da problem rešiš tako, da izriše pravilne trikotnike glede na poljuben iVnos.

Irbis ::

Ali pa takole:
int	i, j;
int	iSmer;
int	iVnos;

printf("Vnesite stevilo, do katerega zelite izris lika:\n");
scanf("%i", &iVnos);

for (i = iSmer = 1; i > 0  &&  iVnos > 0; i += iSmer)
{
	for (j = 0; j < i; j++)
		printf("*");
	printf("\n");
	if (i >= iVnos)
		iSmer = -1;
} 


Zanimivo pa bi bilo narediti stvar z uporabo ene same zanke, torej da v zanki vsakič narišeš eno zvezdico, potem pa s pogojem vsake toliko izpišeš \n. Še posebej, če bi se spomnil, kako bi elegantno preverjal, ali je število oblike n*(n+1)/2, ne da bi hkrati vodil še številko vrstice.

AceD ::

Sicer vem, da so te že zasuli s predlogi in primeri, ampak to je še en primer, kako to rešiti samo z enim for loopom (kot je predlagal Irbis). Sicer je skripta napisana v pythonu, ampak gre bolj za princip delovanja: površino, na katero izrisuješ lik si lahko predstavljš kot koorinatni sistem (tu je (0,0) levo zgoraj) in potem s for loopom obideš vse točke v pravokotniku, ki v celoti obdaja tvoj lik (enakokraki trikovnik). Potem se pa za vsako točko posebej odločiš, ali izpišeš * ali nič (oz. presledek) ali pa novo vrstico.

w = 5 # primer

for i in range(0, w*(w*2-1)):
	y = i/w
	x = i % w
	
	if i < w**2:
		if x <=y :
			print '*',
	else:
		if x <=(w*2-2-y):
			print '*',
		
	if (i+1) % w == 0:
		print '\n',


p.s. % je modul (s tem dobiš preostanek pri deljenju), ** pa potenca

Janac ::

Hvala za pomoč...sedaj prikazujem piramido.

Mi lahko kdo pove, kje je napaka moji kodi?

#include <stdio.h>

int main (void)
{
	int istevec_visine=0;
	int istevec_sirine=0;
	int istevec_presledkov=0;
	int iVnos=0;
	
	printf("Vnesite visino piramide:");
	scanf("%i", &iVnos);
	
	for(istevec_presledkov=iVnos-1; istevec_presledkov>=0; istevec_presledkov--)
	{
		for(istevec_visine=1; istevec_visine<=iVnos; istevec_visine++)
		{
			for(istevec_sirine=1; istevec_sirine<=iVnos; istevec_sirine++)
			{
				printf("*");
				
			}
			
			printf(" ");
	
			
		}
		
		
		printf("\r\n");
	}
}

Zgodovina sprememb…

  • spremenil: Janac ()

lebdim ::

+Janac,

ne boš zadovoljen z mojim odgovorom, samo: v okolju Dev-C++ imaš opcijo razhroščevalnika, ki ga v takem primeru lahko koristiš, saj ti bo šel po programu, ki je napisan. kaj pa, če bi poskusil s tem?

Jakkob ::

Še ene možnost:
#include <iostream>

int main() {
	int i, visina = 10;
	std::string s(visina, '*');
	
	for(i=1;i<2*visina;i++)
	{
		printf("%.*s\n", (visina-abs(visina-i)), s.c_str());
	}
	return 0;
}


Edit: še link
http://ideone.com/oqZyYi

Zgodovina sprememb…

  • spremenil: Jakkob ()

Jakkob ::

Spregledal da rabiš v C, zgoraj je v C++.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(void) {
        int i, visina = 3;
        char *str = malloc(visina + 1);
        memset(str, '*', visina);
        str[visina] = '\0';
     
        for(i=1;i<2*visina;i++)
        {
            printf("%.*s\n", (visina-abs(visina-i)), str);
        }
        return 0;
    }


Nikoli nisem programiral v C-ju ali C++, tako da mogoče lahko še kdo kaj popravi.

@Janac kot so ti že povedali pred mano, problem boš moral najprej rešit v glavi. Potem je samo stvar sintakse, kako boš to zapisal. Ne skrbi, tuti razmišlanja se navadiš z vajo.

Edit: link
http://ideone.com/fOSOw1

Zgodovina sprememb…

  • spremenil: Jakkob ()

jizzer ::

@Janac

Kaj slabših poimenovanj spremenljivk si nisi mogel izbrat? ;(( saj če si tak navajen ok (no v bistvu ni ok), ampak pri bolj kompleksnih problemih in programih te bo to teplo. Namesto iStevec"n" enostavno imej stevec i,j,k,l,m.
Koda bo takoj bolj razpoznavna.

Druga stvar pa če ti že z risanjem na papir negre se nauči uporabljati debugger ker to pa dela čudeže ko enkrata pogruntaš.

Janac ::

#include <stdio.h>

char Linija(char, int);

int main(void)
{
	char cZnak_main='a';
	int iDolzina_main=0;
	int iIzpis=0;
	
	printf("Pozdravljeni, kaj naj vam izpisem v liniji?\n");
	scanf("%c", &cZnak_main);
	
	printf("Kako dolgo linijo pa zelite?");
	scanf("%i", &iDolzina_main);
	
	iIzpis= cZnakec(cZnak_main, iDolzina_main);
	
	printf("%c", iIzpis);
	
	return (0);
}

char Linija(char cZnakec, int iDolzina)
{
	int iStevec=0;
	int iVracam=0;
	
	if(cZnakec>80)
	{
		printf("Stevilo znakov je preveliko!");
		iVracam=-1;
	}
	
	
	else 
	{
		for(iStevec=0; iStevec<=iDolzina; iStevec++)
	    {
	    	printf("%c", cZnakec);
	    }
		iVracam=0;
	}

	return iVracam;

}


compiler mi zaupa da je napaka v undefined reference to cZnakec

jizzer je izjavil:

@Janac

Kaj slabših poimenovanj spremenljivk si nisi mogel izbrat? ;(( saj če si tak navajen ok (no v bistvu ni ok), ampak pri bolj kompleksnih problemih in programih te bo to teplo. Namesto iStevec"n" enostavno imej stevec i,j,k,l,m.
Koda bo takoj bolj razpoznavna.

Druga stvar pa če ti že z risanjem na papir negre se nauči uporabljati debugger ker to pa dela čudeže ko enkrata pogruntaš.


In potem nek drug drug bere tvojo kodo in nima pojma o čem se gre, če pa ima program 1000000000000 vrstic mora vedno gledat na začetek kaj si ti imel v mislih, ko si pisal kodo.

Se bolje bi blo ce bi napisal; iStevec_vrstic ipd.

Jaz in še kdo drug enostavno nerazume teh i, j, k, l , o, f, k, u, tisoč zank, tisoč spremenljivk, potem pa bodi Sherlock Holmes?!

Zgodovina sprememb…

  • spremenil: Janac ()

keworkian ::

Zgrešu si smer, če teh osnov ne razumeš.
Obscenities in B-Flat

Jakkob ::

Ime funkcije ki jo hočeš uporabit je Linija in ne cZnakec.
«
1
2


Vredno ogleda ...

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

Vsota določenih elementov matrike [C]

Oddelek: Programiranje
10982 (670) RatedR
»

Izris lika - ideja

Oddelek: Programiranje
233685 (2720) RatedR
»

Resne težave z razumevanjem osnov programiranja (strani: 1 2 )

Oddelek: Programiranje
8016430 (12942) RatedR
»

Združevanje polj [C]

Oddelek: Programiranje
7962 (826) ragezor
»

Spreminjanje vrednosti v polju [C]

Oddelek: Programiranje
102131 (1930) specing

Več podobnih tem