Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 14-04-2015, 09:33   #1
Rhaegar20
Junior Member
 
Iscritto dal: Apr 2015
Messaggi: 4
[PASCAL] Problema elementare.

Salve a tutti. Ho da pochissimo iniziato a studiare, per conto mio e interesse personale, un po' di programmazione. Provando a risolvere un problema mi son trovato davanti ad un errore, sicuramente commesso da me, che però non riesco ad individuare e che mi sta facendo uscir pazzo.
L'esercizio in questione chiede di crear una funzione che elenchi i primi 50 numeri primi, ed io son arrivato a scriver questo algoritmo:

var a,c,n,d:integer;

begin
a:=2;
write(a,' ');
c:=1;
n:=3;
repeat
d:=2;
while d<n do
begin
if n mod d =0 then
n:=n+1;
d:=d+1
end;
write(n,' ');
n:=n+1;
c:=c+1;
until(c=50);
end.

Il programma, sino al numero primo 83, parrebbe funzionare. Ma, da lì in poi, lista numeri (come 87 e 95) che primi non sono, secondo una logica che proprio mi sfugge. Ci sarebbe qualcuno di così buon cuore da aiutarmi a capire cosa va storto?

Ultima modifica di Rhaegar20 : 14-04-2015 alle 09:51.
Rhaegar20 è offline   Rispondi citando il messaggio o parte di esso
Old 14-04-2015, 10:18   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2794
Metti sempre il tag code intorno al codice, così mantieni l'indentazione
Codice:
begin
    a:=2;
    write(a,' ');
    c:=1;
    n:=3;
    repeat
        d:=2;
        while d<n do
        begin
            if n mod d =0 then
                n:=n+1;
            d:=d+1
        end;
        write(n,' ');
        n:=n+1;
        c:=c+1;
    until(c=50);
end
Il problema è nella parte in rosso. Prova a rifletterci ancora un po' focalizzando l'attenzione su quella parte...
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 14-04-2015, 11:17   #3
Rhaegar20
Junior Member
 
Iscritto dal: Apr 2015
Messaggi: 4
Grazie per l'attenzione innanzitutto.
Sì, immaginavo che il problema fosse in quelle righe, ed infatti ho provato diverse variazioni di codice. Ma il risultato che son riuscito ad ottenere è rimasto lo stesso.
Riguardando la lista di numeri in output, comunque, mi son reso conto di aver scritto un'inesattezza, prima: ci son "errori" anche prima del numero 83.
Rhaegar20 è offline   Rispondi citando il messaggio o parte di esso
Old 14-04-2015, 12:02   #4
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2794
Ok, il problema è questo: il ragionamento che hai fatto è corretto cioè, per ogni numero, provi a dividerlo per tutti i numeri inferiori (while d<n do ...).
Nel codice che hai scritto però cosa succede, ad esempio, se un numero non è divisibile per 2,3,4 ma è divisibile per 5? Ad esempio 25? Immagino che tra i primi rilevati dal tuo programma c'è anche il 27 giusto?
In sostanza è sbagliato quello che fai quando rilevi che un numero è divisibile per un altro numero inferiore e quindi non è primo.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 14-04-2015, 14:00   #5
Rhaegar20
Junior Member
 
Iscritto dal: Apr 2015
Messaggi: 4
Esatto, 27 è proprio il 'primo' dei numeri non-primi che compare nell'elenco. Solo, continua a sfuggirmi il perchè. Ne comprendo perchè il problema si pone proprio a partir da quel valore. Credo d'aver capito che l'errore sta nell'assegnare ad n il valore di n+1 ogni qual volta trovo un divisore, ma non riesco a trovar un altro percorso logico valido.

P.S. Ad ogni modo, la ringrazio del tempo che dedica ad un neofita.
Rhaegar20 è offline   Rispondi citando il messaggio o parte di esso
Old 14-04-2015, 14:44   #6
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2794
Prego, spero di riuscire a spiegarmi...
Facciamo così, analizziamo la parte di codice interessata:
Codice:
        while d<n do
        begin
            if n mod d =0 then
                n:=n+1;
            d:=d+1
        end;
        write(n,' ');
Ed eseguiamola "a mano" ponendoci già nella situazione n=25 e d=5.

d<n ? sì, quindi eseguo il corpo del ciclo
n mod d=0 ? Sì, quindi n=26
d=6 //Qui c'è l'errore
d<n ? sì, quindi rieseguo il corpo del ciclo
n mod d=0 ? No
d=7
d<n ? sì, quindi rieseguo il corpo del ciclo
n mod d=0 ? No
d=8
d<n ? sì, quindi rieseguo il corpo del ciclo
...
... // Viene rieseguito più volte il ciclo, intanto d cresce
...
d=13
d<n ? sì, quindi rieseguo il corpo del ciclo
n mod d=0 ? Sì, quindi n=27
d=14
...
... // Viene rieseguito più volte il ciclo, intanto d cresce
d=27
d<n ? no, quindi esco dal ciclo
stampo n cioè 27
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 14-04-2015, 15:44   #7
Rhaegar20
Junior Member
 
Iscritto dal: Apr 2015
Messaggi: 4
La ringrazio infinitamente della spiegazione, credo di aver capito dove sbagliavo. Ho corretto l'algoritmo in questo modo:

Codice:
        while d<n do
        begin
            if n mod d =0 then
               begin
                  n:=n+1;
                  d:=2
               end
             else
               d:=d+1
        end;
e pare funzionare, almeno per i primi 50 numeri primi.
Rhaegar20 è offline   Rispondi citando il messaggio o parte di esso
Old 14-04-2015, 15:50   #8
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2794
Sì ora è corretto
La mia spiegazione era un po' arzigogolata ma sono contento che abbia capito.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Speciale TV in offerta su Amazon: Hisens...
Non c'è pace per Trezor: 347.000 e-mail ...
È un portatile Dell e li vale tut...
Apple iPhone 17 Pro Max 256GB a 1.195€ (...
GPT-6 Astra è davvero AGI o non s...
LG OLED G6S 48'' a 845€ e G6 55'' a 1368...
Mantax Otax: il malware Android che crip...
Musk incassa un altro maxi contratto IA:...
Le vendite di EV sono esplose in tutto i...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 05:27.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v