Repository 32bit  Forum
Repository 64bit  Wiki

[C] - Creare quadrato con caratteri - [RISOLTO]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

[C] - Creare quadrato con caratteri - [RISOLTO]

Messaggioda SIV » dom lug 19, 2009 0:57

Ragazzi devo fare una stupidaggine in C.

Inserito un numero(side) ed un carattere(c) deve venire fuori un quadrato con dimensioni side*side, formato dal carattere c.

Ho scritto questo, ma non funge:
Codice: Seleziona tutto
 #include<stdio.h>

 int main(){
 int side=0,i=0;
 char c;

 printf("Inserisci il lato del quadrato:");
 scanf("%d",&side);
 printf("\nInserisci il carattere da visualizzare:");
 scanf("%c",&c);
 for (i=0; i<(side*side); i++){
 if(i%side==0){printf("\n");}
 printf("%c",c);
 }
 printf("\n\n");
 return 0;
 }


L'output che mi viene fuori è qualcosa de genere:
Codice: Seleziona tutto
muller@sab-muller ~/Test C $ ./a.out
Inserisci il lato del quadrato:3

Inserisci il carattere da visualizzare:













muller@sab-muller ~/Test C $


Non mi fa neanche immettere il carattere!

Però se sostituisco il carattere (c) ad un intero, così:
Codice: Seleziona tutto
#include<stdio.h>

 int main(){
 int side=0,i=0;
 int c;

 printf("Inserisci il lato del quadrato:");
 scanf("%d",&side);
 printf("\nInserisci il carattere da visualizzare:");
 scanf("%d",&c);
 for (i=0; i<(side*side); i++){
 if(i%side==0){printf("\n");}
 printf("%d",c);
 }
 printf("\n\n");
 return 0;
 }


Funge, difatti l'output è:
Codice: Seleziona tutto
muller@sab-muller ~/Test C $ ./a.out
Inserisci il lato del quadrato:3

Inserisci il carattere da visualizzare:3

333
333
333

muller@sab-muller ~/Test C $
Ultima modifica di SIV il dom lug 19, 2009 2:59, modificato 1 volta in totale.
Avatar utente
SIV
Linux 2.6
Linux 2.6
 
Messaggi: 918
Iscritto il: mer apr 25, 2007 13:07
Località: Bari (Provincia)

Re: [C] - Creare quadrato con caratteri

Messaggioda metrofox » dom lug 19, 2009 1:37

Non puoi utilizzare scanf per un carattere, prova con getchar():

Codice: Seleziona tutto
#include<stdio.h>

int main(){
int side=0,i=0;
char c;

printf("Inserisci il lato del quadrato:");
scanf("%d",&side);
printf("\nInserisci il carattere da visualizzare:");
for (i=0; (c=getchar() != \n) && i<(side*side); i++){
if(i%side==0){printf("\n");}
printf("%c",c);
}
printf("\n\n");
return 0;
}


Sono anche io alle prime armi col C e per ora non ho possibilità di compilare :) Prova tu...
Avatar utente
metrofox
Linux 2.6
Linux 2.6
 
Messaggi: 758
Iscritto il: gio ago 07, 2008 11:29
Slackware: slackware64-current
Kernel: 3.4.4-ck3
Desktop: FluxBox-1.3.1
Distribuzione: FreeBSD-8.1(amd64)

Re: [C] - Creare quadrato con caratteri

Messaggioda SIV » dom lug 19, 2009 1:52

Grazie della risposta.

Nel tuo source mi segnala subito un errore a quel != \n

Quindi l'ho messo tra virgolette:
Codice: Seleziona tutto
#include<stdio.h>

int main(){
int side=0,i=0;
char c;

printf("Inserisci il lato del quadrato:");
scanf("%d",&side);
printf("\nInserisci il carattere da visualizzare:");
for (i=0; (c=getchar() != "\n") && i<(side*side); i++){
if(i%side==0){printf("\n");}
printf("%c",c);
}
printf("\n\n");
return 0;
}


Ma l'errore è:
Codice: Seleziona tutto
muller@sab-muller ~/Test C $ gcc prova.c
prova.c: In function ‘main’:
prova.c:10: warning: comparison between pointer and integer
muller@sab-muller ~/Test C $


Mentre se metto solo tra apici:
Codice: Seleziona tutto
for (i=0; (c=getchar() != '\n') && i<(side*side); i++){


L'output è:
Codice: Seleziona tutto
muller@sab-muller ~/Test C $ ./a.out
Inserisci il lato del quadrato:3

Inserisci il carattere da visualizzare:

muller@sab-muller ~/Test C $
Ultima modifica di SIV il dom lug 19, 2009 1:55, modificato 1 volta in totale.
Avatar utente
SIV
Linux 2.6
Linux 2.6
 
Messaggi: 918
Iscritto il: mer apr 25, 2007 13:07
Località: Bari (Provincia)

Re: [C] - Creare quadrato con caratteri

Messaggioda targzeta » dom lug 19, 2009 1:54

L'errore mi sembra che sia un altro, la scanf potrebbe essere usata, anche se sconsigliata. Se mi date un attimo ve lo dico, solo che alle 3:00 di notte...il cervello dorme :)

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6168
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [C] - Creare quadrato con caratteri

Messaggioda targzeta » dom lug 19, 2009 2:08

Ho provato a fare di meglio ma il codice è questo
Codice: Seleziona tutto
#include<stdio.h>

int main()
{
  int side, i;
  char c;

  printf("Inserisci il lato del quadrato: ");
  scanf("%d", &side);

  printf("\nInserisci il carattere da visualizzare: ");
  scanf("\n%c", &c);

  for (i=0; i<(side*side); i++)
    {
      if(i%side==0)
     printf("\n");
      printf("%c",c);
    }
  printf("\n\n");

  return 0;
}
e dovrebbe funzionare.

Il problema sta nel fatto che tu richiedi a scanf di leggerti un intero (prima invocazione) e di metterlo in side. Però tu da tastiera gli passi sia l'intero che il '\n' un carattere. Quindi la prossima invocazione di scanf, che guarda caso voleva un carattere, si becca il '\n'.

Almeno questo è quello che sembra, ma a quest'ora è difficile essere lucidi :),
Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6168
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [C] - Creare quadrato con caratteri

Messaggioda SIV » dom lug 19, 2009 2:15

Sì funziona!

Quindi il nocciolo sta in:
Codice: Seleziona tutto
scanf("\n%c", &c);


Passando anche \n al carattere c :-k
Ultima modifica di SIV il dom lug 19, 2009 2:20, modificato 2 volte in totale.
Avatar utente
SIV
Linux 2.6
Linux 2.6
 
Messaggi: 918
Iscritto il: mer apr 25, 2007 13:07
Località: Bari (Provincia)

Re: [C] - Creare quadrato con caratteri

Messaggioda targzeta » dom lug 19, 2009 2:20

No, io dico a scanf che si deve aspettare in input un carattere '\n' e poi un carattere, quest'ultimo lo deve mettere in c. Funzionerebbe anche se al posto di '\n%c' della scanf ci metti, prima della scanf un
Codice: Seleziona tutto
getchar()
per fare il flush dello stdin. Non so se mi sono spiegato meglio.

In pratica questo codice funziona:
Codice: Seleziona tutto
#include<stdio.h>

int main()
{
  int side, i;
  char c;

  printf("Inserisci il lato del quadrato: ");
  scanf("%d", &side);

  getchar();

  printf("\nInserisci il carattere da visualizzare: ");
  scanf("%c", &c);

  for (i=0; i<(side*side); i++)
    {
      if(i%side==0)
     printf("\n");
      printf("%c",c);
    }
  printf("\n\n");

  return 0;
}


Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6168
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [C] - Creare quadrato con caratteri

Messaggioda SIV » dom lug 19, 2009 2:25

Sì.

Ho provato anche mettendo getchar() prima della prima scanf e funge:
Codice: Seleziona tutto
#include<stdio.h>

int main()
{
  int side, i;
  char c;


 printf("\nInserisci il carattere da visualizzare: ");
 c=getchar();

  printf("Inserisci il lato del quadrato: ");
  scanf("%d", &side);

  for (i=0; i<(side*side); i++)
    {
      if(i%side==0)
     printf("\n");
      printf("%c",c);
    }
  printf("\n\n");

  return 0;
}


Ora mi segno giusto questo appunto sul libro :thumbright: :thumbright:

Comunque in pratica ho capito, ma in teoria, cosa significa:
fare il flush dello stdin

?
Avatar utente
SIV
Linux 2.6
Linux 2.6
 
Messaggi: 918
Iscritto il: mer apr 25, 2007 13:07
Località: Bari (Provincia)

Re: [C] - Creare quadrato con caratteri

Messaggioda targzeta » dom lug 19, 2009 2:35

In parole povere vuol dire ripulirlo dalle schifezze. Il problema è che la prima scanf si legge solo il numero che gli hai inserito, ad esempio 5. Ma tu con la tastiera hai premuto due tasti il 5 e l'enter, ovvero '5\n' la scanf non elimina il '\n' dallo standard input (stdin) che quindi rimane lì. La seconda scanf non si mette neanche ad aspettare niente dallo stdin perchè trova il \'n'.
Non so, non vorrei confonderti oltre :). In pratica la scanf blocca il terminale perchè si mette a leggere sullo stdin che è vuoto, ma se questo è pieno non si mette ad aspettare, lo legge.
Un altro esempio per capire meglio (sempre esempi delle 3:00 di notte) è quello di eseguire il tuo codice originale, ma alla prima domanda, invece di rispondere solo con il numero, rispondi anche con un carattere, ad esempio inserisci '5d' e vedrai che lui ti fa una matrice 5x5 di caratteri 'd'.

Notte e in bocca al lupo :),
Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6168
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [C] - Creare quadrato con caratteri

Messaggioda SIV » dom lug 19, 2009 2:58

Capito tutto!

Grazie Emanuele e buona domenica visto che ci siamo :) :) :thumbright: :thumbright: :thumbright:
Avatar utente
SIV
Linux 2.6
Linux 2.6
 
Messaggi: 918
Iscritto il: mer apr 25, 2007 13:07
Località: Bari (Provincia)

Re: [C] - Creare quadrato con caratteri - [RISOLTO]

Messaggioda metrofox » dom lug 19, 2009 11:41

Ste cose servono anche a me, grazie :D
Avatar utente
metrofox
Linux 2.6
Linux 2.6
 
Messaggi: 758
Iscritto il: gio ago 07, 2008 11:29
Slackware: slackware64-current
Kernel: 3.4.4-ck3
Desktop: FluxBox-1.3.1
Distribuzione: FreeBSD-8.1(amd64)


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron