Ciclo premi

di il
10 risposte

Ciclo premi

Dove ho sbagliato qui?

import java.util.*;
import java.math.*;

public class CicloEs19 {

	public static void main(String[] args) {
	
		/*Si hanno a disposizione tre premi identici da assegnare in un gruppo di dieci finalisti, ai quali
		 * sono stati associati i numeri da 1 a 10. Scrivere un programma che scelga in modo casuale i numerici
		 * dei tre finalisti che riceveranno un premio. si faccia attenzione a non sorteggiare lo stesso numero
		 * più volte. per esempio, l'estrazione dei finalisti 3, 6, 2 sarebbe valida, ma quella di 3, 3, 11 no
		 * perchè il finalista numero 3 compare due volte e inoltre 11 non è un numero valido per un finalista.
		 * si può semplicemente utilizzare la seguente riga di codice per generare un numero casuale tra 1 a 10
		 * 
		 * int num = (int) (Math.random() * 10) + 1;
		 * */
		double num = 1 , a = 0, b = 0, c = 0;
		
		
		System.out.println("Si hanno a disposizione tre premi identici in un gruppo di 10 finalisti: ");
		System.out.println("Ogni finalista devono avere tre premi differenti.");
		
		
		
		while(num <= 10){
			
			num = (int) (Math.random() * 10) + 1;
			
			if((a != b) && (a != c)){
				a = num;
			}
			else if((b != a) && (b != c)){
				b = num;
			}
			else if((c != a) && (c != b)){
				c = num;
			}
			else {
				System.out.println();
				System.out.println("Finalista A, B, C, hanno avuto tre premi identici, NON è VALIDO!!");
				System.exit(0);
			}
			
			
			System.out.println("A: " + a + " B: " + b + " C: " + c);
		
		}	
		
	}
}


