TEMA 10

Programación en c

VECTORES (matrices o arrays)

            Los vectores nos permiten almacenar una serie de datos en una única variable. Son como una cajonera en cada uno de cuyos cajones podemos guardar un dato. Todos los datos deben ser del mismo tipo.
            Por ejemplo, si queremos almacenar veinte números, con lo que sabemos hasta ahora habríamos diseñado algo similar a:
                                   …

                                   { int numero1,numero2,numero3,numero4…;

                                      printf(“Dame el primer número”);scanf(“%d”,&numero1);

                                      printf(“Dame el segundo número”);scanf(“%d”,&numero2);

                                   

            En vez de ello podemos, usando un vector, llamar a la variable vector, por ejemplo, numeros, y referirnos al numero[0], al numero[1], al numero[2], etc., ya sea para introducirlos o, posteriormente, para operar con ellos o mostrarlos en pantalla.
            Un vector se define de forma parecida a los demás tipos de variables: indicamos su tipo, el nombre que le damos, y señalamos a continuación, entre corchetes, el número de elementos que en él vamos a almacenar.

 Sintaxis:           tipo nombrevector[nº de posiciones];   donde tipo es cualquiera de los tipos de datos conocidos: entero (int), real (float), o carácter (char).

            Para introducir un valor en una determinada posición, indicamos esta entre corchetes. Por ejemplo, si queremos meter en la posición 2 de un vector de enteros, de nombre datos,  el número 35, escribiríamos:  datos[1]=35;  

            Para mostrar el dato almacenado en la posición, por ejemplo, 15, escribríamos: printf(“%d”,datos[14]);

            En el ejemplo se observa que la primera posición es siempre la 0 y no la 1.

            Podemos definir y asignar valores, conjuntamente, a las distintas posiciones de un vector, en la forma:

tipo nombrevector[n]={dato1,dato2,dato3,…,daton};

Ejemplo: Programa que muestre los números naturales del 1 al 5

  #include <stdio.h>
void main()
{ int vector[5]={1,2,3,4,5};
   int n;
   for (n=0;n<=4;n=n+1)
           
printf("%d\n",vector[n]);
 }

            Cuando el número de elementos es elevado, lo que se hace es ir introduciendo los datos, o visualizándolos, con la ayuda de un bucle, que haga que una variable (índice), vaya tomando los valores de cada una de las posiciones del vector.

 Ejemplo: Programa que pida 10 números enteros, guardándolos en un array, y posteriormente los muestre en pantalla en orden inverso al de introducción .

#include <stdio.h>
void main()
{int numeros[10],n;
 
printf("Introduce los números\n");
 for(n=0;n<=9;n=n+1)
   
{printf("¿Número %d ?",n+1);
    scanf("%d",&numeros[n]);
   }
 printf("Los números que has introducido, en orden inverso, son:\n");
 for(n=9;n>=0;n=n-1)
   
{printf("Número %d %d \n",n+1,numeros[n]);
   }
}

     Los arrays pueden ser de más de una dimensión. Podemos imaginar un array bidimensional como una tabla con filas y columnas. Por ejemplo, un array bidimensional para introducir los días de la semana sería de 9 columnas (el miércoles es el día de más caracteres, con 9) y siete filas, una para cada día. La definición sería:

char semana[7][9]={"lunes","martes","miércoles","jueves","viernes","sábado","domingo"};

            Se almacenarían en la forma:

  C O L U M N A S
0 1 2 3 4 5 6 7 8
F I L A S 0 L U N E S û û û û
1 M A R T E S û û û
2 M I E R C O L E S
3 J U E V E S û û û
4 V I E R N E S û û
5 S A B A D O û û û
6 D O M I N G O û û

en donde û es el símbolo correspondiente al carácter nulo: \0

    Los arrays de caracteres tienen sus propias funciones, que trataremos más adelante. Por ahora, podemos tratarlos de forma similar a los de tipo entero o real.

  Ejemplos:
Programa que muestre los días de la semana:

#include <stdio.h>
void main()
{char semana[7][9]={"lunes","martes","miércoles","jueves", "viernes",
"sábado","domingo"};
  int n,m;
  for (n=0;n<7;n=n+1)
    {for (m=0;m<9;m=m+1)
        
printf("%c",semana[n][m]);
     printf("\n");
}

    Podemos mejorar la presentación si limitamos el número de caracteres que se deben imprimir (9 como máximo, si es que no encontramos antes el carácter nulo):

#include <stdio.h>
void main()
{char semana[7][9]={"lunes","martes","miércoles","jueves","viernes",
"sábado","domingo"};
  int n,m;
  for (n=0;n<7;n=n+1)
    {for (m=0;m<9;m=m+1)
       
if (semana[n][m]!='\0') printf("%c",semana[n][m]);
      printf("\n");
    }
 }

    

Inicio

 Ordenación de arrays.

 Método de la burbuja.

    Consiste en ir comparando, desde el primero al penúltimo, cada posición del array con la siguiente. Si están ordenados, se compara el último de los dos con el que le sigue, y así sucesivamente. Al llegar a una pareja que esté desordenada, se intercambian sus valores y se continúa. Cuando llegamos a comparar el penúltimo con el último, si alguna pareja estaba desordenada y hubo que cambiar sus valores, se empieza de nuevo todo el proceso. Se da por concluída la ordenación cuando se recorre toda la lista y no hemos encontrado ninguna pareja desordenada.

 Ejemplo: supongamos los elementos: 4     3. El proceso de ordenación , esquemáticamente, sería:

 

Posición 0

Posición 1

Posición 2

Posición 3

Posición 4

Ciclo 1º

4

2

5

3

8

Ciclo 2º

2

4

3

5

8

Ciclo 3º

2

3

4

5

8

 El siguiente programa ordena 10 números enteros introducidos por el usuario:

#include <stdio.h>
void main()
{int numeros[10],n,aux;
 
char cambio;
 printf("Introduce los números\n");
 for(n=0;n<=9;n=n+1)
   
{printf("¿Número %d ?",n+1);
    scanf("%d",&numeros[n]);
   }
 do
   {cambio='n'; /*Esta variable sirve para recordar al final del proceso de ordenación si hubo que intercambiar alguna pareja*/
   for (n=1;n<=9;n=n+1)
   
{if (numeros[n-1]>numeros[n])
     {aux=numeros[n-1];
      numeros[n-1]=numeros[n];
      numeros[n]=aux;
      cambio='s';}
     }
   }
   while (cambio=='s');
 for(n=0;n<=9;n=n+1)
   
printf("Número %d %d \n",n+1,numeros[n]);
}
 

            El método de la burbuja es el más sencillo de entender pero existen métodos más rápidos, especialmente cuando el número de datos que queremos ordenar es elevado.

Inicio

 ARRAYS DE CARACTERES.

            Se declaran se forma similar a los otros tipos de arrays:       char nombrevariable[nºposiciones];

            El compilador introduce automáticamente, en la posición siguiente al último carácter, el carácter nulo \0          Por esta razón es necesario definir una posición más de las que necesitemos.

             Por ejemplo, si queremos almacenar un nombre, para el que reservamos un máximo de 11 caracteres, escribiríamos:            char nombre[12];           Si en este array almacenamos el nombre ANA, se guardaría como:

            Y si fuese el término MEDITERRÁNEO, se produciría un error debido a que no hemos reservado el espacio para el carácter nulo.

           Para introducir los caracteres, podemos:

  •  escribirlos como cadena literal: char nombrearray[]=”cadena”;

en cuyo caso el compilador reserva automáticamente las posiciones necesarias y además incluye al final  el carácter nulo \0

  • escribirlos carácter a carácter, entre llaves y separados por comillas sencillas:

     char nombrearray[nºposiciones]={‘carácter1’,’carácter2’,…,’\0’};

 teniendo entonces que reservar el número de posiciones necesario e incluir al final el carácter nulo

  • pedirlos al usuario mediante gets(nombrearray), como veremos a continuación en las funciones de cadena.

FUNCIONES DE CADENA.

 printf(); Su sintaxis es la misma que vimos al hablar de los tipos entero, real y char:

              printf(“cadena de formato”,nombrearray);        El especificador de formato del tipo cadena es %s

Ejemplo:         

#include <stdio.h>
void main()      
{ char texto[]="Colegio";
   printf("El texto es %s",texto);
 }

 gets(); Es la función equivalente a scanf(); Permite introducir la cadena por teclado.

              Sintaxis: gets(nombrearray);

              El array debe haber sido definido con un número de posiciones adecuado, de forma que en él quepan la cadena y el carácter nulo.

Ejemplo:

#include <stdio.h>
void main()  
{char texto[12];
  printf("Introduce una palabra de longitud máxima 11 caracteres");
  gets(texto);
  printf("La palabra que has introducido es %s",texto);
 }

getch();  y getche();      Ambas funciones fueron estudiadas. Nos permitían tomar pulsaciones del teclado. Podemos usarlas para ir tomando una cadena carácter a carácter. Habrá que limitar el número de caracteres dependiendo de las posiciones que pusiésemos en la declaración del array, y después del último carácter, hay que meter el carácter nulo.

    Ambas se encuentran en el fichero de cabecera conio.h

Ejemplo: Programa que toma un texto menor de 100 caracteres. El usuario indica que ha acabado pulsando *. Posteriormente el texto se muestra en pantalla.

#include <stdio.h>
#include <conio.h>
void main()
{ int n;
   char caracter,cadena[100]="";
   printf("Introduce un texto menor de 100 caracteres. Pulsa * para acabar\n");
   n=-1;
   while ((n<98) && (caracter!='*'))
      { n=n+1;
         caracter=getche();
         if (caracter!='*') cadena[n]=caracter;
       }
   cadena[n]='\0';
   printf("\nLa palabra introducida es %s",cadena);
}
 

 

Otras funciones de tratamiento de cadenas (strings).

 Todas ellas están incluídas en el fichero de cabecera string.h

 strcat();            Concatena dos cadenas. Sintaxis: strcat(cadenadestino,cadenaorigen);                      

             La cadena destino debe ser lo suficientemente grande como para poder contener a la cadena origen, que se pondrá  después del último carácter, si es que lo hay, de la destino.             

  #include <stdio.h> 
#include <string.h>  
void main()
{ char origen[10],destino[25];
   printf("¿Cadena destino?");gets(destino);
   printf("¿Segunda origen?");gets(origen);
   strcat(destino,origen);
     printf("En cadena destino hay %s",destino);
}

strcmp();          Sintaxis: variable_entera=strcmp(cadena1,cadena2);

Compara dos cadenas, devolviendo:

  • 0 si son iguales

  • <0 si el código ASCII del carácter diferenciador de la primera cadena es menor que el de la segunda.

  • >0 si el código ASCII del carácter diferenciador de la primera cadena es mayor que el de la segunda.

Ejemplo:   

#include <stdio.h> 
#include <string.h>  
void main()
{char primera[10],segunda[10];
  int resultado;
  printf("¿Primera cadena?");gets(primera);
  printf("¿Segunda cadena?");gets(segunda);
  resultado= strcmp(primera,segunda);printf("%d",resultado);
 if (resultado==0)
     printf("Son iguales");
     else if (resultado<0)
            printf("la cadena %s va antes que la cadena %s",primera,segunda);
                    else if (resultado>0)
printf("%s va antes que %s",segunda,primera);
}
   

strcpy(); Sintaxis: strcpy(cadenadestino,cadenaorigen);

Copia la cadena origen en la cadena destino. Esta deberá tener el tamaño adecuado para contener a la primera.

Ejemplo:    

#include <stdio.h>
#include<string.h>
void main()
{char destino[100],origen[100];
printf("Introduce la cadena que quieres copiar ");
gets(origen);
strcpy(destino,origen);
printf("la cadena copiada es: %s",destino);
}

strlen();            Sintaxis: variable_entera=strlen(cadena);

Mide la longitud (el nº de caracteres) de una cadena. Los espacios en blanco también son caracteres

Ejemplo:

#include <stdio.h>
#include <string.h>  
void main()  
{char cadena[100];  
 int longitud;  
 
printf("Introduce un texto");gets(cadena);
 longitud= strlen(cadena);
 printf("La cadena tiene %d caracteres",longitud);
 }
 

 

Ejemplos:

1.- Programa que invierta un texto introducido por el usuario. 

Ejemplo:     ¿Texto? ESTO ES FÁCIL    

                    TEXTO INVERTIDO: LICÁF SE OTSE

 

inicio   #include <stdio.h>
#include <conio.h>
#include <string.h>
/*Dice el número de caracteres de una frase de 500 caracteres como máximo y la escribe al revés*/
void main()
{   char texto[501];
     int n,longitud;
     printf("¿Frase (máximo 500 caracteres: ");
     gets(texto);
     longitud=strlen(texto);
    printf("\nAl reves es: ");
     for (n=longitud-1;n>=0;n=n-1)
             printf("%c",texto[n]);
}
         
  el texto introducido se  guarda en el array tex
         
medimos la longitud del texto (el nº de caracteres)
         
desde la posición final
         
escribe el carácter de lugar posición
         
hasta la posición 1ª
         
fin

2.- Programa que genere una loto: 6 números aleatorios, enteros y distintos entre 1 y 49

Ejemplo: Loto: 3  25  14  2  40  31

inicio   #include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{int loto[50],n,x;
srand( (unsigned)time( NULL ) );
for (n=1;n<=50;n=n+1)
loto[n]=0;
printf("LOTO DE LA SUERTE:");
for (n=1;n<=6;n=n+1)
{ do
x=rand()%(49-1+1)+1;
while (loto[x]==x);
loto[x]=x;
printf("\n%d \t%d",n,x);
}
}
 
            
desde n=0 (primera posición del array)  
            
inicializamos los valores de las posiciones a 0  
            
hasta n=48 (última posición del array)  
            
desde n=1  
            
repite  
            
generamos número aleatorio entero entre 1 y 49  
           
mientras en la posición x no haya 0  
            
introduce el número x generado en la posición x  
            
escribe el nº generado  
            
hasta n=6  
              
fin    

3.- Programa que cuente el número de palabras de un texto introducido por el usuario.

Ejemplo:  ¿Texto? (máximo 500 caracteres) Esto es una prueba
                4 palabras

  inicio   #include <stdio.h>
#include <string.h>
void main()
{  char texto[501];
    int lon,n,pa=0;
    printf("¿Texto? (máximo 500 caracteres)");
    gets(texto);
    lon=strlen(texto);
    for (n=0;n<=lon-1;n=n+1)
        if (texto[n]==' ') pa=pa+1;
    printf("%d palabras",pa+1);
}
              
  inicializamos el nº de palabras pa a o  
              
  pedimos el texto  
              
  medimos su longitud en lon  
              
  desde que n vale 0 (1ª posición de la palabra)   
             
si en la posición n hay un espacio  
         sumamos una palabra en pa  
            
  hasta que n vale lon-1 (última posición de la palabra)  
              
  escribimos el nº de palabras  
              
  fin  

4.- Programa que pida un verbo en infinitivo y diga a qué conjugación pertenece, o muestre el mensaje "no es verbo o no está en infinitivo".

    inicio  
/*LA FUNCIÓN strlwr(cadena); CONVIERTE CADENA EN MINÚSCULAS, Y LA FUNCIÓN
strupr(cadena); CONVIERTE CADENA EN MAYÚSCULAS. TE PUEDE SER ÚTIL. USA TAMBIÉN LA ESTRUCTURA switch;*/

#include <stdio.h>
#include <string.h>
void main()
{   char verbo[15],ter;
     int lon;
     printf("¿Verbo?");gets(verbo);
     strlwr(verbo);
     lon=strlen(verbo);
     ter=verbo[lon-2];
     switch (ter)
    {
       case 'a':printf("Primera");break;
       case 'e':printf("Segunda");break;
       case 'i':printf("Tercera");break;
       default: printf("No es verbo o no está en infinitivo");
     }
}
                
    pedimos verbo  
                
    pasamos a minúsculas  
                
    medimos su longitud  
                
si el carácter penúltimo es a pertenece a la 1ª  
                          
si el carácter penúltimo es e pertenece a la 2ª  
                          
si el carácter penúltimo es i pertenece a la 3ª  
                          
              y si no es ninguno de los anteriores no es verbo o no está en infinitivo  
                
         

 

5.- Programa que desordene aleatoriamente las letras de una palabra introducida por el usuario.

inicio   #include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{  char palabra[21],testigo[21];
    int lugar,longitud,vez,aleatorio;
    randomize();
    for (lugar=0;lugar<=20;lugar=lugar+1)
         testigo[lugar]='-';
    printf("¿Palabra máximo 20 letras");
    gets(palabra);
    longitud=strlen(palabra);
    for (vez=1;vez<=longitud;vez=vez+1)
        {
           do
                {
                 aleatorio=random(longitud)+1;
                }
           while (testigo[aleatorio-1]!='-');
           testigo[aleatorio-1]='*';
           printf("%c",palabra[aleatorio-1]);
         }
}
 
            
desde la posición 0  
            
