[Curso] Introducción a la programación en C (X)

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, m0skit0, LnD, ka69, zacky06

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

[Curso] Introducción a la programación en C (X)

Mensaje por m0skit0 »

<< Anterior Siguiente >>

"Soy presidente de la República Islámica de Irán... irán y no volverán... es que si no lo digo reviento. Jeje" - Joaquín Reyes de Ahmadineyad

Estructuras de datos

Bueno, ahora vamos a dejar un poco las instrucciones a la máquina para ver cómo podemos organizar los datos con los que vamos a trabajar. Hasta ahora sólo hemos visto una forma, con variables. En esta lección intentaré que comprendáis dos más: los vectores (o arrays como los llaman los yankis) y los structs (que no sé como demonios se llama en cristiano).

Un vector es una variable múltiple de un tipo determinado. Si recordáis la metáfora que usamos para describir una variable (el cajón), un vector es como un armario con varios cajones seguidos del mismo tipo. Veamos un ejemplo:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char* argv[])
{
   int i, j = 0, k = 0;

   // Dos vectores de 10 enteros cada uno
   int pares[10];   
   int impares[10];

   // Recorremos los números desde el 1 hasta el 20 (ambos inclusive)
   for (i=1; i<=20; i++)
      // Si el número es par
      if(i%2 == 0)
         // Lo metemos en el vector de pares, en la posición j y avanzamos a la siguiente posición del vector
         pares[j++] = i;
      else
         // Si no, lo metemos en el vector de impares, en la posición k y avanzamos a la siguiente posición del vector
         impares[k++] = i;

   // Imprimimos el vector de pares
   for (i=0; i<10; i++)
      printf("%d ", pares[i]);

   printf("\n");

   // Imprimimos el vector de impares
   for (i=0; i<10; i++)
      printf("%d ", impares[i]);

   printf("\n");

   return 0;
}

Un cosa muy importante a tener en cuenta para los vectores es que siempre empiezan por 0, es decir, el primer elemento de un vector ejemplo[100] es ejemplo[0] y el último es ejemplo[99] (lo que hace 100 elementos). Ahora veréis también que los famosos char[] son efectivamente vectores de caracteres :)

Pasando al tema de los structs, se podría decir que son muy parecidos a los vectores, salvo que esta vez los elementos pueden ser de distinto tipo, y no se accede a ellos por índice (usando [n]), sino por nombre. Veamos un ejemplo:

Código: Seleccionar todo

#include <stdio.h>
#include <string.h>

// Defino una estructura del tipo tPersonaje
struct tPersonaje
{
   char nombre[80];
   unsigned int level;
   int hp;
   unsigned int mp;
   unsigned int xp;
};

int main(int argc, char* argv[])
{
   // Declaro una variable del tipo tPersonaje definida más arriba
   struct tPersonaje personaje;
   
   // Para acceder a los registros de la estructura, se usa el .
   personaje.level = 40000;
   personaje.hp = 32520;
   personaje.mp = 32520;
   personaje.xp = 45500;
   // Para copiar una cadena de caracteres en otra, se usa strcpy (ojo con los tamaños)
   // Aquí copio "m0skit0" a personaje.nombre
   strcpy(personaje.nombre, "m0skit0");

   // Imprimimos el personaje
   printf("Personaje principal:\n");
   printf("Nombre: %s\n", personaje.nombre);
   printf("Nivel: %d\n", personaje.level);
   printf("Puntos de experiencia: %d\n", personaje.xp);
   printf("Vida: %d\n", personaje.hp);
   printf("Magia: %d\n", personaje.mp);

   return 0;
}

Como veis, primero hemos creado un nuevo tipo de datos, en este caso tPersonaje. Ahora podemos declarar variables que sean de este tipo, igual que hacemos con int o char* ;). Creamos una variable personaje con el tipo tPersonaje y le vamos asignando los valores. No importa que la definición del struct esté dentro o fuera de main(), aunque generalmente se prefiere fuera, por razones que entenderéis más adelante cuando hablemos de funciones y del alcance de las declaraciones.

Espero os haya quedado claro, si no, ya sabéis, a preguntar :D

