Ejercicios y practicas de programación en c resueltos o con solución

El ejercicio planteado es el siguiente:

La práctica o ejercicios con solución que se propone es realizar un ejercicio en el cual se han de solicitar una fecha por pantalla y esta ha de ser correcta en todos los sentidos es decir, se ha de comprobar los días, meses, años, y que los separadores de la misma este bien situados, en caso de que la fecha introducida sea incorrecta el ejercicio ha de volver a solicitar la fecha de nuevo.



La solución de los ejercicios que se plantean es la siguiente:

/*
    El siguiente ejercicio o práctica de programación
    tiene como función realizar el aprendizaje de las
    ordenes relacionadas con el tratamiento de cadenas
    de la libreria string.h, asi como la utilización de
    bucles, conversion de cadena a número, etc.
    Para realizar este ejercicio o práctica se ha de solicitar
    una fecha utilizando un formato de cadena dd/mm/aaaa, se
    ha de comprobar que la fecha sea correcta y que el formato
    de la misma este bien, teniendo en cuenta que para el dia
    y el mes se han de teclear obligatoriamente dos digitos
    mientras que para el año se han de teclear cuatro, se ha
    de tener en cuenta tambien si el año es bisiesto o no.
*/
// Librerias a utilizar por el programa
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    // Variables a utilizar por el programa
    int dia = 0;
    int mes = 0;
    int anyo = 0;
    char fecha[11];
    char cdia[3];
    char cmes[3];
    char canyo[5];
    int correcta = 0; // Variable para controlar si la fecha es correcta
                        // 0 indica correcta 1 indica un valor incorrecto
    char *puntero;
    int contador;
    int auxiliar=0;
    // se solicita la fecha por pantalla
    do {
        // damos por hecho que la fecha es correcta
        // si se encuentra algun error entoces se modifica
        correcta = 0;
        // se solicita la fecha utilizando un formato cadena
        printf("Fecha (dd/mm/aaaa)...: ");
        scanf(" %s",fecha);
        // se comprueba en primer lugar si la longitud de la
        // fecha son diez caracteres, si no es asi esta mal
        // se utiliza la funcion strlen de la libreria string.h
        if(strlen(fecha)!=10) correcta=1;
        // se comprueba cuantas barras existen y en que posiciones
        contador = 0;
        while(contador<=strlen(fecha)) {
            if(fecha[contador]=='/' && (contador!=2 && contador!=5)) correcta=1;
            contador++;
        }
        if(correcta==0) {
            // Separar la fecha utilizando la funcion strtok
            contador=0;
            puntero = strtok (fecha,"/");
            while(puntero!=NULL) {
                switch(contador) {
                    case 0:
                        strcpy(cdia,puntero);
                        break;
                    case 1:
                        strcpy(cmes,puntero);
                        break;
                    case 2:
                        strcpy(canyo,puntero);
                        break;
            }
                contador++;
                puntero = strtok (NULL,"/");
            }
            // convertir dia,mes y año en formato texto a numero
            dia = atoi(cdia);
            mes = atoi(cmes);
            anyo = atoi(canyo);
            // Otra forma de convertir la fecha puede ser la
            // siguiente utilizando el codigo ascii y teniendo en
            // cuenta que el valor del caracter ascii del 0 es 48
            dia = ((cdia[1]-48)*1) + ((cdia[0]-48)*10);
            mes = ((cmes[1]-48)*1) + ((cmes[0]-48)*10);
            anyo = ((canyo[3]-48)*1) + ((canyo[2]-48)*10) + ((canyo[1]-48)*100) + ((canyo[0]-48)*1000);
            // Una vez separada la fecha se realiza la comprobacion para
            // analizar si la fecha es correcta, comprobando los meses
            // y los dias correspondientes a cada mes
            switch(mes) {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    if(dia<1 || dia>31) correcta=1;
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    if(dia<1 || dia>30) correcta=1;
                    break;
                case 2:
                    // si el año es bisiesto o no
                    if ( ((anyo%4==0) && (anyo%100!=0)) || (anyo%400==0) ) {
                        if(dia<1 || dia>28) correcta=1;
                    } else {
                        if(dia<1 || dia>29) correcta=1;
                    }
                    break;
                default:
                    correcta=1;
                    break;
            }
        }
    } while(correcta==1);
   return 0;
}

Algunas de las funciones que se utilizan son las siguientes:

funcion: STRLEN

perteneciente a la librería string.h, la función devuelve el numero de caracteres que contiene una cadena sin tener en cuenta el carácter de fin de cadena. el formato de utilización es el siguiente.

VariableNumerica = strlen(VariableCadena) ;

funcion: STRCPY

perteneciente a la librería string.h, la función realiza la copia de una cadena de caracteres en otra. el formato de utilización es el
siguiente.

strcpy(CadenaDestino,CadenaOrigen);

 

funcion: STRTOK

perteneciente a la librería string.h, la función realiza la descomposición de la cadena especificada en trozos (tokens), el problema es que la cadena original es destruida en el proceso. el formato de utilización es el siguiente.

strtok(CadenaCaracteres,CaracterSeparador);

esta función normalmente se utiliza con un puntero y un bucle que repita el proceso hasta que se recorre la cadena por completo. observar el ejemplo de descomposición de la fecha utilizando el carácter separador / (barra).

funcion: IF
===================
la función if denominada también Si Condicional, permite realizar la evaluación de una condición y ejecutar una serie de acciones dependiendo del resultado verdadero o falso de la misma. el formato de utilización es el siguiente.

if (Condicion) {
  acción/es a realizar en caso verdadero;
} else {
  acción/es a realizar en caso falso;
}

funcion: DO…WHILE

la función do…while se denomina también bucle condicional, haz mientras. ya que repite una serie de acciones mientras se cumpla la
condición que se especifique en la misma. la diferencia con otros bucles, es que al menos una vez las acciones que se encuentran en el mismo son ejecutadas, posteriormente se comprueba la condición y si se cumple se vuelve a repetir el grupo de acciones. el formato de utilización es el siguiente.

do {
  acción/es a realizar;
} while(CondicionAEvaluar)

funcion: WHILE

la función while se denomina también bucle condicional mientras. la orden permite realizar la repetición de una acción o conjunto de acciones, mientras que se cumpla la condición que se especifique. a diferencia del anterior bucle, primero se evalúa la condición y si se cumple se realizan las ordenes especificadas. el formato de utilización es el siguiente.

 

while ( Condicion ) {
  acción/es a realizar;
}

función: SWITCH

la función switch al igual que el si condicional permite realizar la ejecución de acciones dependiendo del valor que se evalúa por la orden. el formato de utilización es el siguiente.

switch ( VariableaEvaluar ) {
case Valor:
 acción/es;
 break;
case Valor:
acción/es;
break;
default:
acción/es;
break;
}

El resultado de la práctica, ha de mostrar una imagen similar a la siguiente.

 

Ejercicios en C, comprobar fecha correcta.

Ejercicios en C, comprobar fecha correcta.

Gracias por vuestra visita y un saludo!!!