Adjunto el final tomado el 13/12/16 de informática 1 con mi resolución, disculpen no se si esta bien por que estoy practicando y también por no haberlo escaneado.
[/code]
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define ERRORALABRIRARCHIVO -1
#define ERRORALCREARARCHIVO -2
#define ERRORALLEERARCHIVO -3
#define ERRORALESCRIBIRARCHIVO -4
#define ERRORALPEDIRMEMORIA -5
int rgbGris(char *origen, char *destino);
int rotar90(char *origen, int pixelX, int pixelY, char *destino);
int histograma(char *origen, int pixelX, int pixelY, char *destino);
int main (int argc,char **argv)
{
return 0;
}
int rgbGris(char *origen, char *destino)
{
//reservo memoria
FILE *archo, *archd;
int j , i, *gris;
char *rgb;
//abro los archivos
archo = fopen(origen, "r");
if(archo == NULL)
{
return ERRORALABRIRARCHIVO;
}
archd = fopen(destino, "w");
if(archd == NULL)
{
return ERRORALCREARARCHIVO;
}
//averiguo el largo del archivo
fseek(archo,0,SEEK_END);
i = ftell(archo);
rewind(archo);//vuelvo el puntero al principio del archivo
//pido memoria para un string que lea todo el archivo y otro para hacer las cuentas
if((rgb = (char *)malloc(sizeof(char)*i)) == NULL)
{
return ERRORALPEDIRMEMORIA;
}
if((gris = (int *)malloc(sizeof(int)*(i/3 - 1))) == NULL)
{
return ERRORALPEDIRMEMORIA;
}
//leo el archivo
if(fread(rgb, sizeof(char), i, archo) == 0)
{
return ERRORALLEERARCHIVO;
}
//hago las cuentas que me piden
for(j=0 ; j < i - 1 ; j += 3)
{
gris = 0,2126*(rgb[j] - 48) + 0,7152*(rgb[j + 1] - 48) + 0,0722*(rgb[j + 2] - 48);
}// asumi que estaba todo junto(el 48 es la diferencia que hay entre el 0 de ascci y el 0 decimal)
//escribo en el archivo
if(fwrite(gris, sizeof(int), i/3 - 1, archd) == 0)
{
return ERRORALESCRIBIRARCHIVO;
}
//libero memoria
free(gris);
free(rgb);
fclose(archd);
fclose(archo);
return i;
}
int rotar90(char *origen, int pixelX, int pixelY, char *destino)
{
//reservo memoria
FILE *archo, *archd;
int i = 0, j = 0, n = 0;
char *pixeles;
//abro los archivos
archo = fopen(origen, "r");
if(archo == NULL)
{
return ERRORALABRIRARCHIVO;
}
archd = fopen(destino, "w");
if(archd == NULL)
{
return ERRORALCREARARCHIVO;
}
//averiguo el tamanio del archivo
fseek(archo, 0, SEEK_END);
i = ftell(archo);
//reservo memoria para el string que lo lea
if((pixeles = (char *)malloc(sizeof(char)*i)) == NULL)
{
return ERRORALPEDIRMEMORIA;
}
//leo todo el archivo
if(fread(pixeles, sizeof(char), i, archo) == 0)
{
return ERRORALLEERARCHIVO;
}
//escribo en el archivo con un algoritmo propio
for(n = 1 ; n <= (pixelX) ; n++)
{
for(j = 0 ; j < (pixelY) ; j++)
{
if(fputc(pixeles[(pixelX-n)+(pixelX+1)*j], archd) == EOF)
{
return ERRORALESCRIBIRARCHIVO;
}
}
if(fputs("\n", archd) == EOF)
{
return ERRORALESCRIBIRARCHIVO;
}
}//asi haria si tiene enter al final de cada renglon
//libero memoria
free(pixeles);
fclose(archd);
fclose(archo);
return i;
}
int histograma(char *origen, int pixelX, int pixelY, char *destino)
{
//reservo memoria
FILE *archo;
int i, j, n;
char *buffer;
//abro el archivo
if((archo = fopen(origen, "r")) == NULL)
{
return ERRORALABRIRARCHIVO;
}
//averiguo el tamanio del archivo
fseek(archo, 0, SEEK_END);
i = ftell(archo);
//reservo memoria para el string que lo lea
if((buffer = (char *)malloc(sizeof(char)*i)) == NULL)
{
return ERRORALPEDIRMEMORIA;
}
//leo todo el archivo
if(fread(buffer, sizeof(char), i, archo) == 0)
{
return ERRORALLEERARCHIVO;
}
memset(destino, 0, 255);//lleno 255 espacios con 0 del string destino
//algoritmo para resolver este ejercicio
for(j=0 ; j <= 255 ; j++)
{
for(n=0 ; n <= 255 ;n++)
{
if(buffer[n] == (j + 48))
{
destino[j]++;
}
}
}
//libero memoria
fclose(archo);
free(buffer);
return i;
}