miércoles, 31 de agosto de 2011

Introducción a los punteros en lenguaje C

Ejemplo de utilización de punteros en lenguaje C.


Enlace CodePad
http://codepad.org/VexOEL07

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Código Fuente
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int valor_entero = 5;
    int * puntero_a_entero;
    puntero_a_entero = &valor_entero;

    //valores almacenados
    //valor_entero = 5
    //&valor_entero = direccion de memoria en la que se guarda la variable entero
    //puntero_a_entero = direccion de memoria en la que se guarda la variable entero
    //*puntero_a_entero = 5

    printf("Explicacion de punteros.\n");

    printf("valor_entero = %d\n", valor_entero);

    printf("&valor_entero = %d\n", &valor_entero);

    printf("puntero_a_entero = %d\n", puntero_a_entero);

    printf("*puntero_a_entero = %d\n", *puntero_a_entero);

    return 0;
}

Multiplicar con variables globales

Ejemplo de función multiplicar utilizando variables globales y locales, en lenguaje C.



Enlace CodePad
http://codepad.org/VbJLa5nH

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Código Fuente
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

#include <stdio.h>
#include <stdlib.h>

void multiplicar (void);

//declaración de variable global (por estar fuera de las funciones)
float variable_global = 0;

int main()
{


    printf("\nEl valor de variable_global es %f en main\n", variable_global);

    multiplicar ();

    printf("\nEl valor de variable_global es %f en main\n", variable_global);

    return 0;
}


void multiplicar (void)
{
    float m1 = 0, m2 = 0;

    printf("Introduce el primer multiplicando: ");
    scanf ("%f", &m1);

    printf("Introduce el segundo multiplicando: ");
    scanf ("%f", &m2);

    //modificacion de variable global
    variable_global = m1 * m2;
}

Ambito de uso de variables locales y globales

Ejemplo de uso de varibles globales frente a locales.



Enlace CodePad
http://codepad.org/W9U4fG6u

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Código Fuente
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



#include <stdio.h>
#include <stdlib.h>

void incrementar (void);

//declaración de variable global (por estar fuera de las funciones)
int variable_global = 0;

int main()
{   //declaración de variable local (por estar dentro de una función, main)
    int variable_local = 0;

    incrementar ();

    puts ("\nValor de las funciones en main");

    printf("El valor de variable_local es %d en main", variable_local);

    printf("\nEl valor de variable_global es %d en main\n", variable_global);

    return 0;
}


void incrementar (void)
{
    int variable_local = 0;

    //llamada a funcion pasando como parametro la variable local
    //existen dos variables variable_local, se modifica la que pertenece a esta funcion
    //no se modifica el valor de la que pertenece a main porque no es accesible
    variable_local = variable_local + 1;

    //modificacion de variable global
    variable_global = variable_global + 1;

    puts ("\nValor de las funciones en incrementar");

    printf("El valor de variable_local es %d en incrementar", variable_local);

    printf("\nEl valor de variable_global es %d en incrementar\n", variable_global);
}

martes, 30 de agosto de 2011

Ejemplos uso libreria time.h

Ejemplo de diversas funciones utilizando la librería Time.h en lenguaje C.

Enlace CodePad
http://codepad.org/Gw1NNjeC

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Código Fuente
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


#include <stdio.h>
#include <time.h>

void conta_atras (int segundos);
void pausa_segundos (float segundos );
void diferencia_tempos (void);
void vaf_segundos_desde_01_01_1970 (void);
void dia_hora_local (void);
void exemplo_ctime (void);
void exemplo_asctime (void);
int vaf_aleatorio_entre (int minimo, int maximo);
void exemplo_mktime (void);

