Sie sind auf Seite 1von 100

Introduccion a la Programacion en C++

UNIVERSIDAD NACIONAL DE INGENIERIA Facultad de Ciencias Abraham Zamudio

Estructuras de Repeticion
Programacin Estructurada
La programacin estructurada es un paradigma que consiste en la organizacin de un cdigo en bloques conformados por estructuras del tipo: Secuencial (asignacin, lectura, escritura) Decisin o seleccin (simple, doble, mltiple) Repeticin (Repita mientras, Hacer-Mientras, Repita para)

Abraham Zamudio

Estructuras de Repeticion
Estructura de repeticin o lazo (Bucles) Permite que un conjunto de sentencias (bloque) de un programa puedan ser ejecutadas repetidamente segn el resultado de una expresin lgica. Tipos de estructuras de repeticin Repeticin condicional o controlada por un centinela: REPITA-MIENTRAS y HACER MIENTRAS. Repeticin controlada por un contador: REPITA -PARA. Conceptos Bsicos Contador Acumulador
Abraham Zamudio 3

Estructuras de Repeticion
Contador Variable cuyo valor se incrementa o decrementa en una cantidad constante cada vez que se produce un determinado suceso o accin. Se debe realizar primeramente una operacin de inicializacin y posteriormente los correspondientes incrementos o Decrementos.
Abraham Zamudio 4

Estructuras de Repeticion
Operaciones sobre un Contador Inicializacin: contador = valor inicial Incremento/decremento: contador = contador + valor_constante contador = contador valor_constante Ejemplo // inicializacin int i=0, j=1000; i++; // incremento j--; //decremento i+=15; // incremento j-=10; //decremento Cuntas iteraciones hacen falta para que j llegue a 0 (cero)?
Abraham Zamudio 5

Estructuras de Repeticion
Acumulador Variable cuyo valor se incrementa o decrementa en una cantidad variable cada vez que se produce un determinado suceso o accin. Se debe realizar primeramente una operacin de inicializacin y posteriormente los correspondientes incrementos o Decrementos.
Abraham Zamudio 6

Estructuras de Repeticion
Operaciones sobre un Acumulador Inicializacin: acumulador = valor inicial Acumulacin: acumulador = acumulador + valor acumulador = acumulador * valor acumulador = acumulador - valor acumulador = acumulador / valor
Abraham Zamudio 7

Estructuras de Repeticion
Ejemplo float iterador = 0, nota = 15.5; unsigned multiplicador = 1; // valor distinto de cero - Acumular (Incrementos) iterador = iterador + nota; multiplicador = multiplicador * nota; multiplicador *= nota; - Acumular (Decrementos) iterador = iterador nota; multiplicador /= nota;
Abraham Zamudio 8

Estructuras de Repeticion - WHILE

Abraham Zamudio

Estructuras de Repeticion - WHILE

Esta sentencia permite ejecutar repetidamente, mientras se cumpla una determinada condicin, una sentencia o bloque de sentencias. La forma general es como sigue: while (expresion_de_control) sentencia;

Abraham Zamudio

10

Estructuras de Repeticion - WHILE


Explicacin: Se evala expresion_de_control y si el resultado es false se salta sentencia y se prosigue la ejecucin. Si el resultado es true se ejecuta sentencia y se vuelve a evaluar expresion_de_control (evidentemente alguna variable de las que intervienen en expresion_de_control habr tenido que ser modificada, pues si no el bucle continuara indefinidamente). La ejecucin de sentencia prosigue hasta que expresion_de_control se hace false, en cuyo caso la ejecucin contina en la lnea siguiente a sentencia. En otras palabras, sentencia se ejecuta repetidamente mientras expresion_de_control sea true, y se deja de ejecutar cuando expresion_de_control se hace false. Obsrvese que en este caso el control para decidir si se sale o no del bucle est antes de sentencia, por lo que es posible que sentencia no se llegue a ejecutar ni una sola vez.
Abraham Zamudio 11

Estructuras de Repeticion - WHILE

Las sentencias (una o ms) del cuerpo del lazo se ejecutan mientras la condicin (expresin lgica) es cierta. Cuando la condicin es falsa, termina la ejecucin del lazo. Abraham Zamudio

12

Estructuras de Repeticion - WHILE

