Base de connaissances CCM
Programmation - Langages - Perl




Sujet 7685 - Trier un tableau sans utiliser la fonction sort

[ Voir ce sujet en ligne ] - [ Catégorie: Programmation - Langages - Perl ]


Trier un tableau sans utiliser la fonction sort


D'abord on initialise une variable $max avec la 1ère valeur de tableau.
Ensuite on va faire une boucle tant que le tableau contient encore des éléments.
C'est avec la fonction splice qui a le rôle de vider le tableau.

Voici l'algorithme :

TANT QUE le tableau contient des éléments
   trouve la valeur maximale
   cherche la position de l'élément trouvé
   ajouter l'élément au début du tableau trié, l'ordre croissante
   ajouter l'élément à la fin du tableau trié - l'ordre décroissante
   suppression d'élément trouvé avec splice - condition d'arrêt de la boucle
   réinitialiser la position
   réinitialiser la valeur $max avec le 1er élément du tableau diminué avec splice
FIN TANT QUE

Le script


#!/usr/bin/perl
use strict;use warnings;

my @tab = qw/9 3 7 14 8 7 25 12 1 6/;
my ($n,$max,@tri,@tri_desc);
$max = $tab[0];

print "@tab\n";
while(@tab){
        $_ > $max and $max = $_ for @tab;
        for (@tab){ $n++;last if $max == $_}
        unshift @tri,$max;
        push @tri_desc,$max;
        splice(@tab,$n-1,1);
        $n=0;
        $max = $tab[0];
}
print "ordre croissante:\t@tri\n";
print "ordre decroissante:\t@tri_desc\n";
__END__


Le résultat


lami20j@debian:~# perl ccm.pl
9 3 7 14 8 7 25 12 1 6
ordre croissante:       1 3 6 7 7 8 9 12 14 25
ordre decroissante:     25 14 12 9 8 7 7 6 3 1
--

Lire la suite

Conversion d'une adresse IP en entier 32 bits »
Publié par lami20j - Dernière mise à jour le 16 novembre 2009 à 12:56 par marlalapocket




Sujet 10440 - Conversion d'une adresse IP en entier 32 bits

[ Voir ce sujet en ligne ] - [ Catégorie: Programmation - Langages - Perl ]

Nous allons faire un ping sur commentcamarche.net, pour récupérer l'adresse IP (voir en gras)

$ ping -c1 commentcamarche.net
PING commentcamarche.net (194.169.240.130) 56(84) bytes of data.
64 bytes from www.commentcamarche.org (194.169.240.130): icmp_seq=1 ttl=53 time=53.2 ms

--- commentcamarche.net ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 53.230/53.230/53.230/0.000 ms


Nous faisons la conversion d'IP en utilisant les opérateurs de traitement de bits.
Le nombre est sur 32 bits. Donc pour obtenir l'entier, nous décalons à gauche chaque octet. L'opérateur | permet de mettre les bits à un.

Voici la représentation en binaire

11000010 00000000 00000000 00000000  - 3254779904 (194 << 24)
00000000 10101001 00000000 00000000  - 11075584   (169 << 16) |
00000000 00000000 11110000 00000000  - 61440      (240 <<  8) |
00000000 00000000 00000000 10000010  - 130
-----------------------------------
11000010 10101001 11110000 10000010   - 3265917058  (3254779904|11075584|61440|130)


Et voici la commande permettant de convertir l'IP en entier sur 32 bits.
$ echo 194.169.240.130 | perl -ne 's/(\d+)\.(\d+)\.(\d+)\.(\d+)/$1<<24|$2<<16|$3<<8|$4/e;print'
3265917058


Voici le résultat du ping utilisant le nombre entier au lieu de l'IP classique
$ ping -c1 3265917058
PING 3265917058 (194.169.240.130) 56(84) bytes of data.
64 bytes from 194.169.240.130: icmp_seq=1 ttl=53 time=53.0 ms

--- 3265917058 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 53.034/53.034/53.034/0.000 ms

Lire la suite

Conversion d'un nombre entier 32 bits en IP »
Publié par lami20j - Dernière mise à jour le 10 novembre 2009 à 16:07 par marlalapocket




Sujet 10443 - Conversion d'un nombre entier 32 bits en IP

[ Voir ce sujet en ligne ] - [ Catégorie: Programmation - Langages - Perl ]


Conversion d'un nombre entier 32 bits en IP


Nombre à convertir : 3265917058

Représentation binaire


11000010 10101001 11110000 10000010 - 3265917058
00000000 00000000 00000000 11000010 - 3265917058 >> 24 ( 194 )

11000010 10101001 11110000 10000010 - 3265917058
10101001 11110000 10000010 00000000 - 3265917058 << 8
00000000 00000000 00000000 10101001 - (3265917058 << 8 ) >> 24 ( 169 )

11000010 10101001 11110000 10000010 - 3265917058
11110000 10000010 00000000 00000000 - 3265917058 << 16
00000000 00000000 00000000 11110000 - (3265917058 << 16) >> 24 ( 240 )

11000010 10101001 11110000 10000010 - 3265917058
10000010 00000000 00000000 00000000 - 3265917058 << 24
00000000 00000000 00000000 10000010 - (3265917058 << 24) >> 24 ( 130 )

Commande pour conversion


$ echo 3265917058 | perl -ne 'print $_>>24 ,".",$_<<8>>24,".",$_<<16>>24,".",$_<<24>>24,"\n"'
194.169.240.130
Publié par lami20j - Dernière mise à jour le 10 novembre 2009 à 15:44 par marlalapocket





© Tous droits réservés 2010 Jean-François Pillou