shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Re: uso de matrizes no awk


From: Julio C. Neves
Subject: Re: [shell-script] Re: uso de matrizes no awk
Date: Thu, 5 Feb 2009 16:04:00 -0200

Edmar,
o Shell não trabalha com matrizes (polidimensionais), somente com vetores
(mono dimensionais), porém ele aceita qq operação com inteiros dentro dos
colchetes dos vetores. Assim sendo, supondo que quero criar uma matriz
bidimensional e que a segunda dimensão terá no máximo 100 elementos, eu
engano o cara fazendo assim:

Matriz 56, 43 => arr[56*100+43]=xxxx

e para pegar os índices eu faço:

let Ind1=5643/100
let Ind2=5643%100

Pessoal, um bom treino para isso, é desenvolver um jogo da velha. Eu já
desenvolvi a rotina do computador começando a partida, falta desenvolver a
do jogador fazendo o primeiro lance. Abaixo o código (pode ser que o cliente
de e-mail quebre algumas linhas.

#!/bin/bash
#
#######################################################
#                   JOGO DA VELHA                     #
#          DUVIDO QUE VOCE CONSIGA GANHAR!            #
#-----------------------------------------------------#
#                    TIC TAC TOE                      #
#    I WON'T GIVE YOU A CHANCE. YOU'LL NEVER WIN!     #
#######################################################
#                                                     #
#         Leia:    Programacao Shell - Linux          #
#         Autor:   Julio Cezar Neves                  #
#         Editora: Brasport                           #
#         ISBN:    85-7452-076-4                      #
#                                                     #
#######################################################
#  Para qualquer duvida ou esclarecimento sobre este  #
# programa estou as ordens em address@hidden #
#-----------------------------------------------------#
#   Any doubt about this program you can find me at   #
#              address@hidden                #
#######################################################
# Se voce estiver sob o ksh, troque a 1a. linha por   #
#                    #!/bin/ksh                       #
#-----------------------------------------------------#
#   If you are running ksh change the 1st. line for   #
#                    #!/bin/ksh                       #
#######################################################
#    Este foi um meio divertido que encontrei para    #
#  testar a compatibilidade no uso de arrays entre o  #
# bash e o ksh. Se alguem quiser desenvolver a rotina #
#   em que o adversario comeca jogando, sinta-se a    #
#  vontade, porem nao esqueca de mandar-me o modulo   #
#             para incorpora-lo ao meu.               #
#-----------------------------------------------------#
#  This program was developed as a funny way to test  #
#  the compatibility between arrays in ksh and bash.  #
# Feel free for develop the module that the opponent  #
# start playing, but don't forget to send me the new  #
#     routine because I'll attach it at this one.     #
#######################################################
#

Ganhei=0
Empate=0
Bold=`tput bold`
OBold=`tput sgr0`
Cols=`tput cols`
if   [ $Cols -lt 80 -o `tput lines` -lt 25 ]
then
    clear
    echo "O tamanho minimo da janela deve ser 25 linhas e 80 colunas"
    exit 2
    read lixo
fi
Col0=`expr \( $Cols - 46 \) / 2`
Eng=`echo "To play in english use: $Bold\`basename $0\`$OBold -e (default
language is portuguese)"`

# Ingles ou Portugues?             English or Portuguese?
if  [ "$1" = -e ]
then
        StrIni[1]="   1   2   3"
        StrIni[2]="1    |   |              +---------+----------+"
        StrIni[3]="  ---+---+---           |  Ties   |   Wins   |"
        StrIni[4]="2    |   |              +---------+----------+"
        StrIni[5]="  ---+---+---           |         |          |"
        StrIni[6]="3    |   |              +---------+----------+"
   StrGan="I   W O N !!!"
   StrEmp="T I E"
   StrLe="Now it's our time to play (RowColumn):"
   StrEr1="At this position already has a -> "
   StrEr2="Write row and column together. I.E. 13 means row 1 and column 3"
   StrFim="Do you want to continue?"
else
        StrIni[1]="   1   2   3"
        StrIni[2]="1    |   |              +---------+----------+"
        StrIni[3]="  ---+---+---           | Empates | Vitorias |"
        StrIni[4]="2    |   |              +---------+----------+"
        StrIni[5]="  ---+---+---           |         |          |"
        StrIni[6]="3    |   |              +---------+----------+"
   StrGan="G A N H E I !!!"
   StrEmp="E M P A T E"
   StrLe="Informe a sua jogada (LinhaColuna):"
   StrEr1="Nesta posicao ja existe um -> "
   StrEr2="Informe Linha e Coluna juntos. Ex: 13 = Linha 1 e Coluna 3"
   StrFim="Deseja continuar?"
fi

Escrever ()
   {
        ColIni=`expr \( $Cols - length "$2" \) / 2`
   tput cup $1 $ColIni
   echo "$2"
   }
Iniciar ()
   {
   Jogo=
   for i in 1 2 3
   do
      for j in 1 2 3
      do
         P[$i$j]=
      done
   done
   clear
   for i in 1 2 3 4 5 6
   do
      tput cup `expr 11 + $i` $Col0
      echo "${StrIni[i]}"
   done
   Seg=`date "+%S"`
   case `expr $Seg % 5` in
      0) Jogo=11 ; Saida=1 ;;
      1) Jogo=13 ; Saida=2 ;;
      2) Jogo=31 ; Saida=3 ;;
      3) Jogo=33 ; Saida=4 ;;
      *) Jogo=22 ; Saida=5 ;;
   esac
   tput cup 16 `expr $Col0 + 29`
   echo $Bold$Empate
   tput cup 16 `expr $Col0 + 40`
   echo $Ganhei$OBold
   }
