19/10/16 15:21
Birkhoff92
Salve come da titolo all'esame di Programmazione I ho svolto l'esercizio i cui mi si chiedevano operazioni sui polinomi, il programma come ammesso anche dal prof era l'unico dei 6 che compilava ed eseguiva ma non mi ha fatto passare l'esame perchè non ho implementato il template ( cosa che a dire il vero era richiesta dal primo punto dei 7 della traccia ). Il problema come gli avevo fatto notare , è che in Eclipse per di più su macchina virtuale mi dava continuamente errori che poi magicamente scomparivano se chiudevo e riaprivo. Ora siccome il problema era il template , io ho svolto senza e cioè così:
MAIN.CPP #include <stdlib.h> #include "Polinomio.h" #include <iostream> using namespace std; int main() { cout<<"\nCreo e inizializzo la lista\n"; polinomio mylist; polinodo *p; init_list(&mylist); insert(&mylist, 2, 3); insert(&mylist, 2, 1); insert(&mylist, 3, 5); insert(&mylist, 3, 7); insert(&mylist, 0, 9); //STAMPA cout<<"\nStampo la lista: \n"<<endl; cout<<&mylist; //CERCA NODO DATO L'ESPONENTE p=search(&mylist,7); cout<<"\nCerca \n"; cout<<"\nIl polinodo cercato e': "<<p->coeff<<"x^"<<p->espon<<endl; //VALUTA IL POLINOMIO IN UN PUNTO cout<<"\nValuto il polinomio in un punto dato: \n"; double v=eval(&mylist,0.9); cout<<"\nIl valore calcolato e': "<<v<<endl; //ADDIZIONO UN NODO AL POLINOMIO cout<<"\n Effettuo la somma tra il polinomio e un polinodo\n"; add(&mylist,4,7); cout<<"\n Dopo la somma il polinomio e':\n"; cout<<&mylist<<endl; //GRADO DEL POLINOMIO cout<<"\nIl grado del polinomio e': "; int e=degree(&mylist); cout<<e<<endl; //DERIVATA cout<<"\nLa derivata del polinomio e': \n"; derivata(&mylist); ordina(&mylist); cout<<&mylist<<endl; return 0; } POLINOMIO.H #ifndef POLINOMIO_H #define POLINOMIO_H #include <iostream> using namespace std; typedef struct Polinodo { // informazioni contenute nel nodo double coeff; unsigned int espon; // puntatore al nodo precedente struct Polinodo *prev; // puntatore al nodo successivo struct Polinodo *next; } polinodo; typedef struct Polinomio { // tiene traccia di quanti nodi sono presenti all'interno della lista int count; // puntatore al primo nodo della lista struct Polinodo *header; // puntatore all'ultimo nodo della lista struct Polinodo *tailer; } polinomio; void init_list(polinomio *); void delete_list(polinomio *); void insert(polinomio *, double,unsigned int ); polinodo *search(polinomio* ,unsigned int); void delete_node(polinomio *, polinodo ); void delete_value(polinomio *, int ); void print_list(polinomio *); void add(polinomio *,double,unsigned int); int degree(polinomio *); void derivata(polinomio *); double eval(polinomio *,double); ostream &operator<<(ostream&,polinomio *); void ordina(polinomio *); #endif POLINOMIO.CPP #include <stdio.h> #include <stdlib.h> #include "Polinomio.h" #include <iostream> #include <math.h> using namespace std; //INIZIALIZZAZIONE DELLA LISTA void init_list(polinomio *list) { // la lista inizialmente non contiene elementi list->count = 0; // sia la testa che la coda puntano inizialmente a NULL list->header = list->tailer = NULL; } //CANCELLAZIONE DELL'INTERA LISTA void delete_list(polinomio *list) { polinodo *n1, *n2; n1 = list->header; // scorro i nodi della lista e li cancello // tramite la funzione free() libero la memoria da essi occupata while (n1 != NULL) { n2 = n1->next; free(n1); n1 = n2; } } //AGGIUNTA DI UN NUOVO NODO ALLA LISTA void insert(polinomio *list, double new_coeff,unsigned int new_espon) { // creo il nuovo nodo e gli alloco uno spazio di memoria polinodo *new_node; new_node = (polinodo*)malloc(sizeof(polinodo)); // inizializzo il nuovo nodo e gli inserisco il nuovo dato new_node->coeff = new_coeff; new_node->espon=new_espon; new_node->next = NULL; // inserisco il nodo all'interno della lista: due casi possibili // CASO 1: la lista e' vuota (count e' 0) // il nuovo nodo fara' sia da header che da tailer if (list->count == 0) { new_node->prev = NULL; list->header = list->tailer = new_node; } // CASO 2: la lista contiene gia' almeno un elemento // aggancio il nuovo nodo alla fine della lista // dopo l'inserimento, il nuovo nodo sara' quindi il tailer della lista else { new_node->prev = list->tailer; list->tailer->next = new_node; list->tailer = new_node; } // aumento il contatore dei nodi della lista list->count++; } //RICERCA DI UN VALORE ALL'INTERNO DELLA LISTA polinodo* search(polinomio *list,unsigned int e) { polinodo *tmp; tmp = list->header; // scorro la lista cercando value // ritorno l'indirizzo del primo nodo che contiene value // altrimenti continuo a scorrere la lista while (tmp != NULL) { if (tmp->espon == e) return tmp; tmp = tmp->next; } // se non trovo nessun nodo contenente value, ritorno NULL return NULL; } //CANCELLAZIONE DI UN SINGOLO NODO void delete_node(polinomio *list, polinodo *n) { // sgancio il nodo puntato da n dalla lista n->prev->next = n->next; if (n->next != NULL) // previene possibili Segmentation Fault n->next->prev = n->prev; // libero la memoria allocata free(n); list->count--; return; } //CANCELLAZIONE DEI NODI IN CUI è PRESENTE UN VALORE INDICATO void delete_value(polinomio *list, int value) { polinodo *tmp; while ((tmp = search(list, value)) != NULL) delete_node(list, tmp); return; } //STAMPA DI TUTTI I NODI DELLA LISTA void print_list(polinomio *list) { polinodo *tmp; tmp = list->header; int i; for (i = 1; i <= list->count; i++) { cout<<"nodo "<<i<<":"<< tmp->coeff<<" "<<tmp->espon<<endl; tmp = tmp->next; } return; } void add(polinomio *list,double c,unsigned int e) { polinodo *temp; temp=list->header; for(int i=0;i<list->count;i++) { if(temp->espon==e) temp->coeff+=c; temp=temp->next; } } int degree(polinomio *list) { unsigned int e=0; polinodo* temp; temp=list->header; for(int i=0;i<list->count;i++) { if(temp->espon>e && temp->coeff!=0) e=temp->espon; temp=temp->next; } return e; } void derivata(polinomio * list) { polinodo *temp; temp=list->header; for(int i=0;i<list->count;i++) { temp->coeff*=temp->espon; temp->espon-=1; temp=temp->next; } } double eval(polinomio *list,double x) { polinodo *temp; temp=list->header; double v=0; for(int i=0;i<list->count;i++) { v=v+pow((temp->coeff)*x,temp->espon); temp=temp->next; } return v; } ostream& operator<<(ostream& os,polinomio *list) { polinodo *temp; temp=list->header; cout<<"\nIl polinomio e':\n"; for(int i=0;i<list->count;i++) { cout<<"+"<<temp->coeff<<"x^"<<temp->espon; temp=temp->next; } return os; } void ordina(polinomio *list) { polinodo *temp; temp=list->header; double c; unsigned int e; for(int i=0;i<list->count;i++) { for(int j=0;j<(list->count)-1;j++) { if(temp->espon<temp->next->espon) { c=temp->coeff; e=temp->espon; temp->espon=temp->next->espon; temp->coeff=temp->next->coeff; temp->next->coeff=c; temp->next->espon=e; } } temp=temp->next; } }ora mi chiedo col template come lo potrei modificare ? Grazie e scusate per il disturbo.
aaa