[bcn-pm] bé, aquí van els programets...

Jordi Delgado jdelgado a lsi.upc.edu
div abr 17 03:00:09 PDT 2009


Hola,

Els enunciats els teniu a:
http://www.lsi.upc.edu/~jdelgado/enunciats.tar.gz

Es diuen P0021.ps, P0022.ps i P0023.ps
Ho dic perque les solucions van anomenades de la
mateixa manera.

Les (meves) solucions son les que trobareu mes avall.

Alguns comentaris sobre els programes:

1) els enunciats estan pensats per a que les dades es
llegeixin des de teclat, sense que hi hagi cap format
especific (mes enlla del que demana l'enunciat). Vull
dir que poden estar separades per espai, salt de linia, 
etc. La idea es que es llegeixin amb 'cin >> ...' i
aquest ja fa aquesta feina. Com que jo no conec l'equivalent
en Perl, he fet aixo:
	local $/=undef;
	$entrada = <STDIN>;
	@entrada = split /\s+/,$entrada;
que et deixa a @entrada les dades que un vol. Segur que es
pot fer millor, pero un "nivell Llama" arriba on arriba ;-)

2) L'examen es un parcial, per tant nomes poden fer
servir coneixements que els hem ensenyat fins ara.
Aixo exclou qualsevol estructura de dades no elemental
(excepte strings).
Fixeu-vos que els meus programes nomes utilitzen llistes
pel tema de l'entrada de dades. A la resta, nombres i
strings (escalars, a Perl).

3) El parcial tenia dos torns. Uns feien el P0021 i el P0022,
i el segon torn feia el P0023 i el P0024. No us poso el
P0024 perque no vaig tenir temps de fer-lo. Malgrat aixo,
demanava llegir l'entrada caracter a caracter. Aixo a Perl
com es faria? Aixo funciona:
	chomp($line = <STDIN>);
	@chars = ($line =~ /[\+-\d]/ig);
	foreach (@chars) {
    		print "$_\n";
	};
ja que els caracters que podiem trobar a l'entrada podien
ser nomes '-', '+' o qualsevol digit numeric.
Estic segur, pero, que es pot fer millor.

4) Finalment, despres dels programes, trobareu uns
fitxers de dades com a jocs de proves. Els programes
funcionen be amb aquests fitxers (cada un amb el seu
corresponent).

I res mes. Lamento marejar-vos amb cosetes tan trivials.
Si em deixen, ja us comentare com va anar el parcial. Vull
dir quins van ser els resultats.

Salut!

Jordi



###################################
#p0021.perl

sub pinta_rusc {
   my ($f, $c) = @_;
   print ' _  '  x ($c - 1) , " _\n";
   $s = (('/ \_'  x ($c - 1)) . '/ \\' . "\n" . ('\_/ '  x ($c - 1))
. '\_/' . "\n") x $f;
   print "$s";
}

local $/=undef;
$entrada = <STDIN>;
@entrada = split /\s+/,$entrada;
for($i=0; $i < @entrada; $i+=2) {
   print "\n" if $i > 0;
   &pinta_rusc($entrada[$i], $entrada[$i+1]);
}


###################################
#p0022.perl

sub modifica {
   my $n = shift;
   return 0 if $n==0;
   return 1 if $n==1;
   return 8 if $n==8;
   return 6 if $n==9;
   return 9 if $n==6;
   return -1;
}

sub es_estrobogramatic {
   my $n = shift;
   my $ntmp = $n;
   my $nreves = 0;
   while (1 <= $ntmp) {
       my $v = &modifica($ntmp % 10);
       return 0 if  $v < 0;
       $nreves = 10 * $nreves + $v;
       $ntmp /= 10;
   }
   return ($nreves == $n);
}

local $/=undef;
$entrada = <STDIN>;
@entrada = split /\s+/,$entrada;
$senar = 0;
foreach (@entrada) {
   chomp;
   $ho_es = 'no';
   if (&es_estrobogramatic($_)) {
       $senar += 1  if ($_ % 2);
       $ho_es = 'si';
   }
   print "$_ ", $ho_es , " es estrobogramatic\n";
};
print "\nestrobogramatics senars: $senar\n";

###################################
#p0023.perl

sub escriu_triangle {
   my $n = shift;
   foreach (1..$n) {
       my $espais = " " x (2*($n - $_));
       my $s = $espais . " " . ('/\  ' x ($_-1)) . '/\\' . "\n";
       $s .= $espais . ('/__\\' x $_) . "\n";
       print "$s";
   }
}

local $/=undef;
$entrada = <STDIN>;
@entrada = split /\s+/,$entrada;
$primer = 1;
foreach (@entrada) {
   if ($primer) { $primer = 0; }
   else { print "\n" if $_ > 0; };
   &escriu_triangle($_);
};

###################################
# Fitxer de dades dat0021.dat
3 4
1 1
2 1 1 2 5 5
1 11

###################################
# Fitxer de dades dat0022.dat
1 2 8
11

101
111 1110             0
38 18
1881
44
69
96
99
123456789   969689696

###################################
# Fitxer de dades dat0023.dat
4
1 -5 3 2
11 7
-5


Més informació sobre la llista de correu Barcelona-pm