[C++] esercizio strutture

cooper1
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
#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
Super Squirrel
Il problema era nel ciclo, usare uno switch al posto di if/else non cambia niente.

cooper1
ho modificato la risposta di prima perchè me ne sono accorto :D

Super Squirrel
"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?

cooper1
"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.

Super Squirrel
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.

cooper1
rieccomi, scusa per essere sparito ma sono stato occupato.
"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);
}

Super Squirrel
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.

cooper1
"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 :lol:
"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.

:rock: :rock:
"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 #-o
così dovrebbe essere tutto apposto, giusto?

Super Squirrel
ho risolto con es.punt[counter]=p−'0';. eseguendo restituisce tutto quello che voglio :lol:

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 #-o
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.

cooper1
"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à! #-o
"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

Super Squirrel
dunque dovrei fare es.punt[counter]=guarda(p)? anche perchè guarda restituisce esattamente il numero con la stessa modalità! #-o

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).

cooper1
ok, credo di poter dire di aver eviscerato in ogni sfaccettatura il problema! grazie infinite per le correzioni, la pazienza e le spiegazioni! :-D

Super Squirrel
Di niente! :)

Obidream
"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

cooper1
"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 :D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.