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

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

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

) 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
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
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.