Está en la página 1de 163

Fundamentos de programación para ingenieros

Cristóbal González Jaime

ÍNDICE

TEMA 1: Algorítmico y lenguaje C. Definiciones

 

5

TEMA 2: El entorno de programación

 

7

TEMA 3: Estructura de un programa

15

TEMA 4: Conceptos básicos

19

Tipos de datos

21

Variables simples

21

Datos de tipo lógico

22

Espacio que ocupan los datos

23

Identificadores. Reglas

23

Instrucciones básicas

24

Instrucciones de asignación

26

Formatos de printf(

)

y scanf(

)

27

Redondeo

 

28

Operadores

30

Moldes

34

TEMA 5: Control de un flujo de programa

 

39

Ejecución condicionada

40

Bloques repetitivos (bucles)

 

44

Bloques repetitivos condicionados al inicio. while(

)

44

Bloques repetitivos condicionados al final. do

while( )

46

Bloques repetitivos con contador. for(

)

47

Diferencias entre for(

)

y while(

)

50

TEMA 6: Variables estructuradas I. Arrays

57

Arrays unidimensionales

59

Arrays bidimensionales

66

Cadenas

70

TEMA 7: Ficheros de texto

 

73

Declaración de ficheros

74

Apertura de un fichero

74

Cerrar un fichero

 

75

Lectura y escritura en ficheros

76

Sentencia feof(

)

77

TEMA 8: Variables estructuradas II. Tuplas

 

83

Declaración de una tupla

85

Manejo de tuplas

86

TEMA 9: Diseño descendente

 

95

Sintaxis de una función

96

Funciones con retorno

97

Funciones con parámetros de entrada

98

Funciones con parámetros de entrada y salida

100

Caso especial de los arrays

102

TEMA 10: Números aleatorios

 

113

COLECCIÓN DE PROBLEMAS RESUELTOS

 

119

TEMA 1

Algorítmico y lenguaje C. Definiciones

El lenguaje Algorítmico

El lenguaje Algorítmico no es un lenguaje de programación, sino un pseudolenguaje. Su función es la de hacer que un programa informático resulte más

sencillo y fácil de entender por la persona. El lenguaje Algorítmico en el que se resuelven los ejercicios en estos apuntes está basado en el lenguaje C (que si es un lenguaje de programación de alto nivel) y es, prácticamente, la traducción simplificada

al español del lenguaje C.

Por algoritmo entendemos a una serie de operaciones necesarias para resolver un

determinado problema. Así, por ejemplo, si queremos hallar cuál es el número más alto de una serie, podemos proceder tomando el primer valor, comparándolo con el segundo

y quedándonos con el mayor de los dos, el cual será comparado con el tercero y así

sucesivamente hasta llegar al último valor de la serie; pues bien, a esta serie de operaciones repetitivas la podemos considerar el algoritmo solución de nuestro problema.

El lenguaje C

El lenguaje C es un lenguaje de programación de alto nivel, esto quiere decir que

presenta una lógica y unas expresiones relativamente fáciles de comprender y cercanas

al razonamiento humano. Un lenguaje de programación permite la traducción a código

máquina (unos y ceros) a través del uso de un compilador. Actualmente el lenguaje C está obsoleto como lenguaje de programación, no obstante sirve de puente para el aprendizaje de C++ y de otros lenguajes de programación más potentes. La principal característica del lenguaje C es la portabilidad, esto es, el poder usar un programa en un ordenador ajeno al equipo en el que el programa fue creado, para ello sólo es necesario una nueva compilación en el equipo en el que se desea ejecutar el programa.

No existen unas normas fijadas de traducción a lenguaje C a partir de lenguaje Algorítmico, por tanto, es necesario dominar C mediante la realización de ejercicios sencillos antes de usar el pseudolenguaje; es del todo desaconsejable pretender manejar sólo el lenguaje Algorítmico y “aprender” normas para traducir a lenguaje C los algoritmos para poder crear los programas.

TEMA 2

El entorno de programación

Introducción

Hoy en día el lenguaje C es un lenguaje de programación cuya historia ha estado vinculada a la informática en sus albores, el lenguaje C con sus más de 35 años de historia es un viejo fósil que ha caído en desuso práctico. Actualmente la programación apunta hacia la programación orientada al objeto y existen otros lenguajes que trabajan así, entre ellos el C++, hermano mayor del lenguaje C cuyo aprendizaje supone hoy el porqué de la existencia del C. Así pues, no existen en la actualidad entornos de programación específicos para C; no obstante, los entornos de C++ admiten que se trabaje, compile, etc en lenguaje C. Nuestro entorno de programación será el Borland C++ Builder, versión 3.0; como estos apuntes no tienen como propósito el aprendizaje del manejo de dicho programa, me limitaré a explicar como se prepara el programa para empezar a realizar nuestros proyectos y como podemos salvar estos proyectos.

Comenzar a trabajar

Al iniciar el programa aparecen abiertas varias ventanas, para empezar:

1. Debemos ir directamente a la opción “File” de la barra de herramientas y seleccionar la opción “New”.

barra de herramientas y seleccionar la opción “New”. 2. Nos aparecerá una ventana llamada “New Items”,

2. Nos aparecerá una ventana llamada “New Items”, debemos resaltar la opción “Console Wizard” y clicar sobre “OK”

3. Al aceptar, aparece una nueva ventana, en ella debemos asegurarnos de que la opción

3. Al aceptar, aparece una nueva ventana, en ella debemos asegurarnos de que la opción “Console” está seleccionada y que también lo está la opción “EXE”.

debemos asegurarnos de que la opción “Console” está seleccionada y que también lo está la opción

4.

Una vez pulsamos “Finish”, nos aparece una ventana con el fondo blanco, debemos

borrar lo que aparece escrito en ella, ya que es en esta ventana donde debemos escribir

el código fuente (programa en C) de nuestro programa.

el código fuente (programa en C) de nuestro programa. Corregir nuestro trabajo 1. Una vez hemos

Corregir nuestro trabajo

1. Una vez hemos terminado de escribir nuestro programa en lenguaje C, debemos

compilarlo, con esta operación veremos si el programa contiene errores de escritura. Si no hemos puesto un punto y coma, falta o sobra una llave, si hemos olvidado declarar una variable, etc, el Borland lo detectará al compilar y nos dirá donde está el error.

Para compilar el programa pulsamos <ctrl.+F9> o bien seleccionamos la opción “Project” de la barra de herramientas y pulsamos sobre la opción “Make project”. El resultado será:

2. Nos aparece al compilar una nueva ventana con el nombre “Compiling”, en ella se

2. Nos aparece al compilar una nueva ventana con el nombre “Compiling”, en ella se señalan el número de errores y de “warnings”, que son errores leves con los que el programa podría funcionar. Aceptamos y nos centramos sobre lo siguiente:

Debajo de la ventana de nuestro código fuente se amplia una nueva ventana que nos informa de dónde están los errores y de que tipo de errores se trata.

En nuestro caso leemos:

[C++Error]Project2.cpp[8]: Statement missing ;

Esto quiere decir que nuestro programa, llamado Project2, tiene un error en la línea 8, tal error es la ausencia de un punto y coma.

3. Corregimos el error, ignoramos el warning de momento y volvemos a compilar obteniendo:

el warning de momento y volvemos a compilar obteniendo: Hemos resuelto el problema satisfactoriamente, aceptamos,

Hemos resuelto el problema satisfactoriamente, aceptamos, podemos ejecutar el programa pulsando <F9> o bien con la opciones que encontramos en “Run”: Run, Run to cursor, Step over, etc.

pulsando <F9> o bien con la opci ones que encontramos en “Run”: Run, Run to cursor,

Al ejecutar nuestro programa aparece una ventana del viejo sistema operativo MS-DOS,

en ella podremos leer aquellos printf (

programa nos pide el radio de un círculo:

)

que se ejecuten al inicio; en nuestro caso, el

