29.1.05

Comprara dos archivos.

Saludos.

El siguiente programa permite comparar dos archivos de texto binários. Aunque funciona la mayoría de las veces, tiene bastantes errores de diseño y, con ciertas condiciones especiales falla.


#include
#include

#define SIZE 256

// Devuelve 1 si son distintos y 0 si son iguales.
int cmpArrays(char a1[], char a2[], int size);

int main(int argc, char *args[])
{
char buff1[SIZE], buff2[SIZE];
int fd1, fd2;
int readed1, readed2;

fd1 = open(args[1], O_RDONLY);
fd2 = open(args[2], O_RDONLY);

while ( (readed1=read(fd1, buff1, SIZE)) >0) {
readed2=read(fd2, buff2, SIZE);
if (readed1 != readed2) {
printf("\nArchivos de distinto tamaño.\n");
return 0;
}
if (cmpArrays(buff1, buff2, readed1)) {
printf("\nArchivos con distinto contenido.\n");
return 0;
}
}

close(fd1);
close(fd2);

printf("\nArchivos iguales.\n");

return 0;
}


//------------------------------------

int cmpArrays(char a1[],char a2[], int size)
{
int c;

for (c=0; c < size;c++)
if (a1[c] != a2[c])
return 1;

return 0;
}

Guardar la entrada estándar en un fichero.

Saludos.

El siguiente código va leyendo la entrada estándar y guardando lo leido en un archivo buffer.f



#include
#include
#include

int main()
{
int fd;
char *buffer[256];
int b_leidos, b_escritos;

fd = open("buffer.f", O_WRONLY | O_APPEND);
if (fd == -1)
{
printf("\nCreando fichero 'buffer.f'\n");
fd = open("buffer.f", O_WRONLY | O_CREAT, 00600);
if (fd == -1)
{
perror("Error creando 'buffer.f'\n");
return -1;
}
}

b_leidos = read(0, buffer, 256);
while (b_leidos > 0)
{
b_escritos = write(fd, buffer, b_leidos);
if (b_escritos == -1)
{
perror("Error escribiendo.\n");
return -1;
}
b_leidos = read(0, buffer, 256);
}
close(fd);
}

23.1.05

Funciones potencial y factorial

Saludos.

Como recordatorio de la manera de hacer bibliotecas de funciones y de las técnicas recursivas, se propuso como ejercicio implementar una biblioteca de funciones con una función potencial y otra factorial. A continuación se muestra dicha biblioteca con versiones recursivas y no recursivas.

Próximamente más.

pot_fac.h

#ifndef __pot_fac__
#define __pot_fac__

int potencial_nr(int, int);
int potencial_r(int, int);
int factorial_nr(int);
int factorial_r(int);

#endif





pot_fac.c

#include "pot_fac.h"

int potencial_nr(int valor, int potencia)
{
int i, resultado;
resultado = 1;
for (i=0; i 0; i--)
resultado *= i;
return resultado;
}

//---------------------------------------------
int factorial_r(int valor)
{
if (valor == 1)
return 1;
return valor * factorial_r(valor-1);
}





prueba_pot_fac.c

#include "pot_fac.h"

int main() {

int resultado;

resultado=potencial_nr(4, 3);
printf("4 elevado a 3 %i (no resursivo)\n", resultado);

resultado=potencial_r(3, 3);
printf("3 elevado a 3 %i (resursivo)\n", resultado);

resultado=factorial_nr(4);
printf("4 factorial %i (no resursivo)\n", resultado);

resultado=factorial_r(6);
printf("6 factorial %i (resursivo)\n", resultado);

return 0;
}


Contar caracteres de una frase

Saludos.

Este ejercicio se propuso para que los alumnos repasaran sus conocimientos de manejo de cadenas en C. El objetivo es introducir una frase en la línea de comandos. El programa devolverá el número de veces que se repite cada una de las letras en la frase.

Próximamente más.


#include "stdlib.h"
#include "string.h"

// Variables globales;
char caracteres[29];
int car_index = 0;
int repeticiones[29];

// Prototipos
void incCaracter(char caracter)
{
int pos = -1;
int i;

for (i=0; i< car_index; i++)
if (caracteres[i] == caracter)
pos = i;

if (pos == -1) {
//car_index++;
caracteres[car_index] = caracter;
repeticiones[car_index] = 0;
pos = car_index;
car_index++;
}

repeticiones[pos] ++;
}

//-----------------------------------------------------
int main(int argc, char *argv[])
{
char cadena[255];
int i = 0;

if (argc < 2) {
printf("Parámetros insuficientes. \n");
return -1;
}
strcpy(cadena, argv[1]);

while (cadena[i] != '\0')
{
incCaracter(cadena[i]);
i++;
}

printf("Estadísticas de <%s>: \n", cadena);
for (i=0; i < car_index; i++)
printf("%c : %i \n", caracteres[i], repeticiones[i]);

return 0;
}