» »

Izris lika - ideja

Izris lika - ideja

RatedR ::

Pozdrav prosim za idejo kako naredit nekaj takšnega:
EDIT: spremenil sem obliko lika (napačna vaja):
*********
********* *
********* **
********* ***
********* ****
********* ***
********* **
********* *
*********

To bi rad naredil z vgnezdenim for zankanjem ampak nevem kako ker se mi ne zdi logično kako narediti ta prostor vmes.
Prosim za pomoč/idejo.
  • spremenilo: RatedR ()

Fortes ::

To je prazen prostor. Na zaslon izpiši " ".

RatedR ::

Ja tako je, znam naredit do sem:
#include<stdio.h>

int main(void)
{
    int iStevec1, iStevec2, iStevec3, iStevec4, iVnos;
    
    printf("Vnesite velikost: ");
    scanf("%d", &iVnos);
    
    for(iStevec1 = 0; iStevec1 < iVnos; iStevec1++)
    {
                 for(iStevec2 = 0; iStevec2 < iVnos; iStevec2++)
                 {
                              printf("*");
                              }
                 printf("\n");
                 }
                 
    getch();
}


Potem si pa predstavljam tako, po 15 vrstici ko se izpiše recimo (velikost = 5) 5 zvezdic, moram dodat še 2 for zanke da izpišeta
*
**
***
****

In nato še dve da izpišeta:

****
***
**
*

Ampak ne gre ker mi vedno vrže v novo vrstico in je vzorec čisto nekaj drugega, koda:
#include<stdio.h>

int main(void)
{
    int iStevec1, iStevec2, iStevec3, iStevec4, iStevec5, iStevec6, iVnos;
    
    printf("Vnesite velikost: ");
    scanf("%d", &iVnos);
    
    for(iStevec1 = 0; iStevec1 < iVnos; iStevec1++)
    {
                 for(iStevec2 = 0; iStevec2 < iVnos; iStevec2++)
                 {
                              printf("*");
                              }
                              for(iStevec3 = 0; iStevec3 < iVnos; iStevec3++)
                              {
                                           for(iStevec4 = 0; iStevec4 <= iStevec3; iStevec4++)
                                           {
                                                        printf("*");
                                                        }
                                           printf("\n");
                                           }
                                           
                                                     for(iStevec5 = 1; iStevec6 <= iVnos; iStevec5++)
                                                     {
                                                              for(iStevec6 = 5; iStevec6 >= iStevec5; iStevec6--)
                                                              {
                                                                           printf("*");
                                                                           }
                                                              printf("\n");
                                                              }
                                                     printf("\n");
                                                     }
                 
    getch();
}

KoKi ::

Skoraj ne morem verjet, da sem se spravil to delat, a mi po šestih for zankah ni dalo mira. ;)

#!/usr/bin/env python -c

velikost = 5

ostanek = 0
count = 0

for i in range(velikost):
    print '*' * (velikost + ostanek)
    if count < velikost / 2:
        ostanek += 1
    else:
        ostanek -= 1
    count += 1

Velikost je število zvezdic kot kvadrat, ostanek pa del, ki gre potem v "raketo". Se pravi, da je ostanek v prvi iteraciji 0, v drugi 1 ... dokler ne prideš do največje dolžine (velikost + velikost / 2). Pazi na to, da vrže velikost / 2 celo število in je vse za decimalno vejico zavrženo. Sedaj sem ti dal idejo za python 2.x, v poljubni programski jezik pa boš sam pretvoril.
# hackable

RatedR ::

A mi lahko to nekdo prevede v C ker ne znam sam pretvorit iz Pythona, ima namreč drugačne sintaktične lastnosti, npr:
vrstica 9: print nemoreš kar tako pomnožit v C-ju.

Če ima pa še kdo kakšen nasvet kako bi popravil mojo kodo prosim da pomaga.

Fortes ::