leer aquellos printf ( programa nos pide el radio de un círculo: ) que se ejecuten

Guardar nuestro trabajo

Una vez hemos visto que nuestro programa se ejecuta de forma satisfactoria, procedemos a guardarlo en disco. Un programa puede haberse compilado sin errores y sin embargo no realizar correctamente la tarea que se le exige. Para salvar nuestro programa elegimos la opción “File” de la barra de herramientas y luego “Save as”.

de la barra de herramientas y luego “Save as”. Nos aparecerá la típica ventana de Windows

Nos aparecerá la típica ventana de Windows para guardar archivos, elegimos donde y ponemos un nombre adecuado a nuestro programa.

la típica ventana de Windows para guardar archivos, elegimos donde y ponemos un nombre adecuado a

TEMA 3

Estructura de un programa

Partes de un programa en lenguaje C

A continuación se describen las partes de las que puede estar formado un programa en

lenguaje C, algunas son prescindibles, como el comentario inicial; otras, en cambio son obligatorias como el bloque de definiciones.

En un programa completo en C se distinguen las siguientes partes:

1º. Comentario inicial: Se escribe al inicio del código fuente, en él se detalla qué hace

el programa, qué ficheros de texto usa, etc. El comentario inicial debe escribirse entre

para que sea ignorado por el programa compilador; en él, los

los símbolos /*

comentarios apareceran en color azúl marino. Es aconsejable añadir, además, otros

comentarios durante el programa que faciliten su posterior entendimiento.

*/

2º. Bloque de declaraciones: Son las primeras líneas no ignoradas por el compilador. En este bloque se cargan las librerías de funciones (ficheros include) y se declaran las constantes que van a ser necesarias (define).

Los ficheros include que se verán en estos apuntes son:

stdio.h

Librería estándar de entrada y salida.

stdio.h Librería estándar de entrada y salida. math.h Funciones matemáticas.   stdlib.h Funciones
stdio.h Librería estándar de entrada y salida. math.h Funciones matemáticas.   stdlib.h Funciones

math.h

Funciones matemáticas.

 

stdlib.h

Funciones estándar del lenguaje C.

 

string.h

Gestión de cadenas de caracteres.

 

malloc.h

Gestión dinámica de memoria.

 

process.h

Permite

hacer

llamadas

al

sistema

operativo (MS-DOS).

 

time.h

Funciones de fecha y hora.

 

Los ficheros include más importantes son stdio.h, math.h, stdlib.h y string.h. En el bloque de declaraciones se escribe:

#include <stdio.h>

Las constantes como el número π, el tamaño de un vector o de una cadena, se definen

en el bloque de declaraciones de la forma:

#define pi 3.1415927

3º. Declaración de funciones: Las funciones creadas por el programador deben ser declaradas en este bloque. Se trata de subprogramas que realizan una determinada función y que han sido creados por el programador. Veremos cómo se crean funciones

en el tema 9 (Diseño Descendente).

int leerfichero(char nomfich[20], double v[N]);

4º. Programa principal: El programa principal dirige el flujo del programa llamando a las distintas funciones conforme sea necesario. Puede llamarse:

void main(void)

no necesita retorno.

{

}

int main()

debe acabar con retorno.

{

return 0;

}

5º. Definición de funciones: Aquí deben ir las distintas funciones que va a usar el programa y que han sido declaradas previamente en el bloque 3º. Es aconsejable anteponer un comentario aclaratorio a cada función, que aclare cual es su uso, las variables de entrada y de salida, etc. Por ejemplo:

/*Funcion que escribe un menu en pantalla, retorna la opción elegida por el usuario*/ int menu(void)

{

int opcion;

printf("1. Suma.\n2. Resta.\n3. Producto.\n4. Cociente.\n0. Salir.\n\nOpcion: "); scanf("%d", &opcion); system("cls"); return (opcion);

}

Ejemplo de programa completo en lenguaje C

Comentario inicial:

/*Programa ejemplo de las partes de un programa típico: Cálculo del área de un círculo.*/

Bloque de declaraciones:

#include <stdio.h> #define pi 3.1415927

Declaración de funciones:

double area (double radio);

Programa principal:

void main (void)

{

double r; double superficie; printf (“\nIntroduce el radio del circulo: “);

scanf (“%lf”, &r); superficie=area(r); printf (“\nEl area del círculo de radio %lf es: \n %lf”, r, superficie); fflush (stdin); getchar ();

}

Definición de funciones:

/*función para calcular el area de un círculo a partir del radio*/

double area (double radio)

{

double result;

result=radio*radio;

result=result*pi;

return result;

}

TEMA 4

Conceptos básicos

Introducción

Una variable puede entenderse que es un espacio (de la memoria), el cual se reserva para el almacenamiento de un dato. El tamaño de una variable depende del tipo de dato que en ella se vaya a almacenar. Antes de usar una variable ésta debe ser creada, es decir, debemos reservar el espacio de memoria que necesitaremos con posterioridad, una variable se crea en la declaración de variables; la declaración de variables es una parte común de todos los programas en cualquier lenguaje de programación.

Podemos hacernos una idea gráfica de la memoria observando la desfragmentación de una unidad en un ordenador con el sistema operativo Windows.

de la memoria observando la desfragmentación de una unidad en un ordenador con el sistema operativo

Tipos de datos

Los datos pueden ser simples o compuestos, predefinidos o definidos por el usuario. Por el momento sólo nos vamos a ocupar de los datos simples. En estos apuntes se van a ver los siguientes tipos de datos simples:

Entero: números enteros (0, 1, 2, 3

)

Real: Números decimales (12.345672, 1.7)

Carácter: Letras (a, b, c

)

Lógico: Sólo en algorítmico (verdadero o falso)

Cadena: Sólo en algorítmico (palabras y enteros de más de 10 cifras)

Variables simples

Entendemos por variables simples a aquellas que almacenan datos simples. Anteriormente hemos mencionado que para usar una variable en un programa es necesario que ésta haya sido previamente declarada. En la declaración de una variable debemos especificar siempre el nombre de la variable y el tipo de dato para el que se usará dicha variable.

Existen diferencias entre el lenguaje C y el Algorítmico a la hora de declarar las variables:

1ª. En Algorítmico las variables se declaran siempre por valor, reservando un espacio en la memoria para introducir un valor. En C las variables se pueden declarar también por dirección, reservando una dirección (PUNTERO).

Declaración por valor. ALGORÍTMICO Var numero: entero num: real letra: carácter Fvar C int numero;

Declaración por valor.

ALGORÍTMICO

Var

numero: entero

num: real

letra: carácter

Fvar

Var numero: entero num: real letra: carácter Fvar C int numero; double num; char letra;

C

int numero;

double num;

char letra;

Declaración por

dirección.

int *numero;

double *num;

char *letra;

2º. En Algorítmico, las variables son declaradas al principio del programa mediante la sentencia Var…Fvar. En C, aunque no sea aconsejable en la mayoría de los casos, las variables pueden ser declaradas en cualquier momento.

Tipo de dato

Declaración en Algoritmico

Declaración en C

de dato Declaración en Algoritmico Declaración en C Carácter letra: cadena char letra; Entero
de dato Declaración en Algoritmico Declaración en C Carácter letra: cadena char letra; Entero
de dato Declaración en Algoritmico Declaración en C Carácter letra: cadena char letra; Entero

Carácter

letra: cadena

char letra;

Entero

num1: entero

int num1;

Real

num2: real

double num2;

Cadena nombre: cadena char nombre[20]; Lógico error: logico int error;
Cadena nombre: cadena char nombre[20]; Lógico error: logico int error;
Cadena nombre: cadena char nombre[20]; Lógico error: logico int error;

Cadena

nombre: cadena

char nombre[20];

Lógico

error: logico

int error;

Datos de tipo lógico

