Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

linguaggio C: delucidazioni

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[21] Re: specifiche di conversione in C

Messaggioda Foto UtenteDirtyDeeds » 25 feb 2013, 21:47

In effetti, l'inghippo sta proprio nell'usare la scanf con un formato numerico: tutti i caratteri che non vengono convertiti rimangono nel buffer e tutte le successive scanf se li ritrovano lì. Un altro modo per aggirare il problema, oltre a quello di richiedere in ingresso una stringa invece di un numero (come avete scritto voi), potrebbe essere quello di svuotare comunque il buffer dopo ogni esecuzione di scanf e di controllare che la conversione sia avvenuta:

Codice: Seleziona tutto
#include<stdio.h>

#define DATA_LEN 5

int main(void)
{
    float data[DATA_LEN];
    int i, nc;

    for(i = 0; i < DATA_LEN; i++)
        do {
            printf("Numero %d: ",i+1);
            nc = scanf("%f",&data[i]);
            fflush(stdin);
        } while (nc < 1);

    for(i = 0; i < DATA_LEN; i++)
        printf("%f\n",data[i]);

  return 0;
}


Nel caso di input da stringa, forse piuttosto che la atof è meglio usare la strtof per i motivi scritti qui, sotto Implementation Notes.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[22] Re: specifiche di conversione in C

Messaggioda Foto Utentelillo » 26 feb 2013, 10:17

signori scusate se ritorno solo ora ma ieri son dovuto scappare a lavorare :lol:
e dai vostri post evinco le finezze che il programma deve avere quando questo è stato scritto per motivi lavorativi.
io devo scrivere un programma per un professore che sono convinto non sappia neanche cosa sia un buffer.
non mi esprimo mai sui mie professori, cercando di trarre da loro il massimo, indipendentemente da quelle che possono essere le loro competenze.
ma questa volta è il massimo. qualcuno ricorderà (forse nessuno) che dovevo fare il mio ultimo esame, bene, non è più così, in quanto il mio esame di informatica è passato da un venti e rotti a una bocciatura in qualche giorno.

motivazione: il prof. (in pensione; con modalità d'insegnamento, prenotazione e svolgimento arcaiche; esami che non rispecchiano il programma e disponibilità con gli studenti nulla) si è sbagliato.
chiudo questa parentesi con un ringraziamento ai miei rappresentanti che stanno portando il caso in consiglio, sperando che gli studenti futuri siano più fortunati di quanto lo siamo stati noi.

tornando a noi:
ho chiesto se potessi usare una scanf, in quanto ultimamente negli appelli si è fissato con le funzioni atoi() per l'appunto, e itoa().
non avendo lo stesso mai introdotto queste funzioni durante il corso, e non avendo mai introdotto la fgets(), mi chiedevo se vi fosse qualche alternativa, da qui la mia domanda sulla scanf
DirtyDeeds ha scritto:In effetti, l'inghippo sta proprio nell'usare la scanf con un formato numerico

a noi per formati numerici fa usare solo la scanf.
Avatar utente
Foto Utentelillo
20,5k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 4178
Iscritto il: 25 nov 2010, 11:30
Località: Nuovo Mondo

0
voti

[23] Re: specifiche di conversione in C

Messaggioda Foto UtenteDirtyDeeds » 26 feb 2013, 10:39

lillo ha scritto:qualcuno ricorderà (forse nessuno) che dovevo fare il mio ultimo esame, bene, non è più così, in quanto il mio esame di informatica è passato da un venti e rotti a una bocciatura in qualche giorno.


Azz... :(

lillo ha scritto:e dai vostri post evinco le finezze che il programma deve avere quando questo è stato scritto per motivi lavorativi.


Be', non necessariamente: quando diedi l'esame di C, ormai vent'anni fa, bisognava portare come tesina un programma (c'era da fare uno scritto di assembly, uno di C, l'orale e la tesina). Il prof, dopo aver constatato che il programma che portavo funzionava come richiesto (era un programma che giocava a tris senza perdere), mi disse: "E se come input ci metto dei caratteri a caso?"; così dicendo battè una stringa a muzzo e il programma... si piantò. Mi disse: ok, il programma va bene, ma metti a posto il controllo dell'input.

Come vedi, anche per passare un esame può essere necessario fare attenzione a queste cose. A tal proposito, anche nel caso utilizzassi la fgets, ricordati di verificare che non ritorni NULL.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[24] Re: linguaggio C: delucidazioni

Messaggioda Foto Utentelillo » 26 feb 2013, 18:36

DirtyDeeds ha scritto:Il prof, dopo aver constatato che il programma che portavo funzionava come richiesto (era un programma che giocava a tris senza perdere), mi disse: "E se come input ci metto dei caratteri a caso?"; così dicendo battè una stringa a muzzo e il programma... si piantò.

assicurarsi attraverso un software il corretto funzionamento di un programma non credo sia il metro di giudizio utilizzato per noi :(
credo si vada più a naso :^o

ho modificato il titolo per dare al thread un carattere più generale e continuare qui con qualche altra domanda.
una di queste ad esempio è:
nel momento in cui dichiaro una variabile globale (prima del main), questa dovrebbe essere vista sia dal main che da tutte le funzioni/procedure.
nei miei appunti, noto che nel main, si preoccupa di passare alle sottofunzioni anche le variabili globali.
lo fa anche il Deitel, ma solo in un esempio.
c'è un qualche particolare motivo?
Avatar utente
Foto Utentelillo
20,5k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 4178
Iscritto il: 25 nov 2010, 11:30
Località: Nuovo Mondo

0
voti

[25] Re: linguaggio C: delucidazioni

Messaggioda Foto UtenteIanero » 26 feb 2013, 18:46

Per rendere la funzione il più generale possibile, e non particolare per un solo valore di un particolare parametro, in modo tale che quella determinata funzione potrà essere ricopiata e riutilizzata anche in un altro codice. :)
:shock:
Avatar utente
Foto UtenteIanero
8.069 5 8 11
Master EY
Master EY
 
Messaggi: 4320
Iscritto il: 21 mar 2012, 15:47

0
voti

[26] Re: specifiche di conversione in C

Messaggioda Foto UtentePietroBaima » 26 feb 2013, 18:51

lillo ha scritto:il mio esame di informatica è passato da un venti e rotti a una bocciatura in qualche giorno.
motivazione: il prof. (in pensione; con modalità d'insegnamento, prenotazione e svolgimento arcaiche; esami che non rispecchiano il programma e disponibilità con gli studenti nulla) si è sbagliato.


OUCH.
Mi dispiace molto. Queste cose sono delle seccature colossali.
Spero che vada presto tutto a posto. davvero.

lillo ha scritto:nel momento in cui dichiaro una variabile globale (prima del main), questa dovrebbe essere vista sia dal main che da tutte le funzioni/procedure.
nei miei appunti, noto che nel main, si preoccupa di passare alle sottofunzioni anche le variabili globali.
lo fa anche il Deitel, ma solo in un esempio.
c'è un qualche particolare motivo?


Davanti alla dichiarazione della variabile globale c'è scritto static oppure volatile?
Generatore codice per articoli:
nomi
Sul forum:
[pigreco]=π
[ohm]=Ω
[quadrato]=²
[cubo]=³
Avatar utente
Foto UtentePietroBaima
90,7k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 12207
Iscritto il: 12 ago 2012, 1:20
Località: Londra

0
voti

[27] Re: linguaggio C: delucidazioni

Messaggioda Foto Utentelillo » 26 feb 2013, 19:05

PietroBaima ha scritto:Davanti alla dichiarazione della variabile globale c'è scritto static oppure volatile?

nessuna delle due:
Codice: Seleziona tutto
#include <stdio.h>
#define SIZE 100

int dimensione =0;

char* caricavettore(FILE*);
void ordina (char*, int);
void scrivi_file (char*, int, FILE*)

void main()
{....

qualche riga dopo, all'interno del main chiama le funzioni ordina e scrivi_file e passa anche dimensione:
Codice: Seleziona tutto
ordina(vettore, dimensione);
scrivi_file(vettore, dimensione, punt);

un ultima cosa, ho visto che il Deitel, in un programma simile, si preoccupa di passare anche SIZE.
Avatar utente
Foto Utentelillo
20,5k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 4178
Iscritto il: 25 nov 2010, 11:30
Località: Nuovo Mondo

2
voti

[28] Re: linguaggio C: delucidazioni

Messaggioda Foto UtenteTardoFreak » 26 feb 2013, 19:07

static ne limita la visibilità a livello di file. Se è dichiarata prima delle funzioni o dei prototipi è sicuramente ed egualmente visibile.

Passare la variabile dimensione si può fare. L' unica cosa da tenere presente è che all' interno della funzione si farà riferimento non alla variabile globale ma all' argomento della funzione.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[29] Re: linguaggio C: delucidazioni

Messaggioda Foto Utentelillo » 26 feb 2013, 19:21

leggendo i vari esempi che ho a disposizione noto una cosa:
le variabili globali, come dimensione nel mio caso, non vengono passate se la sottofunzione ne modifica il valore.
viceversa, se la sottofunzione non deve modificare la variabile, la riceve e nel corpo del programma non opera su di essa, ma la usa solo come termine di comparazione, ad esempio in un for o in un if-else.
potrebbe essere una spiegazione o sto vaneggiando?
Avatar utente
Foto Utentelillo
20,5k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 4178
Iscritto il: 25 nov 2010, 11:30
Località: Nuovo Mondo

1
voti

[30] Re: linguaggio C: delucidazioni

Messaggioda Foto UtenteTardoFreak » 26 feb 2013, 20:45

Mi spiego meglio.
Una delle caratteristiche delle variabili (ma anche delle funzioni) è lo "scope", cioè la visibilità. Ci può essere visibilità a livello di programma, di file, di funzione e di blocco.
Guardiamo questo listato:
Codice: Seleziona tutto
int a;        // visibile a livello di programma
static int b; // visibile a livello di modulo (file)

void fun1(void)
{
  // visibili a livello di funzione
  int c;
  int d;
 
  for(c=0; c<10; c++)
  {
    int d;  // visibile solo fra le parentesi (blocco)
    ...
  }
}

int e;  // visibile solo a fun2 e main

int fun2(int a)
{
  a = a * 2;  // lavora sull' argomento "a"!
  return a;
}

void main(void)
{
  a = 1;
  printf("%d\n", fun2(a));
  printf("%d\n", a);
}


Il risultato sarà:
Prova visibilità
2
1

Spero sia chiaro.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

PrecedenteProssimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 16 ospiti