Y para los que no tengáis ninguna duda, a ver estos retos:

  1. Optimizar el ejemplo dado sobre vectores.
  2. Dado un vector de 50 números enteros, obtener el mayor, el menor, la media y la moda (el número que más veces se repite). Obtener también en qué posición se hayan los cuatro :twisted:
  3. Dado el mismo vector que el reto anterior, ordenarlo de menor a mayor y de mayor a menor.
  4. Crear un programa que implemente una agenda telefónica con un máximo de 20 entradas, siendo cada entrada el nombre, el número de teléfono y las veces que se ha accedido a dicha entrada. Se debe permitir al usuario introducir una nueva entrada (en caso de que queden entradas vacías disponibles), modificar una entrada y borrar una entrada existente.

¡Suerte! :mrgreen:

Descarga en PDF (cortesía de Dark Pallacus)

<< Anterior Siguiente >>
Imagen

arisma
Habitual
Habitual
Mensajes: 497
Registrado: 18 Sep 2009, 08:41

Re: [Curso] Introducción a la programación en C (X)

Mensaje por arisma »

Estructuras xD

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (X)

Mensaje por m0skit0 »

Es que estructuras queda mal :D ¿Estructuras de qué? ¿De datos? Eso no son sólo structs...
Imagen

arisma
Habitual
Habitual
Mensajes: 497
Registrado: 18 Sep 2009, 08:41

Re: [Curso] Introducción a la programación en C (X)

Mensaje por arisma »

Lo sé, pero aunque no se ajusta es como se traduce.

A ver si me pongo mañana y soy capaz de hacer alguno.

Avatar de Usuario
dark_sasuke
Moderador Global
Moderador Global
Mensajes: 3379
Registrado: 03 Sep 2009, 02:13
Twitter: D4rkyt0

Re: [Curso] Introducción a la programación en C (X)

Mensaje por dark_sasuke »

arisma escribió:A ver si me pongo mañana y soy capaz de hacer alguno.


tan dificil se pone :S
Imagen

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (X)

Mensaje por m0skit0 »

arisma escribió:Lo sé, pero aunque no se ajusta es como se traduce.

Lo sé, pero nunca me gustó...

dark_sasuke escribió:tan dificil se pone :S
dark_sasuke escribió:tan dificil se pone :S

Tampoco tanto. Si esto es díficil, no veas lo que queda :juasjuas: Eso sí, son más largos, sobre todo el último. No desesperes ;)
Imagen

Avatar de Usuario
finfantasy
Habitual
Habitual
Mensajes: 153
Registrado: 15 Oct 2009, 19:00

Re: [Curso] Introducción a la programación en C (X)

Mensaje por finfantasy »

Yo las solía conocer como "tuplas" y también se ajusta al castellano, almenos en los apuntes de programación en castellano que nos dan los nombra así.

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (X)

Mensaje por m0skit0 »

Tuplas me gusta más xD Es que no sé dónde metí mis apuntes de Pascal (la nostalgia me invade... :cry: ).

PD: Noob, tú plas!
Imagen

Avatar de Usuario
dark_sasuke
Moderador Global
Moderador Global
Mensajes: 3379
Registrado: 03 Sep 2009, 02:13
Twitter: D4rkyt0

Re: [Curso] Introducción a la programación en C (X)

Mensaje por dark_sasuke »