Se pregunta al principio por la condicin, por tanto el lazo se ejecuta cero (si la primera vez la condicin es falsa) o mas veces. Si la condicin nunca se hace falsa, el programa entra en un lazo infinito, es decir, las sentencias del cuerpo del lazo se ejecutarn indefinidamente.

Abraham Zamudio

13

Estructuras de Repeticion - WHILE

Abraham Zamudio

14

Estructuras de Repeticion - WHILE

Abraham Zamudio

15

Estructuras de Repeticion - WHILE

Abraham Zamudio

16

Estructuras de Repeticion - WHILE

Hay que estar pendientes de INICIALIZAR las variables que intervienen en la condicin antes de ejecutar el lazo por primera vez, ya que lo primero que hace la estructura es evaluar la condicin.
Abraham Zamudio 17

Estructuras de Repeticion - WHILE


#include <stdio.h> main() { char nombre[15]; int c; printf("Cual es tu nombre? \n"); scanf("%s", nombre); c=0; while( nombre[c] > 0 ) { c++; /* incrementamos el contador en uno*/ } printf("Tu nombre tiene %d caracteres \n", c); return 0; Abraham Zamudio }

18

Estructuras de Repeticion - WHILE


Salidas abruptas del while Algunas veces es conveniente salir de forma abrupta de una estructura de repeticin. Para esto se utiliza la sentencia break. Segn break, el lazo de repeticin ms interno se cancelar.
Abraham Zamudio 19

Estructuras de Repeticion - WHILE


Ejemplo de break

Abraham Zamudio

20

Estructuras de Repeticion - WHILE


Regreso abrupto a la condicin Dentro de un lazo de repeticin, se pueden hacer regresos abrutos a la condicin que gobierna al lazo. El constructo en C para tal proposito es el continue.
Abraham Zamudio 21

Estructuras de Repeticion - WHILE


Ejemplo del continue Supongamos que queremos procesar solamente los nmeros enteros positivos de un conjunto introducido por teclado:
i=0; while (i<10) { prinf(Introduzca un nmero: ); scanf(%i,&n); if (n < 0) continue; else { i++; printf(Procesable); } Abraham Zamudio }

22

Estructuras de Repeticion - WHILE


Ejemplo Calcular la suma de n nmeros introducidos por teclado.

Abraham Zamudio

23

Estructuras de Repeticion - WHILE


Ejemplo Calcular la suma de n nmeros introducidos por teclado.

Abraham Zamudio

24

Estructuras de Repeticion - WHILE


Codificacin
#include <stdio.h> void main () { int n, num, suma = 0, contador = 0; printf(Introduzca el nmero de elementos a sumar); scanf(%i,n); while (contador < n) { contador++; printf(Introduzca un numero);

scanf(%i,&num); suma += num;

} printf(Suma = %i\n, suma); }


Abraham Zamudio 25

Estructuras de Repeticion - WHILE


Ejemplo. EPS. Leer una serie de nmeros reales y calcular su media. La marca de fin de lectura ser el 999

Abraham Zamudio

26

Estructuras de Repeticion - WHILE

Abraham Zamudio

27

Estructuras de Repeticion - WHILE

Abraham Zamudio

28

Estructuras de Repeticion WHILE Ejercicios Propuestos

Abraham Zamudio

29

Estructuras de Repeticion WHILE Ejercicios Propuestos

Abraham Zamudio

30

Estructuras de Repeticion WHILE Ejercicios Propuestos

Abraham Zamudio

31

Estructuras de Repeticion WHILE Ejercicios Propuestos

Abraham Zamudio

32

Estructuras de Repeticion WHILE Ejercicios Propuestos

Abraham Zamudio

33

Estructuras de Repeticion WHILE Ejercicios Propuestos

Abraham Zamudio

34

Estructuras de Repeticion DO ... WHILE

Abraham Zamudio

35

Estructuras de Repeticion DO ... WHILE


La estructura Hacer-Mientras es una sentencia del tipo REPITA MIENTRAS con la diferencia que evala la condicin al final del lazo y no al principio. Las sentencias (una o ms) del cuerpo del lazo se ejecutan mientras que la condicin (expresin lgica) es cierta. Como se pregunta al final por la condicin, el lazo se ejecuta una o mas veces. Si la condicin nunca se hace falsa, las sentencias del cuerpo del lazo se ejecutarn indefinidamente.
Abraham Zamudio 36