Jogar ()
   {
   P[$1]=$2
   Lin=`echo $1 | cut -c1`
   Col=`echo $1 | cut -c2`
   Lin=`expr \( $Lin - 1 \) \* 2 + 13`
   Col=`expr \( $Col - 1 \) \* 4 + 3 + $Col0`
   tput cup $Lin $Col
   echo $2
   }
Placar ()
   {
   tput bold
   if  [ $1 = E ]
   then
      Empate=$((Empate+1))
      tput cup 22 $Col0
          echo "$StrEmp"
      tput cup 16 `expr $Col0 + 29`  # Escrevendo Placar
      echo $Empate
   else
      Ganhei=$((Ganhei+1))
      tput cup 22 $Col0
          echo "$StrGan"
      tput cup 16 `expr $Col0 + 40`  # Escrevendo Placar
      echo $Ganhei
      case $2 in
      L) for j in 1 2 3
         do
            Jogar $i$j X
         done
         ;;
      C) for j in 1 2 3
         do
            Jogar $j$i X
         done
         ;;
      D1)for i in 11 22 33
         do
            Jogar $i X
         done
         ;;
      *) for i in 13 22 31
         do
            Jogar $i X
         done
      esac
   fi
   tput sgr0
   }

# Cuidado com o chefe!             WARNING! The boss is near you!
trap "clear ; exit" 0 2 3


# Jogando                          Playing
while true
do
   Iniciar
   if  [ "$1" != "-e" ]
   then
       Escrever 3 "$Eng"
   fi
   Jogar $Jogo X
   Vez=0
   while true
   do
      if [ $Vez -eq 4 ]
      then
         Placar E
         break
      fi
      tput cup 21 $Col0
      echo "$StrLe"
      tput cup 21 `expr $Col0 + 1 + length "$StrLe"`
      tput el
      tput cup 21 `expr $Col0 + 1 + length "$StrLe"`
      read Jogo
      case $Jogo in
      [1-3][1-3]) if  [ ${P[$Jogo]} ]
                  then
                      tput cup 22 $Col0
                      echo -n "$Bold$StrEr1${P[$Jogo]} <-$OBold"
                      read Jogo
                      tput cup 22 $ColIni
                      tput el
                      tput cup 21 `expr $Col0 + 1 + length "$StrLe"`
                      tput el
                      continue
                  fi
                  Jogar $Jogo O
                  Vez=$((Vez+1))
                  ;;
      *)          tput cup 22 $Col0
                  echo -n "$Bold$StrEr2$OBold"
                  read Jogo
                  tput cup 22 $Col0
                  tput el
                  tput cup 21 `expr $Col0 + 1 + length "$StrLe"`
                  tput el
                  continue
      esac

      for i in 1 2 3
      do
         LX[i]=0 ; CX[i]=0 ; LO[i]=0 ; CO[i]=0 ; DX[i]=0 ; DO[i]=0
      done

      for i in 1 2 3
      do
         for j in 1 2 3
         do
            [ "${P[$i$j]}" = X ] && LX[i]=$((${LX[$i]}+1))
            [ "${P[$i$j]}" = O ] && LO[i]=$((${LO[$i]}+1))
            [ "${P[$j$i]}" = X ] && CX[i]=$((${CX[$i]}+1))
            [ "${P[$j$i]}" = O ] && CO[i]=$((${CO[$i]}+1))
         done
      done
      for i in 11 22 33
      do
         [ "${P[$i]}" = X ] && DX[1]=$((${DX[1]}+1))
         [ "${P[$i]}" = O ] && DO[1]=$((${DO[1]}+1))
      done

      for i in 13 22 31
      do
         [ "${P[$i]}" = X ] && DX[2]=$((${DX[2]}+1))
         [ "${P[$i]}" = O ] && DO[2]=$((${DO[2]}+1))
      done

# Pra ganhar                       I wanna win!

      for i in 1 2 3
      do
         LAlinhadas[i]=$((${LX[i]}-${LO[i]}))
         CAlinhadas[i]=$((${CX[i]}-${CO[i]}))
         DAlinhadas[i]=$((${DX[i]}-${DO[i]}))
         if  [ ${LAlinhadas[i]} -eq 2 ]
         then
            for j in 1 2 3
            do
               [ ${P[$i$j]} ] && continue
               Jogo=$i$j
               Jogar $Jogo X
               Placar G L
               break 3
            done
         fi
         if  [ ${CAlinhadas[i]} -eq 2 ]
         then
            for j in 1 2 3
            do
               [ ${P[$j$i]} ] && continue
               Jogo=$j$i
               Jogar $Jogo X
               Placar G C
               break 3
            done
         fi
      done
      if  [ ${DAlinhadas[1]} -eq 2 ]
      then
         for i in 11 22 33
         do
            [ ${P[$i]} ] && continue
            Jogo=$i
            Jogar $Jogo X
            Placar G D1
            break 2
         done
      fi
      if  [ ${DAlinhadas[2]} -eq 2 ]
      then
         for i in 13 22 31
         do
            [ ${P[$i]} ] && continue
            Jogo=$i
            Jogar $Jogo X
            Placar G D2
            break 2
         done
      fi

# Pra nao perder                   I don't wanna lose

      for i in 1 2 3
      do
         if  [ ${LAlinhadas[i]} -eq -2 ]
         then
            for j in 1 2 3
            do
               [ ${P[$i$j]} ] && continue
               Jogo=$i$j
               Jogar $Jogo X
               continue 3
            done
         fi
         if  [ ${CAlinhadas[i]} -eq -2 ]
         then
            for j in 1 2 3
            do
               [ ${P[$j$i]} ] && continue
               Jogo=$j$i
               Jogar $Jogo X
               continue 3
            done
         fi
      done
      if  [ ${DAlinhadas[1]} -eq -2 ]
      then
         for i in 11 22 33
         do
            [ ${P[$i]} ] && continue
            Jogo=$i
            Jogar $Jogo X
            continue 2
         done
      fi
      if  [ ${DAlinhadas[2]} -eq -2 ]
      then
         for i in 13 22 31
         do
            [ ${P[$i]} ] && continue
            Jogo=$i
            Jogar $Jogo X
            continue 2
         done
      fi

# Ao ataque!                       Let's attack!

      case $Vez in
         1)  case $Saida in
               1)  [ ${P[33]} ] && Jogo=13 || Jogo=33 ;;
               2)  [ ${P[31]} ] && Jogo=33 || Jogo=31 ;;
               3)  [ ${P[13]} ] && Jogo=11 || Jogo=13 ;;
               4)  [ ${P[11]} ] && Jogo=31 || Jogo=11 ;;
               *)  if  [ ${P[11]} ]
                  then
                     Jogo=33
                  elif [ ${P[33]} ]
                  then
                     Jogo=11
                  elif [ ${P[13]} ]
                  then
                     Jogo=31
                  else
                     Jogo=13
                  fi
             esac ;;
         *)  [ $P{[22]} ] &&
             {
                 Jogo=
                 for i in 1 3
                 do
                    for j in 1 3
                    do
                       [ ${P[$i$j]} ] &&
                       {
                          [ ${P[$j$i]} ] && continue ||
                          {
                             Jogo=$j$i
                             break 2
                          }
                       } || {
                          Jogo=$i$j
                          break 2
                       }
                    done
                 done
                 [ "$Jogo" ] &&
                 {
                    Jogar $Jogo X
                    continue
                 }
                 for i in 1 2 3
                 do
                    for j in 1 2 3
                    do
                       [ "${P[$i$j]}" ] && continue
                       Jogo=$i$j
                       break 2
                    done
                 done
            } || Jogo=22
      esac
      Jogar $Jogo X
   done
   tput cup 23 $Col0
   echo "$StrFim"
   tput cup 23 `expr $Col0 + length "$StrFim" + 1`
   read a
   [ `echo $a | tr n N` = N ] && exit
done
-- 
Abração,
Julio
*Cursos de Shell e Zenity nos finais de semana:
- Em SP ligue (11) 2125-4747;
- Em DF ligue (61) 3223-3000;
- No RJ brevemente;
- Turmas fechadas em outras cidades ligue (21) 8112-9988*



2009/2/5 edmarssouza <address@hidden>

>   E ai jimmy, valeu pela ajuda colega. São de grande ajuda.
> Mais fiquei com uma dúvida quanto a matriz bidimensional, se fosse
> possivel você colocar um exemplo simples para mim ter uma idéia da
> matriz em um contexto, seria de maior ajuda. Agradeço desde já. Um
> abraço e obrigado denovo.
>
> Edmar de Souza Prado
>
> --- Em address@hidden <shell-script%40yahoogrupos.com.br>,
> jimmy <ronaldo_tgz@...>
> escreveu
> >
> > On Thu, Feb 05, 2009 at 07:57:48AM -0000, edmarssouza wrote:
> > > E ai pessoal tudo bem?
> > > Preciso de uma ajudinha, agradeceria a colaboração de todos.
> > > É o seguinte queria saber como faço para declarar várias matrizes
> em
> > > awk, em apenas uma linha ou pouca linha? Porque exemplo em shell
> > > script, faço:
> > >
> > > array=("shell" "script" "é" "demais")
> > >
> > > Desse modo declarei um array em apenas uma linha. Pois no awk
> > > atualmente uso o seguinte modo:
> > >
> > > array[1]="awk"
> > > array[2]="é"
> > > array[3]="demais"
> >
> > no gawk o mais próximo disso que conheço seria usando o comando
> split:
> >
> > awk 'BEGIN{split("awk é demais",array); print array[2]}'
> >
> > >
> > > E isso se torna muito trabalhoso com muitas matrizes. Outra
> coisinha
> > > como trabalho com matrizes bidimensional em awk?
> >
> > array[1,1] = "bidimensional"
> >
> > > Quem puder me ajudar
> > > com um exemplo ou link para uma apostila, ficarei imensamente
> > > agradecido.
> >
> > http://www.gnu.org/software/gawk/manual/gawk.txt
> >
> > > Obrigado a todos que contribuirem fico agradecido pela
> > > atenção desde já. Um abraço.
> > >
> > > Edmar de Souza Prado
> > >
> > > ------------------------------------
> >
> >
> > --
> > " Não manejo bem as palavras
> > Mas manipulo bem as strings."
> > ------------------------------
> >
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]