«

»

nov 07

Programmazione, compiti svolti

Publico i miei svolgimenti di alcuni esami di programmazione da 9cfu del corso di ingegneria informatica di Palermo sperando che siano utili a qualcuno.

Le implementazioni sono tutte in C++ ANSI, l’ambiente di sviluppo usato e Dev-Cpp (non perché mi piacesse…semplicemente era l’IDE che avrei usato durante l’esame e quindi era bene che mi abituassi alle sue stranezze, adesso è un ambiente passabile ma la versione 4 che usavo era orrenda). inoltre uso il più possibile le STL (il mio corso non prevedeva la scrittura di strutture di dati)

Tipicamente nei compiti uso un file main, un file di header con tutti i prototipi e un file cpp con tutte le implementazioni, genericamente non è una buona idea ma per cose così piccole è inutile fare le cose in maniera scalabile

Testo del compito

PROGRAMMAZIONE (9 CFU)
SIMULAZIONE DI UNA BATTUTA DI CACCIA.
Scrivete un programma per la simulazione di una battuta di caccia in base alle specifiche sotto riportate.
La battuta di caccia si svolge in una riserva, che per semplicità si suppone quadrata e di dimensione 3000×3000, nella quale sono presenti 50 lepri e 10 cinghiali inizialmente disposti in posizione casuale e con direzione di moto casuale.
I cinghiali si muovono in linea retta con velocità costante di 2,5 m/s fino a quando non raggiungono il confine della riserva; in questo ultimo caso cambiano direzione in maniera casuale.
Le lepri si muovono a intermittenza. Si muovono in linea retta con velocità di 4m/s e direzione casuale per 5 secondi, poi stanno fermi per cinque secondi, poi si muovono per altri 5 secondi con una nuova direzione casuale e così via.
Nella riserva sono anche presenti 3 cacciatori che vengono inizializzati in posizione casuale e non si muovono durante la simulazione. Quando un animale si trova a distanza inferiore a 25 m da un cacciatore viene catturato.
Alla fine della battuta di caccia (dopo 7200 secondi) stampate il numero di cinghiali e di lepri catturate da ciascun cacciatore.

Diagramma UML della mia soluzione

Diagramma UML

Diagramma UML, (clicca per lo zoom)

Codice della soluzione

Header (caccia.h)

#ifndef CACCIA
#define CACCIA
#include <iostream>
#include <string>
#include <list>
using namespace std;
class point{public:
       int riga;
       int colonna;
       point();
       point(int r,int c){riga=r;colonna=c;};
       string ToString();
};

class Animale{public:
      Animale(string nome,float veocita);
      Animale(string nome,point posizione,float angolazione,float velocita){
                     this->nome=nome;this->velocita=velocita;
                     this->posizione=posizione;this->angolazione=angolazione;
                     };
      string nome;
      virtual point muovi(long tempo)=0;
      point posizione;
      float angolazione;
      float velocita;
};

class Lepre:public Animale{public:
      Lepre():Animale("Lepre",4.0f){};
      Lepre(point posizione,float angolazione):
                  Animale("Lepre",posizione,angolazione,4.0f){
                  this->posizione=posizione;
                  this->angolazione=angolazione;
                  };
      virtual point muovi(long tempo);
};

class Cinghiale:public Animale{public:
      Cinghiale():Animale("Cinghiale",2.5){};
      Cinghiale(point posizione,float angolazione):
                  Animale("Cinghiale",posizione,angolazione,2.5){
                  this->posizione=posizione;
                  this->angolazione=angolazione;
                  };
      virtual point muovi(long tempo);
};

class Cacciatore{public:
      static const int vista=250;
      Cacciatore(list<Animale*> &animali,string nome=""){this->nome=nome;this->animali=&animali;this->lepri=0;this->cinghiali=0;}
      Cacciatore(list<Animale*> &animali,string nome,point posizione);
      void spara();
      list<Animale*> *animali;
      string nome;
      point posizione;
      int angolazione;
      int lepri;
      int cinghiali;
};

class Campo{public:
      list<Animale*> animali;
      list<Cacciatore*> cacciatori;
      static const int righe=3200;
      static const int colonne=3200;
};
float distanza(point,point);
#endif

Codice delle classi (caccia.cpp)