int velikost = 5, ostanek = 0, count = 0; 
for(short i = 0 ; i < velikost ; i++){
    for(short j = 0 ; j < (velikost + ostanek) ; j++){
        printf("*");
    }

    if(count < velikost / 2) ostanek +=1;
    else ostanek -= 1;
    
    count += 1;
    
    printf("\n");
}

RatedR ::

Hvala, pa še eno vprašanje za oba, od kod vama ideja?

Jaz vem da take ideje ne bi dobil nikoli, za mano je ogromno poskusov pisanja teh zank pa mi nikoli ne rata, tudi ko gledam tole kodo se mi zdi da je čist preveč elegantno rešena da bi jaz to kadarkoli znal, zanima me če bi bil kdo pripravljen zgornjo kodo raztegnit da bi jo nekdo ki se tega težko loti razumel?

Hvala

Jakkob ::

Evo še z eno for loop zanko v C-ju:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) 
{
	int i, visinaKvadrata = 5, visinaTrikotnika = 8;
	char *str = malloc(visinaKvadrata + visinaTrikotnika + 1);
	memset(str, '*', visinaTrikotnika+visinaKvadrata);
	str[visinaTrikotnika+visinaKvadrata] = '\0';
	
	for(i=1;i<2*visinaTrikotnika;i++) {
		printf("%.*s\n", (visinaTrikotnika-abs(visinaTrikotnika-i)+visinaKvadrata), str);
	}
	return 0;
}


link: http://ideone.com/GpOZIb

Zgodovina sprememb…

  • spremenil: Jakkob ()

Yacked2 ::

public class primer1 {

	public static void main(String[] args) 
	{
		//stevec
		int n = 4;
		
		//izracunamo kolikokrat rabimo pognat osnovno for zanko
		//vidis lahko da je osnovni lik kvadrat
		int m = 2*n + 1;
		
		//z pomoznim stevcem gledamo koliko dodatnih * moramo izpisovati
		int pomozniStevec = 0;
		
		//s to spremenljivko gledamo ali moramo pomozni stevec povecati ali pomanjsati
		boolean narascanje = true;
		
		//osnovna for zanka
		for(int i = 0; i < m; i++)
		{
			//izpisemo * za osnovni kvadrat
			for(int j = 0; j < m; j++)
			{
				System.out.print("*");
			}
			System.out.print(" ");
			
			//sedaj pa pogledamo se koliko dodatnih * zvezdic rabimo
			if(pomozniStevec < n && narascanje)
			{
				//ce smo dosegli maximum se bomo v naslednjem koraku zaceli spuscati
				if(pomozniStevec == n-1)
				{
					narascanje = false;
				}
				
				//izpisemo se dodatne *
				for(int j = 0; j < pomozniStevec; j++)
				{
					System.out.print("*");
				}
				
				//povecamo pomozni stevec
				pomozniStevec++;
			}
			else //enako kot zgoraj samo, da se tukaj spuscamo
			{
				for(int j = 0; j < pomozniStevec; j++)
				{
					System.out.print("*");
				}
				pomozniStevec--;
			}
			
			
			System.out.println();
		}

	}

}


Sem z razlogom raztegnil kodo, da ti bo mogoče olajšalo dojemanje koncepta.
Korak naprej ni vedno ustrezen...sploh če si na robu prepada!

KoKi ::

Nightta: Ko se meni ustavi, vzamem svinčnik in list papirja. Veno pomaga. Drugega nasveta ti ne morem dat, saj je vedno od vsakega posameznika odvisno, kako pristopi k problemu. Je pa vedno potrebno nek kompleksen problem razbit na manjše podprobleme.
# hackable

Fortes ::

RatedR je izjavil:

Hvala, pa še eno vprašanje za oba, od kod vama ideja?

Jaz vem da take ideje ne bi dobil nikoli, za mano je ogromno poskusov pisanja teh zank pa mi nikoli ne rata, tudi ko gledam tole kodo se mi zdi da je čist preveč elegantno rešena da bi jaz to kadarkoli znal, zanima me če bi bil kdo pripravljen zgornjo kodo raztegnit da bi jo nekdo ki se tega težko loti razumel?

