Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    Aiuto esercizio d'esame, va bene questa soluzione?

    Ciao,
    a breve avrò l'esame di linguaggi di programmazione che contiene una parte in Java, vi posto i primi due punti del testo della parte relativa a Java:

    "Un insieme di processi condividono un unico buffer in cui possono scrivere e prelevare dati di tipo intero. Il
    buffer ha dimensioni limitate, fissate al momento della sua creazione, ed i processi sono sottoposti ai vincoli
    seguenti:
    1) I processi possono iniziare ad operare solo dopo che il buffer è stato creato
    2) Un processo può essere di tipo scrittore (ed in questo caso potrà solo scrivere dati nel buffer) oppure
    lettore (ed in questo caso potrà solo leggere dati dal buffer cancellandoli nel contempo)
    3) Un processo può scrivere un valore intero dal buffer solo se il buffer non è pieno
    4) Un processo può leggere o rimuovere un dato dal buffer solo se il buffer non è vuoto.
    Ciascun processo è caratterizzato dal suo tipo (scrittore o lettore) e:
    a) Se il processo è di tipo scrittore, allora esso contiene tutti i valori che (eventualmente)
    scriverà sul buffer
    b) Se il processo è di tipo lettore, allora esso contiene un’area di memoria in cui scrivere i
    valori che (eventualmente) preleverà dal buffer.
    Problema 1. Si richiede il progetto di un tipo astratto di dato Processo che rappresenti processi del tipo
    appena descritto. Le operazioni di interesse per il tipo di dati sono quelle evidenziate nei punti sopra.
    Si osserva esplicitamente che, in accordo con i principi di programmazione orientata agli oggetti sui quali è
    basato il corso, un tipo di dati deve occuparsi della consistenza e correttezza dei dati che rappresenta rispetto
    a tutti gli aspetti considerati. Pertanto il tipo di dati Processo deve opportunamente occuparsi anche della
    gestione del buffer.
    Problema 2. Si richiede l’implementazione in Java del tipo astratto di dato Processo ."

    Vabbè vi risparmio il tipo di dati astratto che sono quasi certo che vada bene e vi posto direttamente la mia soluzione in Java, commentata...mi dite se va bene?

    codice:
    public class Processo{
    	
    	private static int [] buffer = new int[30];	// Creo una variabile di classe di tipo array di int e alloco un array di 30 elementi
    	private static int dove;
    	
    	private boolean scrittore;	// Se scrittore è true allora il processo è di tipo scrittore, se è false è di tipo lettore
    	private int [] area;		// E' l'area di memoria interna ad ogni processo
    	private int quale;			// Posizione dell'elemento da scrivere o leggere presente nell'area di memoria dei processi
    	
    	/** Costruttore 1: CREA UN PROCESSO DI TIPO LETTORE quindi dovrà creare un'area di memoria vuota per tale processo
    		@param dim di tipo int: è la dimensione dell'area di memoria interna al processo
    		@return un oggetto di tipo Processo lettore */
    		
    	public Processo(int dim){
    		
    		if(dim > 0){				// Se il valore della dimensione dell'area di memoria ricevuto è coerente
    			area = new int[dim];	// allora crea un array di interi di dimensione dim e metti in area il suo riferimento
    			quale = -1;				//
    			scrittore = false;		// L'oggetto di tipo Processo viene creato come processo lettore
    		}
    		
    		else{						// Se invece il valore della dimensione dell'area di memoria ricevuto non è coerente
    			System.err.println("Errore: valore della dimensione dell'area di memoria non coerente");	// Messaggio d'erore
    			area = null;
    			quale = null;	// Imposta le variabili di istanza a null
    		}
    	}
    	
    	/** Costruttore 2: CREA UN PROCESSO DI TIPO SCRITTORE: l'area di memoria del processo scrittore è già esistente e vi
    		copiato il contenuto del parametro: un'array, che poi sarà copiato nel buffer
    		@param mem di tipo int []: è l'array di interi che deve essere copiato nell'area di memoria del processo
    		@return un oggetto di tipo Processo scrittore */
    		
    	public Processo(int [] mem){
    		
    		int i;							// Variabile contatore
    		scrittore  = true;				// L'oggetto di tipo Processo viene creato come processo scrittore
    		quale = 0;						//
    		area = new int [mem.length];	// L'array area viene creato avente la stessa dimensione dell'array parametro
    		
    		for(i = 0; i < area.length; i++)
    			area[i] = mem[i];			// Copia tutti gli elementi dell'array ricevuto nell'area di memoria del processo
    			
    	}
    	
    	/** Legge i valori dal buffer e li copia nell'area di memoria dell'oggett Processo che riceve il messaggio
    		@param void
    		@return void */
    	
    	public void leggi(){
    		
    		/* Se il processo è di tipo lettore e se l'indice del prossimo elemento dell'area di memoria del processo è minore
    		   della dimensione dell'array che la implementa e se il buffer non è vuoto */
    		if(!scrittore ^ quale+1<area.length ^ dove>-1){
    			area[quale] = buffer[dove];						// Copia un elemento dal buffer all'area di memoria
    			quale++;										// Incrementa l'indice nell'area di memoria
    			dove--;											// Decrementa l'indice del buffer e svuota la locazione
    		}
    		
    		else
    			System.err.println("Errore");					// Altrimenti stampa un messaggio di errore
    		
    	}
    	
    	/** Scrivi i valori presenti nell'area di memoria del processo ricevente nel buffer
    		@param void
    		@return void */
    	
    	public void scrivi(){
    		
    		/* Se il processo è di tipo scrittore e se l'indice  del prossimo elemento dell'area di memoria è minore dela
    		   dimensione dell'array che la implementa e se l'indice della prossima posizione del buffer è minore della sua
    		   dimensione */
    		if(scrittore ^ quale < area.length ^ dove+1 < buffer.length){
    			buffer[dove+1] = area[quale];		// Copia l'elemento corrente dell'area di memoria nel buffer
    			quale ++;						// Incrementa alla prossima locazione di memoria del processo che sarà copiata
    			dove ++;						// Incrementa alla prossima locazione del buffer dove copiare il prossimo elemento
    		}
    		
    		else
    			System.err.println("Errore");					// Altrimenti stampa un messaggio di errore
    		
    	}
    	
    }
    Mi dà un errore quando faccio: quale = null;
    credo che dipenda dal fatto che quale è di tipo int e il null lo posso assegnare solo a valori di tipo riferimento? eventualmente come risolvere per attribuire un valore nullo ad un intero? gli dò -1 come valore di errore?
    Come logica ci può stare queta soluzione?

    Grazie
    Andrea

  2. #2
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    E' un po' difficile capire come vada risolto questo esercizio senza aver fatto il corso.

    A me suonano strane alcune cose:
    1. Parliamo di processi? devono estendere Thread o implementare l'interfaccia Runnable?
    2. Perché creare una classe astratta che sia padre di Lettore e Scrittore? A parte l'area di memoria (che viene usata in modo diverso) non sembrano aver molto in comune.
    3. L'area di memoria non dovrebbe essere costruita nel costruttore della classe astratta? Ok, questa è opinabile...
    4. Non sarebbe meglio creare due classi diverse per Lettore e Scrittore?

    riguardo a:

    codice:
    public Processo(int dim)
    {
    	if(dim > 0)
    	{
    		area = new int[dim];
    		quale = -1;
    		scrittore = false;
    	}
    	else
    	{
    		System.err.println("Errore: valore della dimensione dell'area di memoria non coerente");	
    		area = null;
    		quale = null;	// Imposta le variabili di istanza a null
    	}
    }
    sarebbe meglio lanciare una eccezione quando dim < 0. (Anche una IndexOutOfBoundException oppure una IllegalArgumentException)

    Beh.. sii felice perché essere più severi di così non credo che si possa essere...
    Ciao e in bocca al lupo!
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    Nono...è un esame di programmazione orientata ad oggetti...è il primo esame di programmazione ad oggetti e in cui vedo Java...è solo un'esercizio per implementare un tipo di dato...in questo caso il tipo di dato da implementare è Processo ma poteva anche essere Rettangolo (implentare una classe che rappresenta rettangoli dando i due punti sulla diagonale principale) o una classe che implementa le frazioni

    Non ci sono argomenti avanzati...anche le classi astratte e l'ereditarietà non sono trattate...è solo per implementare il dato le cui specifiche sono fornite nell'esercizio...anche le eccezioni sono argomento del prossimo corso e non le dobbiamo usare

    Poi i processi in quanto tali ed i 3d li vediamo a sistemi operativi che è tutt'altro esame

  4. #4
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    Ah!

    Dove ho studiato io le classi principali le abbiamo viste al primo esame di fondamenti. Tra queste ricordo bene che c'erano le eccezioni... Pagina 36 se non ricordo male...
    I Thread in effetti non li abbiamo mai visti a lezione neppure noi.

    Però permettimi di dirti che hai docenti quantomeno originali: chiedere di costruire un tipo di dato "Processo" mi sembra una bestemmia..

    Ancora ciao!
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

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.