[c] stampa di un disegno nel terminale

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

[c] stampa di un disegno nel terminale

Messaggio da cristian_c »

Stavo scrivendo un programma che dovrebbe disegnare sullo schermo le tessere del domino.
Ovviamente mi piacerebbe utilizzare il carattere * in questo modo:

    *            |    *        *
        *        |        *
            *    |    *        *
(questo e' un esempio).
Scrivo qui perche' il problema e' questo:
le printf lavorano riga per riga, e almeno concettualmente mi risulta impossibile disegnare una cosa del genere.Ho sentito dire che in windows si usano le API di sistema per risolvere questo problema.Ma in linux(e quindi con Ubuntu) come posso fare per superare l'ostacolo prodotto da questo semplice programmino?

Grazie per le eventuali risposte?
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
mous16
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3940
Iscrizione: mercoledì 25 ottobre 2006, 15:51
Sesso: Maschile

Re: [c] stampa di un disegno nel terminale

Messaggio da mous16 »

non ho capito che problema hai a disegnare una cosa così riga per riga... comunque ce ne sono tante di librerie per utilizzare diversamente il terminale. mi pare che le ncurses siano largamente usate
Pagine personali: Forum Ubuntu-it - Wiki Ubuntu-it - Launchpad
Solo/mous16
Avatar utente
neonum6
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 633
Iscrizione: sabato 25 febbraio 2006, 17:13
Contatti:

Re: [c] stampa di un disegno nel terminale

Messaggio da neonum6 »

cristian_c ha scritto: Stavo scrivendo un programma che dovrebbe disegnare sullo schermo le tessere del domino.
Ovviamente mi piacerebbe utilizzare il carattere * in questo modo:

    *            |    *        *
        *        |         *
            *    |    *        *
(questo e' un esempio).
Scrivo qui perche' il problema e' questo:
le printf lavorano riga per riga, e almeno concettualmente mi risulta impossibile disegnare una cosa del genere.Ho sentito dire che in windows si usano le API di sistema per risolvere questo problema.Ma in linux(e quindi con Ubuntu) come posso fare per superare l'ostacolo prodotto da questo semplice programmino?

Grazie per le eventuali risposte?
come mai dici che con la printf non puoi stampare a video quella cosa??
printf("    *            |    *        *"+'\n'+"        *        |        *"+'\n'+"            *    |    *        *");
Impossible is 0.
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c] stampa di un disegno nel terminale

Messaggio da cristian_c »

@ neonum e mous,

il problema e' che il terminale mi deve stampare la tessera che ho scelto, quello era solo un'esempio, perche' quello che deve stampare e' noto solo a tempo di esecuzione.
3-5 era solo un esempio
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
mous16
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3940
Iscrizione: mercoledì 25 ottobre 2006, 15:51
Sesso: Maschile

Re: [c] stampa di un disegno nel terminale

Messaggio da mous16 »

se è un esercizio didattico probabilmente c'è un modo di farlo più che valido con la printf, ma se no ti ho detto, studiati le ncurses
Pagine personali: Forum Ubuntu-it - Wiki Ubuntu-it - Launchpad
Solo/mous16
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [c] stampa di un disegno nel terminale

Messaggio da crap0101 »

array?
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
moretto11
Prode Principiante
Messaggi: 217
Iscrizione: venerdì 20 aprile 2007, 16:33
Contatti:

Re: [c] stampa di un disegno nel terminale

Messaggio da moretto11 »

io ho risolto così:

Codice: Seleziona tutto

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

void init(char mat[][3]);
void riempi_pari(int tess, char mat[][3]);
void riempi_dispari(int tess, char mat[][3]);
int main(){
    int i,j,k;
    char mat1[3][3];
    char mat2[3][3];
    int tess1,tess2;
    init(mat1);
    init(mat2);
    printf("Digitare i numeri della tessera: ");
    scanf("%d %d",&tess1,&tess2);
    if((tess1<0||tess1>6)||(tess2<0||tess2>6)){
        fprintf(stderr,"Errore, numeri fuori dal range dei valori 0-6!");
        exit(1);
    }
    if(tess1%2==0)
        riempi_pari(tess1,mat1);
    else
        riempi_dispari(tess1,mat1);
    if(tess2%2==0)
        riempi_pari(tess2,mat2);
    else
        riempi_dispari(tess2,mat2);
    for(i=0;i<3;i++){
        printf(" ");
        for(j=0;j<3;j++){
            printf("%c ",mat1[i][j]);
        }
        printf("| ");
        for(k=0;k<3;k++){
            printf("%c ",mat2[i][k]);
        }
        printf("\n");
    }
    return 0;
}

void init(char mat[][3])
{
    int i,j;
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            mat[i][j]=' ';
        }
    }
}

