Blog del corso di Programmazione (9 CFU) tenuto da Marco La Cascia presso l'Universita' di Palermo per il corso di laurea in Ingegneria Informatica e delle Telecomunicazioni. Tratta la programmazione a oggetti in Java.
giovedì 10 novembre 2011
Testo esercitazione 6
Disponibile il testo dell'esercitazione 6 relativa ai puntatori.
Salve prof. Nell'esercizio sull'inversione della stringa(num.5) non capisco in che modo utilizzare i puntatori per invertire le lettere. avevo pensato a tale soluzione senza puntatori:
void inversion(char *s) { int i=0,j=0; char c; while(s[i] !='\0'){ i++; } --i; int temp=(int) i/2;//il num delle inversioni corrispnde alla metà della grandezza per difetto for(int j=0;j<temp;j++) { c=s[i-j]; s[i-j]=s[j]; s[j]=c; }
In pratica invece degli indici devi utilizzare dei puntatori per spostarti all'interno della stringa. Ad esempio nella prima parte del codice, quella in cui calcoli la i di fine stringa puoi usare un char* p inizializzato a s e con una while(*p != '\0') p++; ti posizioni a fine stringa. Per fare l'inversione potresti far scorrere s in avanti e p indietro finche' non si incontrano e scambiare ogni volta gli elementi.
Il problema e' che a seconda se la parola da invertire sia di lunghezza pari o dispari la tua condizione del for rischia di essere sempre vera. Puo' infatti capitare che i e j si "incrociano" senza essere mai uguali (ad esempio se i=3 e j=2 al giro successivo avrai i=2 e j=3) e quindi il for continua e fa andare in crash il programma).
Questo commento è stato eliminato dall'autore.
RispondiEliminaSalve prof.
RispondiEliminaNell'esercizio sull'inversione della stringa(num.5) non capisco in che modo utilizzare i puntatori per invertire le lettere.
avevo pensato a tale soluzione senza puntatori:
void inversion(char *s)
{
int i=0,j=0;
char c;
while(s[i] !='\0'){
i++;
}
--i;
int temp=(int) i/2;//il num delle inversioni corrispnde alla metà della grandezza per difetto
for(int j=0;j<temp;j++)
{
c=s[i-j];
s[i-j]=s[j];
s[j]=c;
}
}
In pratica invece degli indici devi utilizzare dei puntatori per spostarti all'interno della stringa. Ad esempio nella prima parte del codice, quella in cui calcoli la i di fine stringa puoi usare un char* p inizializzato a s e con una while(*p != '\0') p++; ti posizioni a fine stringa.
RispondiEliminaPer fare l'inversione potresti far scorrere s in avanti e p indietro finche' non si incontrano e scambiare ogni volta gli elementi.
Questo è il codice non funzionante dell'esercizio 5 di cui le parlavo oggi pomeriggio:
RispondiElimina#include
using std::cout;
using std::cin;
using std::endl;
void inverti(char*, int);
int main() {
const int max = 50;
char s[max];
cout << "Inserisci una stringa: ";
cin >> s;
int dim = 0;
while(s[dim] != 0)
++dim;
inverti(s, dim);
cout << s << endl;
system("PAUSE");
return 0;
}
void inverti(char*s, int dim) {
char tmp;
char* p;
p = s;
for(int i=dim-1, j=0; i != j; i--, j++) {
tmp = s[j];
s[j] = *(p+i);
*(p+i) = tmp;
}
return;
}
Il problema e' che a seconda se la parola da invertire sia di lunghezza pari o dispari la tua condizione del for rischia di essere sempre vera. Puo' infatti capitare che i e j si "incrociano" senza essere mai uguali (ad esempio se i=3 e j=2 al giro successivo avrai i=2 e j=3) e quindi il for continua e fa andare in crash il programma).
RispondiElimina