/*
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:
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.
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.
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.
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).
*/
Pergunta
luizflleitaoufrj
/*
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
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.