void riempi_pari(int tess, char mat[][3])
{
    if(tess==0){
        return;
    }
    mat[0][0]='*';
    mat[2][2]='*';
    switch(tess){
        case 2:
            break;
        case 4:
            mat[0][2]='*';
            mat[2][0]='*';
            break;
        case 6:
            mat[0][2]='*';
            mat[2][0]='*';
            mat[1][0]='*';
            mat[1][2]='*';
            break;
        default:
            break;
    }
}

void riempi_dispari(int tess, char mat[][3])
{
    mat[1][1]='*';
    riempi_pari(tess-1,mat);
}

Ultima modifica di moretto11 il giovedì 17 luglio 2008, 13:37, modificato 1 volta in totale.
Avatar utente
mous16
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3940
Iscrizione: mercoledì 25 ottobre 2006, 15:51
Sesso: Maschile

Re: [c] stampa di un disegno nel terminale

Messaggio da mous16 »

si, bene, ma cristian_c si è dimenticato di darci il testo del problema...
Pagine personali: Forum Ubuntu-it - Wiki Ubuntu-it - Launchpad
Solo/mous16
Avatar utente
moretto11
Prode Principiante
Messaggi: 217
Iscrizione: venerdì 20 aprile 2007, 16:33
Contatti:

Re: [c] stampa di un disegno nel terminale

Messaggio da moretto11 »

mous16 ha scritto: si, bene, ma cristian_c si è dimenticato di darci il testo del problema...
bhe nn era qst che doveva fare? stampare le tessere del domino scelte dall'utente?
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c] stampa di un disegno nel terminale

Messaggio da cristian_c »

Allora scusatemi per il ritardo,
il programma semplicemente deve visualizzare i numeri presenti sulla superficie delle tessere del domino.
Io ho previsto due opzioni:
1. Visualizzare una tessera del domino scelta dall'utente
2. Visualizzare tutte le tessere del domino in una volta

Per il primo punto ho piu o meno risolto senza fare a meno di API e roba varia.Posto il codice sotto:

Codice: Seleziona tutto

#include <stdio.h>

main()
{
 int t1,t2;
 printf("\n   *** PROGRAMMA PER LA RAPPRESENTAZIONE DELLE TESSERE DEL DOMINO ***\n\n");
 printf("\nPremere:\n1- Per visualizzare una tessera in particolare\n2- Per visualizzare l'intero set di tessere\n\n");
 printf("// l'utente dovrà inserire una coppia di cifre che rappresentano i numeri\n// presenti sulla superficie della tessera che si vuole visualizzare\n\n");
 printf("prima cifra(da 0 a 6): ");
 scanf("%d",&t1);
 printf("seconda cifra(da 0 a 6): ");
 scanf("%d",&t2);
 if ((t1>=0 && t1<=6) && (t2>=0 && t2<=6)) {
     printf("\n"); 
     if (t1==0 || t1==1) printf("   ");
     if (t1==2 || t1==3) printf("*  ");
     if (t1==4 || t1==5 || t1==6) printf("* *");
     printf(" | ");
     if (t2==0 || t2==1) printf("   ");
     if (t2==2 || t2==3) printf("*  ");
     if (t2==4 || t2==5 || t2==6) printf("* *");
     printf("\n");
     if (t1==1 || t1==3 || t1==5) printf(" * ");
     if (t1==0 || t1==2 || t1==4) printf("   ");
     if (t1==6) printf("* *");
     printf(" | ");
     if (t2==1 || t2==3 || t2==5) printf(" * ");
     if (t2==0 || t2==2 || t2==4) printf("   ");
     if (t2==6) printf("* *"); 
     printf("\n");
     if (t1==0 || t1==1) printf("   ");
     if (t1==2 || t1==3) printf("  *");
     if (t1==4 || t1==5 || t1==6) printf("* *");
     printf(" | ");
     if (t2==0 || t2==1) printf("   ");
     if (t2==2 || t2==3) printf("  *");
     if (t2==4 || t2==5 || t2==6) printf("* *"); 
     printf("\n\n"); 
 }
}
Per quanto riguarda il secondo punto,qui si apre un problema.Ancora non ho scritto il codice.
L'idea e' quella di mettere le tessere l'una accanto all'altra e quando finisce lo spazio nella finestra della console
fare in modo di andare a capo e andare avanti cosi fino a che non finiscono le tessere.
Quindi occorre sapere a priori quante tessere prevedere per ogni fila credo, in modo da non avere degli obbrobri, cioe' tessere che per mancanza di spazio stanno in parte su una fila e parte in un'altra.

Ma il numero di caratteri per riga della finestra della console dipende dalla finestra del programma in cui si e' eseguito il sorgente c, e non e' detto che siano tutte uguali,anzi temo che dipenda ogni volta.
Percio' questo crea un problema nella programmazione, perche' io devo saperlo a priori quando scrivo il codice.
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
mous16
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3940
Iscrizione: mercoledì 25 ottobre 2006, 15:51
Sesso: Maschile

Re: [c] stampa di un disegno nel terminale

Messaggio da mous16 »

se vuoi andare con gli standard, falla da 80 caratteri, se no non so come potresti fare a scoprirlo, anche se un modo ci deve essere...
Pagine personali: Forum Ubuntu-it - Wiki Ubuntu-it - Launchpad
Solo/mous16
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c] stampa di un disegno nel terminale

Messaggio da cristian_c »

Ho completato il programma con le due modalità  (good) (b2b)

Ho trovato il modo per calcolare il numero di colonne nel terminale(un sincero grazie ad enzotib  :D ).
Ecco il codice sorgente del programma:

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <linux/termios.h>

int colonne()
{
    int fd = fileno(stdin);
    struct winsize s;

    if (!isatty(fd)) {
        fprintf(stderr, "Not a terminal\n");
        exit(1);
    }
    ioctl(fd, TIOCGWINSZ, &s);
    return s.ws_col;
}

main()
{
 int t1,t2;
 char c;
 int col,rig;
 int i,j,iold,jold,q,cont;
 printf("\n   *** PROGRAMMA PER LA RAPPRESENTAZIONE DELLE TESSERE DEL DOMINO ***\n\n");
 printf("\nPremere:\n1- Per visualizzare una tessera in particolare\n2- Per visualizzare l'intero set di tessere\n\n");
 printf("\t\t\t\t\t\t\tScelta:");
 scanf("%c",&c);
 if (c == '1') {
     printf("\n// l'utente dovrà inserire una coppia di cifre che rappresentano i numeri\n// presenti sulla superficie della tessera che si vuole visualizzare\n\n");
     printf("prima cifra(da 0 a 6): ");
     scanf("%d",&t1);
     printf("seconda cifra(da 0 a 6): ");
     scanf("%d",&t2);
     if ((t1>=0 && t1<=6) && (t2>=0 && t2<=6)) {
         printf("\n"); 
         if (t1==0 || t1==1) printf("   ");
         if (t1==2 || t1==3) printf("*  ");
         if (t1==4 || t1==5 || t1==6) printf("* *");
         printf(" | ");
         if (t2==0 || t2==1) printf("   ");
         if (t2==2 || t2==3) printf("*  ");
         if (t2==4 || t2==5 || t2==6) printf("* *");
         printf("\n");
         if (t1==1 || t1==3 || t1==5) printf(" * ");
         if (t1==0 || t1==2 || t1==4) printf("   ");
         if (t1==6) printf("* *");
         printf(" | ");
         if (t2==1 || t2==3 || t2==5) printf(" * ");
         if (t2==0 || t2==2 || t2==4) printf("   ");
         if (t2==6) printf("* *"); 
         printf("\n");
         if (t1==0 || t1==1) printf("   ");
         if (t1==2 || t1==3) printf("  *");
         if (t1==4 || t1==5 || t1==6) printf("* *");
         printf(" | ");
         if (t2==0 || t2==1) printf("   ");
         if (t2==2 || t2==3) printf("  *");
         if (t2==4 || t2==5 || t2==6) printf("* *"); 
         printf("\n\n"); 
     }
 }
 if (c == '2') {
     print("Visualizzazione delle 28 tessere in corso.Premere un tasto per continuare...");
     scanf("%c",&c);
     col=colonne();
     q=col/9;
     if (q*9+q-1>col) q=q-1;
     cont=1;
     rig=0;
     iold=0;
     jold=0;
     for(j=0;j<7;j++) 
         for(i=j;i<7;i++) {
             if (cont%q==1 || cont!=1) printf("\n");  
             if (rig==0) {
                 if (i==0 || i==1) printf("   ");
                 if (i==2 || i==3) printf("*  ");
                 if (i==4 || i==5 || i==6) printf("* *");
                 printf(" | ");
                 if (j==0 || j==1) printf("   ");
                 if (j==2 || j==3) printf("*  ");
                 if (j==4 || j==5 || j==6) printf("* *");
             }
             if (rig==1) {
                 if (i==1 || i==3 || i==5) printf(" * ");
                 if (i==0 || i==2 || i==4) printf("   ");
                 if (i==6) printf("* *");
                 printf(" | ");
                 if (j==1 || j==3 || j==5) printf(" * ");
                 if (j==0 || j==2 || j==4) printf("   ");
                 if (j==6) printf("* *"); 
             }
             if (rig==2) {
                 if (i==0 || i==1) printf("   ");
                 if (i==2 || i==3) printf("  *");
                 if (i==4 || i==5 || i==6) printf("* *");
                 printf(" | ");
                 if (j==0 || j==1) printf("   ");
                 if (j==2 || j==3) printf("  *");
                 if (j==4 || j==5 || j==6) printf("* *");                           
             }
             if (cont%q==0) {
                 if (rig==3) {
                     iold=i; jold=j;
                     rig==-1;
                 }
                 i=iold; j=jold;
                 rig++;
             }
             if (cont%q!=0) printf(" ");
             cont++;
         }             
 }
}
Ho provato a compilarlo,ma ottengo un fallimento:

Codice: Seleziona tutto

cristiancozzolino@cristiancozzolino-laptop:~/programmazione$ gcc domino.c -o domino
/tmp/ccgTMHC3.o: In function `main':
domino.c:(.text+0x3cf): undefined reference to `print'
collect2: ld returned 1 exit status
cristiancozzolino@cristiancozzolino-laptop:~/programmazione$ 
mi potete dire cos'e' successo?  ??? ::)
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Dahman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1013
Iscrizione: mercoledì 31 ottobre 2007, 8:29
Località: Torino

Re: [c] stampa di un disegno nel terminale

Messaggio da Dahman »

Se la funzione print é definita nell'header , allora devi linkare il tuo programma con la relativa libreria altrimenti il compilatore non ne trova l'implementazione, come suggerito dal testo dell'errore.

ciao
dahman
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c] stampa di un disegno nel terminale

Messaggio da cristian_c »

@dahmann,
cosa devo aggiungere di preciso in gcc?
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
mous16
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3940
Iscrizione: mercoledì 25 ottobre 2006, 15:51
Sesso: Maschile

Re: [c] stampa di un disegno nel terminale

Messaggio da mous16 »

era voluto l'uso di print, o voleva essere un printf con un errore di battitura?
Pagine personali: Forum Ubuntu-it - Wiki Ubuntu-it - Launchpad
Solo/mous16
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c] stampa di un disegno nel terminale

Messaggio da cristian_c »

mous16 ha scritto: era voluto l'uso di print, o voleva essere un printf con un errore di battitura?
ah,grazie, ora ho corretto  :-[

Dopo averlo compilato l'ho eseguito.
Nel caso dell'opzione 1 va tutto bene, ma se provo con l'opzione 2 il cursore si muove in basso a sinistra e tutto l'output è cancellato.
Potete provarlo anche voi e cercare di capire cosa c'e' che non va?  ::) ::) ::) ::)
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c] stampa di un disegno nel terminale

Messaggio da cristian_c »

ho provato ad eseguire il programma con gdb, anche se non ha funzionato come dovrebbe step by step  :-\
Però è uscito comunque qualcosa di interessante per quanto riguarda il bug:

Codice: Seleziona tutto

(gdb) file domino
Reading symbols from /home/cristiancozzolino/programmazione/domino...done.
(gdb) break main
Breakpoint 1 at 0x804863b
(gdb) run
Starting program: /home/cristiancozzolino/programmazione/domino 

Breakpoint 1, 0x0804863b in main ()
Current language:  auto; currently asm
(gdb) next
Single stepping until exit from function main, 
which has no line number information.

   *** PROGRAMMA PER LA RAPPRESENTAZIONE DELLE TESSERE DEL DOMINO ***


Premere:
1- Per visualizzare una tessera in particolare
2- Per visualizzare l'intero set di tessere

							Scelta:2
Visualizzazione delle 28 tessere in corso.Premere un tasto per continuare...
    |     
    |     
*   |     
*   |     
* * |     
* * |     
* * |     
    |    
 *  |     
    |     
 *  |     
    |     
 *  |     
* * |     
 *  |  *  
    |  * 
    |     
  * |     
  * |     
* * |     
* * |     
* * |     
^Z
Program received signal SIGTSTP, Stopped (user).
0x08048a0f in main ()
(gdb) 

secondo voi che cosa puo' voler dire?  ::)
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c] stampa di un disegno nel terminale

Messaggio da cristian_c »

ciao,
allora ho capito che non posso modificare i e j all'interno del ciclo for.
Avete un'idea per risolvere il problema?

Edit:
ho modificato il programma:

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <linux/termios.h>

int colonne()
{
    int fd = fileno(stdin);
    struct winsize s;

    if (!isatty(fd)) {
        fprintf(stderr, "Not a terminal\n");
        exit(1);
    }
    ioctl(fd, TIOCGWINSZ, &s);
    return s.ws_col;
}

main()
{
 int t1,t2;
 char c;
 int col,rig;
 int i,j,iold,jold,q,cont;
 printf("\n   *** PROGRAMMA PER LA RAPPRESENTAZIONE DELLE TESSERE DEL DOMINO ***\n\n");
 printf("\nPremere:\n1- Per visualizzare una tessera in particolare\n2- Per visualizzare l'intero set di tessere\n\n");
 printf("\t\t\t\t\t\t\tScelta:");
 scanf("%c",&c);
 if (c == '1') {
     printf("\n// l'utente dovrà inserire una coppia di cifre che rappresentano i numeri\n// presenti sulla superficie della tessera che si vuole visualizzare\n\n");
     printf("prima cifra(da 0 a 6): ");
     scanf("%d",&t1);
     printf("seconda cifra(da 0 a 6): ");
     scanf("%d",&t2);
     if ((t1>=0 && t1<=6) && (t2>=0 && t2<=6)) {
         printf("\n"); 
         if (t1==0 || t1==1) printf("   ");
         if (t1==2 || t1==3) printf("*  ");
         if (t1==4 || t1==5 || t1==6) printf("* *");
         printf(" | ");
         if (t2==0 || t2==1) printf("   ");
         if (t2==2 || t2==3) printf("*  ");
         if (t2==4 || t2==5 || t2==6) printf("* *");
         printf("\n");
         if (t1==1 || t1==3 || t1==5) printf(" * ");
         if (t1==0 || t1==2 || t1==4) printf("   ");
         if (t1==6) printf("* *");
         printf(" | ");
         if (t2==1 || t2==3 || t2==5) printf(" * ");
         if (t2==0 || t2==2 || t2==4) printf("   ");
         if (t2==6) printf("* *"); 
         printf("\n");
         if (t1==0 || t1==1) printf("   ");
         if (t1==2 || t1==3) printf("  *");
         if (t1==4 || t1==5 || t1==6) printf("* *");
         printf(" | ");
         if (t2==0 || t2==1) printf("   ");
         if (t2==2 || t2==3) printf("  *");
         if (t2==4 || t2==5 || t2==6) printf("* *"); 
         printf("\n\n"); 
     }
 }
 if (c == '2') {
     printf("Visualizzazione delle 28 tessere in corso.Premere un tasto per continuare...");
     scanf("%c",&c);
     col=colonne();
     q=col/9;
     if (q*9+q-1>col) q=q-1;
     cont=1;
     rig=0;
     iold=0;
     jold=0;
     i=0;
     j=0;
     while (j<7) 
       while(i<7) {
             if (cont%q==1 || cont!=1) printf("\n");  
             if (rig==0) {
                 if (i==0 || i==1) printf("   ");
                 if (i==2 || i==3) printf("*  ");
                 if (i==4 || i==5 || i==6) printf("* *");
                 printf(" | ");
                 if (j==0 || j==1) printf("   ");
                 if (j==2 || j==3) printf("*  ");
                 if (j==4 || j==5 || j==6) printf("* *");
             }
             if (rig==1) {
                 if (i==1 || i==3 || i==5) printf(" * ");
                 if (i==0 || i==2 || i==4) printf("   ");
                 if (i==6) printf("* *");
                 printf(" | ");
                 if (j==1 || j==3 || j==5) printf(" * ");
                 if (j==0 || j==2 || j==4) printf("   ");
                 if (j==6) printf("* *"); 
             }
             if (rig==2) {
                 if (i==0 || i==1) printf("   ");
                 if (i==2 || i==3) printf("  *");
                 if (i==4 || i==5 || i==6) printf("* *");
                 printf(" | ");
                 if (j==0 || j==1) printf("   ");
                 if (j==2 || j==3) printf("  *");
                 if (j==4 || j==5 || j==6) printf("* *");                           
             }
             if (cont%q==0) {
                 if (rig==3) {
                     iold=i; jold=j;
                     rig==-1;
                 }
                 i=iold; j=jold;
                 rig++;
             }
             if (cont%q!=0) printf(" ");
             i++;
             j++;
             cont++;
       }
     printf("\n\n");         
 }
}
e già l'output è migliorato rispetto a prima:

