Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Facultad de Ingeniería
Programación Estructurada UNIDAD II
Teoría de ciclos.
Un ciclo es cualquier construcción de programa que repite una sentencia o
secuencia de sentencias un número de veces. Las sentencias o grupo de sentencias que
se repiten en un bloque se denominan cuerpo del bucle y cada repetición del cuerpo del
ciclo se llama iteración del ciclo.
Contadores, acumuladores.
Contadores:
En los procesos repetitivos se necesita normalmente contar los sucesos o acciones
internos del ciclo, como pueden ser: registro o elementos en un archivo y número de
iteraciones a realizar por el ciclo. Para realizar esta tarea se utilizan los contadores, cuya
construcción es una de las técnicas corrientes en la realización de cualquier programa.
Un contador es un campo de la memoria que está destinado a contener los diferentes
valores que se van incrementando o decrementando en cada iteración. El campo
contendrá las sucesivas sumas parciales que se van realizando en la ejecución de las
sucesivas repeticiones. El incremento en las sumas parciales es siempre constante,
pudiendo ser positivo o negativo, es decir el contador se irá incrementando o
decrementando. El contador se representará en un programa por medio de una variable.
En las instrucciones de preparación del ciclo se realiza la inicialización del
contador o contadores. La inicialización de un contador consiste en poner el valor inicial
de la variable que representa al contador.
Ejemplos:
Contador =0 Contador = 4
Por consiguiente, el contador se representará por una instrucción de asignación
del tipo:
Contador = Contador + 1 Contador = Contador – 1
Siendo 1 el incremento del contador.
Acumuladores:
Un acumulador es un campo o zona de memoria cuya misión es almacenar
cantidades variables resultantes de sumas sucesivas. Realiza la función de un contador
con la diferencia que el incremento o decremento de cada suma es variable en lugar de
constante como en el caso del contador.
Se representa por S=S+N donde N es una variable y no constante. Al igual que al
contador a un acumulador se le inicializa.
En el ciclo for tanto la variable de control como las que se utilizan para la
condición pueden ser del tipo entera o caracter, ya que la variable tipo carácter tiene una
valor entero (código ASCII).
Ejemplos con el ciclo for: El siguiente programa imprime los números del 1 al 20
elevados al cuadrado:
#include <stdio.h>
main()
{ int num;
for(num=1;num<=20;num++)
printf(“%8d %8d\n”,num, num*num);
}
do()-while
Tiene la forma :
do
{
sentencias
} while(expresión);
El ciclo do_while repite una sentencia o varias sentencias mientras la expresión
es cierta. Se detiene cuando la expresión de convierte falsa. Este ciclo siempre se ejecuta
al menos una vez, dado que la expresión controladora del ciclo se checa al final de cada
iteración.
Ejemplo:
La siguiente sección de programa pide una serie de números, determinado para
cada uno si son pares o impares, este terminará cuando se teclee un * .
do
{
printf(“Teclea un número “);
scanf(“%”,&num);
if(num%2==0)
printf(“Número par “);
else
printf(“Número impar “);
printf(“Teclee * para terminar “);
scanf(“%c”,¢inela);
}while(centinela !=‟*‟);
while()
Un ciclo while tiene una condición del ciclo (una expresión lógica) que controla
la secuencia de repetición. La posición de esta condición del ciclo es delante del cuerpo
de este y significa que un ciclo while es un ciclo pretest de modo que cuando se ejecuta
el mismo, se evalúa la condición antes de que se ejecute el cuerpo del ciclo.
En la siguiente figura se representa el diagrama de flujo del ciclo.
Sintaxis:
1.- while (condición_ciclo) sentencia;
2.- while (condición_ciclo )
{
sentencia 1;
sentencia 2;
. cuerpo del ciclo
.
.
sentencia n;
}
El comportamiento o funcionamiento de una sentencia (ciclo) while es:
1. Se evalúa la condición del ciclo
2. Si es verdadera (distinto de cero ):
a. La sentencia especificada, denominada cuerpo del ciclo, se ejecuta.
b. Vuelve el control al paso 1.
3. En caso contrario:
a. El control se transfiere a la sentencia siguiente al ciclo.
Ejemplo 1.
/* Cuenta hasta 10 */
int x=0;
while (x<10)
printf(“X = %d”,x++);
Ejemplo 2.
/* Visualiza n asteriscos */
contador = 0;
while (contador < n)
{
printf (“*”);
contador++;
}
La variable que representa la condición del ciclo se denomina también variable
de control del bucle debido a que su valor determina si el cuerpo del ciclo se repite. La
variable de control del ciclo debe ser: 1) inicializada, 2) comprobada, y 3) actualizada
para que el cuerpo del ciclo se ejecute adecuadamente.
Anidaciones.
Al igual que en otras estructuras utilizadas dentro de el lenguaje C, los ciclos
también se pueden anidar, de tal forma que dentro de un ciclo se incluya uno o más
ciclos como parte del cuerpo de este.
Estos ciclos serán ciclos internos al primero, y por consiguiente cada que el ciclo
que los contiene se repite estos se evaluará y/o se repetirán.
No existe restricción en lo que respecta a anidar un cilo de un tipo dentro de otro,
es decir se puede perfectamente tener un ciclo while dentro de un cilo for o do_while.
for( x=1;x<=5;x++)
for (y=1;y<=10;y++)
printf(“%d x %d = %d \n”, y,x,y*x);
Ejemplo 2: Este programa lee las temperaturas de los 365 días del año cada hora
#include <stdio.h>
void main(void)
{ float temp;
int dias=1, horas;
while(dias<=365)
{
for( horas=1;horas<=24;horas++)
{
printf(“Da la temperatura del día %d en la hora %d “,dias,horas);
scanf(“%f”,&temp);
}
dias=dias+1;
}
}
En este caso se encuentra anidado dentro de un ciclo while un ciclo for.
Introducción a arreglos.
Un arreglo se define como un grupo de datos homogéneos, ordenados y finitos.
Homogéneos porque todos los datos almacenados en el arreglo deben ser del mismo
tipo, ordenados porque se encuentran en posiciones consecutivas de memoria y finitos
porque siempre debe de ser una cantidad de elementos predefinidos desde un principio.
Por esta última razón estos también se definen como estructuras estáticas.
Los arreglos se dividen es arreglos unidimensionales (también conocidos como
vectores) y multidimensionales dentro de los cuales los que más manejaremos en el
curso serán los de dos dimensiones (también conocidos como tablas o matrices).
Los datos contenidos en un arreglo pueden ser cualquiera de los tipos de datos
que conocemos en C, (char, flota, int, etc ), e incluso tipos de datos creados por el
programador como lo serían las estructuras, las cuales se verán un poco más adelante.
Cada uno de los datos contenidos en el arreglo se conoce como elemento del
arreglo y la posición que este guarda en el mismo se maneja como subíndice, estos son
consecutivos y siempre inician con la posición 0.
Arreglos unidimensionales.
Como ya se menciono anteriormente los arreglos unidimensionales también se
conocen como vectores y como su nombre lo indica son arreglos que tienen un salo
dimensión. La representación que le damos al arreglo es la siguiente:
Inicialización de vectores.
Al igual que las variables sin dimensión a los vectores también se les puede dar
un valor inicial, la forma de hacer esto es :
int VECTOR_A [5] = { 1,2,3,4,5 };
float VECTOR_B[5] = { 1.1,2.3,4,5,6.7,9.6};
char VECTOR_C[5][ = { „s „, „d‟, „p‟, „#‟, „2‟};
char VECTOR_D[5][10] = { “uno”, “dos”, “tres”, “cuatro”, “cinco”};
En caso de que se quisiera inicializar todos los elementos del arreglo a 0
únicamente se pone:
int VECTOR [5] ={0};
Para acceder a los elementos de un vector, solo de debe de utilizar la siguiente
sintaxis: Nombre de la variable [ posición ]
Búsqueda:
La operación de búsqueda es básica en cualquier estructura de datos, esta se
refiere como su nombre lo indica a buscar dentro de un grupo de datos un dato o un
conjunto de datos en especial, existen diferentes tipos de búsquedas, la más sencilla de
ellas es la búsqueda lineal, que es la que se explicará a continuación:
BÚSQUEDA LINEAL.
Esta consiste en revisar elementos por elemento el arreglo hasta encontrar el
elemento a buscar, cuando este no se repite en el arreglo en el momento que se
encuentra la búsqueda se puede abandonar, pero si hay más de una ocurrencia de el
elemento a buscar en el arreglo se sigue revisando el arreglo hasta llegar a la ultima
posición de éste.
Ejemplo de una búsqueda lineal cuando el elemento a buscar solo se encuentra
una vez en el arreglo.
int E_buscar, Vector[20], pos=-1, p;
printf(“Cual es elemento que buscas “); //Guardas el elemento que
buscas en E_buscar
scanf(“%d”, &E_buscar);
for(p=0;p<20;p++) //Recorres todo el vector desde el 1º hasta el último
if(Vector[p]==E_buscar)//si E_buscar es igual a lo que esta en Vector[p]
{ pos=p; //Guardas la posicion p donde se encontró en pos
break; //Abandonas el ciclo
}
if (pos==-1) //Si pos es igual a –1 no se encontró, ya que era el valor
inicial y nunca se modifico, es decir no se cumplió la condición.
printf(“El elemento no se encontró “);
else //Si pos es diferente de –1 si lo encontró y esta en pos
printf(“El elemento se encuentra en la posición %d”, pos);
ORDENACIÓN
Una de las operaciones básicas que se aplican en vectores es la ordenación de
estos. La ordenación consiste en reagrupar ya sea en órden ascendente o descendente
los elementos del vector.
Existen diferentes métodos de ordenación uno de ellos es el método de
ordenación de la burbuja, este es cuando el número de elementos a ordenar es de
tamaño pequeño ya que el método consiste en tomar el primer elemento del vector y
compararlo con el resto de los elementos, de tal forma que cada que encuentra un
elemento menor al que se esta comparando este se intercambia, al finalizar la primer
pasada por los elementos del vector el elemento mayor del vector quedará en la última
posición(si la ordenación es ascendente) , el proceso se repite con todos los demás
elementos del vector hasta que éste queda ordenado.
23 2 56 1
Primer pasada
0 23 23 > 2 si hay 0 2 0 2 0 2
intercambio
1 2 1 23 23 >56 no hay 1 23 1 23
intercambio
2 56 2 56 2 56 56>1 si hay 2 1
intercambio
3 1 3 1 3 1 3 56
Segunda pasada
0 2 2 > 23 no hay 0 2 0 2
intercambio
1 23 1 23 23 >1 si hay 1 1
intercambio
2 1 2 1 2 23
3 56 3 56 3 56
Tercera pasada
0 2 2 > 1 si hay 0 1
intercambio
1 1 1 2
2 23 2 23
3 56 3 56
Al finalizar, el vector queda ordenado.
Si hacemos el código para este método tomando K para las pasadas, j como
subíndice para las posiciones y N para el número de elementos quedaría así:
for(k=1;k<N;k++)
for(j=0;j<N-k;j++)
if(Vector[j]>Vector[j+1])
{ aux=Vector[j];
Vector[j]=Vector[j+1];
Vector[j+1]=aux;
}
A B C D E \0
[0] [1] [2] [3] [4] [5]
A B C D E F G \0
[0] [1] [2] [3] [4] [5] [6] [7]
Para copiar una constante cadena o copiar una variable de cadena a otra variable
de cadena se debe utilizar la función de la biblioteca estándar - srtcpy() copiar cadenas -
lo cual quedaría:
strcpy(cadena,”ABCDEFG “);
Ejemplo: El siguiente segmento de programa muestra una cadena de caracteres
en forma vertical.
char cadena[ ]=”Ejemplo de manipulación de cadenas “;
int pos;
for(pos=0;cadena[pos];pos++) // Mientras no se llegue al carácter nulo el
ciclo se repite
printf(“%c\n”,cadena[pos]); // Imprime cada una de los elementos de la
cadena.
Cuando estamos manejando un arreglo de caracteres, este se maneja de la misma
forma que los arreglos numéricos, que son los que se verán a continuación.
Arreglos bidimensionales.
Como ya se menciono antes, estos también se conocen como matrices o tablas,
estos son arreglos que tienen 2 dimensiones. La declaración de estos es similar a los de
una sola dimensión pero por lógica estos deberán de tener 2 dimensiones.
Declaración:
Tipo de dato Nombre_variable [indice del renglón] [ indicie de la columna];
Ejemplo:
int MATRIZ_A [5][2]; //Declaración de arreglo de enteros, 5 renglones
por 2 columnas.
float MATRIZ_B[5][2]; //Declaración arreglo de flotantes, 5 renglones
por 2 columnas.
char MATRIZ_C[5][2]; //Declaración arreglo de caracteres, 5 renglones
por 2 columnas.
char MATRIZ_D[5][10]; //Declaración de arreglo, 5 cadenas de
caracteres por 2 columnas de una longitud de
10 cada una.
La representación de un arreglo bidimensional es como sigue:
MATRIZ
0 1
0 12 3
1 34 6
2 5 56
3 43 4
4 51 5
//Escritura de la matriz
for (renglón=0;renglón<2;renglón++)
for(columna=0;columna<3;columna++)
printf(“%d es el elemento [%d][%d] de la MATRIZ“,
MATRIZ[renglón][columna],renglón,columna);
Arreglos multidimensionales.
Los arreglos multidimensionales son aquellos que tienen más de una dimensión,
dentro de estos se encuentran los arreglos bidimensionales.
La declaración, inicialización y acceso es igual a las mencionadas anteriormente
en los vectores y matrices, solo que en este caso dependerá de las dimensiones que se
estén manejando.
Ejemplo de un arreglo de 3 dimensiones.
int x,y,z,ARREGLO[2][3][4];
//Lectura
for(x=0;x<2;x++)
for(y=0;y<3;y++)
for(z=0;z<4;z++)
{
printf(“Teclea el valor del elemento [%d][%d][%d] “, x,y,z);
scanf(“%d”,&ARREGLO[x][y][z]]);
}
//Escritura
for(x=0;x<2;x++)
for(y=0;y<3;y++)
for(z=0;z<4;z++)
printf(“%d es el valor del elemento [%d][%d][%d] “,
ARREGLO[x][y][z], x,y,z);