En lenguaje C no existe este tipo de datos, las variables de tipo lógico que usamos en Algorítmico deben ser declaradas variables de tipo entero int en C. En lenguaje C, el concepto de verdadero o falso viene expresado de la siguiente manera:

Todo valor distinto de 0 es verdadero y el valor 0 se considera falso.

Ejemplo

/*Programa que determina si un número es positivo o negativo*/

#include <stdio.h>

void main(void)

{

int log;

/*variable de tipo lógico*/

int a;

printf("\nIntroduce un numero: "); scanf("%d", &a);

log=a<0;

/*si a<0 log recibe un valor distinto de 0, verdadero*/

if(log)

{

printf("\El numero es negativo");

}

else

{

printf("\El numero es positivo");

}

fflush(stdin);

getchar();

}

Espacio que ocupan los datos

Hemos dicho que a una variable la podemos considerar un espacio en el que podemos guardar de forma momentánea un dato; pues bien, en función del tipo de dato para el que se haya declarado la variable, se reservará un espacio de un determinado tamaño en la memoria del ordenador. En la siguiente tabla se muestra el espacio que ocupan los datos vistos hasta ahora.

Tipo de dato Algorítmico C   Carácter char Número entero Entero Espacio reservado 8 bits

Tipo de dato

Algorítmico

C

 

Carácter

char

Número entero

Entero

C   Carácter char Número entero Entero Espacio reservado 8 bits Carácter   int 16
C   Carácter char Número entero Entero Espacio reservado 8 bits Carácter   int 16

Espacio reservado

8 bits

Carácter

Carácter   int 16 bits Número decimal Real double 64 bits
 

int

16

bits

Número decimal

Real

double

64

bits

Carácter   int 16 bits Número decimal Real double 64 bits

Identificadores. Reglas

Bajo el término de identificadores se engloban los nombres de variables, nombres de funciones, nombres de constantes, etc.

En lenguaje C existen una serie de reglas sobre identificadores, estas son:

El primer carácter debe ser una letra o el guión bajo (_).

Debe tener como máximo 31 caracteres.

No pueden usarse letras acentuadas, la letra ñ ni caracteres especiales

(%, #, etc). No pueden utilizarse las palabras reservadas (main, char, int, double,

etc.). No se permiten espacios (nombre de variable 1).

Instrucciones básicas

Distinguimos tres tipos de instrucciones:

Entrada de datos.

Salida de datos.

Asignación.

Las funciones y operadores que usaremos serán distintas para C y para Algorítmico.

Instrucciones de entrada de datos

La instrucción leer (

)

nos permite leer datos que han sido introducidos por

teclado y están escritos en pantalla, el siguiente programa en Algorítmico lee un dato de tipo real y lo almacena en la variable dato.

Accion principal

Var

Fvar

leer (dato)

Faccion

dato: real

En C, el proceso es algo más complejo. La función que debemos usar es scanf ( mismo ejemplo anterior:

void main(void)

), el

{

double dato;

scanf (“%lf”, &dato);

}

La sintaxis de la función scanf(

scanf (“<formato del tipo de dato>”, &<nombre de la variable donde se almacenará>);

Esta función se usa para capturar datos de la pantalla y asignarlos a variables. Únicamente.

) es siempre:

Instrucciones de salida de datos

Las funciones de salida de datos permiten mostrar en pantalla el contenido de

una variable. En algorítmico se usa la función escribir (

Accion principal

Var

Fvar

leer (dato) escribir (“El valor es: “, dato) Facción

Dato: real

El resultado será ver en pantalla:

).

El valor es: <valor introducido>

En lenguaje C la función a usar es printf (

),

la sentencia printf (

)

permite la

escritura en la pantalla de frases, datos, o frases con datos formando parte de ellas.

La sintaxis de printf (

printf (“

<nombre de la variable que lo contiene>);

)

es:

<formato

de tipo de dato>

”,

La sentencia printf ( comillas “ ”.

)

escribe en la pantalla del ordenador lo que se encuentre entre las

Ejemplos

a)

printf (“hola Que taL”);

hola Que taL

b)

distancia=12;

printf (“El valor es: %d metros.”, distancia);

El valor es: 12 metros.

El ejemplo que usamos en algorítmico anteriormente:

void main(void)

{

double dato;

scanf (“%lf”, &dato); printf (“\nEl valor es: %lf”, dato);

}

El formato de tipo de dato (%lf en este caso, dato real doble) se debe colocar en el lugar en que se desee que aparezca escrito el dato dentro de la frase. Si en un solo printf ( ) se van a escribir varios datos, las variables se deben colocar al final, separadas por comas, en el mismo orden en que se hallen los formatos de tipo de dato.

Ejemplo:

dia=25;

mes=8;

year=1980;

printf (“La fecha es: %d del mes %d de %d.”, dia, mes, year);

Resultado en pantalla:

La fecha es: 25 del mes 08 de 1980.

Instrucciones de asignación

Es la instrucción más importante, para que el valor de un dato se asigne a otro, ambos deben ser del mismo tipo. Las diferencias aquí son menores, tanto en C como en Algorítmico, la asignación es de izquierda a derecha. Probablemente la asignación de variables sea lo único que es más sencillo en C que en Algorítmico. Ejemplos:

Algorítmico:

dato1 := dato2

C:

dato1 = dato2

En ambos casos a la variable dato1 se le asigna el valor contenido en la variable dato2. Estos son ejemplos de asignación sin cambio de valor.

Formatos de printf (

)

y scanf (

)

Carácter

Uso

Carácter Uso
Carácter Uso

%d

Muestra o captura un entero (int)

%c

Muestra o captura un carácter

%lf

Muestra o captura un número decimal

%s

Muestra o captura una cadena

Muestra o captura un carácter %lf Muestra o captura un número decimal %s Muestra o captura
Muestra o captura un carácter %lf Muestra o captura un número decimal %s Muestra o captura

Para la orden printf (

apuntes usaremos casi únicamente el carácter \n que obliga un salto de linea, es decir, a

partir de \n escribe en la línea siguiente. Existen muchos caracteres de escape, los más importantes se recogen en la tabla siguiente.

tenemos además los llamados caracteres de escape, en estos

)

Carácter de escape Denominación \n Salto de línea. \t Tabulador.
Carácter de escape Denominación \n Salto de línea. \t Tabulador.

Carácter de escape

Denominación

\n

Salto de línea.

\t

Tabulador.

Carácter de escape Denominación \n Salto de línea. \t Tabulador.
\” Comilla doble. \’ Comilla simple. \a Sonido de alerta.
\” Comilla doble. \’ Comilla simple. \a Sonido de alerta.

\”

Comilla doble.

\’

Comilla simple.

\a

Sonido de alerta.

Ejemplo:

printf (“\’El Quijote\’\n\tEn un lugar de La Mancha

”);

Resultado en pantalla:

‘El Quijote’ En un lugar de La Mancha

Ejemplo: Instrucciones de entrada y salida de datos.

/*Programa que pide por teclado nombre, edad y peso y los muestra en pantalla*/

#include <stdio.h>

void main(void)

{

char nombre[20]; int edad; double peso; printf("\nIntroduzca su nombre: "); scanf("%s", &nombre);

printf("\nIntroduzca su edad: "); scanf("%d", &edad);

printf("\nIntroduzca su peso: "); scanf("%lf", &peso);

printf("\n\nUsted se llama %s, tiene %d años y pesa %lf kg.", nombre, edad, peso);

fflush(stdin);

getchar();

}

Redondeo

Existen funciones específicas de redondeo, estas son ceil y floor, estas funciones están contenidas en la librería math.h.

ceil obtiene el entero más pequeño que sea menor que el número decimal que se desea redondear.

Ejemplo

#include <stdio.h>

#include <math.h>

void main()

{

double numero, redondo; printf("Introduce un numero decimal: "); scanf("%lf", &numero); redondo=ceil(numero); printf("\nEl numero redondeado es: %lf", redondo);

fflush(stdin);

getchar();

}

En este ejemplo, si introducimos el 2.35, el programa mostrará en pantalla el 3.000000.

floor elimina los decimales de una variable de doble precisión (double).

Ejemplo

#include <stdio.h>

#include <math.h>

void main()

{

double numero, redondo; printf("Introduce un numero decimal: "); scanf("%lf", &numero); redondo=floor(numero);

printf("\nEl numero redondeado es: %lf", redondo); fflush(stdin); getchar();

}

Si en este programa introducimos el 5.98 se mostrará en pantalla el 5.000000.

Redondeo directo

Podemos redondear un número decimal a un determinado número de decimales menor de 6, esto se hace, directamente, anteponiendo al formato lf un 0.n, siendo n el número de decimales a que se desea redondear el número decimal.

Ejemplo

#include <stdio.h>

void main()

{

double numero; printf("Introduce un numero decimal: "); scanf("%lf", &numero); printf("\nEl numero redondeado a dos decimales es: %0.2lf", numero); fflush(stdin);

getchar();

}

Si introducimos el 3.254764 el programa muestra en pantalla el 3.25. Si introducimos el 2.235 el programa muestra en pantalla el 2.24.

Operadores

Los operadores son los caracteres especiales que, junto con las variables, van a constituir las expresiones del programa.

Ejemplos de expresiones son:

<variable1> + <variable2> <variable> <variable1> - <variable2>

Los operadores son distintos en C y en algorítmico y, distinguimos los siguientes tipos:

Operadores aritméticos.

Operadores relacionales.

Operadores lógicos.

Operadores de asignación.

Operadores direccionales.

En las siguientes tablas se recogen los operadores más comunes. En los ejemplos, a y b son variables que contienen datos simples y del mismo tipo.

Operadores aritméticos (iguales para C que para algorítmico):

Acción Suma Ejemplo en Algorítmico a + b Ejemplo en C a + b Significado

Acción

Suma

Ejemplo en

Algorítmico

a + b

Ejemplo en C

a + b

Significado

Suma los datos

contenidos en a y b

a + b Significado Suma los datos contenidos en a y b Resta Producto Cociente Resto
a + b Significado Suma los datos contenidos en a y b Resta Producto Cociente Resto

Resta

Producto

Cociente

Resto

a – b

a * b

a / b

a % b

Resta al valor de a el

a valor de b.

– b

a Multiplica el valor

* b

de a por el de b.

a / b

a % b

Calcula la división

del valor de a entre el de b

Calcula el resto de la división del valor de

a entre el de b. (Solo para enteros)

del valor de a entre el de b Calcula el resto de la división del valor
del valor de a entre el de b Calcula el resto de la división del valor

Operadores relacionales:

Denominación

Ejemplo en

Algorítmico

Ejemplo en C

Significado

Menor que a < b a < b Mayor que a > b a >

Menor que

a < b

a

< b

Mayor que

a > b

a

> b

Menor o igual que

a <= b

a <= b

a >= b

a >= b

¿es el valor de a

¿es el valor de a

¿es el valor de a

menor que el valor de b?

menor que el valor de b? menor que el de b? menor o igual que el

menor que el de b?

menor o igual que el de b?

¿es el valor de a

mayor o igual que el de b?

el de b? ¿es el valor de a mayor o igual que el de b? Mayor

Mayor o igual que

¿es el valor de a

igual que el de b?

¿es el valor de a

distinto al de b?

Igual

a = b

a == b

Distinto

a <> b

a != b

Operadores lógicos:

Estos operadores se usan para concatenar expresiones lógicas con objeto de ver si se cumplen o no el conjunto de esas operaciones. En la siguiente tabla aparecen dos variables más, c es una variable que contiene un dato simple del mismo tipo que los contenidos en a y b; var es una variable de tipo lógico.

Denominación

Ejemplo en

Ejemplo en C

Significado

Algorítmico

Ejemplo en Ejemplo en C Significado Algorítmico Conjunción (a<c) y (b<c) (a<c) &&
Ejemplo en Ejemplo en C Significado Algorítmico Conjunción (a<c) y (b<c) (a<c) &&
Ejemplo en Ejemplo en C Significado Algorítmico Conjunción (a<c) y (b<c) (a<c) &&
Ejemplo en Ejemplo en C Significado Algorítmico Conjunción (a<c) y (b<c) (a<c) &&

Conjunción

(a<c) y (b<c)

(a<c) && (b<c)

¿son a y b menores que c?

Disyunción

(a<c) o (b<c)

(a<c) || (b<c)

¿es a o b menor que c?

Negación lógica

no var

!var

¿es verdad que no se cumple var?

|| (b<c) ¿es a o b menor que c? Negación lógica no var !var ¿es verdad

Operadores de asignación:

Denominación

Ejemplo en

Algorítmico

Ejemplo en C

Significado

Ejemplo en Algorítmico Ejemplo en C Significado Asigna a la variable a el valor de b.
Ejemplo en Algorítmico Ejemplo en C Significado Asigna a la variable a el valor de b.
Ejemplo en Algorítmico Ejemplo en C Significado Asigna a la variable a el valor de b.

Asigna a la variable a el valor de b.

Aumenta el valor de a 1 unidad.

Asignación sin cambio de valor

a := b

a = b

a++

Incremento

Disminuye el valor

de a en 1 unidad.

Decremento

a--

Operadores direccionales

&

Investiga la dirección de un dato.

& Investiga la dirección de un dato. * Dada la dirección de un dato, investiga el
& Investiga la dirección de un dato. * Dada la dirección de un dato, investiga el

*

Dada la dirección de un dato, investiga el valor.

Operadores “especiales” del Algorítmico:

Operador ↑ Ejemplo a ↑ b Significado Eleva el valor de a al valor de

Operador

Ejemplo

a b

Operador ↑ Ejemplo a ↑ b Significado Eleva el valor de a al valor de b.

Significado

Eleva el valor de a al valor de b.

Raiz( )

Raiz (a)

Calcula la raiz cuadrada del valor de a.

Las acciones que realizan estos operadores son llevadas a cabo en C por funciones predefinidas incluidas en la librería math.h, estas son pow ( ), para elevar una variable a otra y sqrt ( ), para calcular la raiz cuadrada del valor contenido en una variable.

Ejemplo

/*Programa para el calculo de potencias*/

#include <stdio.h>

#include <math.h>

void main(void)

{

int base, exp, potencia; printf("\nValor de la base: "); scanf("%d", &base); printf("\nValor del exponente: "); scanf("%d", &exp); potencia=pow(base, exp); printf("\n\nEl valor numerico es %d", potencia); fflush(stdin); getchar();

}

Moldes

Los moldes o cast, fuerzan que una variable de un tipo determinado se comporte como una de otro tipo distinto, hacer, por ejemplo que un número real se comporte como un número entero o viceversa.

Para los datos enteros y reales, basta con anteponer “(int)” o “(double)” delante del nombre de la variable que queramos que se comporte como dato entero o real doble, respectivamente.

Ejemplos:

/*Programa para hallar la parte entera de un número real*/

#include <stdio.h>

void main(void)

{

double num; printf("\nNumero real: "); scanf("%lf", &num);

printf("\n\nLa parte entera es %d.", (int)num); fflush(stdin); getchar();

}

/*Programa para calcular el cociente entre dos números enteros*/

#include <stdio.h>

void main(void)

{

int a, b; double cociente; printf("\nValor del dividendo: "); scanf("%d", &a); printf("\nValor del divisor: "); scanf("%d", &b); cociente=(double)a/(double)b;

printf("\n\nEl resultado de la division es %lf", cociente); fflush(stdin); getchar();

}

Moldeo en cadenas

Los datos de tipo cadena (arrays de caracteres) pueden convertirse en datos de tipo entero o de tipo real. Los moldes para cadenas de texto están definidos en el fichero include stdlib.h, y son:

atoi (cad1) atof (cad1) Convierte en entero la cadena cad1. Convierte en real la cadena