pongo el caracter - en cada posición del array testigo  
            
hasta la posición 20  
            
el usuario introduce la palabra  
            
medimos la longitud de la palabra  
            
desde la primera letra  
            
repite  
            
generar un número aleatorio  
            
mientras en la posición aleatorio-1 del array testigo no esté el carácter -  
            
metemos en la posición aleatorio-1 del array testigo un *  
              
escribimos la letra de la posición aleatorio-1    
              
hasta la última letra    
              
fin    

6.- Programa que desordene aleatoriamente 10 nombres introducidos por el usuario.

/*DESORDENA ALEATORIAMENTE 10 NOMBRES INTRODUCIDOS POR EL USUARIO*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{   randomize();
    char palabras [10][25],nombre[25];
    int n,lon,lugar,x,testigo[25];
    for (n=0;n<=9;n=n+1)
    {   printf("¿Nombre %d? ",n+1);
        gets(nombre);
        lon=strlen(nombre);
        for (lugar=0;lugar<=lon-1;lugar=lugar+1)
        palabras[n][lugar]=nombre[lugar];
        palabras[n][lon]='\0';
    }
    for (n=0;n<=9;n=n+1)
        testigo[n]=-1;
    for (n=0;n<=9;n=n+1)
        {  do
                x=random(10);
            while (testigo[x]==x);
            testigo[x]=x;
            lugar=0;
            printf("\n");
            while (palabras[x][lugar]!='\0')
            {   printf("%c",palabras[x][lugar]);
                 lugar=lugar+1;
             }
          }
}

Inicio

Tema de ampliación:

FUNCIONES 

             Una función es una parte del programa que realiza una determinada tarea o devuelve un valor. El propio bloque principal del programa, es para C una función, y también son funciones printf(), scanf(), etc.

            Se trata ahora de definir nuestras propias funciones, por ejemplo para calcular cubos de números, logaritmos en base n, centrar un texto en pantalla, etc.

            Para utilizar una función en un programa, en el inicio, tras las declaraciones de los ficheros de cabecera, la definimos, en la forma:

 tipo_resultado_devuelto   nombre_función (tipo_argumentos_que_recibe ,  argumentos_que_recibe);

            Cada argumento debe ir precedido de su tipo.

            Por ejemplo: int funcion (int numero1, int numero2);      con lo que indicamos que el programa va a usar una función de nombre funcion, que devuelve un resultado de tipo entero, y que recibe del bloque principal dos números enteros como argumentos.   

            Posteriormente, en cualquier parte del programa, se escribe la función, repitiendo como encabezamiento de la misma el que se puso al declararla, y desarrollándola a continuación entre llaves. El resultado devuelto por la función se indica mediante return resultado;        Cuando una función no devuelve ningún valor, se puede omitir return;

            Dentro de la función se pueden declarar las variables que esta necesite, que sólo tendrán validez durante la ejecución de la misma.

            Para invocar desde el bloque principal a la función, se escribe el nombre de la misma, y entre paréntesis se pasan los argumentos, si es que los hay. En caso de no existir, simplemente se ponen los paréntesis. Cuando el programa llega a la llamada a la función, salta a la misma, pasando los argumentos, , si los hay, a las variables correspondientes de la función, la ejecuta, y devuelve el valor, si lo hay, al bloque principal, continuándose con la ejecución del programa.

            Las variables que se pasaron a la función, aunque en ésta se modificasen, permanecen inalteradas (paso de parámetros por valor). 

Esquema del uso de funciones.

#include <stdio.h>
int fun1();
int fun2();
 

int fun1()
{
  printf("Esta es la función 1\n");
}

int fun2()
{
  printf("Esta es la función 2\n");
}

void main()
{
  printf("Bloque principal\n");


  fun1(); /*Aquí se invoca a la función 1, que no tiene argumentos*/


  printf("Bloque principal\n");


  fun2();/*Aquí se invoca a la función 1, que no tiene argumentos*/


  printf("Bloque principal\n");
}

