Documente Academic
Documente Profesional
Documente Cultură
MÓDULO:
INFORMÁTICA INDUSTRIAL
INTRODUCCIÓN A LA PROGRAMACIÓN
1. HISTORIA DEL LENGUAJE C
El lenguaje C es hoy en día uno de los más extendidos. Podemos asegurar que junto con su
hermano C++ se ha convertido en el lenguaje por excelencia de los ambientes comerciales y
profesionales. Esta popularidad se ve apoyada por la gran cantidad de compiladores, librerías,
generadores de código, libros y artículos en revistas especializadas existentes en el mercado
sobre C.
El lenguaje C fue desarrollado hacia 1972 por Dennis Ritchie en los laboratorios Bell de
AT&T. Ritchie se dedicaba a la programación de sistemas (lenguajes, S.O, software de base, etc.)
y desarrolló C como una herramienta excelente para este tipo de tareas. Sin embargo,
actualmente el C se ha convertido en un lenguaje de propósito general y es utilizado en
desarrollos de distintos tipos (S.O, gráficos, gestión, construcción de compiladores, juegos,
multimedia...).
Es uno de los sistemas operativos más importantes y extendidos, Unix, está escrito en su
totalidad en C y sólo algunos detalles de implementación dependientes de la máquina están
escritos en lenguaje ensamblador. Otros entornos que utilizan C como lenguaje principal son
DOS, Windows, NT, OS/2, X Window... Como podemos ver, se trata de un lenguaje realmente
importante.
Hay gente que dice que C es un lenguaje muy difícil de aprender, en fin, que tiene símbolos
raros. Sin embargo, esos símbolos no son tantos y en ellos reside gran parte de la potencia de
este lenguaje.
Existe una gran cantidad de entornos en el mercado para desarrollar programas en C. Por
ejemplo, en Unix el compilador de C (cc) se distribuye junto con el sistema operativo de forma
gratuita, como una herramienta más. En los demás sistemas normalmente se debe adquirir como
un paquete aparte. En DOS/Windows existen varios paquetes en el mercado tales como Borland
C++, Microsoft Visual C++, Symantec C++ y Dev-C++.
2 Informática Industrial
2. CARACTERÍSTISCAS DE LENGUAJE C
Una de las grandes bazas del C es su portabilidad. Los programas en C pueden ser
trasladados a cualquier sistema existente tan sólo con recompilar el código.
Naturalmente hablamos de C estándar sin las extensiones propias de cada compilador.
I.E.S. “Cavanilles" 3
Distingue perfectamente entre mayúsculas y minúsculas. Por tanto cuando se declaren
variables hay que tener en cuenta de escribirlas exactamente igual. Ejemplo: Las
variables SUma y suma serán distintas. Las instrucciones se escribirán siempre en
minúsculas.
3. ESTRUCTURA DE UN PROGRAMA
Estructura de un programa
/*Primer programa en */
Comentarios
/*saludo.c*/
El orden de las diferentes declaraciones puede variar a gusto del programador, e incluso
pueden hacerse declaraciones de variables entre las instrucciones del programa. Aunque la
estructura anterior se puede seguir para realizar programas sencillos, cuando estos son más
complejos se suelen dividir en varios ficheros con las siguientes extensiones:
#include “mifichero.h”
♦ Los ficheros del código fuente, entre los que estaría el programa principal y los ficheros con
los subprogramas del usuario, se almacena con extensión .c.
4 Informática Industrial
3.1 COMENTARIOS
/* Es un ejemplo de comentario*/
Las directivas para el compilalador no son instrucciones ejecutables sino que sirven para
indicar al compilador, o más concretamente al preprocesador (editor con el que hacemos el
programa), una serie de acciones que se deben realizar durante la compilación. Entre estas
acciones estarían.
Directiva define
La directiva define se utiliza para declaración de constantes que se podrán utilizar siempre
que necesitemos. Su formato es: # define nombre valor.
Directiva include
El nombre del fichero debe ir entre < > si este forma parte de una librería de compilación o
entre doble comillas “” si se va especificar su ruta o path.
I.E.S. “Cavanilles" 5
Dentro de estas librerías tendremos, entre otras cosas, las funciones que vayamos a utilizar
a lo largo del programa. Cabe mencionar que el compilador por s mismo solo reconoce unos
pocos operadores (operadores aritméticos, lógicos, relaciones, etc), el resto de funciones están
incluidas en librerías. Si lo que pretendemos es realizar un programa para que funcione en un
ordenador y que el modo de introducir las entradas sea el teclado y de la salida sea el monitor,
deberemos siempre incluir <stdio.h> como librería, ya que es la que contiene dichas funciones.
3.3 CARACTERES EN C
Los caracteres en C pueden agruparse en letras, dígitos, espacios en blanco, caracteres
especiales, signos puntuación y secuencias de escape.
Los caracteres espacio en blanco, tabulador horizontal, tabulador vertical, avance de página
y nueva línea, son caracteres denominados caracteres en blanco sirven para hacer más legible el
programa. Por ejemplo:
main ()
{
printf ("Hola, que tal estais. \n");
}
Pero si se colocan en exceso los espacios en blanco son ignorados por el compilador. Hay
otros caracteres que tienen una función especial como son los siguientes: ; : “ { } y muchos otros.
Secuencias de escape
Se utilizan para poder sacar por pantalla ciertos elementos que no podemos escribir, como
nueva línea, tabular y para hacer referencia a caracteres no imprimibles. Así mismo, también se
utiliza para sacar por pantalla simbología con función especial. El lenguaje C tiene predefinidas las
siguientes secuencias de escape.
Secuencias de escape
\n Ir al principio de la siguiente línea
\t Tabulador horizontal
\v Tabulador vertical
\b Retroceso
\r Retorno de carro sin avance de línea
\f Alimentación de página
\a Alerta, pitido
\´ Comilla simple
\” Comilla doble
\\ Barra invertida
\ ddd Carácter ASCII. Representación octal
\ xdd Carácter ASCII. Representación hexadecimal
6 Informática Industrial
Identificadores
Los identificadores son nombres dados a constante, variables, tipos, funciones y etiquetas
de un programa. Los identificadores constan de uno o más caracteres (letras, dígitos) como norma
nunca debe ser el primer carácter debe ser una letra o un carácter subrayado.
Palabras clave
Existen una serie de identificadores predefinidos que tienen un significado especial para el
compilador, por tanto un identificador definido por el usuario no puede tener el mismo nombre que
una palabra clave.
Ejemplo1 de programa:
I.E.S. “Cavanilles" 7
3.4 TIPOS DE DATOS
En 'C' existen básicamente cuatro tipos de datos, aunque como veremos después‚si
podremos definir nuestros propios tipos de datos a partir de estos cuatro. A continuación se detalla
su nombre, el tamaño que ocupa en memoria y el rango de sus posibles valores.
Tipos de datos
Tipo Tamaño en Rango de valores
bits
char 8 -128 a 127
Tipos enteros:
int 16 -32768 a 32767
Todos los tipos enteros pueden llevar los modificadores signed (con signo) o con unsigned
(sin signo).
También pueden llevar los modificadores: short y long, los tipos int , así tendremos short
int o long int. También se aplica long a double, tendremos long double.
3.4.1 char
Se utiliza para caracteres y almacenan un valor entero entre –128 a 127 cuando la
definimos como char o signed char indistintamente. Cuando la definimos como unsigned char
su valor varía de 0 a 128.
signed char c;
unsigned char b;
8 Informática Industrial
3.4.2 int
Un short o short int (se puede poner de las dos forma) es un entero de tipo corto, cuyo
valor será menor o igual a int. Así normalmente los valores que toma son:
15 15
-32768 a 32767 ( -2 a 2 -1) para short o signed short ( short int o signed short int).
16
0 a 65535 (0a2 –1) para unsigned short (unsigned short int).
Un long o long int (se puede poner de las dos forma) es un entero de tipo corto, cuyo
valor será mayor o igual a int. Así normalmente los valores que toma son:
31 31
-2147483648 a 2147483647 ( -2 a 2 -1) para long o signed long ( long int o signed long int).
32
0 a 4294967295 (0a2 –1) para unsigned long (unsigned long int).
Notar que los cualificadores de tipo (short y long) pueden variar de formato (nº de
bytes usados) dependiendo del compilador. Normalmente se utilizará int y cuando el
rango nos exceda, podremos utilizar el long int. Siempre se podrá recurrir a un float,
aunque no utilicemos decimales, pero ocupará más memoria inútilmente.
3.4.3 float
Es un numero real con coma flotante, es un numero con decimales que puede estar
comprendido entre: 3.4 E-38 a 3.4E+38, tanto para valores positivos como para valores negativos.
El valor 3.4 E-38 nos indica la precisión o el valor más pequeño que puede representar, y 3.4E+38
el máximo valor que puede representar.
3.4.4 double
Es un numero real con coma flotante de doble precisión, que puede estar comprendido
entre: 1.7 E-308 a 1.7E+308
Puede tener el modificador long, que pasará de 64 bits a 80 bits pero se deberá poner como
long double tendrá una precisión de 3.4 E-4932 a 3.4E+4932. Se tratan ambos de un número
real con coma flotante con un rango mayor, tanto en la precisión como en el valor máximo.
I.E.S. “Cavanilles" 9
3.5 VARIABLES
<tipo> <nombre>;
int p;
p=25;
precio=300;
Es posible inicializar y declarar más de una variable del mismo tipo en la misma sentencia:
<tipo> <nombre1>,<nombre2>=<valor>,<nombre3>=<valor>,<nombre4>;
Como ampliaremos posteriormente las variables pueden ser globales o locales. Las globales
afectan a todo el programa y se declaran después de main () al iniciar el cuerpo del programa. Las
variables locales se declaran dentro de las funciones.
Ejemplo 2 de programa:
10 Informática Industrial
3.6 OPERADORES
Operadores aritméticos
Ejemplo 3 de programa:
I.E.S. “Cavanilles" 11
Operadores relacionales
Habrá que tener en cuenta la precedencia de los operadores a la hora de trabajar con ellos:
() Mayor precedencia
++, - -
*, /, %
+, - Menor precedencia
Las operaciones con mayor precedencia se realizan antes que las de menor precedencia. Si
en una operación encontramos signos del mismo nivel de precedencia, esta se realiza de
izquierda a derecha:
12 Informática Industrial
a+=5;
Ejemplo 5 de programa:
printf("a + 5 = %d\ n" ,a);
/* Uso de los operadores de asignación */
c-=1;
/* operad2.c */
printf("c - 1 = %d\ n" ,c);
#include <stdio.h>
b*=3;
main() /* Realiza varias operaciones */
printf("b * 3 = %d" ,b);
{
}
int a=1, b=2, c=3 ;
Las operaciones printf y scanf son de entrada y salida (E/S) por lo tanto no forman parte del
conjunto de sentencias de C sino que pertenecen al conjunto de funciones de la biblioteca
estándar de C. Por esta razón cualquier fichero fuente en el que se incluyan las operaciones E/S,
deberá contener la línea: # include <stdio.h>
La rutina printf permite la aparición de valores numéricos, caracteres y cadenas de texto por
pantalla. El prototipo de la sentencia printf es el siguiente:
printf(control,arg1,arg2...);
Modificadores Salida
%c Un único carácter (int).
%d Un entero con signo, en base decimal.
%i Un entero con signo, en base decimal.
%u Un entero sin signo, en base decimal.
%o Un entero en base octal.
%x Un entero sin signo en base hexadecimal letras en minúsculas. %X (mayúsculas)
%e Un número real en coma flotante, con exponente en minúscula. %E (mayúsculas)
%f Un número real en coma flotante, sin exponente.
%g Un número real en coma flotante, con formato %f o %e. (%G en mayúsculas)
%s Una cadena de caracteres
%p Un puntero o dirección de memoria
I.E.S. “Cavanilles" 13
%n Un puntero a un entero, en el cual se almacena el tamaño de l buffer.
El formato completo de los modificadores es el siguiente:
Longitud: especifica la longitud máxima del valor que aparece por pantalla. Si la longitud es
menor que el número de dígitos del valor, este aparece ajustado a la izquierda.
Debemos tener en cuenta que los modificadores entre corchetes [ ] son opcionales.
La rutina scanf permite entrar datos en la memoria del ordenador a través del teclado. El
prototipo de la sentencia scanf es el siguiente:
scanf(control,arg1,arg2...);
En la cadena de control indicaremos, por regla general, los modificadores que harán
referencia al tipo de dato de los argumentos. Al igual que en la sentencia printf los modificadores
estarán formados por el carácter % seguido de un carácter de conversión. Los argumentos
indicados ser n, nuevamente, las variables.
Ejemplo 8 de programa
/* La suma de dos numeros*/
/*suma.c*/
#include<stdio.h>
main ()
{
int dato1, dato2,suma;
printf ("Introduce dos numeros: ");
scanf ("%d \n %d",&dato1,&dato2);
/*resultado*/
suma = dato1 + dato2;
printf ("La suma es: %d + %d = %d",dato1,dato2,suma);
}
Ejercicios propuestos:
1. El ejemplo 8 modifícalo para que no solo obtengas la suma, sino también la resta, la división y
la multiplicación, con un formato similar al que tiene la suma.
2. Realizar un programa que calcule los intereses producidos y el capital total acumulado de una
cantidad c, invertida a un interés r durante t días.
c⋅r ⋅t
La fórmula utilizada para el calculo de los intereses es: I =
360 ⋅ 100
Siendo: I = Total intereses a pagar.
c = Capital.
r = Tasa de interés nominal en tanto por ciento.
t = Período de cálculo en días.
4 3
3. Realizar un programa que calcule el volumen de una esfera, cuya fórmula es: v = πr
3
I.E.S. “Cavanilles" 15
4. SENTENCIAS DE CONTROL
4.1 SENTENCIA IF
La sentencia if permite a un programa tomar una decisión para ejecutar una acción u otra,
basándose en el resultado verdadero o falso de una expresión. La sintaxis es la siguiente:
Se evalúa la condición.
16 Informática Industrial
4.1.1 ANIDAMIENTO DE SENTENCIAS IF
Las sentencias if...else pueden estar anidadas. Con la siguiente sintaxis por ejemplo:
I.E.S. “Cavanilles" 17
Estructura else if
Es una estructura que aparece con bastante frecuencia, es consecuencia de las sentencias
if anidadas. Tiene la siguiente sintaxis.
18 Informática Industrial
4.2 SENTENCIA SWITCH
Permite ejecutar una o varias acciones, en función del valor de una expresión. Es una
sentencia especial para decisiones multiples. La sintaxis a utilizar es la siguiente.
switch (expresión)
{
case valor1: sentencias 1; break;
case valor2: sentencias 2; break;
case valor3: sentencias 3; break;
..............
case valorN: sentencias N; break;
default: sentencias_por_defecto;
}
Primero se evalúa la expresión y se ejecutan las sentencias de la rama cuyo valor coincida
con el de la expresión. La expresión puede debe ser entera, o un char con valor entero o una
constante entera.
Ejemplo 12 de programa:
case 1:
/*Días correspondientes a un mes de un año case 3:
dado*/
case 5:
/*dias.c*/
case 7:
#include <stdio.h>
case 8:
case 10:
main()
case 12:
{
dd = 31;
unsigned int dd = 0, mm = 0, aa = 0;
break;
printf("Introducir mes (##) y año (####): ");
case 4:
scanf("%d %d", &mm, &aa);
case 6:
switch (mm)
case 9:
{
case 11:
I.E.S. “Cavanilles" 19
dd = 30; printf("\nEl mes no es valido\n");
break; break;
case 2:
if ((aa % 4 == 0) && (aa % 100 != 0) || }
(aa % 400 == 0)) if (mm >= 1 && mm <= 12)
dd = 29; printf("\nEl mes %d del año %d tiene %d
else dias\n", mm, aa, dd);
dd = 28;
break; }
default:
Ejercicio propuesto:
Realizar un programa que pida “Dar el número del día de la semana” y escriba el
equivalente en letras.
Las sentencias repetitivas o bucles son estructuras que permiten ejecutar partes del código
de forma repetida mientras se cumpla una condición. Esta condición puede ser simple o
compuesta de otras condiciones unidas por operadores lógicos. Existen tres tipos principales:
while, do y for.
La sentencia while repite una o varias sentencias mientras el valor de una condición sea
verdadero. La sintaxis es la siguiente:
While (condición)
Sentencia_que_se_repite;
Ejemplo 13 de programa: {
/* Uso de la sentencia WHILE. */ int numero=1;
/*while.c*/ while(numero<=25)
#include <stdio.h> {
#include <stdlib.h> printf("%d\n",numero);
main() /* Escribe los números del 1 al 25 */ numero++;
20 Informática Industrial
} Ejemplo 14 de programa:
system("PAUSE"); /* Uso de la sentencia WHILE. */
} /*divisor.c*/
#include <stdio.h>
#include <stdlib.h>
main()
{
int num,divisor;
printf("Numero:...");
scanf("%d",&num);
divisor=num;
while(divisor>0)
{
if (num % divisor ==0)
printf("El numero %d es divisor de
%d\n",divisor,num);
divisor --;
} system("PAUSE");
}
La sentencia do while repite una o varias instrucciones hasta que se cumpla una condición.
La condición se evalúa después de ejecutar las sentencias del bucle. La sintaxis es la siguiente:
do {
sentencia_que_se_repite
}
while (condición);
La sentencia for permite repetir una o varias tantas veces como indique una variable. La
condición se evalúa despees de ejecutar las sentencias del bucle. La sintaxis es la siguiente:
La Condición_fin provoca el fin del bucle cuando su valor sea falso (Ejemplo: i <= 5).
El incremento es una o varias instrucciones separadas por comas, que se ejecuta una vez en
cada ejecución del bucle antes de evaluar la Condición_fin. Suele ser la instrucción de
incremento de la variable indice ( Ejemplo: i ++).
Ejemplo 17 de programa:
Ejemplo 18 de programa: }
/*bucle.c*/
#include <stdio.h>
void main()
{
int i = 1, j = 1;
while ( i <= 3 ) /* mientras i sea <=3 */
{
printf("Para i = %d: ", i);
while ( j <= 4 ) /* mientras j sea <= que 4 */
{
printf("j = %d, ", j);
j++;
}
printf("\n");
i++; /* aumentar i en una unidad */
j = 1; /* inicializar j de nuevo a 1 */
}
getch();
I.E.S. “Cavanilles" 23
Ejemplo 19 de programa: z = sqrt(x * x + y * y);
/* Teorema de Pitágoras*/ while (y <= 50 && z <= 50)
/*Imprime los valores z, comprendidos entre 1 {
y 50, que cumplan la expresión z2 = x2 + y2 */ /* Si la raíz cuadrada anterior fue exacta,
/* pitagoras.c*/ escribir z, x e y */
#include <stdio.h> if (z * z == x * x + y * y)
#include <math.h> printf("%10d %10d %10d\n", z, x, y);
void main() y = y + 1;
{ z = sqrt(x * x + y * y);
unsigned int x = 1, y = 1, z = 0; }
printf("%10s %10s %10s\n", "Z", "X", "Y"); x = x + 1; y = x;
printf(" ___________________________\n"); }
while (x <= 50) getch();
{ }
/* Calcular z. Como z es un entero, almacena
la parte entera de la raíz cuadrada */
La sentencia break finaliza la ejecución de una sentencia switch, while, do o for en la cual
aparece. Tal como hemos visto en switch.
− b ± b 2 − 4ac
En los demás casos, utilizaremos la fórmula siguiente: xi =
2a
x + yi
Si d es menor 0 entonces hay dos raíces complejas de la forma:
x − yi
2. Realizar un programa que pida una fecha , de la forma: dd de mm de aaaa, donde dd, mm y
aaaa son enteros. Este programa debe averiguar su número del Tarot, sumando los números
de su fecha de nacimiento y a continuación los reduce a un solo dígito; por ejemplo si su fecha
de nacimiento fuera 17 de Octubre de 1970, los cálculos serían:
17 + 10 + 1970 = 1997 ⇒ 1 + 9 + 9 + 7 = 26 ⇒ 2 + 6 = 8
5. FUNCIONES
En C como en la mayoría de los lenguajes, existen funciones que son bloques de código
utilizados para dividir un programa en partes más pequeñas (subprogramas), cada una de las
cuáles tendrá una tarea determinada. Su sintaxis es:
tipo_función: puede ser de cualquier tipo de los que conocemos. El valor devuelto por la
función será de este tipo. Por defecto, es decir, si no indicamos el tipo, la función devolverá
un valor de tipo entero (int). Si no queremos que retorne ningún valor deberemos indicar el
tipo vacío (void).
tipo y nombre de argumentos: son los parámetros que recibe la función. Los argumentos
de una función no son más que variables (locales) definidas en la función, que reciben un
valor. Este valor se lo enviamos al hacer la llamada a la función. Pueden existir funciones
que no reciban argumentos.
declaración de variables locales: son las variables declaradas dentro de la función y por
tanto solo son accesibles dentro de la función.
retorno a un valor: las funciones pueden retornar un valor. Esto se hace mediante la
instrucción return, que finaliza la ejecución de la función, devolviendo o no un valor. En
una misma función podemos tener más de una instrucción return. El valor devuelto por la
función debe asignarse a una variable. De lo contrario, el valor se perderá.
Las funciones pueden ser llamadas desde la función main o desde otras funciones. Nunca
deben llamar a la función main. Por último recalcar que los argumentos de la función y sus
variables locales se destruirán al finalizar la ejecución de la misma. Su sintaxis puede ser también:
Según el lugar donde son declaradas puede haber dos tipos de variables:
Locales: las variables son creadas cuando el programa llega a la función en la que están
definidas. Al finalizar la función desaparecen de la memoria.
26 Informática Industrial
Si dos variables, una global y una local, tienen el mismo nombre, la local prevalecerá sobre
la global dentro de la función en que ha sido declarada. Dos variables locales pueden tener el
mismo nombre siempre que estén declaradas en funciones diferentes
Al igual que las variables, las funciones también han de ser declaradas. Esto es lo que se
conoce como prototipo de una función. Para que un programa en C sea compatible entre distintos
compiladores es imprescindible escribir los prototipos de las funciones. Los prototipos de las
funciones pueden escribirse antes de la función main o bién en otro fichero. En este último caso
se lo indicaremos al compilador mediante la directiva #include.
I.E.S. “Cavanilles" 27
int suma(x,y) Ejemplo 25 de programa:
int x,y; /* Paso de parámetros. */
{ /*funcion3.c*/
return x + y; #include <stdio.h>
} int suma(int,int); /* prototipo */
main() /* Realiza una suma */
{
int a=10,b=25,t;
t=suma(a,b);/*guardamos el
valor */
printf("%d=%d",suma(a,b),t);
suma(a,b); /* el valor se pierde
sino lo asigno a una variable con
un printf */
getch();
}
int suma(int a,int b)
{
return (a+b);
}
5.3 PASO DE PARAMETROS A UNA FUNCIÓN
Como se ha visto las funciones pueden retornar a un valor mediante la sentencia return.
Esta sentencia tiene dos usos importantes:
Uno de ellos se utiliza par provocar la salida inmediata de una función en la que esta,
volviendo al programa que llamo esta función.
Ejemplo 26 de programa: {
/*Un numero elevado a una potencia positiva*/ float i;
/*exponente.c*/ if (exp < 0)
#include <stdio.h> return ; /* no funciona con números negativos*/
potencia(int base,int exp); i=1;
main() for ( ;exp;exp --)
{ i = base * i ;
int a,b; /* variable local */ printf ("La respuesta es: %f",i);
for(;;) }
{ Ejemplo 27 de programa:
printf("\nValor de a: "); /*Un numero elevado a una potencia positiva/
scanf("%d",&a); /*exponente.c*/
printf("Valor de b: "); #include <stdio.h>
scanf("%d",&b); float potencia(int base,int exp);
potencia(a,b); main()
} {
getch(); int a,b; /* variable local */
} for(;;)
potencia(int base,int exp) {
28 Informática Industrial
printf("\nValor de a: "); {
scanf("%d",&a); float i;
printf("Valor de b: "); if (exp < 0)
scanf("%d",&b); return ; /* no funciona con números negativos*/
printf("La respuesta es: %f\n",potencia(a,b)); i=1;
} for ( ;exp;exp --)
getch(); i = base * i ;
} return(i);
float potencia(int base,int exp) }
Por valor: cualquier cambio que se realice dentro de la función en el argumento enviado, NO
afectará al valor original de las variables utilizadas en la llamada. Es como si trabajáramos con
una copia, no con el original. No es posible enviar por valor arrays, deberemos hacerlo por
referencia.
Para enviar un valor por referencia se utiliza el símbolo & delante de la variable enviada.
Esto le indica al compilador que la función que se ejecutará tendrá que obtener la dirección de
memoria en que se encuentra la variable.
Las variables con un * son conocidas como punteros (almacena una dirección de memoria),
devuelven el valor de la variable situada en la dirección de memoria de esa variable.
Ejemplo 28 de programa: }
/* Paso por valor. */ Ejemplo 29 de programa:
/*funcion4.c*/ /*funcion5.c*/
#include <stdio.h> #include <stdio.h>
void intercambio(int,int); void intercambio(int *,int *);
main() /* Intercambio de valores */ main() /* Intercambio de valores */
{ {
int a=1,b=2; int a=1,b=2;
printf("Tenemos que a=%d y b=%d \n",a,b); printf("Tenemos que a=%d y b=%d \n",a,b);
intercambio(a,b); /* llamada */ intercambio(&a,&b); /* llamada */
printf("\nNos queda al final a=%d y b=%d",a,b); printf("\nNos queda al final a=%d y b=%d",a,b);
getch(); getch();
} }
void intercambio (int x,int y) void intercambio (int *x,int *y)
{ {
int aux; int aux;
aux=x; aux=*x;
x=y; *x=*y;
y=aux; *y=aux;
printf("a=%d y b=%d",x,y); printf("a=%d y b=%d",*x,*y);
I.E.S. “Cavanilles" 29
}
Todo programa tiene una función main principal, es el punto de entrada y de salida del
programa. Hay compiladores que no requieren tipo retornado como el Dev-C++, generalmente
debería hacerse ya que hay compiladores que dan un mensaje de aviso. Los tipos retornados son
int o void se hace de la siguiente forma:
Ya hemos visto que las funciones pueden recibir argumentos. Pues bien, la función main no
podía ser menos y también puede recibir argumentos, en este caso desde el exterior. Los
argumentos que puede recibir son:
argv: es un puntero a un array de cadenas de caracteres que contiene los argumentos, uno
por cadena. En este ejemplo vamos a ver un pequeño programa que escribirá un saludo por
pantalla.
30 Informática Industrial
6. ARRAYS
Un array es un identificador que referencia un conjunto de datos del mismo tipo, se podrá
utilizar un dato u otro con sólo cambiar el índice que lo referencia. El índice será un valor entero y
positivo. En C los arrays comienzan por la posición 0.
Ejemplos:
int lista [100]; /*lista de 100 elementos*/
char nombre [40] /*una cadena de 40 elementos*/
Ejemplos:
I.E.S. “Cavanilles" 31
/*arrays1a.c*/ Ejemplo 32 de programa:
#include <stdio.h> #include <stdio.h>
main() /* Rellenamos del 0 - 9 */ /*arrays1b.c*/
{ #define N_ELEMENTOS 15 /*número de elementos
int vector[10],i; del array */
for (i=0;i<10;i++) void main()
vector[i]=i; {
for (i=0;i<10;i++) int a[N_ELEMENTOS]; /* array a */
printf(" %d",vector[i]); int i = 0; /* subíndice */
getch(); printf("Introducir los valores del array.\n");
} for (i = 0; i < N_ELEMENTOS; i++)
{
printf("a[%d]= ", i);
scanf("%d", &a[i]);
}
/* Salida de datos */
printf("\n\n");
for (i = 0; i < N_ELEMENTOS; i++)
printf("%d ", a[i]);
printf("\n\nFin del proceso.\n");
getch();
}
Una particularidad con los arrays de tipo char (cadena de caracteres), es que deberemos
indicar en que elemento se encuentra el fin de la cadena mediante el caracter nulo (\0). Esto no lo
controla el compilador, y tendremos que ser nosotros los que insertemos este carácter al final de
la cadena.
getche(): Lee un carácter del teclado con eco, no espera por retorno de carro.
getch(): Leé un carácter del teclado, no hace eco y no espera por retorno de carro.
Ejemplos:
int c [2] [3] ; o también se puede inicializarla a la vez que se declara de dos formas
distintas:
Para acceder a los datos de los arrays lo haremos con subíndices, el primero indicará la fila
y el siguiente la columna:
Columna 0 Columna 1 Columna 2
Fila 0 c [0] [0] c [0] [1] c [0] [2]
Fila 1 c [1] [0] c [1] [1] c [1] [2]
I.E.S. “Cavanilles" 33
Haciendo uso de la siguiente fórmula podemos averiguar el número de bytes de memoria
usados por un array:
34 Informática Industrial
6.2.1 ARRAYS CADENAS DE CARACTERES BIDIMENSIONALES
char lista [3] [6]; /* tres cadenas de seis cararacteres cada una */
lista[0]
lista[1]
lista[2]
Los arrays lista[0], lista[1] y lista[3] son tres cadenas de caracteres de 6 elementos cada
una.
La matriz tridimensional se utiliza, por ejemplo, para trabajos gráficos con objetos 3D.
Ejemplo 38 de programa:
/*suma2.c*/
int suma(int x,int y)
{
return x + y;
}
8. NÚMEROS ALEATORIOS
I.E.S. “Cavanilles" 35
/* adivina2.c*/ num = rand() % (10);
#include <stdio.h> printf(“\n Dime un numero entre 0 y 10: “);
#include <stdlib.h> scanf(“%d”,&mio);
#include <time.h> if (num == mio)
main(void) printf(“Acertaste\n”);
{ else
int num,mio; printf(“Fallaste\n”);
for (;;) printf(“ Mio = %d, Num = %d”,mio,num);
{ }
randomize(); }
36 Informática Industrial