Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50

    [JAVA] Inserire data di nascita e calcolare i numeri primi fino ad essa

    Salve, premetto che sono davvero alle prime armi..devo creare un programmino che chieda di inserire il giorno di nascita e che stampi i numeri primi fino a quel numero (compreso, se primo). Ho inserito anche uno "pseudo controllo", diciamo e ho creato il programma che analizza un numero e te lo stampa solo se è primo. Ora io vorrei che queste azioni (analizzare un numero e stamparlo se primo) vengano ripetute per GIORNO, GIORNO-1, GIORNO -2 ecc...fino a 1. (esempio, se inserisco 7, il programma di deve analizzare 7,6,5,4,3,2,1 e stamparmi solo i numeri primi.). Come faccio??
    p.s sono alle prime armi.. non voglio che mi si cambi il codice, voglio solo sapere come analizzare i numeri da GIORNO (variabile) a 1...grazie
    codice:
    import java.util.Scanner;
    
    public class Giornonascita {
    
    
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    
    Scanner in = new Scanner(System.in);
    System.out.println("Inserisci il giorno della tua data di nascita: ");
    int giorno = in.nextInt();
    
    int k= 2;
    double resto= 0;
    
    
    
    //controllo= (es: che non sia 32 
    //-giorno che non esiste)
    if (giorno<=31 && giorno >0) 
    
    
    for (int i =1; i<=giorno; )	
    
    {do {resto= giorno%k;
    if (resto !=0) k++;giorno--;} while (k<giorno-1);
    {System.out.println(giorno); }
    giorno--; }//errore
    
    
    else System.out.println("Errore nell'inserimento: riprova.");
    
    }
    
    }
    p.s sono nuova anche sul forum..spero di non aver inserito correttamente la discussione

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Ciao e benvenuta! ^^

    Ricordati da ora di utilizzare il tag CODE quando devi postare del codice.

    Devi fare semplicemente un for che parta al contrario.
    codice:
    for(int i=giorno; i>1; i--) {

    Il tuo codice è un disastro comunque... ti consiglio di aprire di nuovo il libro guardarti il ciclo for, ad esempio, che sono concetti che stanno davvero alla base.

    L'ho solamente indentato, ma non ho modificato nulla, ho lasciato tutti gli errori.

    codice:
    import java.util.Scanner;
     
    public class Giornonascita {
      public static void main(String[] args) {
        // TODO Auto-generated method stub
    
        Scanner in = new Scanner(System.in);
        System.out.println("Inserisci il giorno della tua data di nascita: ");
        int giorno = in.nextInt();
    
        int k= 2;
        double resto= 0;
    
        //controllo= (es: che non sia 32
        //-giorno che non esiste)
        if (giorno<=31 && giorno >0) 
          for (int i =1; i<=giorno) {
    	    
    		do {
    		  resto= giorno%k;
              if (resto !=0) k++;
    		  giorno--;
    		} while (k<giorno-1);
            {System.out.println(giorno); }
            giorno--; 
    	  }//errore
         else System.out.println("Errore nell'inserimento: riprova.");
      }
    }
    L'if ad esempio non è proprio corretto, serve la parentesi graffa. Il System.out.println() dentro ad un blocco non ha alcun senso... il for è errato proprio come forma.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50
    Ciao, grazie mille per la risposta! In che senso un disastro,comunque? xD So benissimo che il codice che ho postato non funziona, infatti ho scritto "//errore", ma effettivamente dovevo essere più chiara. Per il System tra graffe hai ragione, è che avevo provato un blocco di istruzioni e poi ho dimenticato di rimuovere le parentesi. Comunque credimi, avevo già provato con il for, ma non va.. mi stampa semplicemente il 7 più volte..ma non stampa 7,5,3,2,1.. Il codice con l'aggiunta del for che mi hai consilgliato (che mi pareva comunque di aver già usato), è questo. Che mi consigli? Grazie per la pazienza!

    codice:
    import java.util.Scanner;
    
    public class Giornonascita {
    
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		Scanner in = new Scanner(System.in);
    		System.out.println("Inserisci il giorno della tua data di nascita: ");
    		int giorno = in.nextInt();
    		
    		int k= 2;
    		double resto= 0;
    	
    		
    		
    		//controllo= (es: che non sia 32 
    		//-giorno che non esiste)
    		if (giorno<=31 && giorno >0)
    			
    		
    		
    		
    			for(int i=giorno; i>1; i--) {
    				
    			{do {resto= giorno%k;
    			if (resto !=0) k++;} while  (k<giorno-1);
    			System.out.println(giorno);  
    			}
    			
    			}
    		
    		else System.out.println("Errore nell'inserimento: riprova.");
    		
    	}
    
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Ora mi spiego. ^^

    Iniziamo dagli aspetti che non minano la compilazione. Utilizzi una variabile double per il resto della divisione, ma a te non interessa sapere se il resto è 0.7 o 0.2. A te interessa sapere se è == a 0 oppure no. Quindi puoi usare un int.

    Il for com'era scritto in precedenza non aveva una parte, ovvero quella di incremento.
    Vedo poi molta confusione nel ciclo for, in particolare nel while. Lo scopo è prendere ogni numero da 1 a "giorno" e verificare i primi. Tu in questi caso scorri i numeri da giorno ad 1 tramite la variabile i, quindi è questa da utilizzare.

    Ti consiglio di scrivere meglio il codice. xD

    Se nel ciclo utilizzi giorno, vai a controllare sempre lo stesso numero. ^^


    Ma non conosci le classi ed i metodi?


    Prego!

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50
    Cosa intendi per scrivere meglio il codice? Ti riferisci ad una questione di indentation per una migliore leggibilità? Oppure ad errori nell'uso delle iterazioni o di altri costrutti?

    Comunque scusa se ti sto facendo perdere tempo, ma mi sto dannando su questo semplice codice da vari pomeriggi.. riscontro ancora questi errori. Ho modificato il codice secondo le tue direttive (inserendo giustamente la variabile i), ma adesso se per esempio inserisco 7 mi stampa 7,6,5,4,3,2,1 (e non solo i numeri primi), se invece inserisco 6, non mi stampa proprio nulla

    codice:
    import java.util.Scanner;
    
    public class Giornonascita {
    
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		Scanner in = new Scanner(System.in);
    		System.out.println("Inserisci il giorno della tua data di nascita: ");
    		int giorno = in.nextInt();
    		
    		int k= 2;
    		int resto= 0;
    	
    		
    		
    		//controllo= (es: che non sia 32 
    		//-giorno che non esiste)
    		if (giorno<=31 && giorno >0)
    			
    		
    		
    		
    			for(int i=giorno; i>=1; i--) 
    			{
    				
    				{do {resto= i%k;
    				if (resto !=0) k++;} while  (k<i-1);
    				System.out.println(i);  
    				}
    			
    			}
    		
    		else System.out.println("Errore nell'inserimento: riprova.");
    		
    	}
    
    }

    Mentre aspetto una risposta provo a sforzarmi e a risolvere e nel caso edito il messaggio. Grazie ancora, sei molto disponibile

  6. #6
    Perché due parentesi graffe nel for?
    codice:
    for(int i=giorno; i>=1; i--) 
    {
    	{do {resto= i%k;
    Te ne basta uno solo...
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50
    Si, poi continuando a lavorarci le ho tolte.. ma questo non mi risolve xD

  8. #8
    E' ovvio che col 6 non ti funziona in quanto resti appesa dentro il ciclo while in quanto non ti crei una condizione d'uscita.
    puoi fare così
    codice:
    if(resto!=0) k++;
    else break;
    il break ti fa uscire fuori dal ciclo oppure potresti crearti una variabile booleana che ti fa questo mestiere.

    Altra cosa....devi reinizializzare la varibile k all'inizio del ciclo for altrimenti ti rimarrà sempre incrementata.
    codice:
    for(int i=giorno; i>=1; i--)  {
        k=2;
        ....
    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50
    Grazie mille anche a te.. il codice modificato adesso è:

    codice:
    import java.util.Scanner;
    
    public class Giornonascita {
    
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		Scanner in = new Scanner(System.in);
    		System.out.println("Inserisci il giorno della tua data di nascita: ");
    		int giorno = in.nextInt();
    		
    		int k= 2;
    		int resto= 0;
    	
    		
    		
    		//controllo= (es: che non sia 32 
    		//-giorno che non esiste)
    		if (giorno<=31 && giorno >0)
    			
    		
    		
    		
    			for(int i=giorno; i>=1; i--) 
    			{k=2;
    				
    				do {resto= i%k;
    				if (resto !=0) k++;
    				else break;}
    				while  (k<(i-1));
    				System.out.println(i);  
    				
    			
    			}
    		
    		else System.out.println("Errore nell'inserimento: riprova.");
    		
    	}
    
    }
    Ma ho sempre un problema..adesso il sei me lo analizza, ma come risultati mi stampa 6,5,4,3,2,1..e non i numeri primi. Idem se inserisco il 7. A questo punto mi viene da pensare che la procedura per analizzare un numero e vedere se è primo che ho scritto non è corretta. Ma prima che iterassi il blocco di istruzioni per le i che vanno da giorno a 1, se inserivo un numero primo me lo stampava, se inserivo un numero non primo, non me lo stampava.

    Cioè, quello che intendo fare è un algoritmo di divisioni con modulo, che incrementi via via il k. Ad esempio, se inserisco 6, il resto è zero per k=2 e quindi si capisce immediatamente che non me lo deve stampare. Se invece inserisco 7, il resto è diverso da zero e quindi continua ad incrementare il k, fino a quando si arriva a 6<6 (k<i-1) ed esce dal ciclo, perchè non è vera, stampandomi il 7. Spero di essere stata chiara, ma voglio farmi capire >.<

    Sarà che quel print mi stampa anche i numeri non primi poichè non viene interpretato come "uscita " dal while, ma semplicemente come istruzione successiva per tutti i numeri da 1 a giorno??

  10. #10
    E' ovvio l'istruzione del println ti viene processata in quanto istruzione successiva...

    puoi fare così
    1) ti dichiari una varibile booleana (per esempio chiamiamola "check")
    2) te la inizializzi dopo il for e la poni a true


    codice:
    for(int i=giorno; i>=1; i--) {
    	k=2;
    	check=true;
    	do {
    		resto= i%k;
    		if (resto !=0) k++;
    		else {
    			check=false;
    			break;
                    }
    	
    	}while  (k<(i-1));
    	
            if (check)
    	    System.out.println(i);  
    }
    Ma questo è solo un accrocchio per far funzionare il programma, sono sicuro che ci sono 100 modi per scrivere il programma in modo più pulito, ma visto che sei alle prime armi va bene così, col tempo e con le guide riuscirai a far bene.

    Cmq attenzione: il numero 2 è primo
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.