Ejemplo: Programa que pida dos números y mediante funciones calcule su suma y diferencia.

#include <stdio.h>

float suma (float a,float b);

float resta(float a,float b);

float suma(float a,float b)
{ float resultado;
  resultado=a+b;
  return resultado;
}

float resta(float a,float b)
{ float resultado;
  resultado=a-b;
  return resultado;
}

void main()
{ float a,b;
  printf("¿Primer número?");
  scanf("%f",&a);
  
printf("¿Segundo número?");
  scanf("%f",&b);
  
printf("Suma=%f",suma(a,b));
  printf("Diferencia=%f",resta(a,b));
  }

Ejemplo: Programa que contenga y utilice la función cubo. Esta función calculará el cubo de un número real.

#include <stdio.h>

float fun_cubo(float numero);

float fun_cubo(float numero)
{
  float cubo;
  cubo=numero*numero*numero;
  return cubo;
}

void main()
{
  float numero;
  printf("Dame un número");scanf("%f",&numero);
  printf("El cubo de %f es %f",numero,fun_cubo(numero));
}
 

Ejemplo: Programa que mediante una función calcule el factorial de un número. Dato: el factorial de un número n se define n!=n·(n-1)(n-2)···3·2·1

#include <stdio.h>

double factorial(int numero);

