jueves, 26 de abril de 2012

Ejercicio con matrices y bucles en Lenguaje C

Caso Práctico

Tenemos guardada en una matriz los alumnos de una escuela. Sabiendo que hay 3 cursos distintos, 5 alumnos por curso y que cada alumno tiene 2 asignaturas, se pide:

1. Pedir por teclado las notas que ha sacado cada alumno en cada asignatura y de cada curso.

2. Decir cual es la nota media de un determinado curso.

3. Decir cuántos aprobados y suspensos hay en una determinada asignatura en un determinado curso.

int main()
{

float escuela[3][5][2];
int c,al,as,i,j,menu,asignatura,pos=0;
float media=0;
float aprobados=0;
float suspensos=0;

printf("PROGRAMA ESCUELA\n\n");
printf("================\n\n");

for(c=1;c<4;c++)
{
    printf("CURSO %d:\n",c);
        for(al=1;al<6;al++)
        {
            printf("    ALUMNO %d:\n",al);
                for(as=1;as<3;as++)
                {   
                    printf("        Introduce la nota de la Asignatura %d: ",as);
                    scanf("%f",&escuela[c-1]
[al-1][as-1]);                                        
                }

        }

}

printf("\n\n");

printf("De que curso quiere saber la nota media? [1,2,3]
");
scanf("%d",&menu);

switch (menu){

    case 1:
        for(i=0;i<5;i++)

                    {
                         for(j=0;j<2;j++)
          {
              media += escuela[0][i][j];
          }
        }
        printf("La nota media del Curso 1 es %.2f\n\n\n",media/10);

                  break;

    case 2:

               for(i=0;i<5;i++)
                    {
                         for(j=0;j<2;j++)
          {
              media += escuela[1][i][j];
          }
        }
        printf("La nota media del Curso 2 es %.2f\n\n\n",media/10);

                  break;
    case 3:
       
for(i=0;i<5;i++)
                    {
                         for(j=0;j<2;j++)
          {
              media += escuela[2][i][j];
          }
        }
        printf("La nota media del Curso 3 es %.2f\n\n\n",media/10);

                  break;
}

printf("Aprobados y Suspensos. Seleccione el Curso [1,2,3]");
scanf("%d",&menu);

switch (menu){

    case 1:
        printf("De que asignatura?[1,2]");
        scanf("%d",&asignatura);
        if(asignatura==1)
        {
            for(i=0;i<5;i++)
            {
                if(escuela[0][i][0]>=5)
                {
                    aprobados++;
                }
                else
                {
                    suspensos++;
                }
            }
            printf("En la Asignatura 1 del Curso 1 hay %.0f aprobados y %.0f suspensos\n\n",aprobados,suspensos);
        }
        else
        {
           
for(i=0;i<5;i++)
            {
                if(escuela[0][i][1]>=5)
                {
                    aprobados++;
                }
                else
                {
                    suspensos++;
                }

            }
            printf("En la Asignatura 2 del Curso 1 hay %.0f aprobados y %.0f suspensos\n\n",aprobados,suspensos);
        }
        break;

   
case 2:
        printf("De que asignatura?[1,2]");
        scanf("%d",&asignatura);
        if(asignatura==1)
        {
            for(i=0;i<5;i++)
            {
                if(escuela[1][i][0]>=5)
                {
                    aprobados++;
                }
                else
                {
                    suspensos++;
                }

            }
            printf("En la Asignatura 1 del Curso 2 hay %.0f aprobados y %.0f suspensos\n\n",aprobados,suspensos);
        }
        else
        {
           
for(i=0;i<5;i++)
            {
                if(escuela[1][i][1]>=5)
                {
                    aprobados++;
                }
                else
                {
                    suspensos++;
                }

            }
            printf("En la Asignatura 2 del Curso 2 hay %.0f aprobados y %.0f suspensos\n\n",aprobados,suspensos);
        }
        break;

   
case 3:
        printf("De que asignatura?[1,2]");
        scanf("%d",&asignatura);
        if(asignatura==1)
        {
            for(i=0;i<5;i++)
            {
                if(escuela[2][i][0]>=5)
                {
                    aprobados++;
                }
                else
                {
                    suspensos++;
                }

            }
            printf("En la Asignatura 1 del Curso 3 hay %.0f aprobados y %.0f suspensos\n\n",aprobados,suspensos);
        }
        else
        {
           
for(i=0;i<5;i++)
            {
                if(escuela[2][i][1]>=5)
                {
                    aprobados++;
                }
                else
                {
                    suspensos++;
                }

            }
            printf("En la Asignatura 2 del Curso 3 hay %.0f aprobados y %.0f suspensos\n\n",aprobados,suspensos);
        }
        break;
}

system("PAUSE");

}

Sumar las filas y columnas de una matriz en Lenguaje C

El ejercicio consiste en realizar una matriz de 5x4 elementos y sumar fila por fila y columna por columna, guardando los resultados en dos vectores, uno vertical para las filas, y otro horizontal para las columnas.

Ejemplo:

    MATRIZ       RESULTADO FILAS

5  6  7  2  3    23
4  2  1  0  6    13
3  2  7  6  5    23
7  8  5  2  1    23

19 18 20 10 15 <<-- RESULTADO COLUMNAS




int main()
{

int matriz[4][5];
int horizontal[5];
int vertical[4];
int fila,columna;
int suma=0;
int i;


/*Bucle que registra los numeros introducidos de teclado*/
for(fila=0;fila<4;fila++)
{
    for(columna=0;columna<5;columna++)
    {
        printf("Introduce un numero para la posicion %d,%d: ",fila,columna);
        scanf("%d",&matriz[fila][columna]);
    }
}

/*Bucle que suma las filas y registra el resultado en el vector vertical*/
for(fila=0;fila<4;fila++)
{
    suma=0;
    for(columna=0;columna<5;columna++)
    {
        suma+=matriz[fila][columna];
    }
    vertical[fila]=suma;
}

/*Recorre el vector vertical y muestra los resultados*/
for(i=0;i<4;i++)
{
    printf("%d\n",vertical[i]);
}

/*Bucle que suma las columnas y registra el resultado en el vector horizontal*/
for(columna=0;columna<5;columna++)
{
    suma=0;
    for(fila=0;fila<4;fila++)
    {
        suma+=matriz[fila][columna];
    }
    horizontal[columna]=suma;
}

/*Recorre el vector horizontal y muestra los resultados*/
for(i=0;i<5;i++)
{
    printf("%d",horizontal[i]);
}
system("PAUSE");
}

martes, 24 de abril de 2012

Calcular el día de la semana a partir de una fecha en Lenguaje C

Para calcular el día de la semana (Lunes, Martes, Miércoles...) a partir de una fecha del tipo 02/03/2010, hay que hacer uso del siguiente algoritmo.


Donde:

d = día de la semana
A = Año
DM = Días transcurridos hasta antes del primer día del mes
D = Día
% = Módulo

En primer lugar debemos tener en cuenta si el año es bisiesto o no. Por lo que para calcular el DM%7 deberemos usar una tabla u otra:

Meses E F M A M J J A S O N D
Año regular 0 3 3 6 1 4 6 2 5 0 3 5
Año bisiesto 0 3 4 0 2 5 0 3 6 1 4 6

Vamos a realizar el programa en C:

{

//Declaracion de vectores y variables
int regular[]={0,3,3,6,1,4,6,2,5,0,3,5};
int bisiesto[]={0,3,4,0,2,5,0,3,6,1,4,6};
int d,m,a;

//Para simplificar el algoritmo vamos a dividirlo en partes más pequeñas

int result1,result2,result3,result4,result5;

printf("Introduce un dia de la semana en numero: ");
scanf("%d",&d);
printf("Introduce un mes en numero: ");
scanf("%d",&m);
printf("Introduce un anyo en numero: ");
scanf("%d",&a);

//comprobamos primero si el año es bisiesto o es regular
//si es bisiesto, asignamos a m la posición del vector bisiesto -1
//si es regular, asignamos a m la posición del vector regular -1

if((a%4==0) && !(a%100==0))
{
    m=bisiesto[m-1];
}
else if (a%400==0)
{
    m=bisiesto[m-1];
}
else
{
    m=regular[m-1];
}

//Resolvermos la fórmula poco a poco

result1=(a-1)%7;
result2=(a-1)/4;
result3=(3*(((a-1)/100)+1))/4;
result4=(result2-result3)%7;
result5=d%7;
d=(result1+result4+m+result5)%7;

//resuelto el dia, con un switch case mostramos en pantalla lo que corresponda.

switch(d)
{
    case 0:
        printf("Domingo\n");
        break;
    case 1:
        printf("Lunes\n");
        break;
    case 2:
        printf("Martes\n");
        break;
    case 3:
        printf("Miercoles\n");
        break;
    case 4:
        printf("Jueves\n");
        break;
    case 5:
        printf("Viernes\n");
        break;
    case 6:
        printf("Sabado\n");
        break;
}
system("PAUSE");

}








































                   

lunes, 23 de abril de 2012

Calcular la letra del DNI en Lenguaje C

La letra del DNI es una técnica utilizada para evitar los errores al introducir los 8 números de un DNI. 

Se usan 23 letras del abecedario para el DNI que se encuentran ordenadas en una tabla específicamente así:

0=T, 1=R, 2=W, 3=A, 4=G, 5=M, 6=Y, 7=F, 8=P, 9=D, 10=X, 11=B, 12=N, 13=J, 14=Z, 15=S, 16=Q, 17=V, 18=H, 19=L, 20=C, 21=K, 22=E.

Cada letra se corresponde con un número.

La técnica para calcular el DNI es la siguiente:

- Se divide el nº de DNI entre 23.
- El resto de la división, corresponderá con la letra de ese DNI.

Así si tecleas tu DNI y te equivocas en un número, el programa compara la letra que has introducido con la que debería tener ese número. Si no coinciden, el programa te avisa.

Eso es lo que vamos a crear en C, un programa que calcule la letra de un DNI y lo compare con la letra introducida por el usuario.

{
/*Metemos en un vector las 23 letras usadas en el DNI en el orden especificado anteriormente*/
char letras[]={'T','R','W','A','G','M','Y','F','P','D','X','B','N','J','Z','S','Q','V','H','L','C','K','E'};
int dninumero;
char letra;


printf("Introduce el numero de tu DNI (sin letra): ");
scanf("%d",&dninumero);


printf("Introduce la letra de tu DNI: ");
scanf("%c",&letra);

/*Comparamos la letra introducida por el usuario con la calculada por el programa (resto de dividir el DNI entre 23)*/
if(letra==letras[dninumero%23])
{
    printf("El DNI es correcto");
}
else
{
    printf("El DNI NO es correcto");
}

}

domingo, 22 de abril de 2012

Calculadora básica en Lenguaje C

Vamos a crear una sencilla calculadora en C, con un pequeño menú que nos permita seleccionar si deseamos sumar, restar, multiplicar o dividir. Y nos pida dos números con los que operar.

También añadiremos en el menú una opción para Salir.

Empezamos...

{

int eleccion,operador1,operador2;

/*Empezamos usando un bucle do while para que el programa se ejecute hasta que el usuario seleccione la opcion 5*/
do
{
system("CLS"); //Limpia la pantalla en cada nueva operación.

printf("CALCULADORA\n\n");
printf("1. Suma\n");
printf("2. Resta\n");
printf("3. Multiplicacion\n");
printf("4. Division\n");
printf("5. Salir\n\n");

scanf("%d",&eleccion);

/*Usamos un switch como altenativa multiple para ejecutar la parte correspondiente a la elección del usuario*/

switch(eleccion)
{
    case 1:
        printf("Introduce un numero: ");
        scanf("%d",&operador1);
        printf("Introduce otro numero: ");
        scanf("%d",&operador2);
        printf("Resultado: %d\n",operador1+operador2);
        break;

    case 2:
        printf("Introduce un numero: ");
        scanf("%d",&operador1);
        printf("Introduce otro numero: ");
        scanf("%d",&operador2);
        printf("Resultado: %d\n",operador1-operador2);
        break;

    case 3:
        printf("Introduce un numero: ");
        scanf("%d",&operador1);
        printf("Introduce otro numero: ");
        scanf("%d",&operador2);
        printf("Resultado: %d\n",operador1*operador2);
        break;

    case 4:
        printf("Introduce un numero: ");
        scanf("%d",&operador1);
        printf("Introduce otro numero: ");
        scanf("%d",&operador2);

        /*Ponemos la condicion de que no se pueda dividir entre 0 ya que de lo contrario el programa dará error*/
        if(operador2==0)
        {
            printf("No se puede dividir entre 0, intentalo otra  vez...\n ");
        }
        else
        {
            printf(Resultado: %d\n",operador1/operador2);   
        }
        break;

    case 5:
        printf("Saliendo...\n\n");
}
system("PAUSE");
/*Cuando el usuario selecciona la opción 5, el bucle termina y se cierra el programa*/
}while(!(eleccion==5));

}






Comprobar si un número es primo en Lenguaje C

Un número primo es aquel que solo es divisible entre 1 y él mismo.
Con lo cual solo tiene 2 divisores.

Así que tendremos que usar el ejercicio anterior de calcular los divisores de un número, y comprobar que solo sean dos para que el número sea primo.

{

int num1,i,a;

a=0; */Esta variable la vamos a usar para contar los divisores del número introducido, la inicializamos a 0*/

printf("Introduce un numero: ");
scanf("%d",&num1);

for(i=1;i<=num1;i++)
{
    if(num1%i==0) // si num1 módulo de i es 0, incrementamos a en 1.
    a++;
}


if(a==2); /*Si al final del bucle, a vale 2, el número es primo, porque tiene solamente 2 divisores.
{
    printf("El número es primo");
}
else
{
    printf("El número no es primo");
}


}



Comprobar si un año es bisiesto o regular en Lenguaje C

Para que un año sea bisiesto se deben cumplir 3 condiciones:

1. Que el año sea múltiplo de 4. Es decir, que al dividirlo entre 4 el resto de 0.

2. Que el año NO sea múltiplo de 100. Irónico ya que el propio 100 es múltiplo de 4, con lo que esta condición contradice a la primera aunque luego lo resolveremos.

3. Para liarlo aún más, un año también es bisiesto si es múltiplo de 400, aunque el propio 400 sea múltiplo de 100 que ya se está contradiciendo con la condición 2. 

Con esto tenemos que:

Los años 4,8,12,16... son bisiestos.
Los años 100,200,300,500... no son bisiestos.
Los años 400,800,1200,1600... son bisiestos. 


Pues vamos a hacer el programa que lo resuelva todo.




{


int num1;


printf("Introduce un numero: ");
scanf("%d",&num1);

//Las dos primeras condiciones: Si num1 es múltiplo de 4 y NO es múltiplo de 100


if((num1%4==0) && !(num1%100==0))
{
    printf("El año es bisiesto");
}


//La tercera condicion: Si num1 es múltiplo de 4


else if (num1%400==0)
{
    printf("El año es bisiesto");
}


else // Todos los demás no son bisiestos
{
    printf("El año NO es bisiesto");
}


}

Calcular los divisores de un número en Lenguaje C

Al dividir un número por su divisor, el resto de la división debe ser 0. Para ello usaremos en la función el operador Módulo de(%).

{

int num1,i; //Declaramos las variables de tipo entero

printf("Introduce un numero: ");
scanf("%d",&num1); //Guardamos el número introducido por el usuario en la variable num1

/*Con un bucle for, recorremos todos los números desde el 1 hasta el introducido por el usuario para comprobar uno a uno si es dividor de este.
 
for(i=1;i<=num1;i++)
{
    if(num1%i==0) //La condición es que el numero dividido entre num1 de como resto 0    
    {
        printf("%d, es divisor de %d \n",i,num1);
    }
}

}

sábado, 21 de abril de 2012

Escribir los números pares hasta un número dado en Lenguaje C

{

int num1,i; //Declaramos dos variables, una para pedir un numero y la otra para llevar la cuenta del bucle

printf("Introduce un numero: "); //Pedimos un número de teclado
scanf("%d",&num1); //Lo guardamos en la variable num1

/*Usamos un bucle for con los siguientes parámetros:
Inicializamos i en 2, en cada paso del bucle, i se incrementará en lo que ya tuviera + 2 (2,4,6,8...). El bucle se ejecutará mientras sea menor o igual que el número que hemos introducido de teclado*/
 
for (i=2;i<=num1;i+=2)
{
    printf("%d \n", i); //Mostramos lo que vale i en cada paso del bucle
}

system("PAUSE");

}

Cuenta atrás desde un número en Lenguaje C

{

int num1; //Declaración de variable de tipo entero

printf("Introduce un numero: "); //Pedimos un numero de teclado
scanf("%d",&num1); //Guardamos el numero en la variable num1

//Usamos un bucle Do While, para que se ejecute al menos una vez
do{

    printf("%d\n",num1); //Muestra en pantalla el numero introducido y lo decrementa en 1.
    num--;

}while (num1 != 0); //Todo esto lo realiza mientras num1 no sea 0. En el momento que llega a 0, el bucle termina.

system("PAUSE";


 

Resolver el mayor de dos números en Lenguaje C.

{

int num1, num2; //Declaramos dos variables de tipo entero.

printf("Introduce un numero: "); //Pedimos un numero de teclado.
scanf("%d",&num1); //Guardamos el numero en la variable num1.

printf("Introduce otro numero: "); //Pedimos otro numero de teclado.
scanf("%d",&num2); //Lo guardamos en la variable num2.

if(num1 > num2) //Comparamos, si num1 es mayor que num2...
{
    printf("El mayor es %d \n",num1); //Escribimos que el mayor es num1.
}
else //si no...
{
    printf("El mayor es %d \n",num2); //Escribimos que el mayor es num2.
}
system("PAUSE"); //Hacemos un pause en el programa para que de tiempo a ver el resultado.

}