Estructuras de Repeticion DO ... WHILE


Las variables que intervienen en la condicin pueden INICIALIZARSE antes de la primera ejecucin del lazo o durante sta, ya que la evaluacin de la condicin se hace al final de la estructura. Hay que estar pendientes de MODIFICAR dentro del cuerpo del lazo los valores de las variables que intervienen en la condicin. La modificacin de estos valores debe estar en aras de garantizar que en algn momento la condicin se haga falsa y el lazo pueda terminar su ejecucin.
Abraham Zamudio 37

Estructuras de Repeticion DO ... WHILE

Abraham Zamudio

38

Estructuras de Repeticion DO ... WHILE

Abraham Zamudio

39

Estructuras de Repeticion DO ... WHILE

Abraham Zamudio

40

Estructuras de Repeticion DO ... WHILE

Abraham Zamudio

41

Estructuras de Repeticion DO ... WHILE

Abraham Zamudio

42

Estructuras de Repeticion DO ... WHILE

Abraham Zamudio

43

Estructuras de Repeticion DO ... WHILE


#include <stdio.h> void main () { int conta = 0, CP = 0, CI = 0; int AP = 0, AI = 0, num; float media; do { printf(numero ?\n); scanf(%i,&num); if (num % 2 == 0) { // par CP++; AP += num; }

else { // impar CI++; AI += num; } conta++; } while (conta < 10); if (CI != 0) { media =(float)AI/(float)CI; printf(%i %i %i,AP,CP,media); } else { printf(%i %i,AP,CP); printf(No hay numeros impares\n); } }
Abraham Zamudio 44

Estructuras de Repeticion DO ... WHILE

Abraham Zamudio

45

Estructuras de Repeticion DO ... WHILE

Abraham Zamudio

46

Estructuras de Repeticion DO ... WHILE


#include <stdio.h> void main () { unsigned int n, numero = 0, nPar = 0, nImpar = 0; do // validacin del valor de n printf(Introduzca un valor entero mayor que cero\n); scanf(%i,&n); } while (n >= 1);

do { numero ++; if (numero % 2 ==0) nPar += numero; else nImpar += numero; } while (numero < n); printf(Suma de numeros pares %i\n,nPar); printf(Suma de numeros impares %i\n,nImpar); }
Abraham Zamudio 47

Estructuras de Repeticion DO ... WHILE

Abraham Zamudio

48

Estructuras de Repeticion DO ... WHILE

Abraham Zamudio

49

Estructuras de Repeticion DO ... WHILE

Abraham Zamudio

50

Estructuras de Repeticion DO ... WHILE

Abraham Zamudio

51

Estructuras de Repeticion For

For es quizs el tipo de bucle mas verstil y utilizado del lenguaje C. Su forma general es la Siguiente:
for (inicializacion; expresion_de_control; actualizacion) sentencia;

Abraham Zamudio

52

Estructuras de Repeticion For


Explicacin: Posiblemente la forma ms sencilla de explicar la sentencia for sea utilizando la construccin while que sera equivalente. Dicha construccin es la siguiente: inicializacion; while (expresion_de_control) { sentencia; actualizacion; }
Abraham Zamudio 53

Estructuras de Repeticion For


donde sentencia puede ser una nica sentencia terminada con (;), otra sentencia de control ocupando varias lneas (if, while, for, ...), o una sentencia compuesta o un bloque encerrado entre llaves {...}. Antes de iniciarse el bucle se ejecuta inicializacion, que es una o ms sentencias que asignan valores iniciales a ciertas variables o contadores. A continuacin se evala expresion_de_control y si es false se prosigue en la sentencia siguiente a la construccin for; si es true se ejecutan sentencia y actualizacion, y se vuelve a evaluar expresion_de_control. El proceso prosigue hasta que expresion_de_control sea false. La parte de actualizacion sirve para actualizar variables o incrementar contadores. Abraham Zamudio 54

Estructuras de Repeticion For


