lunes, 12 de marzo de 2012

Vector de string


Para poder leer un vector de string, es decir un vector que en cada posición almacene una cadena de caracteres deberá de manejarse como una matriz la cual la cantidad de filas sera el numero de valores cadena que queramos ingresar y el número de columnas sera la cantidad de caracteres que puede almacentar cada valor, es decir si queremos almacenar 10 nombres de personas y que cada nombre tenga como maximo 30 caracteres, deberiamos de declarar nuestra matriz de la siguiente forma:

char Vnombres[10][30]

El siguiente ejemplo pedira los 10 nombres por pantalla y luego los mostrarara con el objetivo de demostrar la forma en que deben igresarse y mostrarse estos valores:


#include<stdio.h>
int main()
{
    //declaracion del arreglo de 10 posiciones y cada posicion almacenará 30 caracteres máximo
    char vnombres[10][30];
    int i=0;

   //ciclo para pedir los 10 nombres por pantalla
    for (i=0;i<10;i++)
   {
        printf("Ingrese nombre %i :",i+1);
        //note el uso de & debido a que estamos grabando el contenido en la posicion [0]   de la fila
        //esto porque recuerde que las cadenas son majenadas como punteros entonces lo que en
       //realidad tenemos es un apuntador al primer caracter de la cadena almacenada en la fila i     
        scanf("%s",&vnombres[i][0]);    
   }
   //ciclo para mostrar los 10 nombres ingresados anteriormente en la pantalla
   for (i=0;i<3;i++)
   {
       printf("los nombres ingresados son : \n");
       //note que siempre se lee y se muestra la fila correspondiente sobre la columa 0 que es la
       //posicion del primer caracter de la cadena de cada fila
       printf("%s \n",&vnombres[i][0]);
   }
   getch();
   
}

sábado, 25 de febrero de 2012

Lectura de caracteres por teclado con scanf, gets y fgets


Existen varias instrucciones para leer datos de tipo cadena en C ANSI pero algunas tienen diferente forma de manejarlos, tal es el caso de la instrucción scanf, la instrucion gets y la instrucción fgets las cuales explicaremos a continuación:

Funcion scanf:

Esta función es utilizada para capturar datos ingresados por el usuario indicandole un formato del tipo de datos que se espera por pantalla, lo que quiere decir que esta funcion nos sirve para leer varios tipos de datos como lo son: int, double, char,float, etc. y la sintaxis es la siguiente:

scanf("<especificacion del tipo de dato> ",<variable en la que se almacenara el valor ingresado>);

<especificacion del tipo de dato>: en este parametro podemos incluir los siguientes que son los más básicos, recuerde que estos parametros van encerrados dentro de comillas:

"% i" :  para valores enteros
"%d" :  para valores dobles
"%f" :   para valores con punto flotante (decimales)
"%s" :  para cadenas de carácteres
"%c":  para un caracter

Ejemplo de una instruccion que lee por pantalla una valor tipo cadena y un valor tipo entero:

scanf("%s", cadena);
scanf("%i", &numero);

Si notan en la segunda instruccion se uso el simbolo "&" y en la primera no se usa, esto es porque en el scanf necesitamos indicar que es un apuntador hacia el valor que se esta ingresando y los tipos cadena ya son un apuntador por default en C mientras que los enteros no lo son y es por ello que hay que indicarlo anteponiendo el simbolo "&"

problema con cadenas: La instrucción scanf cuando lee cadenas de caracteres leera unicamente hasta donde encuentre un espacio en blanco ignorando todo el demas contenido de dicha cadena, quedando basura en el buffer de lectura y esto lo toma como otra entrada del teclado por cada espacio en blanco que encuentre.

Funcion gets:

La función gets() no hace comprobación del límite de caracteres, es decir nada impedirá al usuario teclear más caracteres de los que soporta la variable que declaramos. La consecuencia de ello es imprevisible, aunque con toda seguridad el programa no funcionará correctamente.
Es importante tener en cuenta que no se permite la asignación de cadenas de caracteres mediante el operador =frase = gets ().

La sintaxis de esta instruccion es la siguinte y solo sirve para leer cadenas de caracteres:

gets(<variable en la que se almacenara el valor ingresado>);

ejemplo:  gets(nombre);

 Esta funcion si permite el ingreso de cadenas de caractéres que poseen espacios en blanco, es decir que podemos ingresar frases completas y tomara como entrada hasta que se presione la tecla <Enter>


fgets:     char *fgets(char *cadena, int n, stdin)

Esta función lee como máximo uno menos que el número de caracteres indicado por n desde el stream apuntado por stream al array apuntado por cadena. Ningún carácter adicional es leído después del carácter de nueva línea "\n".   Un carácter nulo es escrito inmediatamente después del último carácter leído en el array.   Ejemplo para leer una cadena de 80 caracteres se debe hacer de la siguiente forma:


linea[81];  //primero mi variable debe ser de 81 porque recuerden que al final le            //insertara el caracter de fin "\0".

fgets(linea,81,stdin)  //stdin porque nuestros datos provienen del teclado, cuida                       //do porque este parametro cambia cuando la lectura es de                        //archivo 


en linea recibe 80 caracteres mas el caracter de "\0" por esa razon se declaro de tamaño 81 la variable.





miércoles, 13 de abril de 2011

Impresión de matriz gráfica en modo caracter


El siguiente código sirve para darle una presentacion mas vistosa a los datos de una matriz dibujando el contorno con lineas dobles, por lo cual se puede dibujar la matriz de la cantidad de filas y columnas que se desee cambiando unicamente las variables globales F y C respectivamente.  para dibujar dicha matriz se ha separado el dibujo en tres partes:

si copias todo el codigo que aparece despues de la imagen de como queda la matriz tu programa correra sin problemas, la siguiente imagen muestra como se veria una matriz de 3 x 3


//primero puedes declarar estas variables globales para el tamaño de la matriz
//f servira para las filas y c para las columnas
int f,c; 

//1) dibujar la parte de arriba de la matriz:
 //esta funcion dibuja la parte de arriba de la matriz dependiendo la
//cantidad de columnas que tenga.
void dibujarArriba()
{
    int j;
    for(j=0;j<c;j++)   // c es la cantidad de columnas de la matriz
    {
      //si es la posicion 0 es porque es la esquina superior izquierda
      if(j==0)
      {
          printf("%c",201);
          printf("%c%c%c%c",205,205,205,205);
      }
      else
      {
          //si es la ultima posicion es porque es la equina superior derecha
          if(j==c-1)
          {
            printf("%c%c%c%c%c",203,205,205,205,205);
            printf("%c",187);
          }
          //si no es ni la primera ni la ultima posicion es el caracter diferente a las esquinas superiores
          else
          {
            printf("%c",203);
            printf("%c%c%c%c",205,205,205,205);
          }
      }
    }
    printf("\n");  //al terminar la parte de arriba hay que hacer salto de linea   
}
//2) dibujar la parte del medio de la matriz, es decir todas las filas de dicha matriz:
//esta funcion dibuja la parte del medio de la matriz, es decir la cantidad de filas
//que tiene  dicha matriz
void dibujarMedio()
{
  int i,j;
  for(i=1;i<f;i++)
  {  
      for(j=0;j<c;j++)
      {
        //si es la columna 0
        if(j==0)
        {
            printf("%c",204);
            printf("%c%c%c%c",205,205,205,205);
        }
        else
        {  
            //si es la ultima columna
            if(j==c-1)
            {
              printf("%c%c%c%c%c",206,205,205,205,205);
              printf("%c",185);
            }
            //si no es ni la primera ni la ultima columna
            else
            {
              printf("%c",206);
              printf("%c%c%c%c",205,205,205,205);
            }
        }
      }
      printf("\n"); //cada fila dibujada hay que hacer salto de linea
  }
}

//3) dibujar la parte de abajo de la matriz
//esta funcion dibuja la parte de abajo de la matriz dependiendo la
//cantidad columnas que tenga.
int dibujarAbajo()
{
    int j;
    for(j=0;j<c;j++)
    {
      //si es la columna 0 es la esquina inferior izquierda
      if(j==0)
      {
          printf("%c",200);
          printf("%c%c%c%c",205,205,205,205);
      }
      else
      {
          //si es la ultima columna es la esquina inferior derecha
          if(j==c-1)
          {
            printf("%c%c%c%c%c",202,205,205,205,205);
            printf("%c",188);
          }
          //si no es ni la primera ni la ultima posicion es el caracter diferente a las esquinas inferiores
          else
          {
            printf("%c",202);
            printf("%c%c%c%c",205,205,205,205);
          }
      }
    }
}

//y por ultimo puedes poner estos el siguiente procedimiento junto con la funcion main para que corra tu programa:

//funcion encargada aramar la matriz para ello la subdivide en 3 funciones mas
//una para dibujar la parte de arriba, otra para la parte del medio y
//la ultima para la parte de abajo
void dibujarMatriz()
{
    dibujarArriba();   //dibuja la parte de arriba de la matriz
    dibujarMedio(); //dibuja la parte media es decir todas las filas de la matriz
    dibujarAbajo();    //dibuja la parte de abajo de la matriz
}

//aqui hacemos la llamada a la funcion dibujarMatriz
int main()
{
    f=8; //cantidad de filas de la matriz si se quiere otro tamaño basta con cambiarlo aqui
    c=8;  //cantidad de columnas de la matriz si se quiere otro tamaño basta con cambiarlo aqui
    system("cls");  //limpiar pantalla
    dibujarMatriz();  //funcion que se encargara de armar la matriz
    getch();
}