Hvala

Z zankami si bil blizu, le malo drugače jih moraš postavit.

int zvezda = 9; // vrednost poda uporabnik
for (int i = 0 ; i <= 5 ; i++) {
    for (int v = 0; v < zvezda; v++) { 
        printf("*");
    }
    printf(" ");

    for (int j = 0; j < i; j++) {
        printf("*");
    }

    printf("\n");
}

for (int i = 0 ; i < 5 ; i++) {
    for (int v = 0; v < zvezda; v++) { 
        printf("*");
    }
    printf(" ");

    for (int j = 5; j-1 > i; j--) {
        printf("*");
    }

    printf("\n");
}


Izriše lik, ki si ga omenjal v prvi objavi.
Ampak trikotnik s 5 zvezdicami(predvidevam da si tako tudi želel). :)

Jakkob ::

Ti razložim še mojo kodo oz. mojo logiko:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(void) 
{
    // Deklaliral bom en sam niz znakov * maksimalne potrebne dolžine
    // nato pa v vsakem koraku izpisal le toliko * kot ji potrebujem v danem koraku

    // Deklaracija spremenljivk
    int i, visinaKvadrata = 5, visinaTrikotnika = 8;
    
    // Rezerviram dovolj spomina za maksimalno potrebno št. znakov + 1 znak
    char *str = malloc(visinaKvadrata + visinaTrikotnika + 1);
    // Določim naj bo vsak znak v nizu = *
    memset(str, '*', visinaTrikotnika+visinaKvadrata);
    // In zaključim niz znakov
    str[visinaTrikotnika+visinaKvadrata] = '\0';
    
    // Tu je pa zdaj vsa logika
    //foor loop: to je simpl - ponovim za 2*visinaTrikotnika - 1, kolikor vrstic rabim 
    for(i=1;i<2*visinaTrikotnika;i++) {
        // Zdej je pa treba najdt eno logiko, koliko * izpišem v vsakem koraku
        // Najprej je jasno da potrebujem vedno konstantno visino kvadrata zato vedno pristejem visinaKvadrata
        // Za trikotnik moram pa glede na naraščanje i-ja vedno od maksimalne višine trikotnika
        // odštet absolutno razliko maksimalne višine trikotnika in vrstice v kateri sem
        // Če ti napišem za 1. srednjo in zadnjo vrstico
        // i = 1:  8-abs(8-1)  = 1
        // i = 8:  8-abs(8-8)  = 8
        // i = 15: 8-abs(8-15) = 1
        printf("%.*s\n", (visinaTrikotnika-abs(visinaTrikotnika-i)+visinaKvadrata), str);
    }
    return 0;
}

RatedR ::

Hvala vam za pomoč. Ostanite pri temi ko se vrnem z dodatnimi vprašanji.

RatedR ::

Prejšnjega posta ne morem urejat tako da bo tole dvojni post..

Razmišljal sem če si lahko na obstoječem primeru lažje razložim nalogo, torej rad bi naredil to:


Ta lik je sestavljen iz teh dveh:
http://pastebin.com/wPrphhGg
http://pastebin.com/PaCLgbpM

Moji poskusi združevanja niso uspešni ker je preveč števcev in ne morem več sledit poteku izvajanja...

Upam pa da mi bo razlaga iz teh primerov ki jih kokr tok razumem kej pomagala, torej kako združit?

Zgodovina sprememb…

  • spremenilo: RatedR ()

Jakkob ::

