L’ora dell’addio.

Ho finalmente deciso: userò il C++, nelle prove dei nazionali di informatica!

Sperando di riuscire ad impadronirmene prima di allora… suggello lo storico passaggio con una poesia:

 

Pascal ti lascio: l’ora è dell’addio!

Come potrei, ormäi, non cambiare?

Ma chi potrebbe però scordare

da chi il suo programmare prese avvio?

 

Stà certo dunque, non cadrà oblio

sui tuoi indirizzi facili a passare,

sul tuo imput/output -chi lo può eguagliare?-,

sui tanti pregi ch’escon dal dir mio!

 

La nuova lingua mette tutto e più:

dall’ordin chiaro che mi davi tu,

vertigin viene a tanta varietà!

 

Ma se a buon frutto l’esperienza andrà,

potrò andar oltre la semplicità:

allora volerò, col C++!

 

 

Giusto per permettervi di fare un confronto tra i due stili, allego il mio primo programma (funzionante) scritto in c++, di livello "esperto", preceduto dalla sua traduzione in Pascal. (può anche essere, per voi, l’occasione di farvi un’infarinatura di C…)

Il problema che risolve è il seguente: il file di ingresso contiene i numeri N ed M, rispettivamente il numero degli incroci e delle strade che li collegano. Prosegue poi con altre M righe rappresentanti ciascuna una strada con tre numeri a, b, c (nell’ordine incrocio di inizio e fine, e lunghezza della strada);

Ciò che è richiesto è la lunghezza del secondo percorso più breve per giungere dal nodo 1 al nodo N.

Perchè il secondo e non il primo? Beh, il titolo del problema era "follia"…

 

Pascal: 

 

Program follia;
type s=^collegamenti;

     collegamenti=record
                   arrivo:integer;
                   lunghezza:word;
                   dopo:s;
                  end;

     incrocio=record
               uno,due:integer;
               vai:s;
              end;

var via: array [1..2000] of incrocio;
    n,a,b:integer;
    m,c:word;
    u,k:text;
    i:integer;
    x:s;

 

procedure prosegui(v:s; cam:integer);forward;

 

procedure trova(pos,cam:integer);
 begin
  if (via[pos].uno>cam) or (via[pos].uno=-1) then
   begin
    via[pos].due:=via[pos].uno;
    via[pos].uno:=cam;
   end
  else
   if ((via[pos].due>cam) and (via[pos].uno<>cam)) or (via[pos].due=-1) then
    via[pos].due:=cam
   else
    exit;
  prosegui(via[pos].vai,cam);
 end;

 

procedure prosegui(v:s; cam:integer);
 begin
  if v<>nil then
   begin
    trova(v^.arrivo,cam+v^.lunghezza);
    prosegui(v^.dopo,cam);
   end;
 end;

 

begin
 assign(u,’input.txt’);
 reset(u);
 readln(u,n,m);
 for i:=1 to n do
  with via[i] do

   begin
    uno:=-1;
    due:=-1;
    vai:=nil;
   end;
 for i:=1 to m do
  begin
   readln(u,a,b,c);
   new(x);
   x^.arrivo:=b;
   x^.lunghezza:=c;
   x^.dopo:=via[a].vai;
   via[a].vai:=x;
  end;
 close(u);
 trova(0,0);
 assign(k,’output.txt’);
 rewrite(k);
 write(k,via[n].due);
 close(k);
end.

 

———————————————————————————-

 

C++:

 

#include <fstream.h>
#include <stdlib.h>

 

struct collegamenti
 {
   short arrivo;
   unsigned lunghezza;
   collegamenti *dopo;
 };

 

struct incrocio
 {
   int uno,due;
   collegamenti *vai;
 }via[2000];

 

short N;
unsigned M;

 

void trova(int=0,int=0);
void prosegui(collegamenti*,int);

 

int main()
{
      ifstream u("input.txt");
      u>>N>>M;
      {
        short a,b;
        unsigned c;
        collegamenti *x;
        for(short i=0;i<N;i++)
         {
           via[i].uno=-1;
           via[i].due=-1;
           via[i].vai=NULL;
          }
        for(short i=0;i<M;i++)
         {
           u>>a>>b>>c;
           x=new collegamenti;
           x->arrivo=b-1;
           x->lunghezza=c;
           x->dopo=via[a-1].vai;
           via[a-1].vai=x;
         }
       }
      u.close();
      trova();
      ofstream k("output.txt");
      k<<via[N-1].due<<endl;
      k.close();
      return 0;
 }

 

void trova(int pos,int cam)
 {
   if ((via[pos].uno>cam) || (via[pos].uno==-1))
    {
      via[pos].due=via[pos].uno;
      via[pos].uno=cam;
     }
    else
     if ((via[pos].due>cam) && (via[pos].uno!=cam) || (via [pos].due==-1))
      via[pos].due=cam;
     else
      return;
   prosegui(via[pos].vai,cam);
  }

 

void prosegui(collegamenti *v, int cam)
 {
   if (v!=NULL)
    {
     trova(v->arrivo,cam+v->lunghezza);
     prosegui(v->dopo,cam);
    }
 }

 

 

Informazioni su francescodondi

Qui il mio curriculum online. "nerd score"
Questa voce è stata pubblicata in Computer e Internet. Contrassegna il permalink.

Una risposta a L’ora dell’addio.

  1. Giada ha detto:

     

    238) Chi è la persona che conosci che ha più tempo da perdere? Francesco.
    239) Perchè dici questo? Basta guardare al numero di frasi senza senso che ha messo sul blog… =P! Così siamo pari
     
    #include <fstream.h>#include <stdlib.h>
     
    struct collegamenti {   short arrivo;   unsigned lunghezza;   collegamenti *dopo; };
     
    struct incrocio {   int uno,due;   collegamenti *vai; }via[2000];
     
    short N;unsigned M;
     
    void trova(int=0,int=0);void prosegui(collegamenti*,int);
     
    int main(){      ifstream u("input.txt");      u>>N>>M;      {        short a,b;        unsigned c;        collegamenti *x;        for(short i=0;i<N;i++)         {           via[i].uno=-1;           via[i].due=-1;           via[i].vai=NULL;          }        for(short i=0;i<M;i++)         {           u>>a>>b>>c;           x=new collegamenti;           x->arrivo=b-1;           x->lunghezza=c;           x->dopo=via[a-1].vai;           via[a-1].vai=x;         }       }      u.close();      trova();      ofstream k("output.txt");      k<<via[N-1].due<<endl;      k.close();      return 0; }
     
    void trova(int pos,int cam) {   if ((via[pos].uno>cam) || (via[pos].uno==-1))    {      via[pos].due=via[pos].uno;      via[pos].uno=cam;     }    else     if ((via[pos].due>cam) && (via[pos].uno!=cam) || (via [pos].due==-1))      via[pos].due=cam;     else      return;   prosegui(via[pos].vai,cam);  }
     
    void prosegui(collegamenti *v, int cam) {   if (v!=NULL)    {     trova(v->arrivo,cam+v->lunghezza);     prosegui(v->dopo,cam);    } }
     

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...