Menú principal

sábado, 9 de enero de 2016

Vectores (arrays) en C

Los vectores son un tipo de dato compuesto formado por datos simples de un mismo tipo (int, char...) refiriéndome a esos datos con una variable. Para acceder a un dato en concreto en esa coleccion emplearemos un indice. Al primer elemento le corresponde el índice 0, al segundo el 1 y así sucesivamente.

El vector en memoria tendría la siguiente estructura. Observad que los elementos del vector están ocupando posiciones contiguas en la memoria.



Los vectores y los punteros están muy relacionados. De hecho, el nombre del vector es un puntero al inicio de este. Esto  quiere decir que si escribimos en el programa nota[0] o *nota es lo mismo: el contenido de la primera celda de memoria (nota[0]) donde empieza el vector.

Supongamos que quiero ver el cuarto elemento, en este caso habría que poner:

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

int main()
{
    float notas[50]

    printf("El cuarto elemento contiene el valor de: %f", notas[3]);
}

Ya que no hemos inicializado el vector todos los elementos tendrán valores indeterminado.

Para introducir números en ese vector utilizaríamos un bucle for. Aprovecho para enseñaros el #define que sirve para establecer constantes simbólicas, en este programa la llamaremos NUM_NOTAS y al lado de esta podremos el numero de notas que queramos que constituyan el vector de notas. El define resulta útil para que los programas sean más legibles y más fáciles de modificar

#include <stdio.h>
#include <stdlib.h>
#define NUM_NOTAS 5

int main()
{
    float notas[NUM_NOTAS];
    int i;

    for(i=0; i<NUM_NOTAS; i++)
    {
        printf("Intro nota numero %d: ", i);
        scanf("%f", &notas[i]);
    }


    printf("El cuarto elemento contiene el valor de: %f", notas[3]);
}


viernes, 8 de enero de 2016

Punteros en C

Ha llegado la hora de los punteros, una de las cosas mas útiles y por tanto mas utilizadas en la programación. Un puntero se define como una variable que guarda una dirección de memoria. Se declara de la siguiente manera: int *puntero;  
Primero el tipo, en este caso es un puntero a un entero, y luego precediendo al nombre un asterisco.

Este programa establece la variable número como igual a 5 y mediante un puntero cambia el valor a 2

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

int main()
{
    int numero= 5;
    int *puntero;
    
    puntero=&numero; //Recordar que el símbolo & significa "dirección de"
    
    *puntero=2; //Significa "vete al contenido del puntero y pon un dos. 
   
    printf("El valor de la variable numero es: %d", numero);//Saldrá 2

} 
Este ejemplo puede no parecer muy útil, utilizar un puntero para cambiar  el valor de una variable. No obstante ilustra cómo, una vez que tenemos la dirección de una variable, podemos manipular dicha variable de una forma muy sencilla. Esto será especialmente útil cuando veamos las funciones. 

En el ejemplo, tras hacer apuntar nuestro puntero a la variable número, podemos cambiar el valor de dicha variable haciendo que el contenido de la dirección que contiene el puntero ahora sea igual a 2. 
El símbolo * delante de un puntero significa "contenido de".
  

lunes, 4 de enero de 2016

8.- Ejercicio con while en C (kelvin)

Realizar un programa para pasar de grados kelvin a centigrados pidiendo al usuario por teclado los grados kelvin. El programa lo pedirá mientras los datos sean menores que 0.

Programa resuelto:

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

int main()
{
    float centi, kelvin;

    printf("Intro kelvin: ");
    scanf("%f", &kelvin);
    while(kelvin<0)
    {
        printf("No pueden ser negativos. Intro de nuevo kelvin: ");
        scanf("%f", &kelvin);
    }

    centi=kelvin-273.15;
    printf("%f grados kelvin equivalen a %f grados centigrados\n", kelvin, centi);
}

7.- Ejercicio resuelto con while en C (área)

Realizar un programa para calcular el área de un triángulo a partir de su base y altura, Estos datos se pedirán una y otra vez mientras no sean positivos.

Programa resulto:

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

int main()
{
    float base, altura, area;

    printf("Intro base: ");
    scanf("%f", &base);

    while(base<=0)
    {
        printf("Debe ser positiva. Intro de nuevo la base: ");
        scanf("%f", &base);
    }


    printf("Intro altura: ");
    scanf("%f", &altura);

    while(altura<=0)
    {
        printf("Debe ser positiva. Intro de nuevo la altura: ");
        scanf("%f", &altura);
    }

    area=(base*altura)/2;
    printf("El area es: %f", area);
}

6.-Ejercicio resuelto con for en C (área)

Realizar un programa para calcular el área de cinco triángulos. El programa pide 5 veces al usuario que introduzca la base y la altura y va visualizando las áreas calculadas.

Programa resuelto:

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

int main()
{
    float base, altura,  area;
    int i;

    for(i=1; i<=5; i++)
    {
        printf("Intro base: ");
        scanf("%f", &base);
  
        printf("Intro altura: ");
        scanf("%f", &altura);
     
        area=(base*altura)/2;
        printf("El area es: %f", area);
    }
}

5.- Ejercicio resuelto con for en C (kelvin)

Realizar un programa que pida introducir 5 temperaturas por teclado en grados kelvin, haga la media de los datos introducidos y esa media la visualice también en grados centígrados.

Programa resuelto:

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

int main()
{
    float centi, kelvin, mediakelvin;
    float suma=0; //Inicializamos a 0 para hacer la media
    int i;

    for(i=1; i<=5; i++)
    {
        printf("Intro kelvin: ");
        scanf("%f", &kelvin);
        suma=suma+kelvin;
    }
    mediakelvin=suma/5;
centi=mediakelvin-273.15; printf("La media es %f grados kelvin (%f grados centig)\n", mediakelvin, centi); }

sábado, 2 de enero de 2016

4.- Ejercicio resuelto con do while en C (grados)

Este ejercicio es como el ejercicio 2 del programa del if (paso de grados centigrados a kelvin) pero ahora utilizando el do while. Ahora con un do-while pediremos la temperatura una y otra vez mientras el usuario introduzca una temperatura menor que -273.15 (para que no nos de grados kelvin negativos).

Os dejo el programa:

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

int main()
{
    float kelvin, centi;
    do
    {
        printf("Intro centigrados: ");
        scanf("%f", &centi);
    }
    while(centi<-273.15);
    
    kelvin=centi+273.15;
    printf("%f grados centigrados equivale a %f kelvin\n", centi, kelvin);
    
}


viernes, 1 de enero de 2016

Sentencias de control repetitivas (bucles)

En entradas anteriores vimos cómo se puede cambiar la estructura secuencial de un programa (ejecución de una instrucción tras otra según están escritas en el programa) utilizando las sentencias condicionales. Podíamos saltar o ejecutar una parte del programa dependiendo de que se cumpliera una condición u otra. En esta entrada vamos a ver los bucles, son sentencias que nos permiten repetir determinadas instrucciones mientras se cumpla una condición. Por ejemplo si queremos escribir los 100 primeros números no pondremos 100 instrucciones sino una sola que se repita 100 veces utilizando un bucle.

Hay tres tipos de bucles:
  • for
  • while
  • do-while
for

Utilizaremos siempre que sepamos de antemano el numero de veces que queremos repetir las instrucciones. Por ejemplo: El siguiente bucle visualiza los 100 primeros números.

for(i=1; i<=100; i++)
{
   printf("%d " ,i);
}

El bucles for se apoyan en una variable contador (en nuestro caso i) y tiene tres instrucciones:
  • Una inicialización i=1
  • Una condición i<=100  El bucles se ejecutará mientras se cumpla esta condición.
  • Un incremento (o decremento) i++

while

No siempre vamos a saber el numero de veces que hay que iterar. Suponed que tenéis un programa donde el usuario tiene que introducir un numero positivo obligatoriamente. En estas circunstancias deberéis solicitar el numero mientras el valor introducido sea positivo, cosa que es imposible de predecir.

printf("Intro numero positivo");
scanf("%d", &numero);

while(numero<0)

{
    printf("Error: el numero debe ser positivo");
    printf("Por favor introduzca un valor mayor que 0");
    scanf("%d", &numero);
}

Este bucle se repetirá mientras el usuario insista introduciendo valores negativos. Como veis la estructura del while es muy sencilla, solo tenéis que poner la condición y el bucle se ejecutará mientras se cumpla esa condición. OJO que puede no ejecutarse nunca en el caso de que el usuario introduzca un número positivo en el primer intento.

do-while

El do-while es muy parecido al while.La única diferencia es que la condición se evalúa al final del bucle. Esto significa que por lo menos se ejecutará una vez. Tomando el mismo ejemplo anterior con un do-while lo haríamos de la siguiente manera:

do
{
    printf("Intro numero positivo");
    scanf("%d", &numero);
}
while (numero<0);