Un ejemplo tpico puede ser el producto escalar de dos vectores a y b de dimensin n: for (pe =0.0, i=1; i<=n; i++){ pe += a[i]*b[i]; }
Primeramente se inicializa la variable pe a cero y la variable i a 1; el ciclo se repetir mientras que i sea menor o igual que n, y al final de cada ciclo el valor de i se incrementar en una unidad. En total, el bucle se repetir n veces. La ventaja de la construccin for sobre la construccin while equivalente est en que en la cabecera de la construccin for se tiene toda la informacin sobre como se inicializan, controlan y actualizan las variables del bucle. Obsrvese que la inicializacion consta de dos sentencias separadas por el operador (,). Abraham Zamudio 55

Estructuras de Repeticion For

Abraham Zamudio

56

Estructuras de Repeticion For

Abraham Zamudio

57

Estructuras de Repeticion For

Abraham Zamudio

58

Estructuras de Repeticion For

Abraham Zamudio

59

Estructuras de Repeticion For

Abraham Zamudio

60

Estructuras de Repeticion For

Abraham Zamudio

61

Estructuras de Repeticion For

Abraham Zamudio

62

Estructuras de Repeticion For Ejemplo 1

Abraham Zamudio

63

Estructuras de Repeticion For Ejemplo 2

Abraham Zamudio

64

Estructuras de Repeticion For Ejemplo 2


Codificacin #include <stdio.h> void main() { unsigned int AP = 0, num; for (num = 2; num <= 100; num += 2) AP += num; printf(Suma de numeros pares %i \n,AP); }
Abraham Zamudio 65

Estructuras de Repeticion For Ejemplo 3

Abraham Zamudio

66

Estructuras de Repeticion For Ejemplo 3

Abraham Zamudio

67

Estructuras de Repeticion For Ejemplo 3


Codificacin //Calcula el promedio de 3 notas para n //estudiantes #include <stdio.h> void main () { unsigned integer n, k, nota1, nota2, nota3; float media; printf(Introduzca el numero de estudiantes\n); scanf(%i,&n); for (k = 1; k <= n; k++) { printf(Para el estudiante ); printf(Introduzca la nota de PD-I );; scanf(%i,&nota1); printf(Introduzca la nota de Probabilidades); scanf(%i,&nota2); cout Introduzca la nota de Calculo 40 ); scanf(%i,&nota3); media = ((float)nota1 + (float)nota2 + (float)nota3)/3.0; printf(Media del estudiante %i = %i\n,k,media); } }
Abraham Zamudio 68

Estructuras de Repeticion For Ejemplo 4

Abraham Zamudio

69

Estructuras de Repeticion For Ejemplo 4

Abraham Zamudio

70

Estructuras de Repeticion For Ejemplo 4

Abraham Zamudio

71

Estructuras de Repticion Anidadas


Estructuras de repeticin unas dentro de otras. Reglas de anidamiento La(s) estructura(s) interna(s) debe(n) estar completamente contenida(s) en la estructura externa. No deben existir solapamientos.
Abraham Zamudio 72

Estructuras de Repticion Anidadas

Abraham Zamudio

73

Estructuras de Repticion Anidadas Ejemplo 1


Un tringulo rectngulo puede tener lados que sean enteros. El conjunto de tres valores enteros para los lados de un tringulo rectngulo es una tripleta pitagrica. Estos tres lados deben satisfacer la relacin de que la suma de los cuadrados de dos de los lados (cateto1, cateto2) es igual al cuadrado de la hipotenusa. Encontrar todas las tripletas pitagricas tal que Cateto1 < 500, cateto2 < 500 e hipotenusa < 500.
Abraham Zamudio 74

Estructuras de Repticion Anidadas Ejemplo 1

Abraham Zamudio

75

#include <stdio.h> #define MAX 500 int main() { int i, j; for (i = 1; i <= MAX; i++) for (j = 1; j <= i; j++) { if (sqrt(float(i*i+j*j)) - int(sqrt(float(i*i+j*j))) == 0.0) printf("triplete: %i, %i, %i, i, j , i*i+j*j); } } Abraham Zamudio

Estructuras de Repticion Anidadas Ejemplo 1

76

Estructuras de Repticion Anidadas Ejemplo 2


Se conoce la poblacin de cada una de las cinco ciudades mas importantes de veintiocho pases y se desea identificar e imprimir la poblacin de la ciudad mas grande (en nmero de habitantes) de cada pas. REALIZAR EL ANALISIS E-P-S