10 Risposte

  • Re: Ciclo premi

    robot ha scritto:


    Dove ho sbagliato qui?
    È un po' "contorto". Si può fare in modo più semplice e lineare.

    Il primo (a) è banale, l'estrazione è diretta. Il secondo (b), fai un ciclo while finché il valore estratto è uguale ad a. Il terzo idem semplicemente che continui a ciclare se il valore estratto è uguale ad a O b.
  • Re: Ciclo premi

    LA condizione dove devo inserire che il resto funziona
    if(a != b && a != c && b != a && b != c && c != a && c != b) --->dove devo inserire?????

    
    import java.util.*;
    import java.math.*;
    
    public class CicloEs19 {
    
    	public static void main(String[] args) {
    	
    		/*Si hanno a disposizione tre premi identici da assegnare in un gruppo di dieci finalisti, ai quali
    		 * sono stati associati i numeri da 1 a 10. Scrivere un programma che scelga in modo casuale i numerici
    		 * dei tre finalisti che riceveranno un premio. si faccia attenzione a non sorteggiare lo stesso numero
    		 * più volte. per esempio, l'estrazione dei finalisti 3, 6, 2 sarebbe valida, ma quella di 3, 3, 11 no
    		 * perchè il finalista numero 3 compare due volte e inoltre 11 non è un numero valido per un finalista.
    		 * si può semplicemente utilizzare la seguente riga di codice per generare un numero casuale tra 1 a 10
    		 * 
    		 * int num = (int) (Math.random() * 10) + 1;
    		 * */
    		
    		/*È un po' "contorto". Si può fare in modo più semplice e lineare. Il primo (a) è banale, 
    		 * l'estrazione è diretta. Il secondo (b), fai un ciclo while finché il valore estratto è uguale ad a. 
    		 * Il terzo idem semplicemente che continui a ciclare se il valore estratto è uguale ad a O b.*/
    		
    		double num = 1 , a = 0, b = 0, c = 0;
    		
    		
    		System.out.println("Si hanno a disposizione tre premi identici in un gruppo di 10 finalisti: ");
    		System.out.println("Ogni finalista devono avere tre premi differenti.");
    		
    		
    		for(int i = 0; i <= 10; i++){
    			num = (int) (Math.random() * 10) + 1;
    			
    				a = num;
    			
    			for(int y = 0; y < 10; y++){
    				num = (int) (Math.random() * 10) + 1;
    				
    				b = num;
    			}
    			
    			for(int z = 0; z < 10; z++){
    				num = (int) (Math.random() * 10) + 1;
    				c = num;
    			}
    			
    		}
    
    		System.out.println("A:" + a + " B:" + b + " C:" + c);
    
    		
    		}	
    		
    	}
    
    
    
    
  • Re: Ciclo premi

    robot ha scritto:


    if(a != b && a != c && b != a && b != c && c != a && c != b) --->dove devo inserire?????
    Che è 'sta roba?? No no. Non serve questo malloppo di AND !

    E non vedo il senso di fare un for principale, oltretutto di 11 cicli (.. perché?) ) e poi dentro il resto con altri cicli. Che tra l'altro NON stai escludendo affatto i duplicati!! Perché non c'è alcun test in quel senso.

    Prima parlavo di while ma in realtà sarebbe meglio fare un do-while. In teoria il while sarebbe anche usabile ma in modo più "forzato".
    int a = //..... estrai uno caso ...
    
    int b;
    do {
        b = //..... estrai uno caso ...
    } while ( condizione_per_ripetere );

    Dove condizione_per_ripetere scrivila tu ma è abbastanza logica: devi ciclare se hai estratto lo stesso valore di a.

    Similare per il terzo. Stop.
  • Re: Ciclo premi

    QUi ho fatto questa condizione, dopo 5 tentantivi alla 6 ripetizione risulta uguale.
    
    a =  (int) (Math.random() * 10) + 1;
    		
    		do{
    			b = (int) (Math.random() * 10) + 1;
    			c = (int) (Math.random() * 10) + 1;
    			
    		}while(!(a != b) && ( b != c));
    
    		System.out.println("A:" + a + " B:" + b + " C:" + c);
    
    
    
    
  • Re: Ciclo premi

    robot ha scritto:


    QUi ho fatto questa condizione, dopo 5 tentantivi alla 6 ripetizione risulta uguale.
    Se separassi in due do-while distinti (uno per b e l'altro per c) viene più semplice. Se vuoi fare un unico do-while per b e c, si può anche fare ma devi prestare attenzione alla condizione: devi ripetere se b è uguale ad a O se c è uguale ad a O (attenzione qui) se b è uguale a c. Se non metti quest'ultima condizione rischi duplicati.

    Per fare questi esercizi, non serve essere "scienziati" ... basta solo il "ragionamento".
  • Re: Ciclo premi

    
    a =  (int) (Math.random() * 10) + 1;
    		
    		do{
    			b = (int) (Math.random() * 10) + 1;
    			
    			do{
    			c = (int) (Math.random() * 10) + 1;
    			}while(c < b); // c deve essere minore di b
    			
    		}while(a > b); // a deve essere maggiore di b
    
    		System.out.println("A:" + a + " B:" + b + " C:" + c);
    
    
    Ho ragionato in questo modo, ma non sono convinto
  • Re: Ciclo premi

    robot ha scritto:


    Ho ragionato in questo modo, ma non sono convinto
    Ma dove sta scritto (nel testo dell'esercizio) che ci deve essere una logica di confronti per maggiore e/o minore ??
  • Re: Ciclo premi

    
    a =  (int) (Math.random() * 10) + 1;
    		
    		do{
    			b = (int) (Math.random() * 10) + 1;
    			c = (int) (Math.random() * 10) + 1;
    			
    		}while((a > b) && (b < c)); // a deve essere maggiore di b
    
    		System.out.println("A:" + a + " B:" + b + " C:" + c);
    
    		
    		}	
    
    
    Realizzando in questo modo i numeri non saranno uguali, ma ho sempre qualche dubbio, mettendo il < o il > i numeri non si equivalgono
  • Re: Ciclo premi

    In questo modo?
    
    	a =  (int) (Math.random() * 10) + 1;
    		
    		do{
    			b = (int) (Math.random() * 10) + 1;
    			c = (int) (Math.random() * 10) + 1;
    			
    		}while((!(a != b)) || (!(c != b))); // a deve essere maggiore di b
    
    		System.out.println("A:" + a + " B:" + b + " C:" + c);
    
    		
    		}	
    
    
  • Re: Ciclo premi

    "si faccia attenzione a non sorteggiare lo stesso numero più volte"
    questo non c'entra nulla con maggiore o minore.
Devi accedere o registrarti per scrivere nel forum
10 risposte