Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    16

    Aiutatemi con questo semplice quesito, please!

    Salve a tutti!
    Sto provando a risolvere un vecchio tema d'esame che recita così:

    Scrivere una classe Ostello per modellare un ostello. L'ostello ha 50 letti in totale, distribuiti in 10 stanze da 5 letti ciascuna: ogni letto può essere libero o occupato.
    Lo stato del letti nelle stanze deve essere modellato con una matrice di booleani (le righe sono le stanze e le colonne i letti). All'inizio tutti i letti sono liberi.

    Metodo checkin: La classe dispone di un metodo checkin(int stanza, int letto) come mostrato di seguito, che permette di occupare un derminato letto in una determinata stanza.

    public boolean checkin (int stanza, int letto) {
    if (stanza >= 0 & stanza < 10 & letto >= 0 & letto <5) {
    lettoLibero[stanza][letto] = false;
    return true;
    }
    }
    return false;
    }

    Il metodo controlla che i valori letto e stanza siano corretti e che il letto selezionato sia libero. Il metodo ritorna true se il letto viene occupato, false altrimenti.

    Metodo ottimizzaOstello
    L'ostello vuole minimizzare il numero di stanza usate. A tal fine la classe deve disporre di un metodo void ottimizzaOstello() che sposti tutti i clienti nelle prime stanza libere (a partire dalla prima stanza e dal primo letto). Per esempio, se c'è un solo cliente per ogni stanza (quindi in totale ci sono 10 clienti), il metodo sposta tutti i clienti nelle prime stanze.

    Per il momento questo è il codice che ho scritto:
    codice:
    public class Ostello {    boolean lettoLibero[][];
        
        public Ostello() {
            //all inizio tutti i letti sono liberi
            for (int stanza=0; stanza<10; stanza++) {
                for (int letto=0; letto<5; letto++) {
                    lettoLibero[stanza][letto] = false; 
                }
            }
        }
        
        public boolean checkin (int stanza, int letto) {
            if(stanza >= 0 & stanza < 10 & letto >=0 & letto <5) {
                if(lettoLibero[stanza][letto]) {
                    lettoLibero[stanza][letto] = false;
                    return true;
                }
            }
            return false;
        }
    Non riesco ad immaginare come scrivere il metodo ottimizzaOstello. Il ragionamento che ho fatto è il seguente:

    1. Se il letto è libero, cerca nella stanza successiva un letto occupato
    2. Spostalo nella prima stanza libera e imposta il letto occupato come libero
    3. Continua nella ricerca

    Quando cerco di trasformare questo ragionamento in codice, si trasforma solo in un paio di cicli for che si ripetono

    Mi date una mano? Grazie..

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da scretch Visualizza il messaggio
    codice:
        public Ostello() {
            //all inizio tutti i letti sono liberi
            for (int stanza=0; stanza<10; stanza++) {
                for (int letto=0; letto<5; letto++) {
                    lettoLibero[stanza][letto] = false; 
                }
            }
        }
    Intanto qui devi inizializzare la matrice lettoLibero prima di assegnare i valori alle singole celle.E poi da quello che dice il problema all'inizio i letti sono tutti liberi, devi assegnare true ad ogni cella non false.

    Quote Originariamente inviata da scretch Visualizza il messaggio
    Non riesco ad immaginare come scrivere il metodo ottimizzaOstello. Il ragionamento che ho fatto è il seguente:

    1. Se il letto è libero, cerca nella stanza successiva un letto occupato
    2. Spostalo nella prima stanza libera e imposta il letto occupato come libero
    3. Continua nella ricerca
    Il ragionamento sembra filare,nel punto 2 la prima stanza libera però la sai già, non devi mica rifare la ricerca

    Quote Originariamente inviata da scretch Visualizza il messaggio
    Quando cerco di trasformare questo ragionamento in codice, si trasforma solo in un paio di cicli for che si ripetono
    La soluzione può benissimo essere fatta con cicli annidati.
    Ad esempio crei due cicli annidati su stanza e letto in cui man mano verifichi se un letto è libero.

    Quando trovi un letto libero sarebbe una buona cosa non avere altri due cicli annidati in cui esegui la ricerca di un letto occupato con il quale fare lo scambio.
    Questo può provocare un po' di confusione sugli indici ed essere fonte di errori.

    Se possibile creati una funzione che va ad effettuare la ricerca di un letto occupato ed effettua lo scambio:
    alla funzione puoi passare gli indici del posto libero e cominci a cercare dall'indice di riga successivo.Poi devi solo ricordarti di ritornare appena effettuato lo scambio, altrimenti riempirai ogni letto.

    Prova a postare il codice a cui arrivi, e vediamo perché non va
    Ultima modifica di Ansharja; 11-12-2015 a 13:22

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    16
    Per inizializzazione cosa intendi? Credo di averla inizializzata ponendo tutti i letti e le stanze come liberi.

    Il testo dichiara: Il metodo ritorna true se il letto viene occupato, false altrimenti.
    Almeno questo l'ho fatto bene

    Avevo scritto questo codice
    codice:
    public ottimizzaOstello() {		for (int stanza=0; stanza<10; stanza++) {
    			for (int letto=0; letto<5; letto++) {
    				if lettoLibero[stanza][letto] = false; { //letto libero
    					stanza++;
    					for (int stanza=0; stanza<10; stanza++) {
    						for (int letto=0; letto<5; letto++) {
    							if lettoLibero[stanza][letto] = true; { //letto occupato 
    								lettoLibero[stanza][letto] = false;
    							}
    						}
    					}
    				lettoLibero[stanza][letto] = true;
    Ma ho abbandonato perché non mi sembrava che mi portasse da qualche parte..

    Adesso provo con i tuoi consigli e vediamo un po cosa ne esce.

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ehm stai facendo una confusione pazzesca!!


    Quote Originariamente inviata da scretch Visualizza il messaggio
    Per inizializzazione cosa intendi? Credo di averla inizializzata ponendo tutti i letti e le stanze come liberi.
    Per inizializzazione intendo che tu non puoi andare ad assegnare un valore ai campi della matrice lettoLibero prima di averla fisicamente istanziata nel costruttore.
    Questo è il costruttore che hai postato:

    codice:
     public Ostello() {
            //all inizio tutti i letti sono liberi
            for (int stanza=0; stanza<10; stanza++) {
                for (int letto=0; letto<5; letto++) {
                    lettoLibero[stanza][letto] = false; 
                }
            }
        }
    Questo codice causerà sicuramente un errore in esecuzione (NullPointerException) perché appunto non hai ancora istanziato lettoLibero con l'operatore new prima di assegnare i valori alle celle.Quindi prima del ciclo devi scrivere nel costruttore:

    codice:
    lettoLibero=new boolean[10][5];
    Quote Originariamente inviata da scretch Visualizza il messaggio
    Il testo dichiara: Il metodo ritorna true se il letto viene occupato, false altrimenti.
    Almeno questo l'ho fatto bene
    Io mi riferisco al costruttore non al metodo checkin() !
    Nel metodo checkin(int stanza,int letto) quando un letto viene occupato si fa diventare false la corrispondente cella nella matrice, che prima deve quindi essere true (e infatti nel metodo prima si controlla che lettoLibero[stanza][letto] sia true).
    Tu invece al momento della costruzione dell'Ostello metti tutti false nella matrice lettoLibero, quindi non sarà possibile occupare nessun letto!

    Quote Originariamente inviata da scretch Visualizza il messaggio
    codice:
    public ottimizzaOstello() {
    for (int stanza=0; stanza<10; stanza++) {
                for (int letto=0; letto<5; letto++) {
                    if lettoLibero[stanza][letto] = false; { //letto libero
                        stanza++;
                        for (int stanza=0; stanza<10; stanza++) {
                            for (int letto=0; letto<5; letto++) {
                                if lettoLibero[stanza][letto] = true; { //letto occupato 
                                    lettoLibero[stanza][letto] = false;
                                }
                            }
                        }
                    lettoLibero[stanza][letto] = true;
    Qui dentro fai un sacco errori, sia di logica sia di sintassi!

    Intanto l'istruzione if va scritta con le parentesi, cioè if (condizione){// istruzioni}, poi nel testare il valore di una variabile dentro all'if non puoi usare l'operatore = (assegnazione) ma devi utilizzare l'operatore == , dopo quando controlli il valore di un booleano è sufficiente scrivere if(variabile) al posto di if(variabile==true), che è un'inutile ripetizione, e infine tu devi controllare che lettoLibero sia uguale a false se vuoi vedere se è occupato...

    Poi nel ciclo non ha alcun senso utilizzare gli stessi indici nei due cicli annidati, ma davvero c'è una quantità industriale di errori lì dentro!
    Prova intanto a ricontrollare tutta la parte relativa alla sintassi (quantomeno il programma deve compilare), poi penserai a come risolvere quel problema, ma per ora siamo messi malino...
    Ultima modifica di Ansharja; 11-12-2015 a 19:11

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    16
    Ok, ho scritto questo codice

    codice:
    public void ottimizzaOstello() {
            int r = -1; // in questo modo non si 
            int s = -1; // confondo con stanza e letto 
            
            for (int stanza=0; stanza<10; stanza++) {
                for (int letto=0; letto<5; letto++) {
                    if (lettoLibero[stanza][letto] = false) { // il letto è libero
                        lettoLibero[stanza][letto] = lettoLibero[r][s]; // salvo temporaneamente il letto libero
                    }
                    
                    else {
                        if (lettoLibero[stanza][letto] = true && r == -1 && s == -1) { //se il letto è occupato e non ci sono stanze 
                            return;                                                       //libere, il letto viene ignorato 
                        }
                    }
                    
                    else {
                        if (lettoLibero[stanza][letto] = true && r != -1 && s != -1) {
                            lettoLibero[r][s] = lettoLibero[stanza][letto] ;
                            lettoLibero[stanza][letto] = false; // il letto ora è libero                    
                        }
                    }
                }
            }
        }
    Mi sono aiutato con due var per memorizzare il letto libero, ma credo di sbagliare perché poi non assegno quelle variabili come letti occupati.


    EDIT: ho visto solo ora la tua risposta, vedrò di correggere

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Si anche adesso sicuramente il programma non compila, non puoi inserire due else uno di seguito all'altro...
    Al massimo puoi fare if,else if (quanti ne vuoi) e solo l'ultimo può essere un else, dove entrerà il flusso se nessuna delle precedenti condizioni è verificata.

    Ricontrolla il tutto, e cerca sempre di compilare e risolvere gli errori di sintassi prima di postare il codice, altrimenti prima di parlare del tuo problema specifico bisogna fare un ripassino generale

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    16
    Non mi sono ancora rassegnato

    Questa volta vorrei sapere come procedere con il seguente problema:
    Nel testo mi viene detto di creare una classe Ostello, poi nel metodo checkin viene usato, per modellare la matrice dell'ostello, lettoLibero[][]. Ora, io ho scritto tutto il programma con un booleano ostello[][], poi ho letto il metodo checkin ed ho sostituito ostello[][] con lettoLibero[][]. Solo che nel main poi non so bene come procedere ed ho scritto lettoLibero l = new lettoLibero.
    Ovviamente mi da errore e non so come andare avanti, un aiutino?

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.