[C++] esercizio strutture

Messaggioda cooper » 19/09/2018, 10:55

ciao a tutti. ho il seguente esercizio:
Un vettore di interi contiene la rappresentazione, cifra per cifra, di un intero: il posto 0
contiene la cifra più significativa, i posto 1 la seconda cifra più significativa e così via... .
Una variabile intera, poi, indica il numero di cifre utili del vettore; una seconda variabile
intera, invece, contiene il numero intero rappresentato nel vettore (in forma “compatta”).
a. Descrivere una struttura/classe idonea a rappresentare quanto sopra.

b. Scrivere una porzione di codice che consenta di caricare da tastiera il vettore di cui
sopra. Il vettore dovrà essere creato dinamicamente di una lunghezza idonea a
contenere le cifre del numero. I valori in ingresso, inoltre, dovranno essere
controllati tramite la funzione guarda (prototipo: int guarda(char)): la funzione
prende in ingresso un carattere e restituisce il numero corrispondente se il carattere
è una cifra (0,1,2,3,...9), -1 altrimenti.

c. Descrivere l’algoritmo che trasforma l’intero in forma compatta.

d. Facoltativo: mettere a punto la funzione guarda.

pensavo di fare in questo modo
Codice:
#include <iostream>
#include <cstring>
using namespace std;

struct numero{
   int* punt;
   int dimensione;
   int valore;
};

int guarda(char a){
   int l;
   char b[10]={'0','1','2','3','4','5','6','7','8','9'};
   if(strcmp(a,b) == 0) l=a;
   return a;
}

int main(){

   numero es;
   cout<<"inserire dimensione"<<endl;
   cin>>es.dimensione;
   es.punt=new int[es.dimensione];
   for(unsigned int i=0; i<es.dimensione; i++){
      int p;
      cout<<"carica il vettore"<<endl;
      cin>>p;
      if(guarda(p) != -1){
         es.punt[i]=p;
      }else{
         continue;
      }
   }
   for(unsigned int i=0; i<es.dimensione; i++){
      cout<<es.punt[i]<<endl;
   }
   return 0;
}

ma non mi permette di confrontare b ed a (ovvero mi da come errore la riga if(strcmp(a,b) == 0) l=a;). come posso modificare?
oltretutto per il punto c non ho proprio idee. non ho neanche capito cosa dovrebbe fare. come posso fare?
cooper
Cannot live without
Cannot live without
 
Messaggio: 2119 di 4642
Iscritto il: 25/07/2014, 09:19

Re: [C++] esercizio strutture

Messaggioda Super Squirrel » 19/09/2018, 12:18

strcmp() deve avere come argomento 2 c-stringhe, mentre nel tuo caso "a" è una variabile char e non un puntatore a char.
Detto questo sai cosa fa strcmp()? Chiedo perché sinceramente io non ne vedo l'utilità.

La funzione guarda() si aspetta una variabile di tipo char, invece tu gli passi un intero; inoltre dovrebbe ritornare un intero, invece ritorna la variabile "a" che è di tipo char... in fin dei conti non è un gran problema perché avvengono delle conversioni implicite, ma sinceramente non ha molto senso.

Dal punto di vista logico poi la funzione guarda() è completamente inutile... gli passi un valore e ritorna lo stesso valore!

Sempre da un punto di vista prettamente logico, quel continue nel main è completamente inutile visto che il corpo del ciclo for termina subito dopo. Infatti nei cicli for il continue dà inizio ad una nuova iterazione dopo aver effettuato la MODIFICA (i++ in questo caso).
Ciò significa che se effettui un inserimento non valido il programma non ti dà la possibilità di riprovarci.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 293 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] esercizio strutture

Messaggioda cooper » 19/09/2018, 12:47

anzitutto, grazie per la risposta. veniamo ora alle critiche.
Super Squirrel ha scritto:Detto questo sai cosa fa strcmp()? Chiedo perché sinceramente io non ne vedo l'utilità.

sapevo che confrontava due stringhe e restituisce 0 se sono uguali un positivo se il primo carattere è maggiore del secondo oppure negativo nel caso opposto. alla luce di questo pensavo di confrontare i numeri ammissibili (cioè b) con il numero che do in ingresso quando carico il vettore. quindi confronto con strcmp() e se sono uguali assegno il valore, altrimenti no.
tu come faresti altrimenti?
Super Squirrel ha scritto:strcmp() deve avere come argomento 2 c-stringhe, mentre nel tuo caso "a" è una variabile char e non un puntatore a char.

devo quindi dare in ingresso un char* ? non mi sembra molto sensato. forse ho proprio concepito male la funzione, che però non saprei modificare.
Super Squirrel ha scritto:La funzione guarda() si aspetta una variabile di tipo char, invece tu gli passi un intero; inoltre dovrebbe ritornare un intero, invece ritorna la variabile "a" che è di tipo char... in fin dei conti non è un gran problema perché avvengono delle conversioni implicite, ma sinceramente non ha molto senso.

per quanto riguarda il passare un intero mi sono confuso nello scrivere, ma avevo in mente di passare un qualsiasi carattere. quindi correggendo avrei char p in luogo di int p.
quanto al tipo di variabile che ritorno, a questo non ci avevo minimamente pensato. non saprei però come correggere volendo rimanere con questa impostazione.
Super Squirrel ha scritto:Dal punto di vista logico poi la funzione guarda() è completamente inutile... gli passi un valore e ritorna lo stesso valore!

essendo questo un tema d'esame, penso che il professore voglia vedere se abbiamo dimestichezza con la chiamata di funzione, stringhe, ecc.
Super Squirrel ha scritto:Sempre da un punto di vista prettamente logico, quel continue nel main è completamente inutile visto che il corpo del ciclo for termina subito dopo. Infatti nei cicli for il continue dà inizio ad una nuova iterazione dopo aver effettuato la MODIFICA (i++ in questo caso).
Ciò significa che se effettui un inserimento non valido il programma non ti dà la possibilità di riprovarci.

giusto, basta solo l'if.
cooper
Cannot live without
Cannot live without
 
Messaggio: 2120 di 4642
Iscritto il: 25/07/2014, 09:19

Re: [C++] esercizio strutture

Messaggioda Super Squirrel » 19/09/2018, 13:07

sapevo che confrontava due stringhe e restituisce 0 se sono uguali un positivo se il primo carattere è maggiore del secondo oppure negativo nel caso opposto. alla luce di questo pensavo di confrontare i numeri ammissibili (cioè b) con il numero che do in ingresso quando carico il vettore. quindi confronto con strcmp() e se sono uguali assegno il valore, altrimenti no.
tu come faresti altrimenti?

devo quindi dare in ingresso un char* ? non mi sembra molto sensato. forse ho proprio concepito male la funzione, che però non saprei modificare.

Stando alla traccia la funzione guarda() deve semplicemente controllare se il carattere "a" passato alla funzione sia o meno una cifra. Se è una cifra allora ritorna quella cifra (intesa come numero e non come carattere), altrimenti ritorna -1. A tal proposito conosci il codice ASCII?

giusto, basta solo l'if.

No in realtà, altrimenti non avrai la possibilità di reinserire il carattere se la funzione guarda() ritorna -1.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 294 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] esercizio strutture

Messaggioda cooper » 19/09/2018, 13:29

Super Squirrel ha scritto:Stando alla traccia la funzione guarda() deve semplicemente controllare se il carattere "a" passato alla funzione sia o meno una cifra. Se è una cifra allora ritorna quella cifra (intesa come numero e non come carattere), altrimenti ritorna -1. A tal proposito conosci il codice ASCII?

così avevo capito anche io. e purtroppo no non lo conosco.
Super Squirrel ha scritto:No in realtà, altrimenti non avrai la possibilità di reinserire il carattere se la funzione guarda() ritorna -1.

benchè forse inutile potrebbe andare uno switch? qualcosa del tipo:
Codice:
char p;
cin>>p;
switch(guarda(p)){
                 case 0:
                             es.punt[i]=p;
                             break;
                 case 1:
                 ....
                 case 9:
                            es.punt[i]=p;
                            break;
                 default:
                           cout<<"valore non ammesso, inserisci ancora"
}
cooper
Cannot live without
Cannot live without
 
Messaggio: 2121 di 4642
Iscritto il: 25/07/2014, 09:19

Re: [C++] esercizio trutture

Messaggioda Super Squirrel » 19/09/2018, 14:52

così avevo capito anche io. e purtroppo no non lo conosco.

Un char non è altro che un int a 8 bit (quindi 256 valori) che associa ad ogni valore un carattere. Per quanto riguarda la corrispondenza che esiste tra valore e carattere basta cercare codice ASCII tra le immagini di google.
Alla luce di ciò non dovrebbe essere particolarmente difficile implementare la funzione guarda(). Se hai dubbi chiedi pure.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 295 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] esercizio strutture

Messaggioda cooper » 19/09/2018, 15:25

provo così, spero abbia qualche barlume di senso.
Codice:
int guarda(char a){
   int l;
   char b[10]={'0','1','2','3','4','5','6','7','8','9'};
      for(unsigned int i=0; i<10; i++){
      if(a == b[i]) l=a;
   }
      return l;
}

ammesso che così possa andare, continuo ad assegnare un char ad un int facendo una conversione implicita. non so non ho altre idee sinceramente. :roll:
Super Squirrel ha scritto: Per quanto riguarda la corrispondenza che esiste tra valore e carattere basta cercare codice ASCII tra le immagini di google.

questa non ho ben capito come sfruttarla sinceramente.
grazie per l'aiuto e la pazienza :D
cooper
Cannot live without
Cannot live without
 
Messaggio: 2122 di 4642
Iscritto il: 25/07/2014, 09:19

Re: [C++] esercizio strutture

Messaggioda axpgn » 19/09/2018, 15:32

$A=65$, $a=97$, ecc. ecc.
axpgn
Cannot live without
Cannot live without
 
Messaggio: 11971 di 40654
Iscritto il: 20/11/2013, 22:03

Re: [C++] esercizio strutture

Messaggioda cooper » 19/09/2018, 15:49

che si potessero assegnare come codice ASCII ok, ma non so come sfruttarle all'interno della funzione.
Codice:
int guarda(char a){
                 int l;
                 a=getchar();
                 if((a >= 48) and (a <= 57)) l=a;
                 return a;
}

può andare?
cooper
Cannot live without
Cannot live without
 
Messaggio: 2123 di 4642
Iscritto il: 25/07/2014, 09:19

Re: [C++] esercizio strutture

Messaggioda Super Squirrel » 19/09/2018, 16:12

Secondo te va bene? Cosa dovrebbe ritornare la funzione?

A cosa serve il getchar()?

P.S.
al posto di a>=48 puoi anche scrivere a>='0'.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 296 di 1486
Iscritto il: 16/05/2013, 22:05

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite