Stringa dentro cornice

di il
10 risposte

Stringa dentro cornice

Buongiorno a tutti!
Devo svolgere un esercizio in cui viene chiesto, preso in input un intero n e una stringa, di stampare un quadrato di lato n con all'interno la stringa.
Input: 8 My String
Output
********
*My Str*
*ing   *
*      *
*      *
*      *
*      *
********
I problemi che sto riscontrando sono due.
Quando provo a stampare una stringa che ha la stessa lunghezza del "lato interno", n-2 per intenderci, mi da questo risultato:
10 Kusanagi
**********
*Kusanagi*
*        *
*a n a g i *
*        *
*        *
*        *
*        *
*        *
**********
La parte di codice interessata è questa:
number è l'intero.
phrase è la stringa.
emptyMind stampa uno spazio.

Questo else if sta dentro un for
for (int j = 0; j < number - 2; j++)
else if (phrase.length() <= number -2){
					System.out.print('*');
					for (int k = 1; k < phrase.length(); k++) System.out.print(phrase.charAt(k));
					for (int l = phrase.length()-1; l < number - 2; l++) System.out.print(emptyMind);
					System.out.println('*');
					phrase = phrase.replace(phrase, emptyMind);
				}
Non riesco a capire perchè se metto "phrase = phrase.replace(phrase, emptyMind);" fuori dall'else if, non ci sono ripetizioni; mentre se è dento si ripete "a n a g i".

Il secondo problema riguarda quando devo stampare una stringa lunga.
10 Ghost in the Shell
**********
*Ghost in*
* the Shell*
*        *
*        *
*        *
*        *
*        *
*        *
**********
Attualmente ho questo output perchè non ho capito come impostare una lunghezza predefinita per stampare una sottostringa.

So di avere scritto molto e di chiedere molto, ma sono giorni che ci lavoro e che non ne vengo a capo.

10 Risposte

  • Re: Stringa dentro cornice

    Ti assicuro che è molto più semplice di quanto stavi pensando! Non serve il replace e non servono giri "strani".
    Immagina il contenuto interno della cornice come un indice lineare che va da 0 a n. Se tale indice esiste nella stringa, stampi il carattere i-esimo, altrimenti stampi spazio.

    In pratica, dato in input N:
    - tieni una variabile es. idx = 0
    - stampi una riga di N asterischi
    - fai un ciclo for di N-2 cicli (per le righe in mezzo), in cui dentro fai:
    --- stampi 1 asterisco
    --- fai un ciclo di N-2 cicli (per le colonne in mezzo), in cui dentro fai:
    ------- se idx è un indice inferiore al length() della stringa, stampi il carattere a idx (e incrementi idx), altrimenti stampi spazio
    --- stampi 1 asterisco + newline
    - stampi una riga di N asterischi
  • Re: Stringa dentro cornice

    Il programma funziona, ma non capisco perchè inizi a stampare la stringa dal terzo spazio e non dal secondo.
    10 Kusanagi
    **********
    * Kusanag*
    *i       *
    *        *
    *        *
    *        *
    *        *
    *        *
    *        *
    **********
    Ho provato a mettere, come avevo fatto inizialmente, k = 1. Ma anche così, stampa dal terzo "spazio".
    for (int j = 0; j < number - 2; j++){
    				System.out.print('*');
    				for (int k = 0; k < number - 2; k++){
    					if (count < phrase.length()){
    						System.out.print(phrase.charAt(count));
    						count += 1;
    					}
    					else System.out.print(" ");
    				}
    				System.out.println('*');
    			}
  • Re: Stringa dentro cornice

    ilpico22 ha scritto:


    for (int j = 0; j < number - 2; j++){
    				System.out.print('*');
    				for (int k = 0; k < number - 2; k++){
    					if (count < phrase.length()){
    						System.out.print(phrase.charAt(count));
    						count += 1;
    					}
    					else System.out.print(" ");
    				}
    				System.out.println('*');
    			}
    Il codice è di per sé corretto. count chiaramente deve essere inizializzato prima, all'inizio, a 0 (non 1).


    Domanda: come hai fatto l'input di number e phrase?
  • Re: Stringa dentro cornice

    andbin ha scritto:


    ilpico22 ha scritto:


    for (int j = 0; j < number - 2; j++){
    				System.out.print('*');
    				for (int k = 0; k < number - 2; k++){
    					if (count < phrase.length()){
    						System.out.print(phrase.charAt(count));
    						count += 1;
    					}
    					else System.out.print(" ");
    				}
    				System.out.println('*');
    			}
    Il codice è di per sé corretto. count chiaramente deve essere inizializzato prima, all'inizio, a 0 (non 1).


    Domanda: come hai fatto l'input di number e phrase?
    count è prima dei for ed è a 0; count += 1 è per l'incremento.
    l'input è da tastiera.
  • Re: Stringa dentro cornice

    ilpico22 ha scritto:


    l'input è da tastiera.
    Sì .. ok. Ma tecnicamente con cosa? Scanner? (e usato come?) O altro?
  • Re: Stringa dentro cornice

    andbin ha scritto:


    ilpico22 ha scritto:


    l'input è da tastiera.
    Sì .. ok. Ma tecnicamente con cosa? Scanner? (e usato come?) O altro?
    Si, utilizzo Scanner.
    Nel main creo un nuovo oggetto a cui applico il metodo. Il metodo prende come valori l'intero e la stringa da tastiera.
  • Re: Stringa dentro cornice

    ilpico22 ha scritto:


    Si, utilizzo Scanner.
    Nel main creo un nuovo oggetto a cui applico il metodo. Il metodo prende come valori l'intero e la stringa da tastiera.
    Va beh ... continui a non mostrare il codice. Se hai usato nextInt() per il numero, poi seguito da un nextLine() per la stringa, se scrivi 10 Pippo lo spazio tra 10 e Pippo viene PRESO nella stringa. È qui che volevo arrivare ....
  • Re: Stringa dentro cornice

    andbin ha scritto:


    ilpico22 ha scritto:


    Si, utilizzo Scanner.
    Nel main creo un nuovo oggetto a cui applico il metodo. Il metodo prende come valori l'intero e la stringa da tastiera.
    Va beh ... continui a non mostrare il codice. Se hai usato nextInt() per il numero, poi seguito da un nextLine() per la stringa, se scrivi 10 Pippo lo spazio tra 10 e Pippo viene PRESO nella stringa. È qui che volevo arrivare ....
    public static void main(String[] args){
    		StringFramed drawString = new StringFramed();
    		int number;
    		String phrase;
    
    		Scanner keyboard = new Scanner(System.in);
    		number = keyboard.nextInt();
    		phrase = keyboard.nextLine();
    		drawString.matrixString(number, phrase);
    	}
    Scusami, non avevo capito che ti servisse anche il codice!
  • Re: Stringa dentro cornice

    "matrixString" è il nome del metodo.
    Non sapevo questa cosa dell'input con Scanner... Con altri programmi, ma si trattava di dare solo dei numeri, non dava questo problema. Quindi pensavo che lo spazio ci volesse sempre.
    Comunque ti ringrazio davvero tanto per l'aiuto!!!
  • Re: Stringa dentro cornice

    ilpico22 ha scritto:


    Non sapevo questa cosa dell'input con Scanner...
    Lo spazio non è consumato/eliminato dal nextInt() ... viene PRESO dal nextLine() successivo. Funziona così, non è un baco o che altro. Tutto qui.
Devi accedere o registrarti per scrivere nel forum
10 risposte