#!/bin/bash # # On saisit un entier N (ici N=9) et on affiche le motif suivant : # # 9 # 8 # 7 9 # 6 8 # 5 7 9 # 4 6 8 # 3 5 7 9 # 2 4 6 8 #1 3 5 7 9 # 2 4 6 8 # 3 5 7 9 # 4 6 8 # 5 7 9 # 6 8 # 7 9 # 8 # 9 # # L'algorithme est le suivant (pour la partie superieure du motif - la # partie inferieure est tres semblable modulo quelques details lies par # exemple au fait que le nombre de lignes a afficher est N-1 dans # l'implementation qui suit) : # # Pour la ligne i (1 <= i <= N), on commence par afficher N-i blancs. # Puis il reste a afficher i caracteres. En fait, on affiche un caractere # sur deux selon que l'on est sur une ligne paire ou impaire ET que # l'element est pair ou impair. Par exemple pour la premiere ligne (i=1), # il reste a afficher 1 caractere apres les 6-1=5 blancs. On affiche 6 # parce qu'il est pair et situe' sur une ligne impaire (en fait le critere # implemente est : "6 est pair et i+1 aussi"). # # Si on est sur une ligne paire, il faut afficher les pairs (sinon un blanc). # Cette affirmation n'est pas valide. En effet, si N est pair, la premiere # ligne se termine par N et la deuxieme (qui est paire) doit contenir les # impairs. Dans le code qui suit, pour savoir si l'on doit afficher les # pairs ou les impairs on examine si (N + $i + 1) est pair ou impair. # MAX_NO=0 echo -n "Enter Number between (3 to 9) : " read MAX_NO if ! [ $MAX_NO -ge 3 -a $MAX_NO -le 9 ] ; then echo "I ask to enter number between 1 and 9, please..." exit 1 fi clear for (( i=1; i<=MAX_NO; i++ )) do for (( s=MAX_NO; s>i; s-- )) do echo -n " " done s=`expr $MAX_NO - $i + 1` for (( j=$s; j<=$MAX_NO; j++ )) do # on regarde si on est sur une ligne paire ou impaire z=`echo "($MAX_NO + $i + 1) % 2" | bc` # on regarde si l'element est pair ou impair w=`expr $j % 2` if [ $w -eq 0 -a $z -eq 0 ] then echo -n $j else if [ $w -ne 0 -a $z -ne 0 ] then echo -n $j else echo -n " " fi fi done echo "" done ###### Second stage ###################### ## ## for (( i=$MAX_NO; i>1; i-- )) do for (( s=MAX_NO; s>i; s-- )) do echo -n " " done s=`expr $MAX_NO - $i + 1` for (( j=$s; j<=$MAX_NO; j++ )) do # on regarde si on est sur une ligne paire ou impaire z=`echo "($MAX_NO + $i + 1) % 2" | bc` # on regarde si l'element est pair ou impair w=`expr $j % 2` if [ $w -eq 0 -a $z -eq 0 ] then echo -n " " else if [ $w -ne 0 -a $z -ne 0 ] then echo -n " " else echo -n $j fi fi done echo "" done