Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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: 28
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?

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
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: 28
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?

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
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.


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
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: 28
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++...

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: 28
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

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