Pesquisar na Comunidade
Mostrando resultados para as tags ''[poligono] [matriz] [recursão] [strtol] [ponteiro]''.
Encontrado 1 registro
-
/* 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[]) { }