PDA

View Full Version : Funzione tolower() c++


84mrc84
10-06-2016, 15:23
Salve a tutti, volevo un aiuto su un codice che sto studiando e implementando;
trattasi del classico esempio, a titolo di semplice studio e applicazione delle tematiche da me studiate fino a questo punto, di un inventario per piccole aziende.

Il codice è molto semplice e chiaro, solo una cosa però non riesco a capire e spero di trovare qualcuno che mi aiuti:

Si tratta del menù del programma, esattamente:

do
{
cout<<"(I)mmissione\n";
cout<<"(V)isualizzazione\n";
cout<<"(A)ggiornamento\n";
cout<<"(C)ancella\n";
cout<<"(U)scita\n\n";
cout<<"Seleziona una voce: ";
cin>>ch;
}while(!strchr("ivacu",tolower(ch)));
return tolower(ch);

premetto che ho ampiamente studiato la funzione tolower(), ma non riesco a capire come riesce a funzionare in questo codice.

le mie domande sono:
1) perché se inverto la funzione con toupper() e cambio la stringa con"IVACU" non si comporta allo stesso modo logicamente invertito?
2) potete suggerirmi un utilizzo simile da poter studiare e in futuro applicare?

lorenzo001
11-06-2016, 11:27
Perché non si comporta allo stesso modo? Spiegati

84mrc84
11-06-2016, 12:03
Esatto, sostituendo al codice la funzione toupper() e inserendo la stringa maiuscola, il programma non funziona.
Il mio scopo è capire come la funzione tolower() in questo caso fa funzionare il programma.

Se il programma riceve un carattere maiuscolo o minuscolo, con la funzione tolower() funziona tutto, avendo la stringa in minuscolo"ivacu".

Se sostituisco la funzione con toupper() e modifico la stringa "IVACU", allora non funziona più.

lorenzo001
11-06-2016, 13:22
A me funziona regolarmente ...

Ma tu parli solo del codice del menu o del resto del programma?

84mrc84
11-06-2016, 19:12
vi riporto il codice ( attualmente ancora in fase di sviluppo ) così potete fare il debug assieme a me.

Il programma è di natura didattica, sono ancora alle prime armi e sto cercando di fare miei i concetti basilari.

Grazie in anticipo per l'aiuto.



/** non accetta nomi prodotti con spaziature
* bisogna controllare bene l'input da tastiera
*/
#include <iostream>
#include <ctype.h>
#include <cstring>
#include <cstdlib>
#include <cstdio>

using namespace std;

const int SIZE=2;/**< misura per test programma
*/

struct inv_type
{
char item[40];/**< nome articolo */
double cost;/**< costo articolo */
double retail;/**< prezzo al dettaglio */
int on_hand;/**< quantità disponibile */
int lead_time;/**< giorni necessari per il rifornimento */
}invtry[SIZE];/**< dichiarazione array di strutture */

void enter(), init_list(), display(), update(), input(int i), clean();
int menu();

void nessun_elemento(char *s);


int main()
{
char choice;

init_list();

for(;;)
{
choice=menu();
switch(choice)
{
case 'i' : enter();
break;
case 'v' : display();
break;
case 'a' : update();
break;
case 'c' : clean();
break;
case 'u' : return 0;
}
}
}

/**< inizializzazione array invtry */
void init_list()
{
int t;

for (t=0; t<SIZE; t++)
*invtry[t].item = '\0';
/** descrizione ciclo for:
*
* assegna il byte null '\0' a tutti i membri struttura .item dell' array di strutture invtry
*
*/

}

/**< accetta una selezione del menu */
int menu()
{
char ch;
cout<<endl;
do
{
cout<<"(I)mmissione\n";
cout<<"(V)isualizzazione\n";
cout<<"(A)ggiornamento\n";
cout<<"(C)ancella\n";
cout<<"(U)scita\n\n";
cout<<"Seleziona una voce: ";
cin>>ch;
}while(!strchr("ivacu",tolower(ch)));
return tolower(ch);
}

/**< inserire articoli nella lista */
void enter()
{
int i;
/**< trova la prima struttura libera */
for(i=0;i<SIZE;i++)
if(!*invtry[i].item)
break;
if (SIZE==i)
{
cout<<"Lista completa\n";
return;
}
input(i);
}

/**< riceve i dati in input */
void input(int i)
{
//char str[80];
/**< immissione dati */
cout<<"Articolo: ";
cin>>invtry[i].item;

cout<<"Costo: ";
cin>>invtry[i].cost;

cout<<"Prezzo al dettaglio: ";
cin>>invtry[i].retail;

cout<<"Quantita' disponibil: ";
cin>>invtry[i].on_hand;

cout<<"Tempo necessario per rifornimento: ";
cin>>invtry[i].lead_time;
}

/**< Modifica artico esistente */
void update()
{
int i;
char name[80];

cout<<"Digitare il nome dell' articolo da Aggiornare: ";
cin>>name;

for (i=0;i<SIZE;i++)
if(!strcmp(name,invtry[i].item))
break;
if(SIZE==i)
{
cout<<"Articolo non trovato\n";
return;
}
cout<<"Immettere i nuovi dati";
input(i);
}

/**< Visualizzazione della lista */
void display()
{
int t;
for(t=0;t<SIZE;t++)
{
if(*invtry[t].item)
{
cout<<invtry[t].item<<"\n";
cout<<"Costo in Euro: "<<invtry[t].cost;
cout<<"\nPrezzo al dettaglio: ";
cout<<invtry[t].retail<<endl;
cout<<"Quantita' disponibile: "<<invtry[t].on_hand;
cout<<"\nTempo di rifornimento: ";
cout<<invtry[t].lead_time<<" giorni\n\n";
}
}
nessun_elemento(invtry[0].item);
}

void clean()
{
int i;
char name[80];

if(*invtry[0].item == '\0')
nessun_elemento(invtry[0].item);/**< se la prima posizione di memoria è vuota allora richiama funzione */
else{
cout<<"Digitare il nome dell' articolo da Eliminare: ";
cin>>name;
for (i=0;i<SIZE;i++)
if(!strcmp(name,invtry[i].item))
{
(*invtry[i].item = '\0');
cout<<"Articolo Eliminato\n";
}
}
return;
}

void nessun_elemento(char *s)
{
while(!*s){
cout<<"attualmente non ci sono voci";
cout<<endl;
break;
}
}

lorenzo001
11-06-2016, 20:07
Come ti dicevo, funziona.

Facci vedere anche il codice con le modifiche.