ASCII Art – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

ASCII Art – C / C++ – Fórum – Programujte.comASCII Art – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Mazy10
Duch
8. 2. 2015   #1
-
0
-

Čauec, snažím se vyřešit jeden příklad v jazyce C, ale na něčem jsem se zasekl. nakopl by mě někdo?

Napište v jazyku C funkce pro vykreslování obrázků pomocí znaků (tzv. ASCII art).

-Obrázky se budou vykreslovat pomocí plátna -dvojrozměrné matice, která bude obsahovat jednotlivé znaky. Vykreslování se tedy neprovádí přímo na výstupu, ale pouze dochází ke změně daného plátna (strukturacanvas).

-Je možné "vykreslovat" i za hranicí kreslící plochy, tyto body se ale nebudou při zobrazení plátna vykreslovat. Jinými slovy, při pokusu o kreslení mimo plátno nedojde k výjimce při běhu programu.

Funkce:

canvas*canvas_create(intx, inty);
-funkce vytvoří plátno
void canvas_draw_rect(canvas *c, intx, inty, intwidth, intheight, char ch);
-funkce nakreslí na plátno na souřadnice (x,y) obdélník o velikosti widthx heightznakem ch
voidcanvas_clear(canvas*c);
-funkce vyčistí plátno
voidcanvas_print(canvas*c);
-funkce vytiskne plátno na obrazovku

Můj zdrojový kod:

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

typedef struct{ char **c; int x, y;
} canvas;

canvas *canvas_creare(int x, int y);
void canvas_draw_rect (canvas *c, int x, int y, int width, int height, char ch);
void canvas_clear (canvas *c);
void canvas_printf (canvas *c);

canvas *canvas_creare(int x, int y)
{
    int i;
    canvas *temp = (canvas *) malloc (sizeof(canvas));
    temp->x = x;
    temp->y = y;
    temp->c = (char**) malloc(x);
    for (i = 0; i < x; i++)
        temp->c[i] =(char*) malloc(y);

    return temp;
}

void canvas_draw_rect (canvas *c, int x, int y, int width, int height, char ch)
{
    int i,j;
    for (i =x; i<= height;i++)
    {
        for(j=y; j< width;j++)
            c->c[i][j] = ch;
    }        
}

void canvas_printf (canvas *c)
{
    int i,j;
    for (i = 0; i < c->x; i++)
    {
        {
            for (j =0; j< c->y; j++)
            {
                if (c->c[i][j] != ' ')
                    printf ("%c", c->c[i][j]);
                else
                printf(" ");
            }
        }
    printf ("\n");
    }

}


void canvas_clear (canvas *c)
{
    int i,j;
    for(i=0;i<c->x;i++)
       for(j=0;j<c->y;j++)
          c->c[i][j]=' ';
}


int main(int argc, char* argv[])
{
    canvas *c = canvas_creare(20,20);
    canvas_clear (c);
    canvas_draw_rect (c,5, 5, 10, 10, '*');
    canvas_printf (c);
}


Kdyby Vás něco napadlo, dejte radu.

Mazy

Nahlásit jako SPAM
IP: 62.209.230.–
Matěj Andrle+1
Grafoman
8. 2. 2015   #2
-
0
-

#1 Mazy1
Curses/Ncurses - to dle mého použít můžeš a stačí tedy jen sestavit modul... (Objekt z předpřipravených funkcí.)

Nahlásit jako SPAM
IP: 78.136.188.–
Mazy10
Duch
8. 2. 2015   #3
-
0
-

#2 Matěj Andrle
Rozvinul bys to, prosím?

moc tomu nerozumím  

Nahlásit jako SPAM
IP: 62.209.230.–
Matěj Andrle+1
Grafoman
8. 2. 2015   #4
-
0
-

#3 Mazy1
Ncurses a spol jsou knihovny umožňující vyhnout se konceptu konzole a aplikovat standardní GUI ovládání...

http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/windows.html