atoi (cad1)

atof (cad1)

Convierte en entero la cadena cad1.

Convierte en real la cadena cad1.

atoi (cad1) atof (cad1) Convierte en entero la cadena cad1. Convierte en real la cadena cad1.

Ejemplo

/*Calcula el cociente y la parte entera de una división entre datos de tipo cadena*/

#include <stdio.h>

#include <stdlib.h> #define n 10 void main(void)

{

char cadena1[n], cadena2[n]; double division; int entera; printf("\nEscribe el dividendo: "); scanf("%s", &cadena1); printf("\nEscribe el divisor: "); scanf("%s", &cadena2);

division=atof(cadena1)/atof(cadena2);

entera=atoi(cadena1)/atoi(cadena2);

printf("\n\nEl cociente es %lf\nLa parte entera es %d", division, entera); fflush(stdin); getchar();

}

/*moldeo de cadena a real*/ /*moldeo de cadena a entero*/

Resolución de problemas

A la hora de hacer un programa capaz de resolver un determinado problema es

conveniente seguir un procedimiento ordenado; el programador, a partir de los datos de entrada ofrecidos y los datos de salida requeridos, debe hallar las operaciones que resuelvan el problema. A partir de las operaciones creará los algoritmos que finalmente conformen al programa solución.

algoritmos que finalmente conformen al programa solución. Por ejemplo, si tenemos un problema que consis te

Por ejemplo, si tenemos un problema que consiste en comprobar si un número es par, sabremos que los datos de entrada será el número en cuestión (número entero), y lo que el programa debe devolver será un dato de tipo lógico (si es par o no lo es). Así pues requeriremos dos variables:

int

numero;

numero: entero

int

par;

par: lógico

La condición que cumplen los números pares es que son divisibles por dos, es decir, el resto de la división de un número par entre 2 es 0. Esto puede expresarse mediante el algoritmo:

if (numero%2==0)

si numero%2=0

{

par:=V

par=1;

sino

}

par:=F

else

fsi

{

par=0;

}

Este será el algoritmo solución del problema planteado, formará parte del programa solución, el cual, en lenguaje C, será:

#include <stdio.h>

void main(void)

{

/*declaración de variables*/

int numero; int par; /*Introducción de datos por el usuario (teclado)*/ printf(“Introduzca un numero: “); scanf(“%d”, &numero); /*Algoritmo solución*/ if (numero%2==0)

{

par=1;

}

else

{

par=0;

}

/*salida de datos (pantalla)*/

if(par==1)

{

printf(“\n\nEl numero es PAR”);

}

else

{

printf(“\n\nEl numero es IMPAR”);

}

/*Fin del programa*/

fflush(stdin);

getchar();

}

EJERCICIOS

1. Realizar un programa que pida dos números enteros por teclado y muestre, posteriormente por pantalla, la suma de los números.

2. Realizar un programa que pida un valor de x por teclado y muestre en la pantalla el valor de y para:

y =

(

x

1)

2

3. Realizar un programa que pida dos números por teclado y muestre en pantalla el resultado de elevar el primer número al segundo.

4. Hacer un programa en C que muestre el valor del resto que resulte al dividir un número real por otro, introducidos ambos por teclado.

5. Realizar un programa capaz de calcular el volumen de una esfera a partir de su radio.

TEMA 5

Control de un flujo de programa

Introducción

El flujo de un programa lo establece el orden en que se van a ir ejecutando las distintas expresiones que lo componen. Existen tres órdenes básicas que permiten desviaciones en el flujo de un programa. Estas sentencias hacen que, dentro del programa, se ejecuten unas instrucciones u otras en base al cumplimiento de una serie de condiciones.

Ejecución condicionada (Bifurcadores)

Sentencia if

else

En muchas ocasiones nos interesará que una expresión o grupo de expresiones se ejecute sólo si se cumple una o más de una condición.

Una representación gráfica del flujo de un programa al llegar a una de estas sentencias:

flujo de un prog rama al llegar a una de estas sentencias: el programa sigue uno

el programa sigue

uno de los dos caminos, es decir, si la condición

se cumple el programa ejecuta una tras otra las instrucciones incluidas en el bloque, en caso de que la condición no se cumpla, el flujo del programa se desvía y sigue adelante sin ejecutar las instrucciones del bloque.

Al llegar a la sentencia si (

),

Esto se lleva a cabo mediante la sentencia if (

if (<condición>)

} {

else

} {

), su sintaxis es:

