PROGRAMACION / Clave: 11214 UABC Facultad de Ingenieria Arquitectura y Diseño PRACTICA 10. Programas en DevC++ 1.- Programa que imprima las tablas de multiplicar del 1 al 10, se deberá hacer una pausa entre tabla y tabla de multiplicar. 2 .- Programa que se repita N cantidad de veces el programa de Fibonacci (el programa deberá salirse cuando el usuario presione ESC 3 .- Programa que lea N cantidad de veces números entre el rango de 10-200, el programa se repetirá hasta que el usuario introduzca un cero, al final imprimir la media de los números. 47 Pedro Núñez Yépiz Email: pedro_yepiz@uabc.edu.mx PROGRAMACION / Clave: 11214 UABC Facultad de Ingenieria Arquitectura y Diseño TEORIA 4.2.3 ANIDACION Un ciclo anidado es un ciclo que contiene otro ciclo. En C tenemos 3 ciclos diferentes el ciclo while, do_while y for, estos ciclos se pueden anidar uno en otro ya sea el mismo ciclo o uno diferente. C permite 15 niveles de anidación, cuando se anida un ciclo dentro de otro siempre se terminan de realizar primero el ciclo que esta más anidado, por ejemplo en caso de que anidáramos dentro de un ciclo do while a un ciclo for, el ciclo for se terminaría primero. El ejemplo mas claro de un ciclo anidado es un reloj, donde se necesita un ciclo para las Horas, otro ciclo para los minutos, y otro para los segundos. SINTAXIS: for ( ; ; ) { for ( ; ; ) { Sentencia; } } Este es un ejemplo de ciclo anidado con for, pero se puede realizar con cualqueira de los 3 ciclos incluso conbinando for con do while etc. EJEMPLO: for ( i=1; i<=10 ;i++ ) { for (j=1 ;j<=10 ;j++ ) { r=i*j; printf(“%d * %d= %d”,i,j,r); } system(“PAUSE”); } i=1; while ( i<=10 ) { j=1; while( j<=10 ) { r=i*j; printf(“%d * %d= %d”,i,j,r); j++; } i++; system(“PAUSE”); } i=1; do { j=1; do{ r=i*j; printf(“%d * %d= %d”,i,j,r); j++; }while( j<=10 ); i++; system(“PAUSE”); }while ( i<=10 ); En los siguientes ejemplos son 3 formas de anidar los diferentes tipos de ciclos, recordando que también se pueden combinar. En esta ocasión estos ejemplos imprimen las tablas de multiplicar del 1 al 10. 48 Pedro Núñez Yépiz Email: pedro_yepiz@uabc.edu.mx PROGRAMACION / Clave: 11214 UABC Facultad de Ingenieria Arquitectura y Diseño PRACTICA 11 49 Pedro Núñez Yépiz Email: pedro_yepiz@uabc.edu.mx PROGRAMACION / Clave: 11214 UABC Facultad de Ingenieria Arquitectura y Diseño PRACTICA 11. Programas en DevC++ 1.- Programa que lea el nombre y edad de 20 alumnos, desplegar al final el nombre y la edad del alumno con mayor edad y el alumno con menor edad. 2.- Programa que lea el nombre de usuario y password y si el password es igual a “12345” desplegar password correcto si es diferente Incorrecto 3.- Programa que lea N cantidad de cadenas y desplegar la cantidad de vocales que contiene cada frase. 50 Pedro Núñez Yépiz Email: pedro_yepiz@uabc.edu.mx PROGRAMACION / Clave: 11214 UABC Facultad de Ingenieria Arquitectura y Diseño TEORIA: 5.1 Cadenas A diferencia de otros lenguajes de programación que emplean un tipo denominado cadena string para manipular un conjunto de simbolos, en C, se debe simular mediante un arreglo de caracteres, en donde la terminación de la cadena se debe indicar con nulo. Un nulo se especifica como '\0'. Por lo anterior, cuando se declare un arreglo de caracteres se debe considerar un carácter adicional a la cadena más larga que se vaya a guardar. Por ejemplo, si se quiere declarar un arreglo cadena que guarde una cadena de diez caracteres, se hará como: char cadena[11]; Se pueden hacer también inicializaciones de arreglos de caracteres en donde automáticamente C asigna el caracter nulo al final de la cadena, de la siguiente forma: char nombre_arr[ tam ]="cadena"; Por ejemplo, el siguiente fragmento inicializa cadena con ``hola'': char cadena[5]="hola"; El código anterior es equivalente a: char cadena[5]={'h','o','l','a','\0'}; 5.1.1 LECTURA Y ESCRITURA Para asignar la entrada estándar a una cadena se puede usar la función scanf con la opción %s (observar que no se requiere usar el operador &), de igual forma para mostrarlo en la salida estándar. EJEMPLO: int main() { char nombre[15], apellidos[30]; printf("Introduce tu nombre: "); scanf("%s",nombre); printf("Introduce tus apellidos: "); scanf("%s",apellidos); printf("Usted es %s %s\n",nombre,apellidos); } 51 Pedro Núñez Yépiz Email: pedro_yepiz@uabc.edu.mx PROGRAMACION / Clave: 11214 UABC Facultad de Ingenieria Arquitectura y Diseño El lenguaje C no maneja cadenas de caracteres, como se hace con enteros o flotantes, por lo que lo siguiente no es válido: int main() { char nombre[40], apellidos[40], completo[80]; nombre="José María"; /* Ilegal */ apellidos="Morelos y Pavón"; /* Ilegal */ completo="Gral."+nombre+appellidos; /* Ilegal */ } Si bien las cadenas se pueden leer con la sentencia scanf no es lo mas correcto ya que al presionar la tecla espacio se da por aceptada toda la cadena, la forma correcta en C es usar la sentencia gets, para lo que se debe sar la librería <string.h> LECTURA DE UNA CADENA: SINTAXIS: fflush(stdin); gets (cadena); Para usar la sentencia gets no solo se debe usar la librería <string.h> se debe anteponer la sentencia fflush(stdin) , para limpiar el buffer de memoria y permita capturar la cadena correctamente. EJEMPLO: int main() { char nombreCompleto[60]; printf("Introduce tu nombre con apellidos: "); fflush(stdin); gets(nombreCompleto); printf("Usted es %s \n",nombreCompleto); return 0; } Salida de cadenas: Para Imprimir una cadena existen 2 formas en C, una es salida sin formato y la salida formateada. SINTAXIS: Salidas sin formato: puts(cadena); Salida con formato printf(“ %s”, cadena ); 52 Pedro Núñez Yépiz Email: pedro_yepiz@uabc.edu.mx PROGRAMACION / Clave: 11214 UABC Facultad de Ingenieria Arquitectura y Diseño EJEMPLO: int main() { char nombreCompleto[60]; printf("Introduce tu nombre con apellidos: "); fflush(stdin); gets(nombreCompleto); printf("Usted es %s \n",nombreCompleto); //salida formateada puts(nombreCompleto); //salida Sin formato return 0; } 5.1.2 ASIGNACION DE CADENAS Podemos reflejar todo el contenido de una cadena a otra, en otras palabras la copiamos tal cual, para esto utilizamos la función strcpy. SINTAXIS strcpy( cadenaDestino, cadenaOrigen ); Todo el contenido de la cadenaOrigen se copia a la cadenaDestino, si esta última tuviera algún valor este se borra. EJEMPLO #include <string.h> int main() { char nombreCompleto[60],alumno[50]; printf("¿Cuál es tu nombre? “); fflush(stdin); gets(nombreCompleto); printf("Usted es %s \n",nombreCompleto); strcpy(alumno, nombreCompleto); //Se asigna la cadena nombreCompleto a la cadena alumno printf("Alumno: %s \n",alumno); return 0; } 53 Pedro Núñez Yépiz Email: pedro_yepiz@uabc.edu.mx PROGRAMACION / Clave: 11214 UABC Facultad de Ingenieria Arquitectura y Diseño 5.1.3 COMPARACIÓN DE CADENAS Para saber si dos cadenas son exactamente iguales utilizamos la función strcmp. SINTAXIS strcmp ( cadena1, cadena2 ); Esta función devuelve un valor de acuerdo al resultado de la comparación. DEVUELVE: 0 Mayor a 0 Menor a 0 si la dos cadenas son exactamente iguales si la cadena1 es mayor a la cadena2 si la cadena1 es menor que la cadena2 EJEMPLO #include <string.h> int main() { char password[30], rePassword[30]; int resultado; printf(“Escribe tu contraseña "); fflush(stdin); gets(password); printf(“Escribe tu contraseña "); fflush(stdin); gets(rePassword); resultado = strcmp(password, rePassword); if ( resultado == 0 ) printf("La contraseña es aceptada"); else printf("La contraseña no coincide"); return 0; } 54 Pedro Núñez Yépiz Email: pedro_yepiz@uabc.edu.mx