Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - codice polinomi , ma il prof esige il template
Forum - C/C++ - codice polinomi , ma il prof esige il template

Avatar
Birkhoff92 (Normal User)
Rookie


Messaggi: 31
Iscritto: 27/03/2014

Segnala al moderatore
Postato alle 17:21
Mercoledì, 19/10/2016
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ì:
Codice sorgente - presumibilmente C++

  1. MAIN.CPP
  2. #include <stdlib.h>
  3. #include "Polinomio.h"
  4. #include <iostream>
  5. using namespace std;
  6. int main()
  7. {
  8. cout<<"\nCreo e inizializzo la lista\n";
  9. polinomio mylist;
  10. polinodo *p;
  11. init_list(&mylist);
  12. insert(&mylist, 2, 3);
  13. insert(&mylist, 2, 1);
  14. insert(&mylist, 3, 5);
  15. insert(&mylist, 3, 7);
  16. insert(&mylist, 0, 9);
  17.  
  18. //STAMPA
  19. cout<<"\nStampo la lista: \n"<<endl;
  20. cout<<&mylist;
  21.  
  22. //CERCA NODO DATO L'ESPONENTE
  23. p=search(&mylist,7);
  24. cout<<"\nCerca \n";
  25. cout<<"\nIl polinodo cercato e': "<<p->coeff<<"x^"<<p->espon<<endl;
  26.  
  27. //VALUTA IL POLINOMIO IN UN PUNTO
  28. cout<<"\nValuto il polinomio in un punto dato: \n";
  29. double v=eval(&mylist,0.9);
  30. cout<<"\nIl valore calcolato e': "<<v<<endl;
  31.  
  32. //ADDIZIONO UN NODO AL POLINOMIO
  33. cout<<"\n Effettuo la somma tra il polinomio e un polinodo\n";
  34. add(&mylist,4,7);
  35. cout<<"\n Dopo la somma il polinomio e':\n";
  36. cout<<&mylist<<endl;
  37.  
  38. //GRADO DEL POLINOMIO
  39. cout<<"\nIl grado del polinomio e': ";
  40. int e=degree(&mylist);
  41. cout<<e<<endl;
  42.  
  43. //DERIVATA
  44. cout<<"\nLa derivata del polinomio e': \n";
  45. derivata(&mylist);
  46. ordina(&mylist);
  47. cout<<&mylist<<endl;
  48. return 0;
  49. }
  50.  
  51.  
  52. POLINOMIO.H
  53. #ifndef POLINOMIO_H
  54. #define POLINOMIO_H
  55. #include <iostream>
  56. using namespace std;
  57. typedef struct Polinodo
  58. {
  59. // informazioni contenute nel nodo
  60. double coeff;
  61. unsigned int espon;
  62. // puntatore al nodo precedente
  63. struct Polinodo *prev;
  64. // puntatore al nodo successivo
  65. struct Polinodo *next;
  66. } polinodo;
  67. typedef struct Polinomio
  68. {
  69. // tiene traccia di quanti nodi sono presenti all'interno della lista
  70. int count;
  71. // puntatore al primo nodo della lista
  72. struct Polinodo *header;
  73. // puntatore all'ultimo nodo della lista
  74. struct Polinodo *tailer;
  75. } polinomio;
  76.  
  77. void init_list(polinomio *);
  78. void delete_list(polinomio *);
  79. void insert(polinomio *, double,unsigned int );
  80. polinodo *search(polinomio* ,unsigned int);
  81. void delete_node(polinomio *, polinodo );
  82. void delete_value(polinomio *, int );
  83. void print_list(polinomio *);
  84. void add(polinomio *,double,unsigned int);
  85. int degree(polinomio *);
  86. void derivata(polinomio *);
  87. double eval(polinomio *,double);
  88. ostream &operator<<(ostream&,polinomio *);
  89. void ordina(polinomio *);
  90. #endif
  91.  
  92.  
  93. POLINOMIO.CPP
  94.  
  95. #include <stdio.h>
  96. #include <stdlib.h>
  97. #include "Polinomio.h"
  98. #include <iostream>
  99. #include <math.h>
  100.  
  101. using namespace std;
  102. //INIZIALIZZAZIONE DELLA LISTA
  103. void init_list(polinomio *list)
  104. {
  105. // la lista inizialmente non contiene elementi
  106. list->count = 0;
  107. // sia la testa che la coda puntano inizialmente a NULL
  108. list->header = list->tailer = NULL;
  109. }
  110. //CANCELLAZIONE DELL'INTERA LISTA
  111. void delete_list(polinomio *list)
  112. {
  113. polinodo *n1, *n2;
  114. n1 = list->header;
  115. // scorro i nodi della lista e li cancello
  116. // tramite la funzione free() libero la memoria da essi occupata
  117. while (n1 != NULL)
  118. {
  119. n2 = n1->next;
  120. free(n1);
  121. n1 = n2; }
  122. }
  123. //AGGIUNTA DI UN NUOVO NODO ALLA LISTA
  124. void insert(polinomio *list, double new_coeff,unsigned int new_espon)
  125. {
  126. // creo il nuovo nodo e gli alloco uno spazio di memoria
  127. polinodo *new_node;
  128. new_node = (polinodo*)malloc(sizeof(polinodo));
  129. // inizializzo il nuovo nodo e gli inserisco il nuovo dato
  130. new_node->coeff = new_coeff;
  131. new_node->espon=new_espon;
  132. new_node->next = NULL;
  133. // inserisco il nodo all'interno della lista: due casi possibili
  134. // CASO 1: la lista e' vuota (count e' 0)
  135. // il nuovo nodo fara' sia da header che da tailer
  136. if (list->count == 0)
  137. {
  138. new_node->prev = NULL;
  139. list->header = list->tailer = new_node;
  140. }
  141. // CASO 2: la lista contiene gia' almeno un elemento
  142. // aggancio il nuovo nodo alla fine della lista
  143. // dopo l'inserimento, il nuovo nodo sara' quindi il tailer della lista
  144. else
  145. {
  146. new_node->prev = list->tailer;
  147. list->tailer->next = new_node;
  148. list->tailer = new_node;
  149. }
  150. // aumento il contatore dei nodi della lista
  151. list->count++;
  152. }
  153. //RICERCA DI UN VALORE ALL'INTERNO DELLA LISTA
  154. polinodo* search(polinomio *list,unsigned int e)
  155. {
  156. polinodo *tmp;
  157. tmp = list->header;
  158. // scorro la lista cercando value
  159. // ritorno l'indirizzo del primo nodo che contiene value
  160. // altrimenti continuo a scorrere la lista
  161. while (tmp != NULL)
  162. {
  163.  
  164. if (tmp->espon == e)
  165. return tmp;
  166. tmp = tmp->next;
  167. }
  168. // se non trovo nessun nodo contenente value, ritorno NULL
  169. return NULL;
  170. }
  171. //CANCELLAZIONE DI UN SINGOLO NODO
  172. void delete_node(polinomio *list, polinodo *n)
  173. {
  174. // sgancio il nodo puntato da n dalla lista
  175. n->prev->next = n->next;
  176. if (n->next != NULL) // previene possibili Segmentation Fault
  177. n->next->prev = n->prev;
  178. // libero la memoria allocata
  179. free(n);
  180. list->count--;
  181. return;
  182. }
  183. //CANCELLAZIONE DEI NODI IN CUI è PRESENTE UN VALORE INDICATO
  184. void delete_value(polinomio *list, int value)
  185. {
  186. polinodo *tmp;
  187. while ((tmp = search(list, value)) != NULL)
  188. delete_node(list, tmp);
  189. return;
  190. }
  191. //STAMPA DI TUTTI I NODI DELLA LISTA
  192. void print_list(polinomio *list)
  193. {
  194. polinodo *tmp;
  195. tmp = list->header;
  196. int i;
  197. for (i = 1; i <= list->count; i++)
  198. {
  199. cout<<"nodo "<<i<<":"<< tmp->coeff<<" "<<tmp->espon<<endl;
  200. tmp = tmp->next;
  201. }
  202. return;
  203. }
  204. void add(polinomio *list,double c,unsigned int e) {
  205. polinodo *temp;
  206. temp=list->header;
  207. for(int i=0;i<list->count;i++)
  208. {
  209. if(temp->espon==e)
  210. temp->coeff+=c;
  211. temp=temp->next;
  212. }
  213. }
  214. int degree(polinomio *list) {
  215. unsigned int e=0;
  216. polinodo* temp;
  217. temp=list->header;
  218. for(int i=0;i<list->count;i++) {
  219. if(temp->espon>e && temp->coeff!=0)
  220. e=temp->espon;
  221. temp=temp->next;
  222. }
  223. return e;
  224. }
  225. void derivata(polinomio * list) {
  226. polinodo *temp;
  227. temp=list->header;
  228. for(int i=0;i<list->count;i++) {
  229. temp->coeff*=temp->espon;
  230. temp->espon-=1;
  231. temp=temp->next;
  232. }
  233. }
  234. double eval(polinomio *list,double x) {
  235. polinodo *temp;
  236. temp=list->header;
  237. double v=0;
  238. for(int i=0;i<list->count;i++) {
  239. v=v+pow((temp->coeff)*x,temp->espon);
  240. temp=temp->next;
  241. }
  242. return v;
  243. }
  244. ostream& operator<<(ostream& os,polinomio *list) {
  245. polinodo *temp;
  246. temp=list->header;
  247. cout<<"\nIl polinomio e':\n";
  248. for(int i=0;i<list->count;i++) {
  249. cout<<"+"<<temp->coeff<<"x^"<<temp->espon;
  250. temp=temp->next;
  251. }
  252. return os;
  253. }
  254.  
  255.  
  256.  
  257. void ordina(polinomio *list) {
  258. polinodo *temp;
  259. temp=list->header;
  260. double c;
  261. unsigned int e;
  262.  
  263. for(int i=0;i<list->count;i++) {
  264.  
  265. for(int j=0;j<(list->count)-1;j++) {
  266. if(temp->espon<temp->next->espon) {
  267. c=temp->coeff;
  268. e=temp->espon;
  269. temp->espon=temp->next->espon;
  270. temp->coeff=temp->next->coeff;
  271. temp->next->coeff=c;
  272. temp->next->espon=e;
  273. }
  274.  
  275. }
  276. temp=temp->next;
  277.  
  278. }
  279. }

ora mi chiedo col template come lo potrei modificare ? Grazie e scusate per il disturbo.


Autodidatta: c++,sql,swift2.2,python,java(poco)
Hobby: Costruire droni programmando arduino,giocare a basket. Praticante di Sanda Boxe
OS: linux ,MacOs(Sierra), windows(10)
Linux: ubuntu12.04lts,arch,slack,pearos,zorinos,debian e mint 14.
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 416
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 18:04
Mercoledì, 19/10/2016
Difficile da dire senza traccia, probabilmente invece dei coefficienti double avresti dei coefficienti generici di tipo T.
A quel punto in ogni posto dove ora hai un polinomio* dovresti avere un polinomio<T>* e così via.

Hai il codice modificato, anche se non funziona? La macchina virtuale ed Eclipse non c'entrano nulla, probabilmente hai sbagliato qualcosa nella sintassi che è abbastanza scivolosa.

PM Quote
Avatar
Birkhoff92 (Normal User)
Rookie


Messaggi: 31
Iscritto: 27/03/2014

Segnala al moderatore
Postato alle 18:19
Mercoledì, 19/10/2016
Grazie per la risposta innanzitutto. Allora la traccia era :
Scrivere un programma che soddisfi i seguenti requisiti:
Sviluppare un template di classe Polinomio. La rappresentazione interna di un Polinomio è una lista a puntatori. Ciascun termine è costituito da un coefficiente ed un esponente. Il termine 2x^4 ha come coefficiente 2 ed esponente 4. I coefficienti sono memorizzati dall'esponente più piccolo a quello più grande. Inoltre ogni polinomio possiede un puntatore che punta al nodo al quale si è avuto accesso di recente.
Sviluppare una classe completa di costruttore e distruttore. Inoltre si costruiscano le funzioni set e get. La classe deve inoltre possedere i seguenti altri operatori sovrapposti:
a) operator(+) per sommare due polinomi;
b)operator(-) per sottrarre due polinomi;
c) operator(=) per assegnare un polinomio ad un altro;
d)operator(*) per moltiplicare due polinomi. Operator(+=) per la somma e l'assegnazione contratta, operator(-=) per la sottrazione ed assegnazione contratta, operator(*=) per la moltiplicazione e assegnazione contratta(opzionale)
e)si costruisca una classe eccezione polinomio che gestisca tutte le eccezioni di errore che si possono presentare in un polinomio. Si includa tale classe tramite la relazione di composizione.
Tutto questo in 60 minuti.