Abraham Zamudio

77

Estructuras de Repticion Anidadas Ejemplo 2

Abraham Zamudio

78

Estructuras de Repticion Anidadas Ejemplo 2


#include <stdio.h> void main () { int j = 1, mayor, k; while (j < 28) { mayor = 0; for (k = 1; k <= 5; k++) { printf(Introduzca poblacin de ciudad %i:, k); scanf(%i, pob_ciudad); if (pob_ciudad > mayor) mayor = pob_ciudad; } printf(Poblacion mayor del pais %i = %i, j, mayor); j++; } }
Abraham Zamudio 79

Manejo de Archivos en C
El problema de los datos utilizados por un programa, es qu todos los datos se eliminan cuando el programa termina. En la mayora de los casos se desean utilizar datos que no desaparezcan cuando el programa finaliza. De cara a la programacin de aplicaciones, un archivo no es ms que una corriente (tambin llamada stream) de bits o bytes que posee un final (generalmente indicado por una marca de fin de archivo). Para poder leer un archivo, se asocia a ste un flujo (tambin llamado secuencia) que es el elemento que permite leer los datos del archivo. En C un archivo puede ser cualquier cosa, desde un archivo de disco a un terminal o una impresora. Se puede asociar un flujo a un archivo mediante una operacin de apertura del archivo

Abraham Zamudio

80

Manejo de Archivos en C

La realidad fsica de los datos es que stos son nmeros binarios. Como es prcticamente imposible trabajar utilizando el cdigo binario, los datos deben de ser reinterpretados como enteros, caracteres, cadenas, estructuras, etc.

Abraham Zamudio

81

Manejo de Archivos en C
En el siguiente slide se intenta representar la realidad de los datos de un fichero. En el ejemplo, el fichero guarda datos de trabajadores. Desde el punto de vista humano hay salarios, nombres, departamentos, etc. Desde el punto de vista de la programacin hay una estructura de datos compuesta por un campo de tipo String, un entero, un double y una subestructura que representa fechas.
Abraham Zamudio 82

Manejo de Archivos en C

Abraham Zamudio

83

Manejo de Archivos en C Clasificacion


Por el tipo de Contenido Archivos de texto. Contienen informacin en forma de caracteres. Normalmente se organizan los caracteres en forma de lneas al final de cada cual se coloca un carcter de fin de lnea (normalmente la secuencia \r\n). Al leer hay que tener en cuenta la que la codificacin de caracteres puede variar (la se puede codificar muy distinto segn qu sistema utilicemos). Los cdigos ms usados son:

ASCII. ISO 8859-1. Windows 1252. Unicode. Archivos binarios.

Abraham Zamudio

84

Manejo de Archivos en C Clasificacion


por la forma de acceso
Archivos secuenciales. Se trata de archivos en los que el contenido se lee o escribe de forma continua. No se accede a un punto concreto del archivo, para leer cualquier informacin necesitamos leer todos los datos hasta llegar a dicha informacin. En general son los archivos de texto los que se suelen utilizar de forma secuencial.

Archivos de acceso directo. Se puede acceder a cualquier dato del archivo conociendo su posicin en el mismo. Dicha posicin se suele indicar en bytes. En general los archivos binarios se utilizan mediante acceso directo.

Abraham Zamudio

85

Manejo de Archivos en C
Estructura FILE y punteros a archivos En el archivo de cabecera stdio.h se define una estructura llamada FILE. Esa estructura representa la cabecera de los archivos. La secuencia de acceso a un archivo debe poseer esta estructura. Un programa requiere tener un puntero de tipo *FILE a cada archivo que se desee leer o escribir. A este puntero se le llama puntero de archivos.
Abraham Zamudio 86

Manejo de Archivos en C

Apertura de Archivos : La apertura de los archivos se realiza con la funcin fopen. Esta funcin devuelve un puntero de tipo FILE al archivo que se desea abrir. El prototipo de la funcin es:

Abraham Zamudio

87

Manejo de Archivos en C
nombreArchivo es una cadena que contiene la ruta hacia el archivo que se desea abrir. modo es otra cadena cuyo contenido puede ser:

Abraham Zamudio

88

Manejo de Archivos en C

Abraham Zamudio

89