Codice: Seleziona tutto

cristiancozzolino@cristiancozzolino-laptop:~/programmazione$ ./domino

   *** PROGRAMMA PER LA RAPPRESENTAZIONE DELLE TESSERE DEL DOMINO ***


Premere:
1- Per visualizzare una tessera in particolare
2- Per visualizzare l'intero set di tessere

							Scelta:2
Visualizzazione delle 28 tessere in corso.Premere un tasto per continuare...
    |     
    |     
*   | *   
*   | *   
* * | * * 
* * | * * 
* * | * * 

cristiancozzolino@cristiancozzolino-laptop:~/programmazione$ 

Idee e/o suggerimenti per risolvere il problema?  ???
Ultima modifica di cristian_c il venerdì 26 dicembre 2008, 20:00, modificato 1 volta in totale.
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c] stampa di un disegno nel terminale

Messaggio da cristian_c »

Ho modificato il programma. Ho portato il j++ dal ciclo più interno a quello più esterno.

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <linux/termios.h>

int colonne()
{
    int fd = fileno(stdin);
    struct winsize s;

    if (!isatty(fd)) {
        fprintf(stderr, "Not a terminal\n");
        exit(1);
    }
    ioctl(fd, TIOCGWINSZ, &s);
    return s.ws_col;
}

main()
{
 int t1,t2;
 char c;
 int col,rig;
 int i,j,iold,jold,q,cont;
 printf("\n   *** PROGRAMMA PER LA RAPPRESENTAZIONE DELLE TESSERE DEL DOMINO ***\n\n");
 printf("\nPremere:\n1- Per visualizzare una tessera in particolare\n2- Per visualizzare l'intero set di tessere\n\n");
 printf("\t\t\t\t\t\t\tScelta:");
 scanf("%c",&c);
 if (c == '1') {
     printf("\n// l'utente dovrà inserire una coppia di cifre che rappresentano i numeri\n// presenti sulla superficie della tessera che si vuole visualizzare\n\n");
     printf("prima cifra(da 0 a 6): ");
     scanf("%d",&t1);
     printf("seconda cifra(da 0 a 6): ");
     scanf("%d",&t2);
     if ((t1>=0 && t1<=6) && (t2>=0 && t2<=6)) {
         printf("\n"); 
         if (t1==0 || t1==1) printf("   ");
         if (t1==2 || t1==3) printf("*  ");
         if (t1==4 || t1==5 || t1==6) printf("* *");
         printf(" | ");
         if (t2==0 || t2==1) printf("   ");
         if (t2==2 || t2==3) printf("*  ");
         if (t2==4 || t2==5 || t2==6) printf("* *");
         printf("\n");
         if (t1==1 || t1==3 || t1==5) printf(" * ");
         if (t1==0 || t1==2 || t1==4) printf("   ");
         if (t1==6) printf("* *");
         printf(" | ");
         if (t2==1 || t2==3 || t2==5) printf(" * ");
         if (t2==0 || t2==2 || t2==4) printf("   ");
         if (t2==6) printf("* *"); 
         printf("\n");
         if (t1==0 || t1==1) printf("   ");
         if (t1==2 || t1==3) printf("  *");
         if (t1==4 || t1==5 || t1==6) printf("* *");
         printf(" | ");
         if (t2==0 || t2==1) printf("   ");
         if (t2==2 || t2==3) printf("  *");
         if (t2==4 || t2==5 || t2==6) printf("* *"); 
         printf("\n\n"); 
     }
 }
 if (c == '2') {
     printf("Visualizzazione delle 28 tessere in corso.Premere un tasto per continuare...");
     scanf("%c",&c);
     col=colonne();
     q=col/9;
     if (q*9+q-1>col) q=q-1;
     cont=1;
     rig=0;
     iold=0;
     jold=0;
     i=0;
     j=0;
     while (j<7) {
       while(i<7) {
             if (cont%q==1 || cont!=1) printf("\n");  
             if (rig==0) {
                 if (i==0 || i==1) printf("   ");
                 if (i==2 || i==3) printf("*  ");
                 if (i==4 || i==5 || i==6) printf("* *");
                 printf(" | ");
                 if (j==0 || j==1) printf("   ");
                 if (j==2 || j==3) printf("*  ");
                 if (j==4 || j==5 || j==6) printf("* *");
             }
             if (rig==1) {
                 if (i==1 || i==3 || i==5) printf(" * ");
                 if (i==0 || i==2 || i==4) printf("   ");
                 if (i==6) printf("* *");
                 printf(" | ");
                 if (j==1 || j==3 || j==5) printf(" * ");
                 if (j==0 || j==2 || j==4) printf("   ");
                 if (j==6) printf("* *"); 
             }
             if (rig==2) {
                 if (i==0 || i==1) printf("   ");
                 if (i==2 || i==3) printf("  *");
                 if (i==4 || i==5 || i==6) printf("* *");
                 printf(" | ");
                 if (j==0 || j==1) printf("   ");
                 if (j==2 || j==3) printf("  *");
                 if (j==4 || j==5 || j==6) printf("* *");                           
             }
             if (cont%q==0) {
                 if (rig==3) {
                     iold=i; jold=j;
                     rig==-1;
                 }
                 i=iold; j=jold;
                 rig++;
             }
             if (cont%q!=0) printf(" ");
             i++;
             cont++;
       }
       j++;
     }  
     printf("\n\n");         
 }
}
L'output è di nuovo cambiato  :o  :

Codice: Seleziona tutto

cristiancozzolino@cristiancozzolino-laptop:~/programmazione$ ./domino

   *** PROGRAMMA PER LA RAPPRESENTAZIONE DELLE TESSERE DEL DOMINO ***


Premere:
1- Per visualizzare una tessera in particolare
2- Per visualizzare l'intero set di tessere

							Scelta:2
Visualizzazione delle 28 tessere in corso.Premere un tasto per continuare...
    |     
    |     
*   |     
*   |     
* * |     
* * |     
* * |     

cristiancozzolino@cristiancozzolino-laptop:~/programmazione$ 

Qualche idea?  :)
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c] stampa di un disegno nel terminale

Messaggio da cristian_c »

In questa nuova versione del programma ci sono diversi bugfixes(eh!Sto parlando come uno sviluppatore!  :P ):

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <linux/termios.h>

int colonne()
{
    int fd = fileno(stdin);
    struct winsize s;

    if (!isatty(fd)) {
        fprintf(stderr, "Not a terminal\n");
        exit(1);
    }
    ioctl(fd, TIOCGWINSZ, &s);
    return s.ws_col;
}

main()
{
 int t1,t2;
 char c;
 int col,rig;
 int i,j,iold,jold,q,cont;
 printf("\n   *** PROGRAMMA PER LA RAPPRESENTAZIONE DELLE TESSERE DEL DOMINO ***\n\n");
 printf("\nPremere:\n1- Per visualizzare una tessera in particolare\n2- Per visualizzare l'intero set di tessere\n\n");
 printf("\t\t\t\t\t\t\tScelta:");
 scanf("%c",&c);
 if (c == '1') {
     printf("\n// l'utente dovrà inserire una coppia di cifre che rappresentano i numeri\n// presenti sulla superficie della tessera che si vuole visualizzare\n\n");
     printf("prima cifra(da 0 a 6): ");
     scanf("%d",&t1);
     printf("seconda cifra(da 0 a 6): ");
     scanf("%d",&t2);
     if ((t1>=0 && t1<=6) && (t2>=0 && t2<=6)) {
         printf("\n"); 
         if (t1==0 || t1==1) printf("   ");
         if (t1==2 || t1==3) printf("*  ");
         if (t1==4 || t1==5 || t1==6) printf("* *");
         printf(" | ");
         if (t2==0 || t2==1) printf("   ");
         if (t2==2 || t2==3) printf("*  ");
         if (t2==4 || t2==5 || t2==6) printf("* *");
         printf("\n");
         if (t1==1 || t1==3 || t1==5) printf(" * ");
         if (t1==0 || t1==2 || t1==4) printf("   ");
         if (t1==6) printf("* *");
         printf(" | ");
         if (t2==1 || t2==3 || t2==5) printf(" * ");
         if (t2==0 || t2==2 || t2==4) printf("   ");
         if (t2==6) printf("* *"); 
         printf("\n");
         if (t1==0 || t1==1) printf("   ");
         if (t1==2 || t1==3) printf("  *");
         if (t1==4 || t1==5 || t1==6) printf("* *");
         printf(" | ");
         if (t2==0 || t2==1) printf("   ");
         if (t2==2 || t2==3) printf("  *");
         if (t2==4 || t2==5 || t2==6) printf("* *"); 
         printf("\n\n"); 
     }
 }
 if (c == '2') {
     printf("Visualizzazione delle 28 tessere in corso.Premere un tasto per continuare...");
     c=getchar();
     col=colonne();
     q=col/9;
     if (q*9+q-1>col) q=q-1;
     cont=1;
     rig=0;
     iold=0;
     jold=0;
     j=0;
     while (j<7) {
       i=j;
       while(i<7) {
             if (cont%q==1 && cont!=1) printf("\n");  
             if (rig==0) {
                 if (i==0 || i==1) printf("   ");
                 if (i==2 || i==3) printf("*  ");
                 if (i==4 || i==5 || i==6) printf("* *");
                 printf(" | ");
                 if (j==0 || j==1) printf("   ");
                 if (j==2 || j==3) printf("*  ");
                 if (j==4 || j==5 || j==6) printf("* *");
             }
             if (rig==1) {
                 if (i==1 || i==3 || i==5) printf(" * ");
                 if (i==0 || i==2 || i==4) printf("   ");
                 if (i==6) printf("* *");
                 printf(" | ");
                 if (j==1 || j==3 || j==5) printf(" * ");
                 if (j==0 || j==2 || j==4) printf("   ");
                 if (j==6) printf("* *"); 
             }
             if (rig==2) {
                 if (i==0 || i==1) printf("   ");
                 if (i==2 || i==3) printf("  *");
                 if (i==4 || i==5 || i==6) printf("* *");
                 printf(" | ");
                 if (j==0 || j==1) printf("   ");
                 if (j==2 || j==3) printf("  *");
                 if (j==4 || j==5 || j==6) printf("* *");                           
             }
             if (cont%q==0) {
                 if (rig==2) {
                     iold=i; jold=j;
                     rig=-1;
                 }
                 i=iold; j=jold;
                 rig++;
             }
             if (cont%q!=0) printf(" ");
             i++;
             cont++;
       }
       j++;
     }  
     printf("\n\n");         
 }
}
Adesso l'output è questo:

Codice: Seleziona tutto

cristiancozzolino@cristiancozzolino-laptop:~/programmazione$ ./domino
   *** PROGRAMMA PER LA RAPPRESENTAZIONE DELLE TESSERE DEL DOMINO ***


Premere:
1- Per visualizzare una tessera in particolare
2- Per visualizzare l'intero set di tessere

							Scelta:2
Visualizzazione delle 28 tessere in corso.Premere un tasto per continuare...    
|         |     *   |     *   |     * * |     * * |     * * |         |    
 *  |         |      *  |         |      *  |     * * |      *  |  *      |  * 
    |       * |       * |     * * |     * * |     * * |         |       * |    
*   |     * * |     * * |     * * |     *   | *   *   | *   * * | *   * * | *  
 *  |  *      |  *   *  |  *  * * |  *      |      *  |         |      *  |    
  * |     * * |     * * |     * * |       * |   *   * |   * * * |   * * * |   *
* * | *   *   | *   * * | *   * * | *   * * | *   * * | * * * * | * * * * | * *
* * |      *  |  *      |  *   *  |  *  * * |  *      |      *  |     * * |    
* * |   *   * |   * * * |   * * * |   * * * |   * * * | * * * * | * * * * | * *
* * | * * * * | * * * * | * * 

cristiancozzolino@cristiancozzolino-laptop:~/programmazione$ 

Ci siamo quasi. Ora il problema è quel getchar nella linea:

Codice: Seleziona tutto

     printf("Visualizzazione delle 28 tessere in corso.Premere un tasto per continuare...");
     c=getchar();
Qualcuno puo' aiutarmi a impostare bene quel getchar che evidentemente non funziona?  :(
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti