Ir para conteúdo
Fórum Script Brasil
  • 0

luizflleitaoufrj

Pergunta

/*
No final do arquivo inclua um comentário com a macro $RCSfile$. 

Um dispositivo de saída (monitor) pode ser visto como uma matriz bidimensional de pixels. Para simplificar, cada pixel poderáestar apagado ou aceso. Considerando-se um terminal do tipo texto, um pixel será representado por um caractere, ou seja, '0' se estiver apagado e '1' se estiver aceso.

Um algoritmo de preenchimento de área utilizado neste ambiente recebe as informações atualizadas sobre todos os pixels do    monitor, incluindo a definição de um polígono, ou seja, os pixels correspondentes aos lados do polígono deverão estar acesos.Além disso, o algoritmo deverá receber a quantidade de linhas e de colunas do monitor e as coordenadas de um pixel localizadodentro do polígono.

A partir destas informações, toda a área interna ao polígono deverá ser preenchida (os pixels deverão ser definidos pelo     caractere '1').

Para isso, a primeira ação é verificar se o pixel desejado já está aceso. Se estiver nenhuma ação deverá ser executada.

Caso contrário, o pixel em questão deverá ser aceso e o algoritmo deverá ser executado novamente para os quatro pixels       vizinhos a este pixel (esquerda, direita, abaixo e acima do pixel em questão).

Baseado no algoritmo acima, crie o arquivo "aula0601.h" contendo a definição das macros APAGADO ('0'), ACESO ('1'),          NUMERO_MAXIMO_LINHAS (25) e NUMERO_MAXIMO_COLUNAS (80), do tipo tipoErros (tipo enumerado contendo os códigos de retorno da  função PreencherPoligono, por exemplo, ok - valendo 0, abscissaInvalida - valendo 1, etc.), do tipo tipoPixel (enumerado     contendo os valores apagado e aceso) e do protótipo da função MostrarMonitor. Esta função deverá receber uma matriz de pixels(tipoPixel) correspondendo ao monitor, além de suas dimensões. A função deverá exibir o conteúdo desta matriz. A macro       referente à combinação ifndef e define, como por exemplo _AULA0601_, deverá ser definida como uma string valendo:


    "@(#)aula0601.h $Revision$"

    tipoErros
    MostrarMonitor (tipoPixel monitor [NUMERO_MAXIMO_LINHAS] [NUMERO_MAXIMO_COLUNAS],                                                            unsigned maximoLinhas, unsigned maximoColunas);


Observação:
O uso do operador ternário na chamada da função printf que exibe cada pixel (cada caractere correspondente) é obrigatório.


    Operador Ternário:
    Condição ? verdadeiro : falso


Crie o arquivo "aula0601.c" contendo o código fonte da função MostrarMonitor. Esta função deverá conter, antes da exibição doconteúdo, uma chamada para a função system executando o comando clear. Após a exibição do conteúdo, esta função deverá       conter uma chamada para a função sleep (com o tempo mínimo necessário para que uma configuração do monitor possa ser         visualizada pelo usuário). A função deverá retornar ok (ZERO) ou o código de erro correspondente.

Inclua, no arquivo "aula0601.h", a definição do protótipo da função LimparMonitor. Esta função deverá receber as informações sobre todos os pixels do monitor em questão, além do número máximo de linhas e do número máximo de colunas deste dispositivo.Se todos os argumentos forem válidos, a função deverá "apagar" todos os pixels do dispositivo. A função deverá retornar ok   (ZERO) ou o código de erro correspondente.


    tipoErros
    LimparMonitor (tipoPixel monitor [NUMERO_MAXIMO_LINHAS][NUMERO_MAXIMO_COLUNAS],                                                             unsigned maximoLinhas, unsigned maximoColunas);


Inclua, no arquivo "aula0601.c", a implementação da função LimparMonitor. A função MostrarMonitor deverá ser executada no    final da execução da função LimparMonitor.

Inclua, no arquivo "aula0601.h", a definição do protótipo da função DesenharRetangulo. Esta  função deverá receber as        informações atualizadas sobre todos os pixels do monitor, o número máximo de linhas e o número máximo de colunas do          dispositivo, além das coordenadas do canto superior esquerdo e do canto inferior direito do retângulo desejado. Se todos os  argumentos recebidos forem válidos, a função deverá "acender" todos os pixels que correspondam aos lados do retângulo em     questão. A função deverá retornar ok ou o código de erro correspondente.


    tipoErros
    DesenharRetangulo (tipoPixel monitor [NUMERO_MAXIMO_LINHAS][NUMERO_MAXIMO_COLUNAS],                                                             unsigned maximoLinhas, unsigned maximoColunas, unsigned ordenadaEsquerda,                                                    unsigned abscissaEsquerda, unsigned ordenadaDireita, unsigned abscissaDireita);


Inclua, no arquivo de "aula0601.c", a implementação da função DesenharRetângulo. A função MostrarMonitor deverá ser executadano final da execução da função DesenharRetangulo.

Inclua, no arquivo "aula0601.h", a definição do protótipo da função PreencherPoligono. Esta função deverá receber as         informações atualizadas sobre todos os pixels do monitor, incluindo a definição de um polígono, ou seja, os pixels           correspondentes aos lados do polígono deverão estar acesos. Além disso, a função deverá receber a quantidade de linhas e de  colunas do monitor e as coordenadas de um pixel localizado dentro do polígono. Se todos os argumentos forem válidos, o       polígono deverá ser preenchido de acordo com o algoritmo definido acima.


    tipoErros
    PreencherPoligono (tipoPixel monitor [NUMERO_MAXIMO_LINHAS ][ NUMERO_MAXIMO_COLUNAS],                                                           unsigned maximoLinhas, unsigned maximoColunas, unsigned linha,                                                               unsigned coluna);


Inclua, no arquivo de "aula0601.c", a implementação da função PreencherPoligono. A função MostrarMonitor deverá ser executadatoda vez que um pixel for modificado.

Crie o arquivo "aula0602.c" contendo a implementação do programa de testes da função PreencherPoligono. Este programa deverá receber o número de linhas e o número de colunas do dispositivo desejado, as coordenadas do canto superior esquerdo e do     canto inferior direito de um retângulo e as coordenadas de um ponto que esteja dentro deste retângulo. Se todos os argumentosrecebidos forem válidos, o programa deverá chamar as funções necessárias (LimparMonitor, MostrarMonitor, DesenharRetangulo e PreencherPoligono).

Inclua, no arquivo de dependências, a macro AULA0602OBJS - correspondendo aos arquivos necessários para criar o executável a partir dos arquivos "aula0601.c" e "aula0602.c". Além disso, defina a macro AULA06, equivalendo ao executável "aula0602", e  altere a macro EXECS, de forma que o valor da mesma inclua os executáveis criados na aula 06. O arquivo de dependências      deverá incluir ainda os objetivos aula06 (executável da aula 06) e aula0602 (executável criado a partir dos arquivos         definidos pela macro AULA0602OBJS) com os comandos correspondentes.

Crie, na máquina local (lig0XY), o executável aula0602 (compilação e link-edição) usando o comando make. Teste o executável  criado.

Repita o passo anterior na máquina loghost02. Para isso execute o comando "make clean aula0602" (sem as aspas).

Submeta os arquivos aula0601.h, aula0601.c, aula0602.c e Makefile ao sistema de controle de versão (comando ci).

Recupere uma cópia de leitura dos arquivos aula0601.h, aula0601.c e aula0602.c (comando co) e uma cópia de escrita do arquivoMakefile (comando co -l).
*/

/* aula0601.h */

#ifndef _AULA0601_
#define _AULA0601_ "@(#)aula0601.h $Revision$"

#define APAGADO                    0
#define ACESO                    1

#define NUMERO_MAXIMO_LINHAS            25
#define NUMERO_MAXIMO_COLUNAS            80


typedef enum {ok, caractereInvalido, tamanhoInvalido,
              abscissaInvalida, ordenadaInvalida} tipoErros /* acrescentar parâmetros */
typedef enum {APAGADO, ACESO} tipoPixel


tipoErros
MostrarMonitor (tipoPixel [NUMERO_MAXIMO_LINHAS] [NUMERO_MAXIMO_COLUNAS],
                unsigned, unsigned);

tipoErros
LimparMonitor (tipoPixel [NUMERO_MAXIMO_LINHAS] [NUMERO_MAXIMO_COLUNAS],
               unsigned, unsigned);

tipoErros
DesenharRetangulo (tipoPixel [NUMERO_MAXIMO_LINHAS][NUMERO_MAXIMO_COLUNAS],
                   unsigned, unsigned, unsigned,
                   unsigned, unsigned, unsigned);

tipoErros
PreencherPoligono (tipoPixel [NUMERO_MAXIMO_LINHAS ][ NUMERO_MAXIMO_COLUNAS],
                   unsigned, unsigned, unsigned, unsigned);


#endif

/* aula0601.c */

tipoErros
MostrarMonitor (tipoPixel monitor[NUMERO_MAXIMO_LINHAS][NUMERO_MAXIMO_COLUNAS],
                unsigned maximoLinhas, unsigned maximoColunas)
{
  unsigned indiceLinhas, indiceColunas;

  system(clear);
  sleep(1);

  for (indiceLinhas = 0; indiceLinhas < maximoLinhas; indiceLinhas++)
  {
    for (indiceColunas = 0; indiceColunas < maximoColunas; indiceColunas++)
      printf(monitor[indiceLinhas][indiceColunas] = ACESO ? "1 " : "0 ");
    
    printf("\n");
  } /* for */

  return ok;
} /* MostrarMonitor */


tipoErros
LimparMonitor (tipoPixel monitor[NUMERO_MAXIMO_LINHAS][NUMERO_MAXIMO_COLUNAS],
               unsigned maximoLinhas, unsigned maximoColunas)
{
  unsigned indiceLinhas, indiceColunas;

  for (indiceLinhas = 0; indiceLinhas < maximoLinhas; indiceLinhas++)
  {
    for (indiceColunas = 0; indiceColunas < maximoColunas; indiceColunas++)
    {
      monitor[indiceLinhas][indiceColunas] = 0;
      printf("%i ", monitor[indiceLinhas][indiceColunas]);
    } /* for */

    printf("\n");
  } /* for */

  return ok;
} /* LimparMonitor */


tipoErros
DesenharRetangulo (tipoPixel monitor[NUMERO_MAXIMO_LINHAS][NUMERO_MAXIMO_COLUNAS],
                   unsigned maximoLinhas, unsigned maximoColunas, unsigned ordenadaEsquerda,
                   unsigned abscissaEsquerda, unsigned ordenadaDireita, unsigned abscissaDireita);
{
  unsigned indiceLinhas, indiceColunas;


  if (((abscissaEsquerda < 0) || (abscissaEsquerda > maximoLinhas))  ||
      ((abscissaDireita  < 0) || (abscissaDireita  > maximoLinhas)))
  {
    printf("A abscissa esta fora dos parametros especificados e/ou suportados.");
    exit(abscissaInvalida);
  } /* if */


  if (((ordenadaEsquerda < 0) || (ordenadaEsquerda > maximoColunas))  ||
      ((ordenadaDireita >  0) || (ordenadaDireita  > maximoColunas)))
  {
    printf("A ordenada esta fora dos parametros especificados e/ou suportados.");
    exit(ordenadaInvalida);
  } /* if */


  for (indiceLinhas = 0; indiceLinhas < maximoLinhas; indiceLinhas++)
  {
    for (indiceColunas = 0; indiceColunas < maximoColunas; indiceColunas++)
    {

      if (((indiceLinhas ==  abscissaEsquerda)  &&
           (indiceColunas >= ordenadaEsquerda)  &&
           (indiceColunas <=  ordenadaDireita)) ||

          ((indiceColunas ==  ordenadaDireita)  &&
           (indiceLinhas >=  abscissaEsquerda)  &&
           (indiceLinhas <=  abscissaDireita))  ||

          ((indiceLinhas  ==  abscissaDireita)  &&
           (indiceColunas >= ordenadaEsquerda)  &&
           (indiceColunas <= ordenadaDireita))  ||

          ((indiceColunas == ordenadaEsquerda) &&
           (indiceLinhas >=  abscissaEsquerda) &&
           (indiceLinhas <=  abscissaDireita)))
      {
        monitor[indiceLinhas][indiceColunas] = 1;
        printf("%i ", monitor[indiceLinhas][indiceColunas]);
      } /* if */
      else
      {
        monitor[indiceLinhas][indiceColunas] = 0;
        printf("%i ", monitor[indiceLinhas][indiceColunas]);
      } /* else */

    } /* for */

    printf("\n");

  } /* for */

  return ok;
} /* DesenharRetangulo */


tipoErros
PreencherPoligono (tipoPixel monitor[NUMERO_MAXIMO_LINHAS][NUMERO_MAXIMO_COLUNAS],
                   unsigned maximoLinhas, unsigned maximoColunas, unsigned linha,
                   unsigned coluna);
{

  if ((maximoColunas > NUMERO_MAXIMO_COLUNAS)    ||
      (maximoLinhas  >  NUMERO_MAXIMO_LINHAS)    ||
      (maximoColunas < 0) || (maximoLinhas < 0))
  {
    printf("\n\nOs parametros de linha e/ou coluna estao fora das dimensoes suportadas.\n\n\n");
    exit(tamanhoInvalido);
  } /* if */

  for (indiceLinhas = 0; indiceLinhas < maximoLinhas; indiceLinhas++)
  {
    for (indiceColunas = 0; indiceColunas < maximoColunas; indiceColunas++)
    {
      if ((monitor[indiceLinhas][indiceColunas] < '0') ||
          (monitor[indiceLinhas][indiceColunas] > '1'))
      {
        printf("\n\nEntrada contem caractere invalido.\n\n\n");
        exit(caractereInvalido); 
      } /* if */
    } /* for */
  } /* for */


  

} /* PreencherPoligono */


/* aula0602.c */

int
main(int argc, char *argv[])
{

}

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...