[C++] esercizio strutture
ciao a tutti. ho il seguente esercizio:
pensavo di fare in questo modo
ma non mi permette di confrontare b ed a (ovvero mi da come errore la riga [inline]if(strcmp(a,b) == 0) l=a;[/inline]). come posso modificare?
oltretutto per il punto c non ho proprio idee. non ho neanche capito cosa dovrebbe fare. come posso fare?
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
#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 [inline]if(strcmp(a,b) == 0) l=a;[/inline]). come posso modificare?
oltretutto per il punto c non ho proprio idee. non ho neanche capito cosa dovrebbe fare. come posso fare?
Risposte
Il problema era nel ciclo, usare uno switch al posto di if/else non cambia niente.
ho modificato la risposta di prima perchè me ne sono accorto

"cooper":
lo modificherei così: ...
Forse al posto di es.punti dovresti scrivere es.punti[counter].
In ogni caso non va bene... hai provato a lanciare il programma? L'output è quello che ti aspetti?
P.S.
Il punto c) poi lo hai svolto?
"Super Squirrel":
In ogni caso non va bene... hai provato a lanciare il programma? L'output è quello che ti aspetti?
no, non ho avuto/ho tempo. cosa noti di errato?
"Super Squirrel":
Il punto c) poi lo hai svolto?
no, su quello ancora zero idee.
no, non ho avuto/ho tempo. cosa noti di errato?
Il problema è qui:
es.punti[counter]=p;
assegni al generico elemento dell'array non la cifra (come richiesto dall'esercizio), ma l'intero associato a quella cifra nel sistema di codifica utilizzato (ASCII o altro).
no, su quello ancora zero idee.
Per esempio dall'array:
3 - 8 - 2 - 5
devi ricavare l'intero 3825.
Per farlo basta giocare con le potenze di 10.
rieccomi, scusa per essere sparito ma sono stato occupato.
non ho capito cosa starei andando ad assegnare
potrei allora fare così: prima gli faccio calcolare la dimensione del vettore (che chiamo [inline]dim[/inline]) e poi userei questo algoritmo
"Super Squirrel":
assegni al generico elemento dell'array non la cifra (come richiesto dall'esercizio), ma l'intero associato a quella cifra nel sistema di codifica utilizzato (ASCII o altro).
non ho capito cosa starei andando ad assegnare

"Super Squirrel":
Per farlo basta giocare con le potenze di 10.
potrei allora fare così: prima gli faccio calcolare la dimensione del vettore (che chiamo [inline]dim[/inline]) e poi userei questo algoritmo
int numero; for(unsigned int i=0; i<dim; i++){ numero += v[i]*10^((dim-1)-i); }
non ho capito cosa starei andando ad assegnare![]()
Ti rispondo, non è quello il problema, ma sinceramente non capisco perchè aspettare una mia risposta quando basterebbe compilare e lanciare il programma?!
In ogni caso ipotizziamo di inserire da tastiera 5, dal momento che la variabile p è un char, con l'istruzione es.punti=p stai assegnando all'intero es.punti il valore '5' (che per esempio nel codice ASCII vale 53) e non 5.
prima gli faccio calcolare la dimensione del vettore (che chiamo dim)
Se guardi i membri della struct "numero" ti renderai che non ce n'è bisogno, perchè quel valore (dim) già lo conosci.
e poi userei questo algoritmo...
La variabile numero non andrebbe inizializzata?
In ogni caso la logica dell'algoritmo è corretta.
P.S.
Si tratta di una sorte di "pseudocodice" immagino, visto che l'operatore ^ in C++ non rappresenta l'elevazione a potenza.
"Super Squirrel":
Ti rispondo, non è quello il problema, ma sinceramente non capisco perchè aspettare una mia risposta quando basterebbe compilare e lanciare il programma?!
più che altro perchè essendo un esame scritto non avevo mai iniziato a scriverlo al pc ed avevo pezzi di codice e correzioni un po' ovunque. insomma pigrizia diciamo.
"Super Squirrel":
In ogni caso ipotizziamo di inserire da tastiera 5, dal momento che la variabile p è un char, con l'istruzione es.punti=p stai assegnando all'intero es.punti il valore '5' (che per esempio nel codice ASCII vale 53) e non 5.
ho risolto con $es.punt[counter]= p - '0';$. eseguendo restituisce tutto quello che voglio

"Super Squirrel":
Se guardi i membri della struct "numero" ti renderai che non ce n'è bisogno, perchè quel valore (dim) già lo conosci.
ovviamente si.
"Super Squirrel":
La variabile numero non andrebbe inizializzata?
giustamente, quindi [inline]int numero=0;[/inline]
"Super Squirrel":
In ogni caso la logica dell'algoritmo è corretta.


"Super Squirrel":
Si tratta di una sorte di "pseudocodice" immagino, visto che l'operatore ^ in C++ non rappresenta l'elevazione a potenza.
sono talmente abituato a fare la potenza con ^ che mi sono scordato del pow

così dovrebbe essere tutto apposto, giusto?
ho risolto con es.punt[counter]=p−'0';. eseguendo restituisce tutto quello che voglio![]()
Sicuramente, ma perchè ripetere un'operazione già effettuata dalla funzione guarda() ?!
sono talmente abituato a fare la potenza con ^ che mi sono scordato del pow![]()
così dovrebbe essere tutto apposto, giusto?
Si, ma direi che non c'è bisogno di scomodare la libreria math (per la funzione pow() intendo), basta utilizzare una variabile inizializzata ad 1 che viene moltiplicata per 10 ad ogni iterazione del ciclo.
"Super Squirrel":
Sicuramente, ma perchè ripetere un'operazione già effettuata dalla funzione guarda() ?!
dunque dovrei fare [inline]es.punt[counter]=guarda(p)[/inline]? anche perchè guarda restituisce esattamente il numero con la stessa modalità!

"Super Squirrel":
Si, ma direi che non c'è bisogno di scomodare la libreria math
lo dici per una questione pratica? perchè ho sentito già alcune persone a cui pow non piace, ma non ho mai chiesto il perchè e non capisco che vantaggi possa portare il non usarla
dunque dovrei fare es.punt[counter]=guarda(p)? anche perchè guarda restituisce esattamente il numero con la stessa modalità!![]()
Esatto, io farei qualcosa del genere:
unsigned int i = 0; while(i < n.dimensione) { cin >> p; n.ptr[i] = guarda(p); if(n.punt[i] != -1) { ++i; } }
lo dici per una questione pratica? perchè ho sentito già alcune persone a cui pow non piace, ma non ho mai chiesto il perchè e non capisco che vantaggi possa portare il non usarla
Sicuramente qualcuno più esperto saprà darti una risposta più precisa, in ogni per la mia esperienza ti dico che pow() è molto lento e inoltre non ha senso includere un'intera libreria per fare il lavoro che può essere svolto da una semplice variabile (quella inizializzata a 1 di cui parlavo nel precedente post).
ok, credo di poter dire di aver eviscerato in ogni sfaccettatura il problema! grazie infinite per le correzioni, la pazienza e le spiegazioni!

Di niente!

"cooper":
lo dici per una questione pratica? perchè ho sentito già alcune persone a cui pow non piace, ma non ho mai chiesto il perchè e non capisco che vantaggi possa portare il non usarla
Non è solo una questione pratica, è che guardando il prototipo della pow noterai che è di tipo double così come i parametri ed inoltre utilizza tipicamente un algoritmo di questo tipo:
$a^b = e^(b*log(a))$
il che la rende inadeguata per degli interi o degli interi non segnati
"Obidream":
Non è solo una questione pratica, è che guardando il prototipo della pow noterai che è di tipo double così come i parametri ed inoltre utilizza tipicamente un algoritmo di questo tipo:
$ a^b = e^(b*log(a)) $
il che la rende inadeguata per degli interi o degli interi non segnati
ti ringrazio per la spiegazione