Zkrátka opustíš řešení STD atp. a můžeš se soustředit jen na samotné obrazce.

Nahlásit jako SPAM
IP: 78.136.188.–
Mazy10
Duch
8. 2. 2015   #5
-
0
-

#4 Matěj Andrle
Jasný, díky. Ale tohle mi problém (alespoň myslim) nevyřeší.

Stačí mi, když mi bud šlapat výše uvedený zdrojový kód, ve kterém mám nějakou chybu.

Nahlásit jako SPAM
IP: 62.209.230.–
Matěj Andrle+1
Grafoman
8. 2. 2015   #6
-
0
-

#1 Mazy1
Já hlavně v tvém kódu vidím zubaté pole - namísto 2D... [index1, index2]

Nahlásit jako SPAM
IP: 78.136.188.–
Mazy10
Duch
8. 2. 2015   #7
-
0
-

#6 Matěj Andrle
ve které části? mě příjde ,že právě pracuji pořád se 2D polem 

Nahlásit jako SPAM
IP: 62.209.230.–
Matěj Andrle+1
Grafoman
8. 2. 2015   #8
-
0
-

#7 Mazy1
Používáš [index1][index2] -> to je zubaté pole... (Dle mého právě, že C ani nemá 2D pole - až C++ -> proto se divím.)

Nahlásit jako SPAM
IP: 78.136.188.–
Mazy10
Duch
8. 2. 2015   #9
-
0
-

   

To je zvláštní docela   , já vc C++ nikde nedělal   

No a nějaká rada nebo řešení?

Nahlásit jako SPAM
IP: 62.209.230.–
Matěj Andrle+1
Grafoman
8. 2. 2015   #10
-
0
-

#9 Mazy1
Jak píši - dle mého multidimenzionální pole v C neexistuje a v C++ bylo přidáno až s novými verzemi. Zubaté pole -> [][] je pole pro každý element mateřského pole -> tím může mít každé subpole různou velikost. 2D/3D/... pole je naopak jedno jediné pole akorát speciálně indexované. Nerozumím tomu co vůbec řešíš. A také nerozumím tomu se zápisem mimo hranice obrazovky. Jak má být velký buffer? Poněvadž ačkoliv nevyvoláš výjimku, nemůžeš uložit prvek za hranice 2D pole...

Nahlásit jako SPAM
IP: 78.136.188.–
Mazy10
Duch
8. 2. 2015   #11
-
0
-

To znamená, že když zadaš souřadnice mimo plátno, nenastane chyba a souřadnice se mimo vytvořené plátno nezapíší.

Řeším tady vyřešení toho příkladu :D resp. proč mi to nefunguje..

Nahlásit jako SPAM
IP: 62.209.230.–
Matěj Andrle+1
Grafoman
8. 2. 2015   #12
-
0
-

#11 Mazy1
Jenže nepíšeš co ti nefunguje...

Nahlásit jako SPAM
IP: 78.136.188.–
Mazy10
Duch
8. 2. 2015   #13
-
0
-

Podle mého nějak blbne funkce : canvas_clear (c);

Když ji "zakomentuji" v hlavní funkci, tak se mi na dané souřadnice vytiskne znak

Jen nevím jak to obejít.

Nahlásit jako SPAM
IP: 62.209.230.–
8. 2. 2015   #14
-
0
-

Konstrukce typu int pole[10, 25]; je v C zcela běžná, bohužel jen u statických polí. Pokud však chce dvourozměrné pole alokovat dynamicky, musí mít buď jednorozměrné pole a z "indexů" dopočítávat polohu prvku v poli nebo mít pole ukazatelů na jednotlivé řádky a dynamicky alokovat jednotlivé řádky - zde je nevýhoda: řádky mohou být roztroušené různě po paměti. První popsaný postup je používán u statických polí v implementacích jazyka C.

hu

Nahlásit jako SPAM
IP: 193.86.81.–
Matěj Andrle+1
Grafoman
8. 2. 2015   #15
-
0
-