En el caso de no cumplirse la condición, las operaciones contenidas en el bloque else

} {

se ejecutaran secuencialmente.

En el siguiente ejemplo se muestra un programa que dice si un número entero introducido por teclado es par, el ejercicio se desarrolla en C y en Algorítmico para observar las diferencias:

Lenguaje C Algorítmico void (main (void) { int numero, resto; printf(“Introduce el numero”); scanf(“%d”,
Lenguaje C
Algorítmico
void (main (void)
{
int numero, resto;
printf(“Introduce el numero”);
scanf(“%d”, &numero);
Acción principal
Var
numero, resto: entero
Fvar
leer (numero)
resto=numero%2;
resto:=numero%2
if (resto==0)
{
printf(“\nNumero PAR”);
}
else
Si (resto=0)
Escribir (“Numero PAR”)
Sino
Escribir (“Numero IMPAR”)
Fsi
{
printf(“\nNumero IMPAR);
ffacción
}
}

Entendemos por anidamiento a aquella estructura en que encontramos sentencias como

if (

if (<condicion1>)

)

dentro de las instrucciones de otra sentencia if (

).

{

if (<condicion2>)

else

else

}

{

}

{

}

{

}

Sentencia switch

case

En los casos en que en función de un parámetro se tengan que ejecutar varios bloques

case. Esta sentencia evalúa el valor del

parámetro y, en función de éste, ejecuta uno u otro bloque de sentencias.

Ejemplo

Realizar un programa que pida dos números por teclado, muestre un menú con las opciones de sumar, restar, multiplicar o dividir los números introducidos; finalmente mostrar en pantalla el resultado de la operación correspondiente.

#include <stdio.h>

void main(void)

alternativos se utiliza la sentencia switch

{

double num1, num2; int opcion; printf("\nIntroduce un numero: "); scanf("%lf", &num1); printf("\nIntroduce otro numero: "); scanf("%lf", &num2);

printf("\n\n1. Suma.\n2. Resta.\n3. Producto.\n4. Cociente.\n0. Salir.\n\n\tOpcion: "); scanf("%d", &opcion);

switch(opcion)

/*Evaluación de la variable opcion*/

{

/*casos*/

case 1: printf("\n\nLa suma es %lf.", num1+num2); break;

case 2: printf("\n\nLa diferencia es %lf.", num1-num2); break;

case 3: printf("\n\nEl producto es %lf.", num1*num2); break;

case 4: printf("\n\nEl cociente es %lf.", num1/num2); break;

}

fflush(stdin);

getchar();

}

Cuando usamos la sentencia switch

decir, un bloque de sentencias que se ejecute si el valor del parámetro evaluado no coincide con ninguno de los casos controlados; esto se hace con la sentencia default.

Ejemplo

case podemos añadir un caso por defecto, es

#include <stdio.h>

void main(void)

{

char letra; printf("Introduzca una letra: "); scanf("%c", &letra); switch(letra)

{

case 'a':printf("\nHa pulsado la letra a."); break; case 'b':printf("\nHa pulsado la letra b."); break; case 'c':printf("\nHa pulsado la letra c."); break; case 'd':printf("\nHa pulsado la letra d."); break; case 'e':printf("\nHa pulsado la letra e.");

break; case 'f':printf("\nHa pulsado la letra f."); break; default:printf("\nLa letra pulsada no esta controlada."); /*caso por defecto*/ break;

}

fflush(stdin);

getchar();

}

Bloques repetitivos. (Bucles)

Dentro de los bloques repetitivos (bucles) debemos diferenciar entre bloques repetitivos condicionados y bloques repetitivos con contador.

Bloques repetitivos condicionados al inicio. while (

)

Mediante esta sentencia conseguimos que un bloque de instrucciones se ejecute si se cumple una determinada condición y se siga ejecutando de forma repetitiva mientras dicha condición se cumpla. En el momento en que no se cumple la condición, el bloque de instrucciones deja de ejecutarse.

condición, el bloque de instrucciones deja de ejecutarse. La estructura de la sentencia while ( Algorítmico

La estructura de la sentencia while (

Algorítmico mientras (

en pantalla los 20 primeros números pares.

es muy parecida a la de su homóloga en

En el ejemplo siguiente se muestra un programa que muestra

)

).

Lenguaje C Algorítmico void main(void) { int numero; int contador; Acción principal Var numero, contador:
Lenguaje C
Algorítmico
void main(void)
{
int numero;
int contador;
Acción principal
Var
numero, contador: entero
Fvar
numero=0;
numero:=0
contador=0;
contador:=0
while(contador<20)
{
Mientras(contador<20)
numero=numero+2;
numero:=numero+2
printf(“, %d”, numero);
contador++;
escribir(numero)
contador:=contador+1
}
Fmientras
}
Facción

Al igual que con las sentencias if (

Algo nuevo es la variable contador, los contadores son variables de tipo entero, normalmente usamos como nombres las letras i, j, k, l, m, etc. Los contadores tienen

distintas funciones en la programación. Siempre se inicializan antes de usarse, esto es asignarles el valor 0, normalmente se incrementan en 1 cada vez. En el programa anterior, el contador se inicializa en 0 y se incrementa en 1 cada vez que se realizan las

expresiones del bloque dentro del while(

este bloque de expresiones dejará de

realizarse cuando contador tenga el valor 20. El valor que tiene un contador al final de un bucle resulta muy útil en la programación.

)

else, con while (

)

puede existir anidamiento.

),

Bloques

repetitivos

condicionados

al

final;

sentencia

do

while (

)

Esta sentencia se utiliza cuando el bloque de instrucciones se debe ejecutar al menos una vez, aunque no se cumpla la condición. Puede sustituirse por la sentencia while, precedida del bloque de instrucciones.

La sentencia do siguiente figura: while dirige el flujo de programa de la forma en
La sentencia do
siguiente figura:
while dirige el flujo de programa de la forma en que se muestra en la
Ejemplo 1

/*Programa que pide números por teclado, hasta que se introduce un número negativo y cuenta los números que se han introducido*/ #include <stdio.h> void main(void)

{

int num, i;

i=0;

do

{

printf("\nIntroduce un numero: "); scanf("%d", &num);

i++;

}

while(num>=0);

printf("\n\nSe han introducido %d numeros.", i-1); fflush(stdin); getchar();

}

Ejemplo 2

/*Programa que muestra el sumatorio de una serie de valores reales introducidos por teclado hasta que se introduce el 0*/

#include <stdio.h>

void main(void)

{

double num, sumatorio;

sumatorio=0;

do

{

printf("\nIntroduce un numero: ");

scanf("%lf", &num); sumatorio=sumatorio+num;

}while(num!=0);

printf("\n\nEl valor del sumatorio es %.2lf", sumatorio); fflush(stdin); getchar();

}

Bloques repetitivos con contador; sentencia for (

)

En los casos en que debamos repetir una instrucción o serie de instrucciones un

resulta el más adecuado. Esta

sentencia para el control del flujo de un programa funciona iniciando un contador, realizando un bloque de instrucciones e incrementando dicho contador cada vez que se ejecuta el bloque de instrucciones. Gráficamente:

número de veces conocido, el uso de la sentencia for (

)

que se ejecuta el bloque de inst rucciones. Gráficamente: número de veces conocido, el uso de

Una característica destacable del for (

uno, el contador se inicializa e incrementa automáticamente.

En el ejemplo siguiente se muestra un programa que muestra por pantalla los primeros 20 números impares:

es que cada vez que en el programa se llega a

)

Lenguaje C Algorítmico void main(void) { int numero, contador; numero=1; Acción principal Var contador, numero:
Lenguaje C
Algorítmico
void main(void)
{
int numero, contador;
numero=1;
Acción principal
Var
contador, numero: entero
Fvar
for (contador=0;contador<20;contador++)
Numero=1
{
printf(“, %d”, numero);
Para(contador:=0 hasta contador<20, inc 1)
numero=numero+2;
Escribir(numero)
}
Numero:=numero+2
}
Fpara
Facción

Como podemos ver, tras la sentencia for, aparece entre paréntesis, el valor inicial del contador, el valor final y, por último, el incremento del contador. La estructura en lenguaje C y en Algorítmico es muy similar.

pueden anidarse.

) en el tema 6, cuando

Por supuesto, al igual que los if (

Veremos la tremenda importancia de los anidamientos de for (

expliquemos otro tipo de variables, las variables estructuradas array. Por otra parte es

también posible el anidamiento mixto de estas sentencias para dar lugar a estructuras en las que el control del flujo del programa resulte mucho más complejo.

)

y los

while (

),

los

for (

)

Tareas habituales de los controladores de flujo

A pesar de tener una infinidad de combinaciones y usos posibles, existen una serie de

tareas que son muy usadas en programación, estas tareas tienen una gran variedad de usos, y son: hallar un sumatorio, contar una serie de datos y hallar valores

extremos. Para realizar estas tareas usamos los siguientes bucles con while o sus homólogos con for:

Hallar un sumatorio

El

siguiente algoritmo pide valores de datos reales hasta que se introduce el 0 y calcula

el

sumatorio de los valores introducidos.

printf(“\nIntroduzca un numero: “);

scanf(“%lf”, &num);

sum=num;

while(num!=0);

{

printf(“\nIntroduzca el siguiente numero: “);

scanf(“%lf”, &num);

sum=sum+num;

}

Contar una serie de datos

El siguiente algoritmo cuenta los números introducidos por teclado hasta que el usuario escribe un número negativo.

printf(“\nIntroduzca un numero: “); scanf(“%lf”, &num);

cont=0;

while(num>=0);

{

cont++;

printf(“\nIntroduzca el siguiente numero: “); scanf(“%lf”, &num);

}

Hallar valores extremos

El siguiente algoritmo calcula el máximo y el mínimo de una serie de números introducidos por teclado hasta que se introduzca el 0.

printf(“\nIntroduzca un numero: “); scanf(“%lf”, &num); min=num; max=num;

while(num!=0);

{

printf(“\nIntroduzca el siguiente numero: “); scanf(“%lf”, &num); if(num>max)

{

max=num;

}

if(num<min)

{

min=num;

}

}

Diferencias entre for y while

Muchas operaciones con controladores de flujo podrán realizarse indistintamente con un la sentencia for o con while, las diferencias esenciales son:

La sentencia for lleva implícitas las operaciones de inicialización del contador, establecimiento del condicionante e incremento del contador.

del condicionante e incremento del contador . La sentencia while permite incrementar un contador en el

La sentencia while permite incrementar un contador en el momento y cuantía que se desee.

un contador en el momento y cuantía que se desee. Los siguientes algoritmos realizan la misma

Los siguientes algoritmos realizan la misma tarea: contar el número de enteros positivos introducidos en una serie de N elementos.

cont=0;

i=0;

while(i<N)

{

printf(“\nIntroduce un numero: “); scanf(“%d”, &num);

if(num>=0)

{

cont++;

/*el número de positivos se incrementa*/

}

i++;

}

cont=0;

for(i=0;i<N;i++)

{

printf(“\nIntroduce un numero: “); scanf(“%d”, &num);

if(num>=0)

{

cont++;

/*el número de positivos se incrementa*/

}

}

EJEMPLOS

En los siguientes ejemplos en C, se recogen programas que resuelven problemas matemáticos mediante el uso de composición condicionada e iterativa.

Ejemplo 1

El máximo común divisor de dos números es el mayor número por el que el resto es cero para ambos.

/*Cálcular el máximo común divisor de dos números enteros*/

#include <stdio.h>

void main(void)

{

int num1, num2, menor, divisor, i;

printf("Introduce un numero: "); scanf("%d", &num1); printf("\nIntroduce otro: "); scanf("%d", &num2);

if(num1>num2)

{

menor=num2;

}

else

{

menor=num1;

}

for(i=1;i<=menor;i++)

{

if((num1%i==0)&&(num2%i==0))

{

divisor=i;

}

}

printf("\n\nEl maximo comun divisor es: %d", divisor); fflush(stdin);

getchar();

}

Ejemplo 2

Los valores de la serie de Fibonacci se obtienen sumando los dos valores anteriores, esto es:

1, 1, 2, 3, 5, 8, 13, 21,

/*Genera los 20 primeros números de la sucesión de Fiboacci*/

#include <stdio.h> #define n 20 void main(void)

{

int num1, num2, sum, i;

sum=1;

num1=0;

num2=1;

for(i=0;i<n;i++)

{

printf(" %d", sum);

sum=num1+num2;

num1=num2;

num2=sum;

}

fflush(stdin);

getchar();

}

Ejemplo 3

/*Programa que pide una serie de números por teclado hasta que se introduce el 0, y muestra por pantalla cuántos números se han introducido*/

#include <stdio.h>

void main(void)

{

int numero;

int i;

i=-1;

numero=1;

/*inicializo distinto de 0*/

while(numero!=0)

{

printf("\nNumero: ");

scanf("%d", &numero); i++;

}

printf("\n\nSe han introducido %d numeros.", i); fflush(stdin); getchar();

}

Ejemplo 4

Sabemos que un número es primo si tan sólo es divisible por sí mismo y por la unidad, es decir el resto entre el número y cualquier otro que no sea la unidad, será distinto de 0.

/*Comprueba si un número introducido es primo*/

#include <stdio.h>

void main(void)

{

int numero, i; int primo;

/*Variable de tipo lógico*/

printf("Introduce un numero: "); scanf("%d", &numero);

i=2;

primo=1; /*suponemos que es verdadero (primo)*/

/*mientras siga siendo verdadero, dividimos hasta numero-1*/

while((primo)&&(i<numero))

/*inicializo en 2*/

{

primo=(numero%i!=0);

i++;

}

if(primo==0)

{

printf("\n\n%d no es primo.", numero);

}

else

{

printf("\n\n%d es primo.", numero);

}

fflush(stdin);

getchar();

}

EJERCICIOS

1. Realizar un programa que pida dos números enteros por teclado y muestre en pantalla cuál es el mayor de los dos.

2. Hacer el mismo programa para un número entero y otro real.

3. Realizar un programa que pida dos números por teclado, a continuación debe mostrarse en pantalla un menú de la siguiente manera:

1.

Suma.

2.

Producto.

3.

Menor de los dos.

0.

Salir.

Opción: _

4. Hacer un programa capaz de resolver ecuaciones de segundo grado del tipo:

2

ax

+ bx + c = 0

5. Realizar un programa que escriba todos los números divisibles por 17 entre el 0 y el 10000.

6. Hacer un programa que determine si un número es primo.

7. Hacer un programa que pida números por teclado (hasta que se introduzca el valor 0) y muestre a continuación el valor del sumatorio.

8. Realizar un programa que calcule el factorial de un número introducido por teclado.

9. Hacer un programa que pida 10 números por teclado y, a continuación, muestre por pantalla el mayor de todos ellos.

TEMA 6

Variables estructuradas I. Arrays

Introducción

Hasta ahora todas las variables con las que hemos trabajado han sido variables simples. En este tema veremos un nuevo tipo de variables, los arrays, éstos se clasifican dentro de las variables compuestas. En el siguiente diagrama se muestra una clasificación de todos los tipos de variable que veremos.

clasificación de todos los tipos de variable que veremos. Trataremos a las tuplas en los últimos

Trataremos a las tuplas en los últimos temas, por ahora nos centraremos en los arrays, éstos son de una enorme importancia para la programación, dada su versatilidad y su simplicidad.

Arrays unidimensionales

Se trata de vectores, arrays de una sola dimensión. De forma análoga a la definición de variable, podemos decir que un vector es un espacio de memoria (cajón), el cual está dividido en subespacios. En un vector podemos guardar tantos datos como en subespacios se encuentre dividido.

La siguiente figura representa a un vector, éste se encuentra dividido en cinco espacios, en cada uno de los espacios podemos guardar un dato, podemos referirnos a un dato concreto del vector usando la dirección del espacio en que se encuentre, así si tenemos un vector que hemos llamado uve, para referirnos al dato que ocupa la tercera posición (posición nº 2) dentro del vector, lo haremos por uve[2].

0 1 2 3 4
0
1
2
3
4

Al declarar un vector debemos indicar el tipo de datos que almacenará, el nombre del vector y su dimensión.

Ejemplos:

Lenguaje C:

Algorítmico:

int vectorcito[5];

vectorcito: tabla[5] de entero

double vect[9];

vect: tabla[9] de real

Debemos resaltar que los datos contenidos en un vector son siempre del mismo tipo, así, podemos encontrar vectores que contengan datos reales, enteros o caracteres (una cadena es un vector de caracteres).

Para introducir datos en un vector y para recorrerlo resultan muy eficaces las sentencias

for (

podemos hacerlo:

Vectorcito[0]=1;

Vectorcito[1]=3;

Vectorcito[2]=5;

Vectorcito[3]=7;

Vectorcito[4]=9;

El resultado será que nuestro vectorcito es ahora:

Por ejemplo para rellenar de valores al vector que hemos llamado vectorcito,

).

1 3 5 7 9
1 3
5
7 9

Lo mismo se puede lograr del siguiente modo:

for (i=0;i<5;i++)

{

printf(“\nIntroducir valor: “); scanf(“%d”, &numero); vectorcito[i]=numero;

}

Como puede observarse resulta mucho más sencillo y es obligatorio en el caso de vectores de dimensiones mayores.

Ejemplo. Realizar un programa que pida por teclado 100 enteros, los guarde en un vector y devuelva otro vector con los números que sean pares.

#include <stdio.h> #define N 100 void main (void)

{

int vector[N], vector_par[N]; int i, j;

for(i=0;i<N;i++)

{

printf(“\nIntroduce un numero: “); scanf(“%d”, &vector[i]);

}

j=0;

for(i=0;i<N;i++)

if(vector[i]%2==0)

{

{

vector_par[j]=vector[i];

j++;

}

tam=j;

for(i=0;i<j;i++)

}

{

printf(“ %d”, vector_par[i]);

}

}

EJEMPLOS

Ejemplo 1

/*Programa que pide los valores enteros de un vector por teclado hasta que se introduce el 0, máximo 100, y muestra por pantalla el vector y cuántos números se han introducido*/

#include <stdio.h> #define n 100 void main(void)

{

int numero; int i, temp; int vector[n];

i=-1;

numero=1;

/*inicializo distinto de 0*/

while(numero!=0)

{

i++;

printf("\nNumero: ");

scanf("%d", &numero); vector[i]=numero;

}

/*asigno el valor de numero a la posicion i del vector*/

printf("\n\nSe han introducido %d numeros.\n\n\tVECTOR INTRODUCIDO:\n\n", i); temp=i;

for(i=0;i<temp;i++)

/*escribo en la pantalla los valores del vector*/

{

printf(" %d", vector[i]);

}

fflush(stdin);

getchar();

}

Ejemplo 2

/*Programa que pide los valores de dos vectores reales por teclado hasta que se introduce el 0 en ambos, máximo 100, y muestra por pantalla el producto escalar de los vectores introducidos*/

#include <stdio.h> #define n 100 void main(void)

{

double vector1[n], vector2[n]; double num1, num2, escalar; int i, temp;

i=0;

printf("\Primer valor para el primer vector: "); scanf("%lf", &num1);

printf("\nPrimer valor para el segundo vector: "); scanf("%lf", &num2);

vector1[i]=num1;

vector2[i]=num2;

while((num1!=0)&&(num2!=0))

{

printf("\nsiguiente valor para el primer vector: "); scanf("%lf", &num1);

printf("\nsiguiente valor para el segundo vector: "); scanf("%lf", &num2);

vector1[i]=num1;

vector2[i]=num2;

i++;

}

temp=i;

escalar=0;

for(i=0;i<temp;i++)

{

escalar=escalar+vector1[i]*vector2[i];

}

printf("\n\n\nValor del producto escalar: %lf", escalar);

fflush(stdin);

getchar();

}

Ejemplo 3

/*Lee una secuencia indefinida de números reales, muestra los valores del rango, media y varianza.*/

#include <stdio.h>

#include <stdlib.h> #include <string.h> #define n 100 void main(void)

{

int i, j; double max, min, rg, num, media, sum, var, sumvar; char numcad[9];

double v[n];

printf("Introduce el primer numero: "); scanf("%s", &numcad); num=atof(numcad);

max=-99999;

min=99999;

sum=0;

i=0;

sumvar=0;

while((strcmp(numcad, "f")!=0))

{

/*Cálculo del mayor y del menor numero introducido*/

if(num<min)

{

min=num;

}

if(num>max)

{

max=num;

}

sum=sum+num;

v[i]=num;

i++;

printf("Introduce el siguiente numero (f para terminar): "); scanf("%s", &numcad); num=atof(numcad);

}

/*Guardamos los números introducidos en un vector*/ /*Cuento los números introducidos*/

rg=max-min;

media=sum/(double)i;

printf("\n\nValores introducidos:\n\n");

/*escritura del vector en pantalla*/

for(j=0;j<i;j++)

{

printf("%lf ", v[j]); sumvar=sumvar+(media-v[j])*(media-v[j]); /*Sumatorio para calcular la varianza*/

}

var=sumvar/(double)i;

printf("\n\nEl rango es: %lf", rg); printf("\nLa media aritmetica es: %lf", media); printf("\nLa varianza es: %lf", var); printf("\n\nEL PROGRAMA HA TERMINADO. PULSE ENTER PARA SALIR fflush(stdin); getchar();

}

");

Ejemplo 4

/*Programa que pide los valores de un vector real por teclado hasta que se introduce el 0, máximo 100, y muestra por pantalla los valores de un segundo vector compuesto por los valores del primero sin repetir*/

#include <stdio.h> #define n 100 void main(void)

{

double v[n], vsinrep[n]; double num; int i, j, temp, tam;

int rep;

/*Variable de tipo lógico*/

i=0;

/*Intorducción del vector por teclado*/

printf("\Primer valor para el vector: "); scanf("%lf", &num); v[i]=num;

while(num!=0)

{

printf("\nsiguiente valor para el vector: ");

scanf("%lf", &num);

v[i]=num;

i++;

}

temp=i; /*Tamaño del vector*/

vsinrep[0]=v[0];

tam=0;

for(i=1;i<temp;i++)

{

j=0;

rep=0;

while((rep==0)&&(j<=tam))

/*Comparación con cada valor de vsinrep*/

{

if(v[i]==vsinrep[j])

 

{

rep=1;

/*Salida del bucle*/

}

if(v[i]!=vsinrep[j])

 

{

j++;

/*Paso al siguiente valor de vsinrep*/

}

}

if(rep==0)

{

vsinrep[j]=v[i]; /*Asignación del valor no repetido*/

tam++;

}

/*Aumento del tamaño de vsinrep*/

}

/*Escritura en pantalla del vector sin repetir*/

printf("\n\n\n\tValores sin repetir:\n\n"); temp=tam;

for(i=0;i<temp;i++)

{

printf(" %lf", vsinrep[i]);

}

fflush(stdin);

getchar();

}

Arrays bidimensionales

Nos referimos aquí a las famosas tablas. Las tablas tienen exactamente las mismas propiedades que los vectores, deben ser declaradas al principio del programa indicando el nombre, tamaño y tipo de dato que contendrá. La diferencia con los vectores radica pues en su dimensión, mientras que la dirección de un dato en un vector viene dada por un parámetro, en una tabla se requieren dos: número de fila y número de columna, en ese orden.

Ejemplo:

Lenguaje C:

Algorítmico:

int matriz[3][4];

matriz: tabla[3][4] de entero

En el interior de cada celda aparecen los índices que definen la posición dentro de la tabla.

[0][0] [0][1] [0][2]   [1][2]

[0][0]

[0][1]

[0][2]

 

[1][2]

[1][0]

[2][0]

[0][0] [0][1] [0][2]   [1][2] [1][0] [2][0] [0][3] [1][3] [1][1] [2][1] [2][2] [2][3]

[0][3]

[1][3]

[1][1]

[2][1]

[2][2]

[2][3]

Para rellenar una tabla de datos resulta muy eficaz el anidamiento de dos sentencias for (

Ejemplo: Suponemos una tabla llamada matriz de dimensiones NxN. Si queremos hacer todo ceros la tabla (inicializarla), podemos hacerlo del siguiente modo:

for (i=0;i<N;i++)

{

for (j=0;j<N;j++)

{

matriz[i][j]=0;

}

}

En este ejemplo, i y j son variables de tipo entero usadas como contadores, lo que conseguimos con el anidamiento es recorrer la tabla fila a fila, asignando el valor 0 a cada elemento a medida que avanzamos.

EJEMPLOS

Ejemplo 1

/*Pedir por teclado los valores de una tabla de 5x5 y mostrarla en pantalla*/

#include <stdio.h> #define n 5 void main(void)

{

int m[n][n];

int i, j;

/*Pedimos los valores de cada posición*/

for(i=0;i<n;i++)

{

for(j=0;j<n;j++)

{

printf("\nValor de la posicion %d, %d: ", i, j); scanf("%d", &m[i][j]);

}

}

/*Escritura de la tabla*/

for(i=0;i<n;i++)

{

printf("\n");

for(j=0;j<n;j++)

{

printf("%d ", m[i][j]);

}

}

fflush(stdin);

getchar();

}

Ejemplo 2

/*Pedir los elementos de una tabla de 3x3 por teclado y generar otra de 3x4 en la que la última columna sea la suma de los elementos de las filas de la primera*/

#include <stdio.h> #define n 3 void main(void)

{

int tabla[n][n], tablasum[n][n+1], i, j, sumfila;

for(i=0;i<n;i++)

{

sumfila=0;

for(j=0;j<n;j++)

{

printf("\nFila %d, columna %d: ", i, j); scanf("%d", &tabla[i][j]);

tablasum[i][j]=tabla[i][j]; /*asigno a tablasum los mismos valores*/ sumfila=sumfila+tabla[i][j]; /*sumatorio de la fila*/

}

tablasum[i][j]=sumfila; /*asigno el valor del sumatorio al elemento i, 3 de tablasum*/

}

/*escritura de tablasum en pantalla*/

for(i=0;i<n;i++)

{

printf("\n");

for(j=0;j<n+1;j++)

{

printf(" %d", tablasum[i][j]);

}

}

fflush(stdin);

getchar();

}

Ejemplo 3

/*Lee por teclado valores enteros, hasta que se introduce el 0, máximo 100. Muestra a cada número y su frecuencia en la serie*/

#include <stdio.h> #define n 100 void main(void)

{

int serie[n]; int tabla[n][2]; int freq, num, i, j, tam, x;

x=0;

i=0;

printf("\nValor para la posicion %d: ", i); scanf("%d", &serie[i]); num=serie[i];

while((num!=0)&&(i<n))

{

i++; printf("\nValor para la posicion %d: ", i); scanf("%d", &serie[