void main ()
{
printf("\nExemplo ctime:\n");
exemplo_ctime();

printf("\nExemplo asctime:\n");
exemplo_asctime ();

printf("\nExemplo dia_hora_local:\n");
dia_hora_local ();

printf("\nExemplo vaf_segundos_desde_01_01_1970:\n");
vaf_segundos_desde_01_01_1970 ();

printf("\nExemplo pausa_segundos con 2,5 segundos:\n");
pausa_segundos ( 2.5 );

printf("\nExemplo aleatorio entre dous numeros utilizando time para inicializar xerador de numeros aleatorios:\n");
printf("O valor aleatorio xerado e: %d\n", vaf_aleatorio_entre (500, 600));

printf("\nExemplo conta_atras:\n");
conta_atras (10);

printf("\nExemplo diferencia_tempos:\n");
diferencia_tempos ();

printf("\nExemplo mktime:\n");
exemplo_mktime ();
}

//Mediante asctime obtense unha cadea de texto a partir de un struct tm
void exemplo_asctime ()
{
    time_t tempo_segundos;
    struct tm * timeinfo;

    time ( &tempo_segundos );
    timeinfo = localtime ( &tempo_segundos );

    //asctime pasa a texto a data e a hora pero so en ingles
    //actua como ctime pero recive un struc tm
    printf ( "A data e hora locais son: %s", asctime (timeinfo) );
}

void exemplo_ctime ()
{
    time_t tempo_segundos;

    time ( &tempo_segundos );
    //pasa a texto a data e a hora pero so en ingles
    //actua como asctime pero recive un timet (segundos dende 1900
    printf ( "Segundos %d\n", tempo_segundos );
    printf ( "A data e hora locais son: %s", ctime (&tempo_segundos) );
}
//Mediante ctime obtense unha cadea de texto a partir de un time_t