Nisem gledal tvojih linkov, ampak če ti je bil jasen moj prejšnji primer, ti bo tudi ta:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) 
{
	int i, visinaTrikotnika = 8;
	char *strZvezdice  = malloc(visinaTrikotnika+1);
	char *strPresledki = malloc(visinaTrikotnika*2 + 1);
	memset(strZvezdice, '*', visinaTrikotnika);
	memset(strPresledki, ' ', 2*visinaTrikotnika);
	strZvezdice[visinaTrikotnika]  = '\0';
	strPresledki[2*visinaTrikotnika] = '\0';
	
	for(i=1;i<=visinaTrikotnika;i++) {
		printf("%.*s", (visinaTrikotnika-abs(visinaTrikotnika-i)), strZvezdice);
		printf("%.*s ", 2*(visinaTrikotnika-i), strPresledki);
		printf("%.*s\n", (visinaTrikotnika-abs(visinaTrikotnika-i)), strZvezdice);
	}
	return 0;
}


link: http://ideone.com/vvYmJ7

Zgodovina sprememb…

  • spremenil: Jakkob ()

RatedR ::

Nismo še poinerjev pa malloc, alloc, realloc funkcij jemal, uporabljamo lahko samo knjižnico stdio in nobenih posebnih funkcij.
V mojih pastebin linkih sta že izrisana trikotnika iz katerih sestoji želeni končni lik.

Vseeno hvala za trud.

Zgodovina sprememb…

  • spremenilo: RatedR ()

Yacked2 ::


public class Primer2 {

	public static void main(String[] args) 
	{
		int n = 7;
		
		//koliko vrstic bomo izpisali
		for(int i = 1; i <= n; i++)
		{
			//koliko * bomo izpisali na začetnu
			for(int j = 1; j <= i; j++)
			{
				System.out.print("*");
			}
			
			//koliko " " se rabimo, da bo vrstica polna
			for(int j = i; j < n; j++)
			{
				System.out.print(" ");
			}
			
			//izpisemo tisti " " na sredini
			System.out.print(" ");
			
			//ponovi vajo (copy paste ene zanke višje)
			for(int j = i; j < n; j++)
			{
				System.out.print(" ");
			}
			
			//ponovi vajo (copy paste zanke malo višje)
			for(int j = 1; j <= i; j++)
			{
				System.out.print("*");
			}
			
			
			System.out.println();
		}

	}

}
Korak naprej ni vedno ustrezen...sploh če si na robu prepada!

RatedR ::

Hvala Yacked, zanima me kako na testu naredim kaj takega...vem da tega nebom nikoli stresal iz rokava tako kot vi, zato bi rad vedel kako sledit števcom če imaš časovno omejitev recimo 10 minut?

Yacked2 ::

RatedR je izjavil:

Hvala Yacked, zanima me kako na testu naredim kaj takega...vem da tega nebom nikoli stresal iz rokava tako kot vi, zato bi rad vedel kako sledit števcom če imaš časovno omejitev recimo 10 minut?


Kakšnih 10min ? A da napišeš program, a da se program izvede ? Verjetno za prvo.

Delaj vaje, to je edina in najboljša možnost. Noben ni od rojstva znal programirati, vsi smo se morali naučit, eni prej, drugi kasneje.

Kot znanje programiranja ne mislim na Javo, C++, Python ali kakšen drug konkretni programski jezik, temveč na samo alogritmično razmišljanje. Mogoče se ti zdi, da je program kompliciran in zahteven, vendar se ti bo čez nekaj časa (od posameznika odvisno koliko) zdelo da je preprost in dela točno to, kar piše.

Glede testa pa vprašanje: ali pišete na papir ali na računalnik in ali imate v slednjem primeru možnost testiranja programa (pač poiskusiš če dela) ?

V vse tvojih vprašanjih v tej temi se pojavlja problem uporabe gnezdeni for zank, eno je teoretično razumevanje, drugo pa praktična uporaba, k čemur pripomorejo tudi vse te naloge tukaj.

Mogoče ti bo tale pristop olajšal način: ko boš spočit se usedi za računalnik in napiši dve zanki, eno v drugi, nato pa se igraj s števci in opazuj rezultat, kaj se bo izpisalo. Vsako verzijo podprobno analiziraj(zakaj izpiše toliko vrstic, zakaj toliko *, zakaj toliko presledkov), da ti pride program v kri. Ko imaš enkrat program in rezultat ti priporočam, da si ga sprintaš na list papirja (no vsaj jaz se rajši/lažje učim iz papirja kot iz monitorja, si kaj podčrtaš, ključno mesto obkrožiš itd...), ko boš nekje videl nalogo, ki bo od tebe zahtevala podoben rezultat, kot si ga že enkrat videl, se boš spovnil vseh tistih detajlov, ki so bili pomembni.

