Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problemi con variabili char (linguaggio C)

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[1] Problemi con variabili char (linguaggio C)

Messaggioda Foto UtenteLuigi97 » 26 giu 2017, 10:08

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?
Avatar utente
Foto UtenteLuigi97
40 4
 
Messaggi: 49
Iscritto il: 17 giu 2017, 16:35

1
voti

[2] Re: Problemi con variabili char (linguaggio C)

Messaggioda Foto Utentefairyvilje » 26 giu 2017, 10:11

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.
"640K ought to be enough for anybody" Bill Gates (?) 1981
Qualcosa non ha funzionato...

Lo sapete che l'arroganza in informatica si misura in nanodijkstra? :D
Avatar utente
Foto Utentefairyvilje
15,0k 4 9 12
G.Master EY
G.Master EY
 
Messaggi: 3047
Iscritto il: 24 gen 2012, 19:23

0
voti

[3] Re: Problemi con variabili char (linguaggio C)

Messaggioda Foto UtenteLuigi97 » 26 giu 2017, 10:16

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!
Avatar utente
Foto UtenteLuigi97
40 4
 
Messaggi: 49
Iscritto il: 17 giu 2017, 16:35

0
voti

[4] Re: Problemi con variabili char (linguaggio C)

Messaggioda Foto UtenteLuigi97 » 26 giu 2017, 10:21

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.
Avatar utente
Foto UtenteLuigi97
40 4
 
Messaggi: 49
Iscritto il: 17 giu 2017, 16:35

0
voti

[5] Re: Problemi con variabili char (linguaggio C)

Messaggioda Foto UtenteLuigi97 » 27 giu 2017, 8:57

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).
Avatar utente
Foto UtenteLuigi97
40 4
 
Messaggi: 49
Iscritto il: 17 giu 2017, 16:35

0
voti

[6] Re: Problemi con variabili char (linguaggio C)

Messaggioda Foto UtenteAjeieBrazov » 27 giu 2017, 10:56

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.
Avatar utente
Foto UtenteAjeieBrazov
1.460 4 10
---
 
Messaggi: 586
Iscritto il: 23 mag 2017, 21:53

0
voti

[7] Re: Problemi con variabili char (linguaggio C)

Messaggioda Foto UtenteLuigi97 » 27 giu 2017, 12:25

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 :?
Avatar utente
Foto UtenteLuigi97
40 4
 
Messaggi: 49
Iscritto il: 17 giu 2017, 16:35

0
voti

[8] Re: Problemi con variabili char (linguaggio C)

Messaggioda Foto Utenteboiler » 27 giu 2017, 13:23

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
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5599
Iscritto il: 9 nov 2011, 12:27

0
voti

[9] Re: Problemi con variabili char (linguaggio C)

Messaggioda Foto UtenteLuigi97 » 27 giu 2017, 17:01

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:
Avatar utente
Foto UtenteLuigi97
40 4
 
Messaggi: 49
Iscritto il: 17 giu 2017, 16:35

0
voti

[10] Re: Problemi con variabili char (linguaggio C)

Messaggioda Foto Utenteclaudiocedrone » 27 giu 2017, 17:23

:-) End Of File... sono il meno indicato che esista per intromettermi in certe questioni :lol: ma forse potrebbe essere utile questo :roll: . O_/
"Non farei mai parte di un club che accettasse la mia iscrizione" (G. Marx)
Avatar utente
Foto Utenteclaudiocedrone
21,3k 4 7 9
Master EY
Master EY
 
Messaggi: 15299
Iscritto il: 18 gen 2012, 13:36

Prossimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 15 ospiti