[c] stampa di un disegno nel terminale
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
[c] stampa di un disegno nel terminale
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?
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?
- mous16
- Imperturbabile Insigne

- Messaggi: 3940
- Iscrizione: mercoledì 25 ottobre 2006, 15:51
- Sesso: Maschile
Re: [c] stampa di un disegno nel terminale
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
Re: [c] stampa di un disegno nel terminale
come mai dici che con la printf non puoi stampare a video quella cosa??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?
printf(" * | * *"+'\n'+" * | *"+'\n'+" * | * *");
Impossible is 0.
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c] stampa di un disegno nel terminale
@ 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
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
- mous16
- Imperturbabile Insigne

- Messaggi: 3940
- Iscrizione: mercoledì 25 ottobre 2006, 15:51
- Sesso: Maschile
Re: [c] stampa di un disegno nel terminale
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
- crap0101
- 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
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
- 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
Re: [c] stampa di un disegno nel terminale
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.
- mous16
- Imperturbabile Insigne

- Messaggi: 3940
- Iscrizione: mercoledì 25 ottobre 2006, 15:51
- Sesso: Maschile
Re: [c] stampa di un disegno nel terminale
si, bene, ma cristian_c si è dimenticato di darci il testo del problema...
Re: [c] stampa di un disegno nel terminale
bhe nn era qst che doveva fare? stampare le tessere del domino scelte dall'utente?mous16 ha scritto: si, bene, ma cristian_c si è dimenticato di darci il testo del problema...
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c] stampa di un disegno nel terminale
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:
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.
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");
}
}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.
- mous16
- Imperturbabile Insigne

- Messaggi: 3940
- Iscrizione: mercoledì 25 ottobre 2006, 15:51
- Sesso: Maschile
Re: [c] stampa di un disegno nel terminale
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...
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c] stampa di un disegno nel terminale
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
).
Ecco il codice sorgente del programma:
Ho provato a compilarlo,ma ottengo un fallimento:
mi potete dire cos'e' successo? ??? ::)
Ho trovato il modo per calcolare il numero di colonne nel terminale(un sincero grazie ad enzotib
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++;
}
}
}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$
-
Dahman
- Entusiasta Emergente

- Messaggi: 1013
- Iscrizione: mercoledì 31 ottobre 2007, 8:29
- Località: Torino
Re: [c] stampa di un disegno nel terminale
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
ciao
dahman
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c] stampa di un disegno nel terminale
@dahmann,
cosa devo aggiungere di preciso in gcc?
cosa devo aggiungere di preciso in gcc?
- mous16
- Imperturbabile Insigne

- Messaggi: 3940
- Iscrizione: mercoledì 25 ottobre 2006, 15:51
- Sesso: Maschile
Re: [c] stampa di un disegno nel terminale
era voluto l'uso di print, o voleva essere un printf con un errore di battitura?
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c] stampa di un disegno nel terminale
ah,grazie, ora ho corretto :-[mous16 ha scritto: era voluto l'uso di print, o voleva essere un printf con un errore di battitura?
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? ::) ::) ::) ::)
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c] stampa di un disegno nel terminale
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:
secondo voi che cosa puo' voler dire? ::)
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)
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c] stampa di un disegno nel terminale
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:
e già l'output è migliorato rispetto a prima:
Idee e/o suggerimenti per risolvere il problema? ???
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");
}
}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$
Ultima modifica di cristian_c il venerdì 26 dicembre 2008, 20:00, modificato 1 volta in totale.
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c] stampa di un disegno nel terminale
Ho modificato il programma. Ho portato il j++ dal ciclo più interno a quello più esterno.
L'output è di nuovo cambiato
:
Qualche idea? 
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");
}
}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$
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c] stampa di un disegno nel terminale
In questa nuova versione del programma ci sono diversi bugfixes(eh!Sto parlando come uno sviluppatore! :P ):
Adesso l'output è questo:
Ci siamo quasi. Ora il problema è quel getchar nella linea:
Qualcuno puo' aiutarmi a impostare bene quel getchar che evidentemente non funziona? 
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");
}
}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$
Codice: Seleziona tutto
printf("Visualizzazione delle 28 tessere in corso.Premere un tasto per continuare...");
c=getchar();Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti
