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

    Correzione di un programma di esercitazione

    Ciao a tutti,

    sono nuovo di questo forum anche se mi è stato di aiuto molte volte quando non ero ancora registrato, quindi grazie anticipatamente. Il motivo della mia registrazione è dovuto al fatto che mi sono affacciato da poco alla programmazione in generale e di conseguenza a java, e per esercitarmi ho provato a sviluppare un programmino che dovrebbe fare una cosa semplice:
    c'è una classe condomini i cui attributi sono il nome dei condomini e il piano a cui abitano e ha 2 metodi uno per impostare il piano e l'altro che restituisce il piano a cui abita un condomino

    poi c'è una classe ascensore dove vi è il metodo main che ha un array di 10 utenti di tipo condomini e in cui ci sono 2 cicli, il primo che serve per assegnare un nome a ogni utente e un piano casuale a ciascuno e l'altro che che controlli in pratica chi deve scendere ad ogni piano

    E' un programma stupido, ma ovviamente io sono alle prime armi nella programmazione (avevo programmato in vb.net e avevo imparato qualcosa, ma poi ho voluto cambiare e mi rendo conto che oltre ad essere migliore java è anche più complesso) e se ci fosse qualcuno che potesse darmi una mano a capire dove ho sbagliato, al di là del fatto che avrei potuto fare la stessa cosa diversamente da come l'ho fatta e probabilmente con meno righe di codice, dopo ovviamente una bella risata certo , gliene sarei grato veramente.

    Posto il codice del programmino:

    CLASSE CONDOMINI

    class Condomini{
    String NomeCond = "";
    private int Piano;

    public void SetPiano(int i){
    Piano=i;
    }
    public int GetPiano(int x){
    x=Piano;
    }
    }

    CLASSE ASCENSORE

    class Ascensore{
    Condomini Utenti[];
    int z;
    int p;
    int x;
    public static void main (String[] args) {
    z=0;
    Condomini Utenti[]= new Condomini[10];
    while(z<10){
    Utenti[z].NomeCond="mario"+z;
    Utenti[z].SetPiano((int)(Math.random()*6));
    z++;
    }
    p=0;
    while(p<7){
    z=0;
    while(z<10){
    Utenti[z].GetPiano(int x);
    if(x=p){
    System.out.println("Sono "+Utenti[z].NomeCond+" e scendo al piano "+x);
    }
    z++;
    }
    p++;
    }
    }
    }

    GLI ERRORI CHE MI DA SONO:

    C:\Users\Mirko\Desktop\Programmi di prova\Ascensore.java:18: '.class' expected
    Utenti[z].GetPiano(int x);
    ^
    C:\Users\Mirko\Desktop\Programmi di prova\Ascensore.java:18: ';' expected
    Utenti[z].GetPiano(int x);
    ^
    In attesa di una vostra cortese risposta vi ringrazio anticipatamente.

  2. #2
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Ciao Iiron, benvenuto nel forum.
    Dunque... innanzitutto sarebbe meglio se formattassi il tuo codice nei post: lo puoi fare usando gli appositi tag "code". In questo modo il listato è più leggibile a chi ti può dare una mano.
    Relativamente al tuo programma, alcune segnalazioni, visto che stai imparando... (e non ti devi scusare, ci siamo passati tutti):
    - per convenzione, in Java i nomi delle variabili e dei metodi iniziano con una lettera minuscola mentre i nomi delle classi cominciano con la maiuscola. Funziona comunque, per carità, però è una questione di standard e sarebbe meglio seguirlo (io nel seguito lo farò)
    - proprio un dettaglio: hai chiamato la classe "Condomini"... ma poichè ogni oggetto p un condomino, non sarebbe meglio chiamarla "Condomino"?
    - salvo particolari esigenze, gli attributi degli oggetti è sempre meglio dichiararli "private" ed accedervi solo attraverso i metodi set e get. Tu lo hai fatto per "piano", sarebbe meglio farlo anche per "nomecond"
    - hai sbagliato nella creazione del metodo "getPiano": probabilmente sei abituato al VB. Nel tuo caso particolare, il funzionamento corretto lo ottieni facendo
    codice:
    public int getPiano()
    {
      return (piano);
    }
    Più in basso, quindi dovrai modificare il tuo codice in:
    codice:
    x = Utenti[z].GetPiano();
    (la variabile x l'hai già dichiarata più sopra, se la dichiari di nuovo nella stessa "area di visibilità" di darà errore in compilazione. Stesso discorso per la variabile "utenti": la dichiari due volte)
    Importante: le variabili primitive (int, char, double, ecc.) sono passate per "valore"! In pratica, quando le passi come parametro Java ne utilizza una copia. Discorso contrario per gli oggetti: nelle chiamate a funzione viene passata una copia del _riferimento_, che punta quindi allo stesso "oggetto fisico" in memoria
    - tutte le variabili che dichiari nella classe Ascensore devi spostarle all'interno del metodo main()
    - quando nel main() crei il tuo array di condomini lo stai generando pieno di elementi null, non di "condomini vuoti"! Devi eseguire un ciclo in cui effettivamente li istanzi, usando l'istruzione
    codice:
    utenti[z] = new Condomino();
    come prima istruzione del tuo ciclo while
    - il ciclo while va indubbiamente bene... però solitamente per operazioni di questo tipo un ciclo "for" è più comodo
    - il funzionamento dei due cicli innestati nel main non mi è chiaro... non credo faccia quello che vuoi. Lo puoi spiegare meglio? In ogni caso la condizione dell'if è sbagliata: il "=" è usato per gli assegnamenti, per i confronti devi utilizzare "=="

    Che ne pensi?

  3. #3
    Ciao Desa,

    innanzitutto voglio ringraziarti per la gentilezza, l'accuratezza e la tempestività che hai avuto nella risposta. Poi volevo dirti che non ho avuto il tempo di apportare le modifiche al mio codice e che appena lo avrò fatto ti farò sapere. Nel frattempo ti ringrazio.

  4. #4
    Eccomi Desa, ciao,

    ho seguito tutti i tuoi consigli, ma ho ritenuto opportuno rifarlo da capo ti posto tutto il codice.
    codice:
    public class Ascensore{
    		public static void main (String[] args) {
    
    	Condom inqui[]=new Condom[10];
    	int x;
    	
    		for(x=0;x<10;x++){
    			inqui[x]=new Condom();
    			inqui[x].setpiano((int)(Math.random()*6),"Mario"+x);
    //			System.out.println("Io mi chiamo "+inqui[x].getnome()+" e vivo al piano "+inqui[x].getpiano());
    		}
    		for(int z=0;z<7;z++){
    			for(x=0;x<10;x++){
    				if(z==inqui[x].getpiano()){
    					System.out.println("Io mi chiamo "+inqui[x].getnome()+" e vivo al piano "+inqui[x].getpiano());
    				}
    			}
    		}
    }
    }
    
    public class Condom{
    	private String nome;
    	private int piano;
    	public void setpiano(int i,String b){
    		piano=i;
    		nome=b;
    	}
    	public int getpiano(){
    		return (piano);
    	}
    	public String getnome(){
    		return (nome);
    	}
    }
    Ora mi funziona alla grande ma aspetto cmq con ansia le tue considerazioni
    Grazie, senza dite nn ce l'avrei fatta.

  5. #5
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Ciao Iiron_78, non ho provato a ricompilare/eseguire, ma ad occhio direi che è tutto ok!
    Gli unici suggerimenti che ti posso dare (sono solo suggerimenti e io sono un super-pignolo, nulla di che):
    - nel mio post precedente sono sicuramente stato un po' vago su questo, mea culpa: benissimo che hai messo i nomi di classe maiuscoli e i nomi di variabili/oggetti e metodi minuscoli. Di solito, se gli identificatori sono composti da più parole si utilizza la cosiddetta notazione "a cammello", in cui metti l'iniziale maiuscola a tutte le parole successive alla prima (sulla prima parola vale sempre quello che ho detto sopra). Ti faccio degli esempi così sarà più chiaro:
    es. metodo: getPiano()
    es. variabile: tuaVariabileLocale
    es. classe: TuaClasse
    Se consulti la Javadoc vedrai che è tutto fatto così! Ti ripeto, funziona lo stesso, è solo una questione di convenzioni
    - la generazione casuale del piano va bene anche così: ma se vuoi esiste un metodo molto più comodo nella classe java.util.Random, il nextInt(int n). Prova a dare un occhio alla documentazione online!
    - i metodi "set" dovrebbero impostare una e una sola variabile: sarebbe quindi meglio definire anche un setNome, invece di fare tutto in setPiano! Puoi anche valutare l'idea di usare un costruttore che riceve sia il nome che il piano
    - le parentesi che racchiudono i valori dopo i "return" sono superflue: per vari motivi e per abitudine io le utilizzo (e sono sicuro che quasi nessuno lo fa) e non mi sono accorto di avertele lasciate nel post precedente!
    - se è un qualche esercizio per scuola/università non chiamare la classe "Condom": in inglese significa "perservativo"!!!

    Sono un po' di corsa, spero di non scritto troppo incasinato... a presto!

  6. #6
    Ciao Desa,

    - nel mio post precedente sono sicuramente stato un po' vago su questo, mea culpa: benissimo che hai messo i nomi di classe maiuscoli e i nomi di variabili/oggetti e metodi minuscoli. Di solito, se gli identificatori sono composti da più parole si utilizza la cosiddetta notazione "a cammello", in cui metti l'iniziale maiuscola a tutte le parole successive alla prima (sulla prima parola vale sempre quello che ho detto sopra). Ti faccio degli esempi così sarà più chiaro:
    es. metodo: getPiano()
    es. variabile: tuaVariabileLocale
    es. classe: TuaClasse
    Se consulti la Javadoc vedrai che è tutto fatto così! Ti ripeto, funziona lo stesso, è solo una questione di convenzioni
    hai perfettamente ragione, di solito lo faccio ma la mia preoccupazione è cercare di capire e cercare di imparare e quando sono "preoccupato" tralascio queste cose per andare dritto dritto al problema. Resta il fatto che hai ragione e la prossima volta se posto qualcosa correggerò sicuramente prima perchè le convenzioni vanno rispettate.
    - la generazione casuale del piano va bene anche così: ma se vuoi esiste un metodo molto più comodo nella classe java.util.Random, il nextInt(int n). Prova a dare un occhio alla documentazione online!
    Esiste una documentazione in italiano?
    - i metodi "set" dovrebbero impostare una e una sola variabile: sarebbe quindi meglio definire anche un setNome, invece di fare tutto in setPiano! Puoi anche valutare l'idea di usare un costruttore che riceve sia il nome che il piano
    Ed anche quì hai ragione ma sai ... la fretta di vedere se mi funzionava
    Io sto studiando java su mattone dopo mattone e ho, per approfondire nel caso in cui non fosse tanto chiaro il libro, tutte le lezioni che sono andate in onda in tv di alcuni docenti dell'università la sapienza di Roma. Nel caso in cui non mi bastasse faccio ricerce in google e leggo leggo e rileggo e alla fine se un concetto mi appare all'inizio un pò ostico alla fine riesco ad assimilarlo. Il percorso cmq è lungo e dispendioso in fatto di tempo ed energie.
    Sapresti tu consigliarmi qualcos'altro? Se non altro potrebbe essere una fonte in più dove attingere.

    Grazie ancora ragazzo, ci si sente.

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.