Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    Cicli annidati, non vi capisco

    E' mezzo pomeriggio che tento di fare uno stupido programmino senza riuscirci.
    Fin dall'inizio ho avuto difficoltà a gestire bene i cicli, e non vogliono entrarmi in testa come si deve.
    Tale programma prende in input dall'utente un numero intero e stampa un triangolo isoscele di asterischi la cui base è il doppio dell'intero preso in input -1 e l'altezza è uguale all'intero preso in input. Le uniche istruzioni consentite per la stampa sono una che stampa una linea vuota, una che stampa un asterisco, e una che stampa uno spazio.
    Si suggerisce di usare cicli for annidati.
    Ma io riesco a produrre solo un quadrato
    Per favore mi date una mano a capire SENZA darmi la soluzione? (che la trovo in 2 minuti su internet ma non è questo che cerco).
    Non riesco a capire come dirgli: alla prima riga stampa n spazi e un asterisco, alla seconda riga stampa n-1 spazi e 3 asterischi, e così via


    codice:
    import java.util.Scanner;
    public class Asterischi {
    	public static void main (String[] args) {
    		Scanner scan=new Scanner(System.in);
    		System.out.println("Inserisci un intero: ");
    		int n=scan.nextInt();
    		int c=Math.abs(n); //in caso l'utente metta un negativo
    		int base=2*(c-1);
    //il ciclo esterno stampa c volte una nuova riga e fin qui ci siamo...
    		for (int i=0; i<c; i++) {
    			System.out.println();
    //questa è la parte incriminata
    			for (int j=0; j<=base; j++) {
    				System.out.print(' ');
    				System.out.print('*');
    			}
    		}
    	}
    }
    Grazie!

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    55
    Ciao, nel ciclo interno devi esprimere la condizione per capire se un punto devi stamparlo ("*") o meno (" "), quindi devi usare una regola generale che valga per tutte le righe che stai considerando... ad esempio potresti legare la distanza del punto dal centro, alla riga che stai stampando... ho detto troppo?

    PS togli il <= nel ciclo interno.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Sei sicuro che la base sia 2*(n-1) e non 2*n -1 ??
    Nel modo in cui stai facendo tu verrebbe un triangolo senza punta!Verrebbe una cosa del genere
    codice:
          
      **  
     *  * 
    ******
    penso tu abbia interpretato male la traccia..



  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    no nel modo in cui stavo facendo veniva un quadrato...
    adesso sono riuscita ad ottenere un triangolo rettangolo

    codice:
    import java.util.Scanner;
    public class Asterischi {
    	public static void main (String[] args) {
    		Scanner scan=new Scanner(System.in);
    		System.out.println("Inserisci un intero: ");
    		int n=scan.nextInt();
    		int altezza=Math.abs(n);
    		int base=2*(n-1);
    		for (int i=0; i<altezza; i++) {
    			for (int j=0; j<i; j++) {
    				System.out.print('*');
    			}
    			System.out.println();
    		}
    		
    	}
    }
    @borras non ho capito...

    La faccenda è questa:
    Ponendo il numero dato in input come x:
    - il n. di asterischi da stampare parte da 1 e aumenta di 2 a ogni riga fino ad arrivare a (base*2)-1.
    - il n. di spazi da stampare parte da x-1 diminuisce di 1 a ogni riga fino ad arrivare a 0.

    Ecco, non so tradurre tutto questo in codice.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Semplifico un attimo (secondo la nota tecnica del divide et impera... )
    Sono riuscita a fare dopo mezza giornata la stampa del triangolo invertito... che genio del male...
    Cioè una roba tipo:

    *****
    ****
    ***
    **
    *

    così:

    codice:
    for (int i=1; i<=n; i++) {
    			for (int j=n; j>=i; j--) {
    				System.out.print('*');
    			}
    			System.out.println();
    		}
    RI-EDIT ho fatto il mezzo triangolo dalla parte giusta...ma manca la parte destra

    codice:
    		for (int i=1; i<=n; i++) {
    			for (int j=n; j>=i; j--) {
    				System.out.print(' ');
    			}
    			for (int k=1; k<=i; k++) {
    				System.out.print('*');
    			}
    			System.out.println();
    		}

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Finalmente ce l'ho fatta (con un piccolo aiutino esterno ma che alla fine ho compreso).
    Ecco il programma completo che stampa un triangolo isoscele di asterischi con un numero di righe pari a un n dato in input dall'utente:

    codice:
    import java.util.Scanner;
    public class Asterischi {
    	public static void main (String[] args) {
    		Scanner scan=new Scanner(System.in);
    		System.out.println("Inserisci un intero: ");
    		int num=scan.nextInt();
    		int n=Math.abs(num);
    		int k=0;
    		for (int i=1; i<=n; i++) {
    			int e=i+k;
    			for (int j=n; j>i; j--) {
    				System.out.print(' ');
    			}
    			
    			for (int h=1; h<=e; h++) {
    				System.out.print('*');
    			}
    			k++;
    			System.out.println();
    		}
    	}
    }
    Che faticaccia....ma secondo voi è normale perdere tipo 6 ore per fare una cosa del genere?
    Vabbè almeno ho finalmente compreso il funzionamento dei cicli annidati...

    ps. se volete potete cancellare il topic o cambiarne il titolo con un risolto in mezzo...

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.