Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Problema con Array e Metodi.

    Salve a tutti!
    Il mio problema da svolgere è il seguente:

    Scrivere un programma che riceva un intero, maggiore di 0, rappresentante la capacità in kg di uno zaino, e riceva una serie di interi rappresentanti i pesi degli oggetti da inserirvi no a che la somma dei pesi non eccede la capacità oppure viene ricevuto uno 0. Al termine il programma deve mostrare la capacità massima, il peso totale degli oggetti contenuti e l'elenco dei pesi degli oggetti inseriti.

    Impostare un numero massimo di oggetti inseribili nello zaino e fare in modo che non ne vengano
    inseriti di più.

    Organizzare il programma dell'esercizio in metodi (scegliendo opportunamente tipo di ritorno e sequenza dei parametri formali). In particolare:

    • scrivere un metodo riempiZaino() che riempia lo zaino ovvero che, dati in ingresso l'array che rappresenta gli slot dello zaino e l'intero che rappresenta il peso massimo, richiami gli input dell'utente che corrispondono ai pesi degli oggetti da inserire.
    • scrivere un metodo pesoZaino() che calcoli e restituisca il peso totale dell'array rappresentante lo zaino.
    • scrivere un metodo che stampi l'elenco dei pesi degli oggetti inseriti.





    Allora, io l'avevo impostato così:

    Codice PHP:
    import java.util.Scanner;
        public class Esercizio1{
        public static void main(String arg[]){
        System.out.println("Ciao! Inserisci la capacità massima (in kg) dello zaino");
        Scanner tastiera=new Scanner(System.in);
        double capacitàmax=tastiera.nextDouble();
        if (capacitàmax>0){
            System.out.println("Bene! Ora inserisci una serie di pesi degli oggetti");
            System.out.println("da inserire al suo interno. Per terminare, digita 0!");
            
            double[] lista=new double[??];
            for(int indice=0; indice<??;indice++){
                
    System.out.println("Inserisci il peso");
                
    double peso=tastiera.nextDouble();
    peso=lista[indice];

    Nel senso, non so la dimensione a priori dell'array dei pesi dello zaino, visto che non so a priori quali pesi l'utente inserirà a quindi quale sarà quel valore della somma che deve essere minore della capacità massima dello zaino. dovrei farlo con i metodi ma... anche leggendo le istruzioni non capisco come! qualcuno che mi dia una mano?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da lawrencepad Visualizza il messaggio
    non so la dimensione a priori dell'array dei pesi dello zaino
    Il testo però dice:

    "Impostare un numero massimo di oggetti inseribili nello zaino e fare in modo che non ne vengano inseriti di più."

    Dipende impostare quando ... ci sono almeno 2 alternative:
    a) si chiede la dimensione all'utente (prima di chiedere i valori, ovviamente)
    b) si imposta una dimensione dell'array "cablata" nel sorgente (es. new double[100])

    A me, leggendo il testo, viene da pensare la b). In tal caso l'array è molto espanso e quindi dovresti tenere un'altra variabile es. numValori, che tiene il numero "logico" effettivo di elementi. Tutto qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Codice PHP:
    public static void main(String arg[]){
            
    Scanner tastiera=new Scanner(System.in);
            
    System.out.println("Inserisci la capacità massima in kg dello zaino");
            
    int capmax=tastiera.nextInt();
            if(
    capmax>0){    
                
    System.out.println("Inserisci ora il numero massimo di oggetti inseribili nello zaino");
                
    int oggettimax=tastiera.nextInt();
                
    int[] lista= new int[oggettimax];
                
    System.out.println("Inserisci ora la serie di pesi degli oggetti da inserire");
                
    riempiZaino(lista,capmax);
                
    int[]valoridiritornoriempiZaino(lista,capmax);
                
    pesoZaino(valoridiritorno);
                
    int valoridiritorno2=pesoZaino(valoridiritorno);
                
    System.out.println("La capacità massima dello zaino è: ");
                
    System.out.println(capmax " kg.");
                
    System.out.println();
                
    System.out.println("Il peso totale degli oggetti inseriti nello zaino è: ");
                
    System.out.println(valoridiritorno2 " kg.");
                
    System.out.println();
                
    System.out.println("L'elenco dei pesi degli oggetti inseriti è: ");
                
    StampaInseriti(valoridiritorno);
            } else{
                
    System.out.println("La capacità massima è minore o uguale a 0, quindi non si possono inserire oggetti");
            }
        }




            
            public static 
    int[]riempiZaino(int[]jint h){
                
    int somma=0;
                
    Scanner tastiera2=new Scanner(System.in);
                
    int x=tastiera2.nextInt();
                while(
    x!=&& somma<h){
                    for (
    int indice=0indice<j.lengthindice++){
                        
    somma=somma+x;    
                        
    j[indice]=x;
                        
    x=tastiera2.nextInt();
                    }
                }
                return 
    j;
            }
            
            public static 
    int pesoZaino(int[]y){
                
    int pesototale=0;
                for (
    int indice2=0indice2<y.lengthindice2++){
                    
    pesototale=pesototale+y[indice2];
                }
                return 
    pesototale;
            }
            
            
            public static 
    int[] StampaInseriti(int[]f){
                for(
    int indice3=0indice3<f.lengthindice3++){
                    
    System.out.println(f[indice3] + " kg.");
                }
                return 
    f;
                }
                } 



    Io l'ho impostato così ora, ma perché quando cerco di farmi dare i pesi nel metodo riempiZaino, entro in un ciclo infinito e continuo ad inserire oggetti senza tenere conto delle condizione nel while?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Perché istanzi più volte Scanner verso System.in? Lo detto un sacco di volte sul forum ultimamente. La creazione di un Scanner connesso a System.in va fatta UNA volta sola all'interno della applicazione.


    Perché invochi 2 volte riempiZaino?

    codice:
                riempiZaino(lista,capmax);
                int[]valoridiritorno= riempiZaino(lista,capmax);

    Perché non incapsuli la gestione dello "zaino" (l'array e la somma) in una apposita classe? Non solo verrebbe più "pulito" ma ridurresti la logica nella tua parte principale.
    Se non è proibito dall'esercizio .. ovviamente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Okay, ho sbagliato ad invocare due volte scanner verso system.in.. Però perchè se lascio un solo Scanner verso system in poi durante la compilazione ho l'errore:
    Codice PHP:
    Esercizio1.java:33errorcannot find symbol
                        int x
    =tastiera.nextInt();
                              ^
      
    symbol:   variable tastiera
      location
    : class Esercizio1 
    ?

    Comunque vorrei cercare di farlo in questo modo, io ho invocato due volte riempizaino (forse sbagliando) perchè la prima volta gli passo i parametri al metodo [array(lista) e intero (capacità massima)], dopodichè quando il metodo mi ritorna j(che è un array di elementi) io lo salvo attraverso quel codice in un altro array nel quale memorizzo i valori di ritorno
    la interpreto come: int[]valoridiritorno= (creo un nuovo array di interi)
    riempiZaino
    (lista,capmax); è il contenuto dell'array che sarebbe il risultato del metodo riempiZaino.


    Oltre a spiegarmi dove sbaglio qui (perchè sicuramente sbaglio) mi potresti anche spiegare il perchè del ciclo infinito alla ricezione dei PESI nel metodo riempizaino?
    Ultima modifica di lawrencepad; 14-12-2016 a 12:55

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da lawrencepad Visualizza il messaggio
    Però perchè se lascio un solo Scanner verso system in poi durante la compilazione ho l'errore:
    Codice PHP:
    Esercizio1.java:33errorcannot find symbol
                        int x
    =tastiera.nextInt(); 
    Se tastiera è dichiarato nel main, è LOCALE e ovviamente non è visibile in altri metodi. Serve cambiare un pochino le cose.

    Quote Originariamente inviata da lawrencepad Visualizza il messaggio
    Oltre a spiegarmi dove sbaglio qui (perchè sicuramente sbaglio) mi potresti anche spiegare il perchè del ciclo infinito alla ricezione dei PESI nel metodo riempizaino?
    riempiZaino così come si vede è comunque sbagliato. Fai un for sugli indici ma ad ogni elemento assegni lo stesso x, sovrascrivendo altro che c'era prima.


    Inoltre cerca di usare nomi di variabili chiari e comprensibili, non x, j, h, y, ecc... Quando finisci le lettere dell'alfabeto ...che fai?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Tag per questa discussione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.