Pagina 1 di 2

Problemi con variabili char (linguaggio C)

MessaggioInviato: 26 giu 2017, 10:08
da Luigi97
Salve,
Allora, sto leggendo un pdf online sul linguaggio C, all'interno di esso ci sono anche degli esercizi, solo però non riesco a svolgere uno di essi perché non riesco a capire dove ho sbagliato.
L'esercizio mi chiede di stampare un rettangolo o un quadrato, e di scegliere anche i caratteri con cui tale rettangolo o quadrato deve essere composto (poi mi chiede anche di far visualizzare il rettangolo o quadrato per il numero di volte scelto dall'utente, ma per il momento non ci ho pensato a come fare. Vorrei prima risolvere questa cosa sulle variabili char)
L'esercizio l'ho provato a svolgere così:
Codice: Seleziona tutto
   
#include <stdlib.h>

/* Permettere all'utente di comporre un rettangolo e di decidere anche i caratteri che devono comporre la cornice
e la parte interna del rettangolo e quante volte debba essere ripetuta la visualizzazione del rettangolo. */

int main(void) {
        int a;
   int b;
   int c;
   int x;     /* numero di colonne scelto dall'utente */ 
   int y;     /* numero di righe scelto dall'utente */
   char d;    /* carattere cornice scelto dall'utente */
   char e;    /* carattere parte interna scelto dall'utente */
   
   printf("Inserisci il numero delle colonne: ");
   scanf("%d", &x);
   printf("Inserisci il numero delle righe: ");
   scanf("%d", &y);
   printf("Inserisci il carattere della cornice: ");
   scanf("%c", &d);
   printf("Inserisci il carattere della parte interna: ");
   scanf("%c", &e);
   
for(a=x; a>0; a--){
    printf("%c ", d);   /* viene stampata la prima riga orizzontale (parte alta della cornice) */
}
for(a=y; a>0; a--){     
   printf("\n%c", d);  /* viene stampata la parte sinistra della cornice */
for(b=x-2; b>0; b--)
    printf(" %c", e);   /* viene stampata la parte interna */
for(c=1; c>0; c-- )
    printf(" %c", d);   /* viene stampata la parte destra della cornice */
}
    printf("\n");
for(a=x; x>0; x--){
    printf("%c ", d);   /* viene stampata la parte bassa della cornice */
}
   
   return 0;
}


Un'altra cosa che non capisco sulle variabili char è dato dal seguente programma:
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>

/* */

int main(void) {
    char c;
   
for(c=0; c<=127; c++){
    printf("%d = %c \n", c, c);
}
   
   return 0;
}

E' un programma che dovrebbe permettere di far apparire tutti i caratteri del codice ASCII con i relativi numeri di appartenenza. Solo però, se la variabile è di tipo char, da il numero 127 in poi il programma inizia a stampare all'infinito. E stampa in modo strano. Se nel ciclo for metto <127, stampa bene fino a 126. Ma se appunto metto <=127, allora stampa all'infinito :?
Da notare che se la variabile la dichiaro int, allora stampa bene fino al numero desiderato.
E poi non ho capito perché mi suona l'allarme anche se non inserisco \a ! Ma che...?

Ho già visto i vari tutorial in internet sulle variabili char, ma il tema in questione non lo trattano. Potete spiegarmi voi cos'è che non va?

Re: Problemi con variabili char (linguaggio C)

MessaggioInviato: 26 giu 2017, 10:11
da fairyvilje
unsigned char va fra 0 e 255
char va fra -128 e 127.

Impostando la soglia a 128 non raggiungerai mai quel valore. E quindi ciclo infinito.

Re: Problemi con variabili char (linguaggio C)

MessaggioInviato: 26 giu 2017, 10:16
da Luigi97
fairyvilje ha scritto:unsigned char va fra 0 e 255
char va fra -128 e 127.

Ah ecco :D ! Ho provato e funziona, solo però è fino a 254.
Grazie!

Re: Problemi con variabili char (linguaggio C)

MessaggioInviato: 26 giu 2017, 10:21
da Luigi97
Comunque mi so dimenticato di dire che il primo programma mi si blocca quando devono apparire i printf delle variabili char. In pratica appaiono entrambi nello stesso momento e mi fa stampare solo i caratteri interni.

Re: Problemi con variabili char (linguaggio C)

MessaggioInviato: 27 giu 2017, 8:57
da Luigi97
Però anche così
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>

/* Tabella codice ASCII */

int main(void) {
      int x;
      char c;
      
      printf("Tabella codice ASCII");
      
for(x=0, c=0; x<=255 && c<=255; x++, c++){
    printf("%d = %c \n", x, c);
}
      
   
   return 0;
}

funziona bene.

Comunque il primo programma è un mistero (almeno per me).

Re: Problemi con variabili char (linguaggio C)

MessaggioInviato: 27 giu 2017, 10:56
da AjeieBrazov
Prova a cambiare la dichiarazione
Codice: Seleziona tutto
char c;

in
Codice: Seleziona tutto
unsigned char c;