Manejo de Archivos en C
Un archivo se puede abrir en modo texto o en modo binario. En modo texto se leen o escriben caracteres, en modo binario se leen y escriben cualquier otro tipo de datos. La funcin fopen devuelve un puntero de tipo FILE al archivo que se est abriendo. En caso de que esta apertura falle, devuelve el valor NULL (puntero nulo). El fallo se puede producir porque el archivo no exista (slo en los modos r), porque la ruta al archivo no sea correcta, porque no haya permisos suficientes para la apertura, porque haya un problema en el sistema
Abraham Zamudio 90

Manejo de Archivos en C
cierre de archivos: La funcin fclose es la encargada de cerrar un archivo previamente abierto. Su prototipo es:

pArchivo es el puntero que seala al archivo que se desea cerrar. Si devuelve el valor cero, significa que el cierre ha sido correcto, en otro caso se devuelve un nmero distinto de cero.
Abraham Zamudio 91

Manejo de Archivos en C

Abraham Zamudio

92

Manejo de Archivos en C
#include <stdio.h> #include <string.h> int main() { FILE *fp; fp = fopen("prueba.htm", "w"); /* Abrir archivo para escritura */ fprintf(fp, "<HTML> \n"); fprintf(fp, "<BODY> \n"); fprintf(fp, "Esta es la primera linea de texto. \n"); fprintf(fp, "<CENTER>Esta es la segunda linea</CENTER> \n"); fprintf(fp, "Y esta es la <B>tercera linea de texto.</B> \n"); fclose(fp); /* Cerrar el archivo antes de terminar el programa */ printf("Se ha creado el archivo: prueba.htm \n"); return 0; }
Abraham Zamudio 93

Manejo de Archivos en C

Abraham Zamudio

94

Manejo de Archivos en C

Abraham Zamudio

95

Manejo de Archivos en C

Abraham Zamudio

96

Manejo de Archivos en C

Matriz1.DAT

Matriz2.DAT

4. 5.6 9. 4.6 78. 5.5 1.1 4.8 8.8

3.4 4.4 2.2 4.9 3.4 8.4 2.4 3.7 9.3


Abraham Zamudio 97

Manejo de Archivos en C
#include<stdio.h> #include<stdlib.h> main(){ FILE *fp1, *fp2, *fs; float a[10][10],b[10][10],c[10][10],uno,dos; int n, m, i, j; if((fp1 = fopen("Matriz1.DAT","r"))==NULL) { printf("EL ARCHIVO Matriz1.dat NO EXISTE"); } else{ if((fp2 = fopen("Matriz2.DAT","r"))==NULL) { printf("EL ARCHIVO Matriz2.dat NO EXISTE"); } else{ n = 2; m = 3; for(i=0;i<n;i++) { for(j=0;j<m;j++) { fscanf(fp1,"%f",&uno); a[i][j]=uno; fscanf(fp2,"%f",&dos); b[i][j]=dos; c[i][j]=a[i][j] + b[i][j]; } } } } fclose(fp1); fclose(fp2); Abraham Zamudio

Esta primera parte del ejemplo es para cargar las matrices de entrada que se encuentran fisicamente en dos archivos de texto : Matriz1.DAT Matriz2.DAT

98

Manejo de Archivos en C
printf("La matriz uno es\n"); for(i=0;i<n;i++) { for(j=0;j<m;j++) {printf(" %.2f ",a[i][j]);}printf("\n"); } printf("La matriz dos es\n"); for(i=0;i<n;i++) { for(j=0;j<m;j++) {printf(" %.2f ",b[i][j]);}printf("\n"); } printf("La matriz suma es :\n"); for(i=0;i<n;i++) { for(j=0;j<m;j++) {printf(" %.2f ",c[i][j]);}printf("\n"); } printf("\n"); fs = fopen("MatrizR.txt","w"); for(i=0;i<n;i++) { for(j=0;j<m;j++) { fprintf(fs, " %.2f ",c[i][j]);} fprintf(fs, "\n"); } } Abraham Zamudio 99

En esta segunda parte del ejemplo se utilizan las matrices creadas a partir de los archivos .DAT para hacer operaciones con ellas

Manejo de Archivos en C

Abraham Zamudio

100

Das könnte Ihnen auch gefallen