Buscar

UFPE Sem.2017.2 final gabarito e criterio

Prévia do material em texto

ÁREA II – CCEN / UFPE
Disciplina: IF 165 – Computação Eletrônica – Prova Final 2017.2 Data: 12/12/2017
Nome legível do aluno: ................................................................................................. Turma ......... 
Observações gerais:
Preencher os dados do cabeçalho do bloco de provas e na folha de questões o nome e a turma;
Ao final da prova entregar ao professor ou fiscal a folha de questões e o caderno de prova;
Cada quesito vale dez pontos.
1º quesito: Uma imagem é formada por uma matriz de pixels. Por exemplo, uma imagem de 200 x 300 pixels é composta por uma matriz de pixels de dimensão 200 por 300. O pixel é o elemento básico de uma imagem. Ele e composto por três cores: r (vermelho), g (verde) e b (azul). Matematicamente, os valores de r, g e b, são inteiros entre 0 e 255. Um pixel é considerado um "tom de cinza" APENAS quando r=g=b. Em todos os outros casos o pixel é designado como "colorido". No exemplo abaixo, mostramos um arquivo de uma imagem 2 x 3 pixels (a 1ª linha foi inserida apenas para a compreensão do que as colunas representam). Os pixels 12 e 22 são exemplos de "tons de cinza", enquanto os outros quatro pixels são "coloridos".  
 R   G   B    
180 052 136  --> pixel 11
059 059 059  --> pixel 12
162 209 175  --> pixel 13
231 044 210  --> pixel 21
110 110 110  --> pixel 22
178 231 255  --> pixel 23
O modelo do arquivo da dados considerado para o problema possui apenas três colunas de números inteiros. O número de linhas do arquivo é igual ao produto das dimensões da imagem.
Crie um programa em C que transforme uma imagem "colorida" em "tons de cinza". Para isso:
Declare uma estrutura chamada PIXEL, que armazene as componentes R, G e B de um pixel;
Crie a função sem retorno CARREGA_IMAGEM, que tem como entradas: i) um vetor do tipo Pixel; ii)  o nº de linhas do arquivo. Esta função deve ler as informações do arquivo "IMAGEM.file" e guardá-las no vetor;
Crie a função sem retorno COLORIDO_PARA_CINZA, que converte um pixel "colorido" para "tons de cinza". A função tem como entrada o endereço de memória de uma variável escalar do tipo PIXEL. A conversão de "colorido" para cinza é da forma: CINZA = (r + g + b)/3;
 Crie a função sem retorno SAVA_IMAGEM_CINZA, que salvará a nova imagem no arquivo "IMAGEM_CINZA.file". Esta função tem como entradas: i) um  vetor do tipo Pixel; ii)  o nº de linhas do arquivo; iii) um ponteiro de arquivo;  
Na main:
Peça para o usuário digitar a dimensão da imagem (nº de linha e nº de colunas), e só siga adiante no programa, se o produto destas duas variáveis estiver entre 1 e 1000.
Carregue a imagem para o vetor de pixels com a função CARREGA_IMAGEM;
Faça a conversão dos pixels de "colorido" para "tons de cinza" com a função COLORIDO_PARA_CINZA;
Salve a nova imagem usando a função SAVA_IMAGEM_CINZA;
Critério de correção
Declaração da estrutura                   0,75pt
Declaração Variáveis                       0,50pt
ARQUIVOS: aberto/fechamento       1,00pt
Função CARREGA_IMAGEM           2,00pt
Função COLORIDO_PARA_CINZA 1,00pt
Função SAVA_IMAGEM_CINZA       2,00pt
Chamada das funções                     1,50pt
Laços da main                                 1,25pt
#include <stdio.h>
typedef struct{
 int r, g, b;
}Pixel;
void CARREGA_IMAGEM(Pixel Q[], int n ){
 int i;
 FILE *e =fopen("IMAGEM.file","r");
 for(i=0; i<n; i++)
 fscanf(e,"%d %d %d", &Q[i].r, &Q[i].g, &Q[i].b);
 fclose(e);
}
void COLORIDO_PARA_CINZA(Pixel *p){
 int a = (p->r + p->g + p->b)/3;
 p->r = a; p->g = a; p->b = a;
}
void SAVA_IMAGEM_CINZA(Pixel Q[], int n, FILE* p){
 int i;
 for(i=0; i<n; i++)
 fprintf(p,"%d %d %d\n", Q[i].r, Q[i].g, Q[i].b);
 fclose(p);
}
int main()
{
 Pixel M[1000];
 int i,n,m;
 FILE* s;
 do{
 printf("digite as dimensoes da imagem: ");
 fflush(stdin); scanf("%d %d", &n, &m);
 }while(n*m < 1 || n*m > 1000);
 CARREGA_IMAGEM(M, n*m);
 for(i=0; i<n*m; i++)
 COLORIDO_PARA_CINZA(&M[i]);
 s = fopen("IMAGEM_CINZA.file","w");
 SAVA_IMAGEM_CINZA(M, n*m, s);
 return 0;
}

Continue navegando