aiiss el pascal tambien me gustaba :( , pero ese tutorial llege hasta donde llege porque no habia mas tutorial lo habian borrado xD
Imagen

arisma
Habitual
Habitual
Mensajes: 497
Registrado: 18 Sep 2009, 08:41

Re: [Curso] Introducción a la programación en C (X)

Mensaje por arisma »

Lo siento jefe, lo estoy haciendo en el trabajo(y hay bastante), empecé en casa y quedaba bonito, ahora en fin...

Ejercicio 2.
Spoiler:

Código: Seleccionar todo

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

int main(int argc, char* argv[])
{
   int numMenor = 0, numMayor = 0, posMenor = 0, posMayor = 0;
   float media = 0;
   int vectorNum[50];

   srand(time(0));
   
   int i;
   for (i = 0; i < 50;i++) vectorNum[i] = rand() %65535;

   for (i = 0; i < 50;i++) printf("%d\n", vectorNum[i]);

   //Comenzamos el tratamiento del vector
   for (i = 0; i < 50; i++)
   {
      media = media + vectorNum[i];
      if (vectorNum[i] > vectorNum[posMayor])
      {
         printf("El num. %d ha sido sustituido como mayor por %d\n", vectorNum[posMayor], vectorNum[i]);
         numMayor = 1;
         posMayor = i;
      }
      else if (vectorNum[i] == vectorNum[posMayor])
      {
         printf("Igualado num. %d en posicion-> %d\n", vectorNum[posMayor], i);
         numMayor++;
      }

      if (vectorNum[i] < vectorNum[posMenor])
      {
         printf("El num. %d ha sido sustituido como menor por %d\n", vectorNum[posMenor], vectorNum[i]);
         numMenor = 1;
         posMenor = i;
      }
      else if (vectorNum[i] == vectorNum[posMenor])
      {
         printf("Igualado menor num. %d en posicion-> %d\n", vectorNum[posMenor], i);
         numMenor++;
      }
   }

   //Pues ahora visualizaremos los datos pedidos 2 de 4
   printf("El menor es %d, y se repite %d veces\n", vectorNum[posMenor], numMenor);
   printf("El mayor es %d, y se repite %d veces\n", vectorNum[posMayor], numMayor);
   printf("La media es %.2f, que corresponde a %.0f/50\n", media/50, media);

   return 0;
}


Ejercicio 2. Aprovechando el ordenamiento jejeje.
Spoiler:

Código: Seleccionar todo

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

int main(int argc, char* argv[])
{
   int numMenor = 0, numMayor = 0, posMenor = 0, posMayor = 49;
   float media = 0;
   int vectorNum[50];
   int repvectorNum[50];
   
   srand(time(0));
   
   int i;
   for (i = 0; i < 50;i++) vectorNum[i] = rand() %65535;
   for (i = 0; i < 50;i++) repvectorNum[i] = 0;
   
   //Ahora lo ordenamos de menor a mayor para hacer más fácil la busqueda de la moda
   //Ordenación metodo burbuja, de los más sencillos e ineficaces
   
   for (i = 0; i < 49; i++)
   {
      int j;
      for (j = i + 1;j < 50;j++)
      {
         if (vectorNum[j] < vectorNum[i])
         {
            int temp = vectorNum[j];
            vectorNum[j] = vectorNum[i];
            vectorNum[i] = temp;
         }
      }
   }

   for (i = 0; i < 50;i++) printf("%d\n", vectorNum[i]);
   
   int contador = 0, posOriginal = 0;
   
   //Comenzamos el tratamiento del vector
   for (i = 0; i < 50; i++)
   {
      media = media + vectorNum[i];
      if (vectorNum[i] == vectorNum[posOriginal])contador++;
      else
      {
         repvectorNum[posOriginal] = contador;
         contador = 1;
         posOriginal = i;
      }    
      repvectorNum[posOriginal] = contador;
   }
   
   //Pues ahora visualizaremos los datos pedidos 2 de 4
   printf("El menor es %d, y se repite %d veces\n", vectorNum[posMenor], repvectorNum[posMenor]);
   printf("El mayor es %d, y se repite %d veces\n", vectorNum[posMayor], repvectorNum[posMayor]);
   printf("La media es %.2f, que corresponde a %.0f/50\n", media/50, media);
   
   //Ahora la moda que sería el 3 de 4 jeje
    for (i = 0; i < 50; i++)
    {
       if (repvectorNum[i] != 0) printf("El número %d se repite %d veces.\n", vectorNum[i], repvectorNum[i]);
    }      

   return 0;
}

Ejercicio 3. Basado en intercambios directos entre elemento, por eso el gran número de veces que hay que recorre el vector

Spoiler:

Código: Seleccionar todo

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

int main(int argc, char* argv[])
{
   int numMenor = 0, numMayor = 0, posMenor = 0, posMayor = 0;
   float media = 0;
   int vectorNum[50];

   srand(time(0));
   
   int i;
   for (i = 0; i < 50;i++) vectorNum[i] = rand() %65535;

   for (i = 0; i < 50;i++) printf("%d\n", vectorNum[i]);

   //Comenzamos el tratamiento del vector
   //Ordenación metodo burbuja, de los más sencillos e ineficaces
   
   for (i = 0; i < 49; i++)
   {
      int j;
      for (j = i + 1;j < 50;j++)
      {
         if (vectorNum[j] < vectorNum[i])
         {
            int temp = vectorNum[j];
            vectorNum[j] = vectorNum[i];
            vectorNum[i] = temp;
         }
      }
   }

   printf("Ordenado de menor a mayor\n");
   for (i = 0; i < 50; i++) printf("%d ", vectorNum[i]);
   

   for (i = 0; i < 49; i++)
   {
      int j;
      for (j = i + 1;j < 50;j++)
      {
         if (vectorNum[j] > vectorNum[i])
         {
            int temp = vectorNum[j];
            vectorNum[j] = vectorNum[i];
            vectorNum[i] = temp;
         }
      }
   }


   printf("\nOrdenado de mayor a menor\n");
   for (i = 0; i < 50; i++) printf("%d ", vectorNum[i]);
   
   return 0;
}


Ejercicio 4 o algo similar ;)
Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <string.h>