double factorial(int numero)
{
    int n;
    double facto;
    facto=1;
    for (n=1;n<=numero;n=n+1)
    {
        facto=facto*n;
    }
    return facto;
}

void main()
{
    int numero;
    printf("Introduce un número ");
    scanf("%d",&numero);
    printf("El factorial de %d es %f",numero,factorial(numero));
}
 

Ejemplo: Programa que mediante una función resuelva el trinomio de segundo grado. El usuario introduce los valores de los coeficientes a, b y c.

#include <stdio.h>
#include <math.h>

float raiz1(float a,float b,float c);

float raiz2(float a,float b,float c);

float raiz1(float a,float b,float c)
{

float x1,x2;
x1=(-b+pow(b*b-4*a*c,0.5))/(2*a);
return x1;

}


float raiz2(float a,float b,float c)
{

        float x1,x2;
        x2=(-b-pow(b*b-4*a*c,0.5))/(2*a);
        return x2;

}
 

void main()
{
        float a,b,c;
        printf("Coeficiente a? ");
       
scanf("%f",&a);
        printf("Coeficiente b? ");
        scanf("%f",&b);
        printf("Coeficiente c? ");
        scanf("%f",&c);
        printf("X1=%f",raiz1(a,b,c));
        printf("\nX2=%f",raiz2(a,b,c));
}
 

 


VOLVER