Birkhoff92 ha allegato un file: compito P1 ottobre .jpg (1446233 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da Birkhoff92 il 19/10/2016 alle 18:22


Autodidatta: c++,sql,swift2.2,python,java(poco)
Hobby: Costruire droni programmando arduino,giocare a basket. Praticante di Sanda Boxe
OS: linux ,MacOs(Sierra), windows(10)
Linux: ubuntu12.04lts,arch,slack,pearos,zorinos,debian e mint 14.
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 416
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 18:42
Mercoledì, 19/10/2016
Beh non so adesso se in italiano "template di classe" vuol dire template class, io l'avrei letto come "bozza di classe".
Supponendo comunque che si dovessero usare i template (che però non hanno molto senso in questo caso), non hai comunque rispettato la traccia. Non hai implementato gli operatori custom (+, -, * e =) e la classe eccezione.
Tra l'altro invece di usare una classe hai usato una struttura senza metodi.

Praticamente il tuo non è un programma in C++, ma un programma in C.

Riguardo ai template, penso che l'unica cosa generalizzabile siano i coefficienti del polinomio, anche se non ha molto senso: mettendoli come double va più o meno bene anche per polinomi a coefficienti interi.

PM Quote
Avatar
Birkhoff92 (Normal User)
Rookie


Messaggi: 31
Iscritto: 27/03/2014

Segnala al moderatore
Postato alle 22:38
Giovedì, 20/10/2016
capito grazie mille ;)


Autodidatta: c++,sql,swift2.2,python,java(poco)
Hobby: Costruire droni programmando arduino,giocare a basket. Praticante di Sanda Boxe
OS: linux ,MacOs(Sierra), windows(10)
Linux: ubuntu12.04lts,arch,slack,pearos,zorinos,debian e mint 14.
PM Quote