typedef struct entrada
{
   char* nombre[40];
   char* numTel[9];
   int numAccesos;
}Entrada;


int main(int argc, char* argv[])
{

   int opcMenu;
   int nosalir = 1;
   int libres = 20;
   
   Entrada Agenda[20];   
   
   int i;
   
   for (i = 0; i <20; i++) Agenda[i].numAccesos = -1;   
   
   while(nosalir)
   {
      printf("\n1.- Añadir\n");
      printf("2.- Modificar\n");
      printf("3.- Borrar\n");
      printf("4.- Salir\n");
      printf("Pulsa opción:(%d) ", libres);
      scanf("%d",&opcMenu);
      
      switch(opcMenu)
      {
         case 1: if (libres > 0)
                   {
                      i = 0;
                      while (Agenda[i].numAccesos != -1) i++;
                      printf("Introduce en nombre: ");
                      scanf("%s", &Agenda[i].nombre);                      
                      printf("Introduce el telefono(9 digitos): ");
                      scanf("%s", &Agenda[i].numTel);
                      Agenda[i].numAccesos = 0;
                      printf("Su número de ID es: %d", i);
                      libres--;
                   }
                   else printf("No quedan entradas libres, borre alguna...");
                   break;
         case 2: printf("Número de IDs: ");
                   for (i = 0; i < 20; i++) if (Agenda[i].numAccesos != -1) printf("%d ", i);
                   int idMod;
                   printf("\nIntroduce ID a modificar: ");
                   scanf("%d", &idMod);
                   if(Agenda[idMod].numAccesos < 0 | idMod > 19 | idMod < 0) printf("ERROR: ID erroneo\n");
                   else
                   {                      
                      printf("Introduce en nombre: ");
                      scanf("%s", &Agenda[idMod].nombre);                      
                      printf("Introduce el telefono(9 digitos): ");
                      scanf("%s", &Agenda[idMod].numTel);
                      Agenda[idMod].numAccesos++;
                   }
                   break;
         case 3: printf("Número de IDs: ");
                   for (i = 0; i < 20; i++) if (Agenda[i].numAccesos != -1) printf("%d ", i);
                   int idBorrar;
                   printf("\nIntroduce ID a borrar: ");
                   scanf("%d", &idBorrar);
                   if(Agenda[idBorrar].numAccesos < 0 | idBorrar > 19 | idBorrar < 0) printf("ERROR: ID erroneo\n");                  
                   else
                   {
                      //Agenda[idBorrar].nombre = "";
                      //Agenda[idBorrar].numTel = "";
                      //strcpy para borrar datos
                      printf("ID borrado fue accedido %d veces", Agenda[idBorrar].numAccesos);
                      libres++;                      
                      Agenda[idBorrar].numAccesos = -1;
                   }
                   break;
         case 4: printf("4\n");
                   nosalir = 0;
                   break;
         default:
                   break;         
      }
   }


   return 0;
}
Última edición por arisma el 01 Feb 2010, 16:07, editado 6 veces en total.

Responder