//obten o dia e a hora local partindo de datos GMT
void dia_hora_local ()
{
    time_t tempo_segundos;
    struct tm * timeinfo;
    struct tm * timeinfo2;

    //executando tzset rellenase tzname con datos de zona horaria, senon so iniciais GMT EWT
    tzset ();

    printf("%s\n%s\n%d\n%d\n", tzname[0],tzname[1], timezone, daylight);

    tempo_segundos = time ( NULL );

    timeinfo = localtime ( &tempo_segundos);
    timeinfo2 = gmtime ( &tempo_segundos );

    printf ("%d\n",tempo_segundos);
    printf ("%d\n",tempo_segundos);

    printf("Hora GMT: %02d/%02d/%d %02d:%02d:%02d\n", timeinfo->tm_mday, timeinfo->tm_mon+1, timeinfo->tm_year+1900, timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
    printf("Hora GMT: %02d/%02d/%d %02d:%02d:%02d\n", timeinfo2->tm_mday, timeinfo2->tm_mon+1, timeinfo2->tm_year+1900, timeinfo2->tm_hour,timeinfo2->tm_min,timeinfo2->tm_sec);

    printf("Hora local: %02d/%02d/%d %02d:%02d:%02d\n", timeinfo2->tm_mday, timeinfo2->tm_mon+1, timeinfo2->tm_year+1900, timeinfo2->tm_hour-(((1+daylight)*(timezone))/3600),timeinfo2->tm_min,timeinfo2->tm_sec);
/*
The meaning of each is:
Member	Meaning	Range
tm_sec	seconds after the minute	0-61*
tm_min	minutes after the hour	0-59
tm_hour	hours since midnight	0-23
tm_mday	day of the month	1-31
tm_mon	months since January	0-11
tm_year	years since 1900
tm_wday	days since Sunday	0-6
tm_yday	days since January 1	0-365
tm_isdst	Daylight Saving Time flag

*/
}


//Indica cantos segundos pasaron dende o 1 de Xaneiro de 1970 que se corresponde co devolto pola funcion time()
void vaf_segundos_desde_01_01_1970 ()
{
    time_t segundos_desde_01_01_1970;

    segundos_desde_01_01_1970 = time (NULL);

    printf ("%d Horas dende o 1 de Xaneiro de 1970", segundos_desde_01_01_1970/3600);
}

//utiliza a funcion time para obter o número de segundos entre dous eventos
void diferencia_tempos (void)
{
  time_t inicio,fin;
  char texto_teclado [50];
  double diferencia;

  time (&inicio);
  printf ("Excribe o teu nome e direiche canto tardas en escribilo: ");
  gets (texto_teclado);
  time (&fin);
  //diferencia = difftime (fin,inicio);
  diferencia = fin - inicio;
  printf ("Hola %s.\n", texto_teclado);
  printf ("Levouche %.2f segundos escribir o teu nome.\n", diferencia );
}

//conta os ciclos de reloxo para xerar unha pausa
void pausa_segundos ( float segundos )
{
    clock_t fin_pausa;
    fin_pausa = clock () + (segundos * CLOCKS_PER_SEC);
    while (clock() < fin_pausa);
}

//utiliza a funcion pausa_segundos() para realizar unha conta atrás
void conta_atras (int segundos)
{
    int n;
    printf ("Iniciando Conta Atras...\n");
    for (n=segundos; n>0; n--)
    {
    printf ("%d\n",n);
    pausa_segundos (1);
    }
    printf ("DESPEGUE!!!\n");
}

//Usa time(NULL) para inicializar un xerador de numeros aleatorios, e obtén un número entre dous valores pasados como parámetros
int vaf_aleatorio_entre (int minimo, int maximo)
{
    // Inicizase o xerador de números aleatorios
    srand ( time(NULL) );

    // Xeramos un número aleatorio entre minimo e maximo
    return rand () % (maximo-minimo+1) + minimo;
}

void exemplo_strftime (void)
{
    time_t rawtime;
    struct tm * timeinfo;
    char buffer [80];

    time ( &rawtime );
    timeinfo = localtime ( &rawtime );

    strftime (buffer,80,"Now it's %I:%M%p.",timeinfo);
    puts (buffer);

    /*
    specifier	Replaced by	Example
    %a	Abbreviated weekday name *	Thu
    %A	Full weekday name *	Thursday
    %b	Abbreviated month name *	Aug
    %B	Full month name *	August
    %c	Date and time representation *	Thu Aug 23 14:55:02 2001
    %d	Day of the month (01-31)	23
    %H	Hour in 24h format (00-23)	14
    %I	Hour in 12h format (01-12)	02
    %j	Day of the year (001-366)	235
    %m	Month as a decimal number (01-12)	08
    %M	Minute (00-59)	55
    %p	AM or PM designation	PM
    %S	Second (00-61)	02
    %U	Week number with the first Sunday as the first day of week one (00-53)	33
    %w	Weekday as a decimal number with Sunday as 0 (0-6)	4
    %W	Week number with the first Monday as the first day of week one (00-53)	34
    %x	Date representation *	08/23/01
    %X	Time representation *	14:55:02
    %y	Year, last two digits (00-99)	01
    %Y	Year	2001
    %Z	Timezone name or abbreviation	CDT
    %%	A % sign	%
*/
}
//Usando mktime, obter o dia da semana en texto (luns, martes...)
void exemplo_mktime ()
{
    time_t tempo_segundos;
    struct tm * timeinfo;
    int anno, mes ,dia;
    char * dia_seman_texto[] = { "Domingo", "Luns", "Martes", "Mercores", "Xoves", "Venres", "Sabado"};

    /* Pidense datos de entrada */
    printf ("Introduce o ano: "); scanf ("%d",&anno);
    printf ("Introduce o mes: "); scanf ("%d",&mes);
    printf ("Introduce o dia: "); scanf ("%d",&dia);

    /* collese o tempo actual e modificanse os datos da data para evitar que mktime de un
    erro o non ter a estructura cuberta de todo */
    time ( &tempo_segundos );
    timeinfo = localtime ( &tempo_segundos );
    timeinfo->tm_year = anno - 1900;
    timeinfo->tm_mon = mes - 1;
    timeinfo->tm_mday = dia;

    /* chamando a mktime: timeinfo->tm_wday incluira o número de dia da seman */
    mktime ( timeinfo );

    printf ("A data introcucica corresponde a un %s.\n", dia_seman_texto[timeinfo->tm_wday]);
}

Enlaces a cursos del MIT

Portal de cursos del MIT (Massachusetts Institute of Technology)
http://ocw.mit.edu/courses/

Enlace a cursos del MIT en castellano, español de España o sea.
http://ocw.mit.edu/courses/translated-courses/spanish/

Enlace al curso del MIT sobre introducción a los algoritmos
6.046J / 18.410J Introduction to Algorithms (SMA 5503)

lunes, 29 de agosto de 2011

Ordenación de fichero por el método de selección directa

Aplicación que genera un fichero binario con estructuras que contienen dos datos de tipo entero, uno conteniendo un NIF y otro un importe.

La aplicación realiza una ordenación del archivo por el método del algoritmo de selección directa, ordenando por el número de DNI.

Enlace Codepad
http://codepad.org/eLInSOFS


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Código Fuente
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct Tficha
{
int dni;
int importe;
};

int vaf_aleatorio_entre (int minimo, int maximo);
void escribir (void);
void leer (void);
void ordenar_fichero_seleccion_directa (void);
void ordenar_fichero_burbuja (void);

int main()
{
    srand ( time(NULL) );

    escribir ();

    leer ();

    //getchar ();

    printf ("\nOrdenando fichero, por favor espere un momento...\n");

    ordenar_fichero_seleccion_directa();

    //getchar ();

    leer();

    //getchar ();

    return 0;
}

void leer (void)
{
    struct Tficha ingreso;
    FILE * fichero;
    int i=1;

    fichero = fopen("datos.dat", "rb");

    while (!feof(fichero))
    {
        fread (&ingreso, sizeof(ingreso), 1,fichero);
        if (!feof(fichero)) printf("%06d - %d %d\n", i, ingreso.dni,ingreso.importe);
        i++;
    }

    fclose(fichero);
}


void escribir (void)
{
    struct Tficha ingreso;
    FILE * fichero;
    int i=0;

    fichero = fopen("datos.dat", "wb");

    //printf("\nO valor xerado e %d", vaf_aleatorio_entre(10, 20));

    for (i = 0; i < 1000; i++)
    {
        ingreso.dni = vaf_aleatorio_entre(10000000, 99999999);
        ingreso.importe = vaf_aleatorio_entre(10, 99999);
        fwrite (&ingreso, sizeof(ingreso), 1,fichero);
    }

    fclose(fichero);
}


void ordenar_fichero_seleccion_directa (void)
{
    struct Tficha auxiliar, menor, actual;
    FILE * fichero;
   	int i, j,pos_menor, total_estructuras;

    //se abre el fichero como rb+ para poder sobreescribir los datos
    fichero = fopen("datos.dat", "rb+");

    //nos colocamos al final del fichero y con ftell y sizeof obtenemos el
    //numero total de estructuras almacenadas en el fichero
    fseek (fichero, 0, SEEK_END);
    total_estructuras = ftell (fichero) / sizeof (struct Tficha);

    printf("\nO numero de estructuras e: %d, comezando proceso de ordenacion\n", total_estructuras);

    //regresamos al principio del fichero
    rewind(fichero);

	for (i=0; i<=(total_estructuras - 2); i++) //k es la posicion de la estructura que se esta a pegar
	{
	    pos_menor=i;

		fseek (fichero, i * sizeof (struct Tficha), SEEK_SET);

		//leemos en ficha aux la posicion a escribir
		fread (&menor, sizeof (struct Tficha), 1, fichero);

		auxiliar = menor;

		for (j=i+1; j<=(total_estructuras - 1); j++)
		{
            fseek (fichero, j * sizeof (struct Tficha), SEEK_SET);

            //leemos en ficha aux la posicion a escribir
            fread (&actual, sizeof (struct Tficha), 1, fichero);


            if (actual.dni < menor.dni)
            {
                pos_menor=j;
                menor=actual;
            }
		}

        if (pos_menor != i)
        {
            fseek (fichero, i * sizeof (struct Tficha), SEEK_SET);

            //leemos en ficha aux la posicion a escribir
            fwrite (&menor, sizeof (struct Tficha), 1, fichero);
            //vector[i] = vector[k];

            fseek (fichero, pos_menor * sizeof (struct Tficha), SEEK_SET);

            //leemos en ficha aux la posicion a escribir
            fwrite (&auxiliar, sizeof (struct Tficha), 1, fichero);
        }
	}

    fclose(fichero);

}

int vaf_aleatorio_entre (int minimo, int maximo)
{
    // Inicizase o xerador de números aleatorios
    //srand ( time(NULL) );

    // Xeramos un número aleatorio entre minimo e maximo
    return rand () % (maximo-minimo+1) + minimo;
}

viernes, 26 de agosto de 2011

Almacenar, listar y modificar, nombre y edad de personas, en un fichero binario.

Aplicación que permite almacenar nombre y edad de personas, en un fichero binario.
Opciones Añadir Datos, Listar todos los datos, Modificar un dato



Enlace a codepad
http://codepad.org/vUG8T0Qt

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Código Fuente

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



#include <stdio.h>
#include <stdlib.h>

struct Tficha
{
    char usuario[30];
    int edad;
};

int main()
{
    int continuar = 1, menu = 0;

    while (continuar)
    {
        printf("\n\n1 - Anadir ficha.\n");
        printf("2 - Listar fichas.\n");
        printf("3 - Modificar ficha.\n");
        printf("0 - Salir.\n");
        printf("Elije una opcion: ");

        scanf("%d", &menu);
        fflush(stdin);

        printf("\n");


        switch (menu)
        {
            case 0:
                continuar = 0;
                break;
            case 1:
                anadir ();
                break;
            case 2:
                listar ();
                break;
            case 3:
                modificar ();
                break;
        }
    }

    return 0;
}

void anadir ()
{
    struct Tficha ficha;
    FILE *fichero;
    char usuario [50];

    //Abrese o ficheiro como a para engadir datos o final do ficheiro
    fichero = fopen ("datos_bin.vaf", "ab");

    //solicitase usuario por teclado
    printf("Introduza o nome de usuario: ");
    gets (ficha.usuario);
    fflush(stdin);

    //solicitase idade por teclado
    printf("Introduza edad de usuario: ");
    scanf ("%d", &ficha.edad);
    fflush(stdin);

    fwrite (&ficha, sizeof(ficha), 1 , fichero);

    fclose (fichero);
}

void modificar ()
{
    struct Tficha ficha;
    FILE *fichero;
    char usuario_teclado [50];
    int edad_teclado, encontrado=0;

    //Abrese o ficheiro como rt+ que e a única maneira de modificar o ficheiro
    fichero = fopen ("datos_bin.vaf", "rb+");

    //Se solicita el usuario por teclado
    printf("Introduza o nome de usuario: ");
    //usuario_teclado = getchar ();
    gets (usuario_teclado);
    fflush(stdin);

    //Se solicita el usuario por teclado
    printf("Introduza a idade do usuario: ");
    //usuario_teclado = getchar ();
    scanf ("%d", &edad_teclado);
    fflush(stdin);


    while (!feof(fichero) && encontrado == 0)
    {
        fread (&ficha, sizeof(ficha), 1 , fichero);
        if (strcmp(ficha.usuario, usuario_teclado)==0) encontrado = 1;
    }


    if (encontrado == 1)
    {
        fseek (fichero, -1 * sizeof(ficha), SEEK_CUR);
        //strcpy (ficha.usuario, usuario_teclado);
        ficha.edad = edad_teclado;
        fwrite (&ficha, sizeof(ficha), 1 , fichero);
    }
    else
    {
        printf("\nNo se ha encontrado el registro.\n");
    }

    fclose (fichero);
}

void listar ()
{
    struct Tficha ficha;
    FILE *fichero;
    char usuario [50];

    //Abrese o ficheiro como r para leer os datos do ficheiro
    fichero = fopen ("datos_bin.vaf", "rb");

     //leer hasta final de ficheiro e amosar por pantalla
    while (!feof(fichero))
    {
         fread (&ficha, sizeof(ficha), 1 , fichero);
         if (!feof(fichero)) printf("\n%s %d", ficha.usuario, ficha.edad);
    }

    fclose (fichero);
}
Related Posts Plugin for WordPress, Blogger...