#13 Mazy1
Sleduj:

#include <ncurses.h>
#include <string.h>
 
int main()
{
	char mesg[] = "Welcome in Asart!";
	int rows, columns;

	initscr(); // Začátek módu Ncurses
	getmaxyx(stdscr, rows, columns);
	mvprintw(rows / 2, (columns - strlen(mesg)) / 2, "%s", mesg);

	mvprintw(rows - 1, 0, "This screen has %d rows and %d columns.", rows, columns);
	mvprintw(5, 1, "R", rows, columns); // X, Y, string, maxX, maxY
	refresh();
	getch();
	endwin(); // ukončení módu Ncurses

	return 0;
}

A to je o čem jsem ti psal! Funkce move umístí kurzor na pozici X a Y, funkce getch sejme vstup, funkce refresh vyčistí obrazovku,... Je to mnohem jednodušší a celý kód by pak byl přehlednější!

Nahlásit jako SPAM
IP: 78.136.188.–
Matěj Andrle+1
Grafoman
8. 2. 2015   #16
-
0
-

#14 hlucheucho
Já vím - jak píši... V C prostě není prostor pro OOP a další vyšší elementy. (Ač tam někteří šílenci tyto věci cpou - pak akorát vznikne humus typu Objective-C!) Normální multidimenzionální pole mají až novější verze C++. Úkol bych neplnil - řekl bych, že 2D pole v C není možné vytvořit a tak není možné splnit zadání... (Jak píšeš - rozhodně se nedá použít jako buffer!)

Nahlásit jako SPAM
IP: 78.136.188.–
8. 2. 2015   #17
-
0
-

#16 Matěj Andrle
Obešel bych to tím jednorozměrným polem

hu

Nahlásit jako SPAM
IP: 193.86.81.–
Matěj Andrle+1
Grafoman
8. 2. 2015   #18
-
0
-

#17 hlucheucho
Ale když je zadání s takovouto fatální chybou? :D Jako je gigantický rozdíl mezi polem polí a jedním polem s více rozměry! Každopádně jsem myslím dostatečně odpověděl s Ncurses - tam se dá vykreslovat přesně na zadané pozici atd. - stačí jen vytvořit ten buffer a hotovo...

Nahlásit jako SPAM
IP: 78.136.188.–
Martin
~ Anonymní uživatel
1602 příspěvků
8. 2. 2015   #19
-
+1
-
Zajímavé

#13 Mazy1
To, že pokud nezavoláš funkci canvas_clear a vytisknou se ti náhodné znaky mimo ten obdelník je tím, že po alokaci nemáš definováno co v alokované paměti bude a proto je potřeba ji vyčistit. Můžeš to udělat třeba tak, že na konci konstruktoru zavoláš tu funkci canvas_clear. Takže tvůj kód je správně a používat ncurses je v tomhle případě uplně zbytečné.

Nahlásit jako SPAM
IP: 93.99.228.–
Matěj Andrle+1
Grafoman
8. 2. 2015   #20
-
0
-

#19 Martin
Ncurses je právě na ASCII Art - k ničemu jinému! :D

Nahlásit jako SPAM
IP: 78.136.188.–
Mazy10
Duch
8. 2. 2015   #21
-
0
-

Už jsem to vyřešil. Nevím jestli uplně správně nebo ne, ale šlape to :D

Každopádně díky za rady :)

btw. použil jsem to "2D pole", které jste říkali že se v C nevyskytuje :D

Nahlásit jako SPAM
IP: 62.209.230.–
PiranhaGreg
~ Anonymní uživatel
165 příspěvků
8. 2. 2015   #22
-
0
-

To mi připomnělo můj pokus v ncurses asi půl roku zpět

https://www.facebook.com/groups/343257012467087/permalink/523249381134515

Myslím, že s vykreslováním obrázků v konzoli se ještě nikdo tak daleko nedostal  

Nahlásit jako SPAM
IP: 109.81.210.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 71 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý