Djot (Normal User)
Rookie
Messaggi: 28
Iscritto: 14/02/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++ |
#include <iostream> using namespace std; struct lista{ int val; lista* next; }; lista* creaLista1(int m){ lista* aux ; lista* p=NULL; for(int i = m; i>0 ; i--){ aux = new lista; aux->val= i; aux->next=p; p = aux; } return (p); } lista* cerca(lista* p){ while(p!=NULL){ if((p->val)%2==0 || (p->val)%3==0){ cout << p->val; p = p->next;} else if((p->val)%2!=0 || (p->val)%3!=0) p->next = (p->next)->next; } return (p); } void stampa(lista* p){ while(p!=NULL){ cout << p->val; p = p->next; if(p!=NULL) cout << "->" ; } cout << endl; } int main(){ lista* P; P=creaLista1(5); stampa(P); cerca(P); return 0; }
|
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?
|
|
lumo (Member)
Expert
Messaggi: 449
Iscritto: 18/04/2010
|
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.
|
|
()
Newbie
Messaggi:
Iscritto:
|
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++ |
lista* cerca(lista* p){
while(p!=NULL){
if((p->val)%2==0 || (p->val)%3==0){
cout << p->val;
p = p->next;}
else
if((p->val)%2!=0 || (p->val)%3!=0)
p->next = (p->next)->next;
}
return (p);
}
|
Tu hai scritto:
Codice sorgente - presumibilmente Plain Text |
Se il numerò è divisibile per 2 o per 3
stampa il numero
vai avanti con la lista
altrimenti
se il numero non è divisibile per 2 o per 3
???????
|
Ultima modifica effettuata da il 01/04/2017 alle 19:41 |
|
Djot (Normal User)
Rookie
Messaggi: 28
Iscritto: 14/02/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?
|
|
AldoBaldo (Member)
Guru
Messaggi: 699
Iscritto: 08/01/2015
|
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. |
|
()
Newbie
Messaggi:
Iscritto:
|
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 |
p->next = (p->next)->next;
|
Cosa volevi far fare al programma?
perchè non hai usato un semplice "vai avanti con la lista"? |
|
Djot (Normal User)
Rookie
Messaggi: 28
Iscritto: 14/02/2017
|
Come avete notato non ho molta dimestichezza con il C++...
|
|
()
Newbie
Messaggi:
Iscritto:
|
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. |
|
Djot (Normal User)
Rookie
Messaggi: 28
Iscritto: 14/02/2017
|
Che sia C++ ne sono sicuro, per quanto riguarda il p->next è sicuramente colpa dell'ignoranza
|
|