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++ - Esercizio su Liste
Forum - C/C++ - Esercizio su Liste

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Djot (Normal User)
Rookie


Messaggi: 23
Iscritto: 14/02/2017

Segnala al moderatore
Postato alle 19:16
Sabato, 01/04/2017
Scusatemi , ho qualche problema su un piccolo esercizio riguardante le liste , vi elenco qui sotto il comando dell'esercizio e il mio codice sorgente :
"Letta in input una sequenza di numeri interi positivi memorizzarla in una ista. Costruire una seconda lista contenente soltanto gli elementi della prima lista che non siano numeri primi. Stampare la seconda lista."

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct lista{
  5.         int val;
  6.         lista* next;
  7. };
  8.  
  9. lista* creaLista1(int m){
  10.         lista* aux ; lista* p=NULL;
  11.         for(int i = m; i>0 ; i--){
  12.                 aux = new lista;
  13.                 aux->val= i;
  14.                 aux->next=p;
  15.                 p = aux;
  16.         }
  17.         return (p);
  18. }
  19.  
  20. lista* cerca(lista* p){
  21.         while(p!=NULL){
  22.                 if((p->val)%2==0 || (p->val)%3==0){
  23.                         cout << p->val;
  24.                     p = p->next;}
  25.                 else
  26.                         if((p->val)%2!=0 || (p->val)%3!=0)
  27.                                 p->next = (p->next)->next;
  28.         }
  29.         return (p);
  30. }
  31.  
  32. void stampa(lista* p){
  33.         while(p!=NULL){
  34.                 cout << p->val;
  35.                 p = p->next;
  36.         if(p!=NULL)
  37.                 cout << "->" ;
  38.         }
  39.         cout << endl;
  40. }
  41. int main(){
  42.         lista* P;
  43.         P=creaLista1(5);
  44.         stampa(P);
  45.         cerca(P);
  46.         return 0;
  47. }



Il codice crea e stampa la prima lista , ma tuttavia non stampa la seconda versione della lista (quella senza numeri primi) , potete elencarmi l'errore?


-Djot
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 413
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 19:36
Sabato, 01/04/2017
Il problema che il tuo codice non toglie i primi, ci sarebbero pi modi per farlo, sai cos' un numero primo intanto?

Alla fine la funzione cerca non dovrebbe avere nessun "cout" all'interno, dovrebbe solo ritornare il nuovo puntatore e dopo useresti stampa su quello.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 19:41
Sabato, 01/04/2017
Innanzitutto, l'algoritmo per verificare se un numero primo sbagliato...
Ad esempio:
25 non un numero primo, ma non divisibile ne per 2 ne per 3.

Passiamo al codice
Codice sorgente - presumibilmente C/C++

  1. lista* cerca(lista* p){
  2.         while(p!=NULL){
  3.                 if((p->val)%2==0 || (p->val)%3==0){
  4.                         cout << p->val;
  5.                     p = p->next;}
  6.                 else
  7.                         if((p->val)%2!=0 || (p->val)%3!=0)
  8.                                 p->next = (p->next)->next;
  9.         }
  10.         return (p);
  11. }


  Tu hai scritto:
Codice sorgente - presumibilmente Plain Text

  1. Se il numer divisibile per 2 o per 3
  2.     stampa il numero
  3.     vai avanti con la lista
  4. altrimenti
  5.     se il numero non divisibile per 2 o per 3
  6.     ???????



  

Ultima modifica effettuata da il 01/04/2017 alle 19:41
PM Quote
Avatar
Djot (Normal User)
Rookie


Messaggi: 23
Iscritto: 14/02/2017

Segnala al moderatore
Postato alle 16:35
Domenica, 02/04/2017
Potete fornirmi una versione corretta della funzione cerca? Tralasciando il fatto che cancelli solo numeri non divisibili per 2 e 3 , quale sarebbe la sua versione corretta?


-Djot
PM Quote
Avatar
AldoBaldo (Member)
Expert


Messaggi: 345
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 17:02
Domenica, 02/04/2017
Se val in struct lista un int a 32 bit senza segno puoi includere nel programma la serie precalcolata dei numeri primi compresi tra 2 e 65535, quindi procedere confrontando direttamente con quei valori i valori nella tua lista. Se poi la tua lista una lista ordinata puoi ottimizzare il confronto in modo che effettui il minor numero possibile di calcoli inutili.


Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:12
Domenica, 02/04/2017
Testo quotato

Postato originariamente da Djot:

Potete fornirmi una versione corretta della funzione cerca? Tralasciando il fatto che cancelli solo numeri non divisibili per 2 e 3 , quale sarebbe la sua versione corretta?  



Con

Codice sorgente - presumibilmente Plain Text

  1. p->next = (p->next)->next;



Cosa volevi far fare al programma?
perch non hai usato un semplice "vai avanti con la lista"?

PM Quote
Avatar
Djot (Normal User)
Rookie


Messaggi: 23
Iscritto: 14/02/2017

Segnala al moderatore
Postato alle 17:29
Domenica, 02/04/2017
Come avete notato non ho molta dimestichezza con il C++...


-Djot
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:34
Domenica, 02/04/2017
Testo quotato

Postato originariamente da Djot:

Come avete notato non ho molta dimestichezza con il C++...


non vorrei sbagliarmi, ma questo C , di c++ c' solo il cout
(o per lo meno, a me sembra lo stesso tipo di gestione che ha il C delle liste, e quel
p->next = (p->next)->next
non l'ho mai visto in c.

PM Quote
Avatar
Djot (Normal User)
Rookie


Messaggi: 23
Iscritto: 14/02/2017

Segnala al moderatore
Postato alle 17:39
Domenica, 02/04/2017
Che sia C++ ne sono sicuro, per quanto riguarda il p->next sicuramente colpa dell'ignoranza


-Djot
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo