Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    24

    Grafico a barre ( nella shell )

    Ciao a tutti, sto facendo un esercizio nel quale devo prendere 'n' valori da tastiera e mandare in output un grafico a barre composto da asterischi, per essere chiari, se i valori sono:
    2,5,4,7 allora l'otput sarà:
    *
    *
    * *
    ***
    ***
    ****
    ****

    Comunque, la mia idea, dopo svariati tentativi, è di avere due classi, una che si chiama fillmatrix dove faccio tutte le operazioni necessarie al riempimeto della matrice di caratteri e alla stampa, e l'altra con il main dove chiedo gli 'n' valori e gestisco i metodi della prima classe per la creazione della matrice.
    Il mio problema è che in fillmatrix uso il metodo public void creatematrix per creare la matrice e vorrei usare il metodo fill per riempirla, ma quando nella classe main lo vado ad invocare ho dei problemi dato che gli devo passare la matrice, mentre quest'ultima viene creata in fillmatrix.
    Allego il codice che magari si capisce meglio:


    CLASSE MAIN
    codice:
    package graficobarre;
    import java.util.*;
    
    public class Main {
    
        
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
    
            System.out.print("inserire n: ");
    
            int n = in.nextInt();
    
    
            int[] vett = new int[n];
    
            for( int i = 0; i<n; i++){
                vett[i] = in.nextInt();
            }
    
            int max = vett[0];
    
            for( int i = 0; i<n; i++){
                if(vett[i] > max) max = vett[i];
            }
    
            fillmatrix matrix = new fillmatrix(max, n, 0, 0, max);
    
            matrix.createMatrix();
    
            int pos = 0;
    
            for( int i = 0; i<n; i++){
    
                int val = vett[i];
                matrix.setval(val);
                matrix.setpos(pos);
                matrix.fill();
    
            }
    
        }
    
    }
    CLASSE FILLMATRIX:
    codice:
    package graficobarre;
    
    
    public class fillmatrix {
    
        private int righe, colonne;
        private int pos, val, max;
    
    
    
    
    
        public fillmatrix( int r, int c, int p, int v, int m){
    
            righe = r;
            colonne = c;
            pos = p;
            val = v;
            max = m;
    
        }
    
        public void setmax( int m){
    
            max = m;
    
        }
    
        public void setval( int v){
    
            val = v;
    
        }
    
        public void setpos( int p){
    
            pos = p;
        }
    
        public void createMatrix(){
    
            char[][] mat = new char[righe][colonne];
    
        }
    
        public void fill(char[][] mat){
    
            for(int i = max; i>val; i--){
                mat[i][pos]='*';
            }
    
        }
    
        public void print(char[][] mat){
    
            for( int i = 0; i<righe; i++){
    
                for(int j = 0; j<colonne; j++){
    
                    System.out.print(mat[i][j]);
                }
            }
        }
    }
    Lo so che la classe main non funziona dato che è incompleta, ma questo problema ha completamente bloccato le mie idee su come andare avanti ( in questo modo, lo stesso programma l'ho fatto tutto dentro una classe sola, ma diciamo che non mi piace come stile, per questo vorrei farlo con uno stile di programmazione meno C-like).

    Grazie in anticipo per l'aiuto e scusatemi per eventuali errori grossolani o la confusione, ma sto imparando e sono ancora una seja in java :F

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Grafico a barre ( nella shell )

    Originariamente inviato da anearion
    se i valori sono:
    2,5,4,7 allora l'otput sarà:
    codice:
       *
       *
     * *
     ***
     ***
    ****
    ****
    Dovevi postare il grafico tra i tag code (come ho quotato io), altrimenti non è chiaro il risultato.

    Non ho letto per bene tutto il tuo codice ma ti posso suggerire una soluzione abbastanza semplice e intuitiva.

    Hai N valori in un array es. appunto {2,5,4,7}. Innanzitutto cerchi il valore massimo (è facile questo) che è 7. Quindi sai che dovrai stampare a video 7 righe.

    Pertanto farai un ciclo for per ciclare 7 volte. Tieni una variabile, chiamiamola 'riga', inizialmente a 7 che poi decrementi ad ogni riga.
    E qui adesso mi pare che diventi molto intuitivo. Per ogni ciclo delle righe fai un ciclo sull'array. Se un valore è maggiore della variabile 'riga', allora stampi spazio, altrimenti un asterisco.

    Ovviamente devi generalizzarlo ... io ho fatto l'esempio con il tuo array.

    Tutto qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    24
    hai ragione, scusa per il risultato ma non c'ho fatto caso che mi aveva sfasato gli spazi vuoti.

    grazie per la risposta, ma non è quello il mio problema, questo esercizio l'ho gia fatto in un modo simile a quello detto da te, ma ora quello che mi interessa è riuscire a capirci qualcosa in più nella gestione e modifica di array/matrici e nell'interazione tra classi. Nello specifico nella classe fillmatrix i due metodi creatematrix e fill come possono essere collegati tra di loro, in modo che la matrice che creo nel primo metodo la posso usare nel secondo ?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    A dire il vero un buon "design" potrebbe essere una classe es. GraficoBarre con le seguenti caratteristiche:
    - un costruttore che riceve l'array int[] con i valori. Il costruttore calcola e costruisce già direttamente la matrice del grafico.
    - una serie di metodi per "esporre" al di fuori i dati e le informazioni sul grafico. Un mix di metodi, a tua scelta per ottenere ad esempio:
    a) numero righe/colonne matrice
    b) un carattere nel punto (riga,colonna)
    c) un String con la riga i-esima
    d) un array char[][]

    o varianti simili.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    24
    grazie mille andbin, ora devo uscire, stasera o al più domani all'uni provo con una classe indipendente.

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.