e vedrai che funziona.
Dopo aver visto che funziona ripassati i tipi standard. Come già detto prima "char" può assumere valori da -128 a +127, mentre "unsigned char" può assumere valori da 0 a 255.

Re: Problemi con variabili char (linguaggio C)

MessaggioInviato: 27 giu 2017, 12:25
da Luigi97
AjeieBrazov ha scritto:Prova a cambiare la dichiarazione
Codice: Seleziona tutto
char c;

in
Codice: Seleziona tutto
unsigned char c;

e vedrai che funziona.

Nel secondo programma funziona unsigned char, già ho provato :ok: . Ciò che per me adesso è un mistero è il primo programma. Per il primo intendo quello che ho postato all'inizio del messaggio. Quello che quando dovrei inserire le variabili char appaiono entrambi i printf e mi fa stampare solo la parte interna :?

Re: Problemi con variabili char (linguaggio C)

MessaggioInviato: 27 giu 2017, 13:23
da boiler
Quando dichiari la variabile, inzializzala con qualcosa che sicuramente non userai come cornice o come riempimento:
Codice: Seleziona tutto
char d = EOF;    /* carattere cornice scelto dall'utente */
char e = EOF;    /* carattere parte interna scelto dall'utente */


Poi, sostituisci la linea dove leggi il carattere con quanto segue:
Codice: Seleziona tutto
while (d == '\n' || d == EOF)
    {
        d = getchar();
    }


Ovviamente fai lo stesso con la variabile e.

Il problema è che il printf ti lascia qualcosa nel buffer che viene interpretato da scanf come un input (BTW, evita scanf, è una porcheria).

Un'ultima osservazione, quei nomi di variabile sono proprio bruttini. Che ne dici, invece di
Codice: Seleziona tutto
    int x;     /* numero di colonne scelto dall'utente */
    int y;     /* numero di righe scelto dall'utente */
    char d = EOF;    /* carattere cornice scelto dall'utente */
    char e = EOF;    /* carattere parte interna scelto dall'utente */

di usare questi?
Codice: Seleziona tutto
    int numeroDiColonne;
    int numeroDiRighe;
    char carattereCornice = EOF;
    char carattereInterno = EOF;


Ciao, Boiler

Re: Problemi con variabili char (linguaggio C)

MessaggioInviato: 27 giu 2017, 17:01
da Luigi97
Grazie Foto Utenteboiler, da solo non ci sarei mai riuscito!
Adesso l'esercizio è completo :D
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>

/* Permettere all'utente di comporre un rettangolo e di decidere anche i caratteri che devono comporre la cornice
e la parte interna del rettangolo e quante volte debba essere ripetuta la visualizzazione del rettangolo. */

int main(void) {
   int NC;
   int NR;   
   char cornice = EOF;
   char interno = EOF;
   int CB;
   int CI;
   int CL;
   int DiNuovo;
   int Volte;
   
   printf("Inserisci il numero delle colonne: ");
   scanf("%d", &NC);
   printf("Inserisci il numero delle righe: ");
   scanf("%d", &NR);
   printf("Inserisci il carattere della cornice: ");
while (cornice == '\n' || cornice == EOF){
    cornice = getchar();
}
    printf("Inserisci il carattere della parte interna: ");
while (interno == '\n' || interno == EOF){
    interno = getchar();
}
    printf("Inserisci il numero di volte che vuoi visualizzare il rettangolo o quadrato: ");
    scanf("%d", &Volte);
   
    printf("\n");
   
for(CB=NC+2; CB>0; CB--){
    printf("%c ", cornice);
}
for(CB=NR; CB>0; CB--){
    printf("\n%c", cornice);
for(CI=NC; CI>0; CI--)
    printf(" %c", interno);   
for(CL=1; CL>0; CL-- )
    printf(" %c", cornice);   
}
    printf("\n");
for(CB=NC+2; CB>0; CB--){
    printf("%c ", cornice);   
}
    printf("\n\n");
   
for(DiNuovo=Volte-1; DiNuovo>0; DiNuovo--){
if(DiNuovo>0){
for(CB=NC+2; CB>0; CB--){
    printf("%c ", cornice);
}
for(CB=NR; CB>0; CB--){
    printf("\n%c", cornice);
for(CI=NC; CI>0; CI--)
    printf(" %c", interno);   
for(CL=1; CL>0; CL-- )
    printf(" %c", cornice);   
}
    printf("\n");
for(CB=NC+2; CB>0; CB--){
    printf("%c ", cornice);   
}
   printf("\n\n");
}   
}
   
    return 0;
}

Comunque, sembra che le variabili char, in quel caso, gli si possa attribuire solo il valore "EOF". Ho provato diverse sigle ma mi dà l'errore. Ho dato una breve occhiata in internet e sembra che la sigla EOF abbia a che fare con char e ghetchar. Mi informerò meglio!

Grazie a tutti :ok:

Re: Problemi con variabili char (linguaggio C)

MessaggioInviato: 27 giu 2017, 17:23
da claudiocedrone
:-) End Of File... sono il meno indicato che esista per intromettermi in certe questioni :lol: ma forse potrebbe essere utile questo :roll: . O_/