Pagina 1 di 1

Aiuto su funzioni in C

Inviato: sab 13 ago 2005, 22:19
da elettronicha
Sto imparando a programmare in C. Ho un problemino su questo semplice programma didattico che serve per familiarizzare con le funzioni.

Codice: Seleziona tutto

/* Chiede il lato del quadrato e il carattere da visualizzare e stampa come nell'esempio.
   Es: lato=4, carattere=r             rrrr
				       rrrr
				       rrrr
				       rrrr                                       */

#include <stdio.h>

/* variabili globali */
int size;	/* dimensione lato quadrato */
char character;	/* carattere da visualizzare */
void design ( int size, char character );	/* prototipo funzione */

main()

{
printf("Enter size of the square: ");
scanf("%d", &size);
printf("Enter character: ");
scanf("%c", &character);
design(size, character);	/* chiamo la funzione */

return 0;
}


/* definizione funzione */
void design ( int size_f, char character_f )

{
int i, j;

for ( j = 1; j <= size_f; j++ )

	{
	for ( i = 1; i <= size_f; i++ )
		printf("%c", character_f);
        printf("\n");
	}

return;
}

Cos'ha che non va? Deve essere qualcosa a che fare col tipo carattere, la compilazione non rileva problemi, ma il programma si ferma solo alla richiesta della dimensione del lato e poi non stampa niente.

Grazie in anticipo.

Inviato: dom 14 ago 2005, 0:08
da Sari

Codice: Seleziona tutto

#include <stdio.h>

/* variabili globali */
int size;   /* dimensione lato quadrato */
char character;   /* carattere da visualizzare */
void design ( int size, char character );   /* prototipo funzione */

int main()

{
printf("Enter size of the square: ");
scanf("%d", &size);
printf("Enter character: ");
scanf("%*c"); 
scanf("%c", &character);
design(size, character);   /* chiamo la funzione */

return 0;
}


/* definizione funzione */
void design ( int size_f, char character_f )

{
int i, j;

for ( j = 1; j <= size_f; j++ )

   {
   for ( i = 1; i <= size_f; i++ )
      printf("%c", character_f);
        printf("\n");
   }

return;
} 
così funziona, con scanf("%*c") leggi a vuoto il primo carattere e con scanf("%c", &character) leggi il secondo. Nel buffer infatti in certi casi, tra cui questo, rimane un carattere. Per esempio quì prima della lettura del carattere hai letto un'intero, nel buffer è quindi rimasto un carattere relativo al tasto enter, infatti il tasto enter è codificato con due caratteri (\n\r), ma il lettura viene liberato solo lo \n.
Lo so mi sono spiegato da schifo ma comunque l'importante è che funzi ora :p

Inviato: dom 14 ago 2005, 12:57
da gioco
Un'osservazione che non c'entra col problema: è inutile passare gli argomenti alla funzione design, poichè sono memorizzati in variabili globali e quindi accessibili direttamente da tutto lo scope del file (a meno che non si voglia riutilizzare la funzione design in altri programmi). Scusate la pignoleria :wink:

Inviato: dom 14 ago 2005, 15:04
da elettronicha
@ sari:

funziona anche se sotistuisco " scanf("%*c") " con " scanf(%c)", cioè togliendo il simbolo *. Ho provato. Solo che non capisco una cosa: non è la prima volta che faccio seguire a una printf-scanf un'altra printf-scanf per accquisire dati, e non mi era mai successa una simile cosa. Forse succede per il fatto che avevo acquisito solo interi o float, e col tipo char cambia la questione?


@gioco:

non lo sapevo, ma tu dici che anzicché scrivere

design(size, character);

posso scrivere solo

design;

?

In questo caso non funziona.

Inviato: dom 14 ago 2005, 15:12
da Paoletta
funziona anche se sotistuisco " scanf("%*c") " con " scanf(%c)", cioè togliendo il simbolo *. Ho provato.
è la stessa cosa, perchè tu con entrambi i metodi leggi un carattere a vuoto
Solo che non capisco una cosa: non è la prima volta che faccio seguire a una printf-scanf un'altra printf-scanf per accquisire dati, e non mi era mai successa una simile cosa. Forse succede per il fatto che avevo acquisito solo interi o float, e col tipo char cambia la questione?
sì, cambia perchè leggendo caratteri bisogna condiderare anche i newline!
non lo sapevo, ma tu dici che anzicché scrivere

design(size, character);

posso scrivere solo

design;
no, ma visto che le 2 variabili sono globali non c'è bisogno di scrivere una funzione che le prenda come parametri;

Codice: Seleziona tutto

#include <stdio.h>

/* variabili globali */
int size;   /* dimensione lato quadrato */
char character;   /* carattere da visualizzare */
void design ( );   /* prototipo funzione */

int main()

{
printf("Enter size of the square: ");
scanf("%d", &size);
printf("Enter character: ");
scanf("%*c");
scanf("%c", &character);
design();   /* chiamo la funzione */

return 0;
}


/* definizione funzione */
void design (  )

{
int i, j;

for ( j = 1; j <= size; j++ )

   {
   for ( i = 1; i <= size; i++ )
      printf("%c", character);
        printf("\n");
   }

return;
} 
ciao!

Inviato: lun 15 ago 2005, 15:18
da epd20
Per essere precisi precisi, lo standard ANSI non consigliava per l'acquisizione di caratteri una qualche altra funzione (che ora non ricordo :oops: ) invece di scanf(%c)? Forse era qualcosa del tipo getc() ma non ricordo con precisione scusate.
In quel modo non c'erano i vari problemi con il return...

Inviato: lun 15 ago 2005, 15:32
da elettronicha
getchar(), poi c'è anche la putchar() e altre funzioni per i caratteri, ma...
...ancora non sono arrivato a quel capitolo :D

Grazie a tutti comunque.

Inviato: lun 15 ago 2005, 16:03
da gallows
elettronicha ha scritto:getchar(), poi c'è anche la putchar() e altre funzioni per i caratteri, ma...
...ancora non sono arrivato a quel capitolo :D

Grazie a tutti comunque.
strano nel k&r getchar() è nel primo capitolo, comunque sia buono studio ;)

Inviato: lun 15 ago 2005, 21:25
da elettronicha
Al momento non ho il Kerningham & Ritchie e sto leggendo il Deitel & Deitel e un'altro di autori italiani di cui non ricordo il nome ora. Appena ritorno mi procuro anche quello.