PDA

Visualizza la versione completa : [C++] Funzione potenza con puntatori, non stampa ultimo valore


goatboy
26-03-2012, 09:59
Il titolo è abbastanza esplicativo :D
Sto facendo un esercizio con i puntatori. Prendo in input una serie di interi e poi voglio stampare, per ogni intero, il suo elevamento al quadrato.
Però se inserisco, per esempio, dimensione 4, mi stampa le potenze dei primi 3 numeri e l'ultimo no. Stessa cosa per dimensioni diverse. Mi stampa tutte le potenze tranne l'ultimo e non riesco a capire il perchè.
Avevo provato a fare la funzione potenza in modo ricorsivo, ma non ci sono riuscito :( , mi dava lo stesso errore però, quindi se riesco a capire dove sbaglio provo a rifarla :zizi: , poi ho letto in una discussione qui sul forum che la funzione potenza è meglio farla iterativa, visto che la ricorsiva non presenta grandi vantaggi.
Comunque, questo è il codice:



#include <stdio.h>
#include <stdlib.h>

void potenza(int *p, int dim){
int i;
for(i=0; i<dim; i++){
p[i]=p[i]*p[i];
}
}

int main(){
int *p, i, dim;

printf("Inserisci la dimensione del vettore: ");
scanf("%d", &dim);

p=(int *)malloc(dim*sizeof(int));

printf("Inserisci un numero:\n");
for(i=0; i<dim-1; i++){
scanf("%d ", (p+i));
}

potenza(p, dim);

printf("Numeri elevati a potenza:\n");
for(i=0; i<dim-1; i++){
printf("%d ", *(p+i));
}

system("PAUSE");
}



Qualche suggerimento? :confused:
Tra l'altro ho un dubbio teorico: in questo esercizio uso un array di puntatori giusto? Visto che faccio l'allocazione dinamica. O forse ho detto una castroneria? :confused:

ramy89
26-03-2012, 11:12
for(i=0; i<dim; i++){
scanf("%d ", (p+i));

...
for(i=0; i<dim; i++){
printf("%d ", *(p+i));


Hai fatto la funzione quadrato.Ogni numero viene elevato al quadrato.
Non usi un array di puntatori, usi un puntatore tramite il quale allochi dinamicamente un array di interi.

goatboy
26-03-2012, 11:17
Originariamente inviato da ramy89


for(i=0; i<dim; i++){
scanf("%d ", (p+i));

...
for(i=0; i<dim; i++){
printf("%d ", *(p+i));


Hai fatto la funzione quadrato.Ogni numero viene elevato al quadrato.
Non usi un array di puntatori, usi un puntatore tramite il quale allochi dinamicamente un array di interi.

Io infatti quello volevo fare. Non ho capito l'errore che mi hai segnalato però.. :confused:

ramy89
26-03-2012, 11:40
Originariamente inviato da goatboy
Io infatti quello volevo fare. Non ho capito l'errore che mi hai segnalato però.. :confused:

Non ti stampava l' ultimo valore perché il for usciva quando i<dim-1 non era verificato.
Ma condizione doveva essere i<dim, altrimenti l' ultimo non te lo stampa perché quando i=n-2 incrementa i ed esce dal ciclo, senza eseguirlo ulteriormente.

goatboy
26-03-2012, 12:01
Originariamente inviato da ramy89
Non ti stampava l' ultimo valore perché il for usciva quando i<dim-1 non era verificato.
Ma condizione doveva essere i<dim, altrimenti l' ultimo non te lo stampa perché quando i=n-2 incrementa i ed esce dal ciclo, senza eseguirlo ulteriormente.
Però adesso se metto dimensione 4 , ne inserisco 5 (0,1,2,3,4) e me ne stampa 4.. :confused:

ramy89
26-03-2012, 12:12
Se dim vale 4, è normale che te ne stampa 4.
Il problema sarà sicuramente la pulitura del buffer, ecco perché ti chiede 5 valori anziché 4.
Pulisci il buffer di input:



printf("Inserisci un numero:\n");
for(i=0; i<dim-1; i++){
scanf("%d ", (p+i));
while(getchar()!=10)
;
}

goatboy
26-03-2012, 12:25
Originariamente inviato da ramy89
Se dim vale 4, è normale che te ne stampa 4.

Infatti la perplessità era sul fatto che me ne chiedesse 5, non che me ne stampasse 4 :D

Ho provato a mettere fflush(stdin) prima del ciclo for con la scanf, ma non cambia nulla.

ramy89
26-03-2012, 12:45
Fai vedere il codice così come lo compili.

goatboy
26-03-2012, 12:52
Ecco qua.. ho tolto la fflush(stdin) perchè non cambiava nulla..



#include <stdio.h>
#include <stdlib.h>

void potenza(int *p, int dim){
int i;
for(i=0; i<dim; i++){
p[i]=p[i]*p[i];
}
}

int main(){
int *p, i, dim;

printf("Inserisci la dimensione del vettore: ");
scanf("%d", &dim);

p=(int *)malloc(dim*sizeof(int));

printf("Inserisci un numero:\n");
for(i=0; i<dim; i++){
scanf("%d ", (p+i));
}

potenza(p, dim);
printf("Numeri elevati a potenza:\n");
for(i=0; i<dim; i++){
printf("%d ", *(p+i));
}

system("PAUSE");
}

ramy89
26-03-2012, 12:58
#include <stdio.h>
#include <stdlib.h>

void potenza(int *p, int dim){
int i;
for(i=0; i<dim; i++){
p[i]=p[i]*p[i];
}
}

int main(){
int *p, i, dim;

printf("Inserisci la dimensione del vettore: ");
scanf("%d", &dim);

p=(int *)malloc(dim*sizeof(int));

printf("Inserisci un numero:\n");
for(i=0; i<dim; i++){
scanf("%d ", (p+i));
while(getchar()!=10)
;
}

potenza(p, dim);
printf("Numeri elevati a potenza:\n");
for(i=0; i<dim; i++){
printf("%d ", *(p+i));
}
}


E' probabile che sei su linux, allora la fflush non funzionava, oppure non sei su linux e la mettevi nella posizione sbagliata (cioè prima della scanf e non dopo).

Loading