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.
lunedì 13 dicembre 2010
Testo esercitazione 5
Vi ricordo che domani l'esercitazione si svolgera' regolarmente in aula informatica a partire dalle 14:00. Metteremo in pratica l'uso dei puntatori visto a lezione in questi giorni. Esercitazione 5
Salve prof. ho difficoltà nel primo esercizio, ho volutamente fatto un po un mix tra array e puntatori per vedere se ho capito, ma non capisco dov'è l'errore qui
Il secondo esercizio invece sembra funzionare, è corretto il ragionamento che faccio?
#include using std::cout; using std::endl;
int* cerca(int num,int vett[10]);
int main(int argc, char **argv) { int num = 6; int _num = 3;
int vett[] = {2,5,6,7,8,9,1,4,10,15};
int* ind = cerca(num,vett); int* _ind = cerca(_num,vett);
if(ind != NULL) { cout << num << " si trova all'indirizzo " << ind << endl; } if(_ind == NULL) { cout << _num << " non è presente nell'array." << endl;
Il secondo esercizio sembra corretto, il testo era volutamente vago per lasciarvi liberi di sperimentare l'accesso a elementi di vettori tramite i puntatori. Tu hai usato l'algebra dei puntatori accedendo tramite *(vett+i) che e' la stessa cosa di vett[i]. Un'alternativa sarebbe stata quella di utilizzare il puntatore incrementandolo a ogni ciclo (punt++) e restituendolo quando trova il numero num, ad esempio: ... int* punt = vett; for(int i=0; i<10; i++){ if((*punt) == num) return punt; punt++; } return NULL;
Salve prof. ho un dubbio sull'impostazione dell'esercizio sulla lista circolare; avendo fatto io Java so come implementarla "per classi"; posso concettualmente sostituire le struct alle classi (che fino ad adesso mi sembrano dei "surrogati" di classe) e usare funzioni al posto di metodi (funzioni globali, non associate a oggetti)?? Oppure devo cambiare ottica?
Per adesso puoi pensare le struct come classi che hanno soltanto dati pubblici e implementare le funzionalita' di manipolazione della lista come semplici funzioni. Vedremo piu' avanti che class e struct in C++ sono praticamente la stessa cosa.
Salve Prof. ho avuto dei problemi riquardo l'inserimento delle stringhe da linea di comando. In pratica quando la stringa è composta da parole separate da spazio, il cin memorizza le lettere sulla stringa di destinazione solo fino al primo spazio e ignora ciò che segue. E' normale che si comporti così? O sono io che sbaglio qualcosa nel codice? Ho visto che nella sua soluzione(esercizio 4) la stringa da invertire lei l'ha messa direttamente nel codice...
Si è normale. Da quel che mi ricordo il professore aveva detto che la cin considera lo spazio come separatore. Come per esempio quando vuoi inserire due numeri interi da tastiera puoi benissimo inserirli allo stesso momento separando i due numeri con lo spazio. Oppure inserisci il primo premi su invio e inserisci il secondo. Allo stesso modo funziona con le stringhe, lo spazio funziona da separatore di due stringhe. Quindi quando inserisci da tastiera usando lo spazio, ogni parola separata dall'altra viene interpretata come una stringa a se stante. Esempio se dichiari due vettori a[10] e b[10], e dopo fai cin>>a>>b; , se da tastiera inserisci casa (spazio) ciao , allora casa verrà memorizzato in a mentre ciao in b. Non so se mi sono spiegato e se tutto quello che ho scritto è totalmente esatto però ci ho provato :D :)
adry ha perfettamente chiarito il problema. Per leggere una frase in una stringa si deve usare getline. Cercate su google 'cin getline' e provate a trovare una soluzione.
ho verificato l'utilizzo del metodo getline del cin, risulta molto semplice, non serve includere altre librerie oltre alla "iostream", mostro un esempio di utilizzo:
int main(){ ... char frase[80]; cout << "Inserire una frase: "; cin.getline(frase,80); ... }
@jaywazz89: in realta' della funzione getline ce ne sono tante versioni, sia come metodo di cin che come funzione esterna alla classe cui appartiene cin. Ce ne sono inoltre versioni per operare sia su char[] che su string del C++ (quelle che non siamo riusciti a vedere l'ultimo giorno di lezione). Torneremo comunque su quest'argomento piu' avanti nel corso.
Salve prof. ho difficoltà nel primo esercizio, ho volutamente fatto un po un mix tra array e puntatori per vedere se ho capito, ma non capisco dov'è l'errore qui
RispondiElimina#include
using std::cout;
using std::endl;
void arrayCopy(double*,double*);
int main(int argc, char **argv)
{
double vett[10] = {1,2,3,4,5,6,7,8,9,10};
double* p1 = vett;
double new_vett[10];
double* p2 = new_vett;
arrayCopy(p1,p2);
int i=0;
while (i<10)
{
cout << new_vett[i];
i++;
}
return 0;
}
void arrayCopy(double* src,double* dest) {
for(int i=0; i<10; i++) {
*(src + i) = *(dest + i);
}
return;
}
Mi vengono stampati 10 numeri assurdi tipo 10 alla meno 3 e simili.
Ok mi scuso errore stupidissimo, copiavo nell'array src i valori di dest che non è inizializzato. Sostituendo con
RispondiElimina*(dest + i) = *(src +i);
funziona.
Il secondo esercizio invece sembra funzionare, è corretto il ragionamento che faccio?
RispondiElimina#include
using std::cout;
using std::endl;
int* cerca(int num,int vett[10]);
int main(int argc, char **argv)
{
int num = 6;
int _num = 3;
int vett[] = {2,5,6,7,8,9,1,4,10,15};
int* ind = cerca(num,vett);
int* _ind = cerca(_num,vett);
if(ind != NULL) {
cout << num << " si trova all'indirizzo " << ind << endl;
}
if(_ind == NULL) {
cout << _num << " non è presente nell'array." << endl;
return 0;
}
}
int* cerca(int num,int vett[10]) {
for(int i=0; i<10; i++) {
if(num == *(vett + i)) {
int* punt = vett;
punt += i;
return punt;
break;
}
}
return NULL;
}
Grazie.
Il secondo esercizio sembra corretto, il testo era volutamente vago per lasciarvi liberi di sperimentare l'accesso a elementi di vettori tramite i puntatori. Tu hai usato l'algebra dei puntatori accedendo tramite *(vett+i) che e' la stessa cosa di vett[i]. Un'alternativa sarebbe stata quella di utilizzare il puntatore incrementandolo a ogni ciclo (punt++) e restituendolo quando trova il numero num, ad esempio:
RispondiElimina...
int* punt = vett;
for(int i=0; i<10; i++){
if((*punt) == num) return punt;
punt++;
}
return NULL;
Salve prof. ho un dubbio sull'impostazione dell'esercizio sulla lista circolare; avendo fatto io Java so come implementarla "per classi"; posso concettualmente sostituire le struct alle classi (che fino ad adesso mi sembrano dei "surrogati" di classe) e usare funzioni al posto di metodi (funzioni globali, non associate a oggetti)?? Oppure devo cambiare ottica?
RispondiEliminaGrazie.
Per adesso puoi pensare le struct come classi che hanno soltanto dati pubblici e implementare le funzionalita' di manipolazione della lista come semplici funzioni.
RispondiEliminaVedremo piu' avanti che class e struct in C++ sono praticamente la stessa cosa.
Salve Prof. ho avuto dei problemi riquardo l'inserimento delle stringhe da linea di comando. In pratica quando la stringa è composta da parole separate da spazio, il cin memorizza le lettere sulla stringa di destinazione solo fino al primo spazio e ignora ciò che segue. E' normale che si comporti così? O sono io che sbaglio qualcosa nel codice? Ho visto che nella sua soluzione(esercizio 4) la stringa da invertire lei l'ha messa direttamente nel codice...
RispondiEliminaSi è normale. Da quel che mi ricordo il professore aveva detto che la cin considera lo spazio come separatore. Come per esempio quando vuoi inserire due numeri interi da tastiera puoi benissimo inserirli allo stesso momento separando i due numeri con lo spazio. Oppure inserisci il primo premi su invio e inserisci il secondo. Allo stesso modo funziona con le stringhe, lo spazio funziona da separatore di due stringhe. Quindi quando inserisci da tastiera usando lo spazio, ogni parola separata dall'altra viene interpretata come una stringa a se stante. Esempio se dichiari due vettori a[10] e b[10], e dopo fai cin>>a>>b; , se da tastiera inserisci casa (spazio) ciao , allora casa verrà memorizzato in a mentre ciao in b. Non so se mi sono spiegato e se tutto quello che ho scritto è totalmente esatto però ci ho provato :D :)
RispondiEliminaadry ha perfettamente chiarito il problema. Per leggere una frase in una stringa si deve usare getline. Cercate su google 'cin getline' e provate a trovare una soluzione.
RispondiEliminaho verificato l'utilizzo del metodo getline del cin, risulta molto semplice, non serve includere altre librerie oltre alla "iostream", mostro un esempio di utilizzo:
RispondiEliminaint main(){
...
char frase[80];
cout << "Inserire una frase: ";
cin.getline(frase,80);
...
}
@jaywazz89: in realta' della funzione getline ce ne sono tante versioni, sia come metodo di cin che come funzione esterna alla classe cui appartiene cin. Ce ne sono inoltre versioni per operare sia su char[] che su string del C++ (quelle che non siamo riusciti a vedere l'ultimo giorno di lezione). Torneremo comunque su quest'argomento piu' avanti nel corso.
RispondiElimina