Najpomembneje pa.... NE SMEŠ OBUPATI! Za pomoč smo ti na voljo tukaj na forumu.
Korak naprej ni vedno ustrezen...sploh če si na robu prepada!

technolog ::

Za poljuben N:

val x = (0 to N).map("*" * (2*N+1) + " " + "*" * _)
x.foreach(println)
x.reverse.tail.foreach(println)


Skratka, če opaziš simetrijo lika, si lahko poenostaviš kodo na račun višje porabe pomnilnika.

Zgodovina sprememb…

Jakkob ::

technolog je izjavil:

Za poljuben N:

val x = (0 to N).map("*" * (2*N+1) + " " + "*" * _)
x.foreach(println)
x.reverse.tail.foreach(println)


Skratka, če opaziš simetrijo lika, si lahko poenostaviš kodo na račun višje porabe pomnilnika.


Samo komentar: tole je Scala (sem mogu pogooglat) in koda je za ta primer:
 http://i.imgur.com/p82rfx1.png?1

http://i.imgur.com/p82rfx1.png?1

RatedR ::

Yacked2 je izjavil:


Kakšnih 10min ? A da napišeš program, a da se program izvede ? Verjetno za prvo.
Glede testa pa vprašanje: ali pišete na papir ali na računalnik in ali imate v slednjem primeru možnost testiranja programa (pač poiskusiš če dela) ?

Hvala za odgovor in motivacijo.

- 10 minut sem dal primer ker je na testu približno 5 nalog, deljeno s 45 minut pisanja pride 10 minut na nalogo
- pišemo na papir, programov ne moremo testirat

Yacked2 ::

RatedR je izjavil:

Yacked2 je izjavil:


Kakšnih 10min ? A da napišeš program, a da se program izvede ? Verjetno za prvo.
Glede testa pa vprašanje: ali pišete na papir ali na računalnik in ali imate v slednjem primeru možnost testiranja programa (pač poiskusiš če dela) ?

Hvala za odgovor in motivacijo.

- 10 minut sem dal primer ker je na testu približno 5 nalog, deljeno s 45 minut pisanja pride 10 minut na nalogo
- pišemo na papir, programov ne moremo testirat


Jaooo... na faksu imamo izpit na računalniku, kjer imaš javne testne primere, da program testiraš preden oddaš.

A to bo 5 nalog iz gnezdenih zank a ste delali še kaj drugega ? Načeloma rabiš par minut za nalogo da napišeš in potem ene 5 min da se prepričaš da res dela.
Korak naprej ni vedno ustrezen...sploh če si na robu prepada!

RatedR ::

Ja par minut zame je bolj težka, ne test ni samo iz teh nalog, imamo tudi matrike pa rekurzijo ki mi povzročata manj težav...tisto vsaj rešim ko se nekaj časa ukvarjam, teh likov pa zgrda ne.

Mi poveš kaj mate na faksu kaj? Kmalu bo prišel čas ko se bom moral odločit kam na faks in zaenkrat je FRI zame odgovor ne, še vedno me pa zanima kaj imate tam.


Vredno ogleda ...

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

Vsota določenih elementov matrike [C]

Oddelek: Programiranje
10919 (607) RatedR
»

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

Oddelek: Programiranje
8015377 (11889) RatedR
»

Združevanje polj [C]

Oddelek: Programiranje
7872 (736) ragezor
»

Spreminjanje vrednosti v polju [C]

Oddelek: Programiranje
101969 (1768) specing
»

Izris zvezdic v C (strani: 1 2 )

Oddelek: Programiranje
816717 (5301) SimplyMiha

Več podobnih tem