#include "caccia.h"
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <sstream>
#define pi 3.141592654
using namespace std;
float distanza(point da ,point a){
      int ascisse=da.riga-a.riga;
      int ordinate=da.colonna-a.colonna;
      return sqrt(ascisse*ascisse + ordinate*ordinate);
};

point::point(){
               this->riga=rand()%Campo::righe;
               this->colonna=rand()%Campo::colonne;
};

string point::ToString(){
        stringstream temp;
        temp<<"["<<riga<<","<<colonna<<"]";
        return temp.str();
       };

Animale:: Animale(string nome,float velocita){
          this->nome=nome;
          this->posizione=point::point();
          this->angolazione=(rand()%360)*((2*pi)/360);
          this->velocita=velocita;
          //cout<<posizione.ToString()<<endl;
};

point Lepre::muovi(long tempo){
     tempo=tempo%10;
     //cout<<tempo<<" ";
      if(tempo>5){
                  angolazione=(rand()%360)*((2*pi)/360);
                  posizione.riga+=(int)(velocita*sin(angolazione));
                  posizione.colonna+=(int)(velocita*cos(angolazione));
                  if(posizione.riga> Campo::righe)posizione.riga=Campo::righe;
                  if(posizione.colonna> Campo::colonne)posizione.colonna=Campo::colonne;
                  if(posizione.riga< 0)posizione.riga=0;
                  if(posizione.colonna< 0)posizione.colonna=0;
                  };
return posizione;
};

point Cinghiale::muovi(long tempo){
     posizione.riga+=(int)(velocita*sin(angolazione));
     posizione.colonna+=(int)(velocita*cos(angolazione));
     if((posizione.riga>Campo::righe || posizione.colonna>Campo::colonne)
        ||(posizione.riga<0 ||posizione.colonna<0)
     ){
                          if(posizione.riga> Campo::righe)posizione.riga=Campo::righe;
                          if(posizione.colonna> Campo::colonne)posizione.colonna=Campo::colonne;
                          if(posizione.riga< 0)posizione.riga=0;
                          if(posizione.colonna< 0)posizione.colonna=0;
                          angolazione=(rand()%360)*((2*pi)/360);
     };
     return posizione;
};

void Cacciatore::spara(){
     //int n=0;
     for(list<Animale*>::iterator from = animali->begin();
        from != animali->end();
        ++from//,cout<<++n<<endl
        )if(distanza(posizione,(*from)->posizione)<vista){
            if((*from)->nome=="Lepre"){this->lepri++;
                                       cout<<nome<<": Ucciso una lepre ho!     ";
                                       }else{this->cinghiali++;
                                       cout<<nome<<": Ucciso un  cinghialo ho! ";
                                       };
            cout<<(*from)->posizione.ToString()<<endl;
            delete (*from);
            animali->erase(from);//se si cancella un valore l'teratore salta
            return;
        };
};

Cacciatore::Cacciatore(list<Animale*> &animali,string nome,point posizione){
                             this->nome=nome;
                             this->animali=&animali;
                             this->lepri=0;
                             this->cinghiali=0;
                             this->posizione=point::point();
};

Codice del main (main.cpp)

#include <cstdlib>
#include <iostream>
#include <ctime>
#include "caccia.h"
using namespace std;

int main(int argc, char *argv[])
{
    srand((unsigned int)time(NULL));
    int a;
    Campo campo;
    campo.cacciatori.push_back(new Cacciatore(campo.animali,"Qui'"));
    campo.cacciatori.push_back(new Cacciatore(campo.animali,"Quo'"));
    campo.cacciatori.push_back(new Cacciatore(campo.animali,"Qua'"));
    for(a=0;a<10;a++){campo.animali.push_back(new Cinghiale());};
    for(a=0;a<50;a++){campo.animali.push_back(new Lepre());};
    for (a=0;a<7200;a++){
//        cout<<a<<" ";
        for(list<Animale*>::iterator from = campo.animali.begin();
                                     from != campo.animali.end();
                                     ++from
                                     )(*from)->muovi(a);

        for(list<Cacciatore*>::iterator from = campo.cacciatori.begin();
                                     from != campo.cacciatori.end();
                                     ++from
                                     )(*from)->spara();
    };
    system("PAUSE");
    return EXIT_SUCCESS;
}

Share Button