TEMA 10
Programación en c
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"); } } |
![]() |
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 8 2 5 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.
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.
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);
}
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;
}
}
}
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));
}