Forum » Programiranje » 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.
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 ()
RatedR ::
Ja tako je, znam naredit do sem:
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, 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. ;)
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.
#!/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.
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
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:
link: http://ideone.com/GpOZIb
#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 ::
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 ::
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?
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:
link: http://ideone.com/vvYmJ7
#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.
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 ::
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:
Skratka, če opaziš simetrijo lika, si lahko poenostaviš kodo na račun višje porabe pomnilnika.
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…
- spremenil: technolog ()
Jakkob ::
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:
RatedR ::
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 ::
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.
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Vsota določenih elementov matrike [C]Oddelek: Programiranje | 1002 (690) | RatedR |
» | Resne težave z razumevanjem osnov programiranja (strani: 1 2 )Oddelek: Programiranje | 16695 (13207) | RatedR |
» | Združevanje polj [C]Oddelek: Programiranje | 994 (858) | ragezor |
» | Spreminjanje vrednosti v polju [C]Oddelek: Programiranje | 2185 (1984) | specing |
» | Izris zvezdic v C (strani: 1 2 )Oddelek: Programiranje | 7256 (5840) | SimplyMiha |