Fundacin Misin Sucre Municipio Urachiche Edo. Yaracuy
Programa Nacional de Formacin en Sistemas e Informtica
1 C Ctedra: Introduccin a la Programacin Primer Periodo Primer Trimestre Profesor-Asesor: Vladimir Gude
G Gu u a a 1 1 d de e p pr ro og gr ra am ma ac ci i n n e en n L Le en ng gu ua aj je e C C
La presente gua no pretende sustituir al profesor, sino servir de apoyo a los triunfadores en el aprendizaje de la programacin en el lenguaje C.
Historia del Lenguaje C El lenguaje C naci en los laboratorios de la Bell Telephone y ha sido estrechamente asociado con el sistema operativo Unix, ya que su desarrollo se realiz en este sistema y debido a que tanto Unix como el propio compilador C, fueron escritos en C. Este lenguaje est inspirado en el lenguaje B escrito por Ken Thompson en 1970 con intencin de recodificar el Unix, que en la fase de arranque estaba escrito en lenguaje ensamblador, en vistas a su transportabilidad a otras mquinas. B era un lenguaje evolucionado e independiente de la mquina, inspirado en el lenguaje BCPL concebido por Martn Richard en 1967. En 1972, Dennis Ritchie, toma el relevo y modifica el lenguaje B, creando el lenguaje C y rescribiendo el Unix en dicho lenguaje. La novedad que proporcion el lenguaje C sobre el B fue el diseo de tipos y estructura de datos. C, que ha sido pensado para ser altamente transportable y para programar lo improgramable, tiene sus inconvenientes. Carece de instrucciones de Entrada/Salida, de instrucciones para manejo de cadenas de caracteres, con lo que este trabajo queda para la librera de rutinas, con la consiguiente prdida de transportabilidad. Ha pesar de todo, C ha demostrado ser un lenguaje extremadamente eficaz y expresivo.
Conceptos Variables: Las variables son nombres que se le dan a las localidades en la memoria principal donde un elemento de dato puede almacenarse. Un nombre de variable puede estar formado por una secuencia de letras del alfabeto y/o dgitos de 0 al 9 y/o el carcter subrayado (_). Sin embargo, no debe comenzar con un dgito. Ejemplos: edad, num_1, n1, Edad Los nombres de variables pueden contener caracteres del alfabeto en mayscula as como en minscula. En el ejemplo anterior, las variables edad y Edad se toman como variables distintas Sin embargo, los programadores generalmente usan letras minsculas para los identificadores de las variables, para evitar confusiones. El nombre de una variable puede tener cualquier longitud, pero slo los primeros 31 caracteres son significativos. Aunque algunos compiladores de C aceptan slo los primeros ocho caracteres como significativos. Los nombres de variables no pueden ser iguales a las palabras reservadas de C. De hecho las palabras reservadas en C estn en letras minsculas. A continuacin se presenta la lista de las 32 palabras reservadas o claves del ANSI C (algunos compiladores aaden otras palabras claves, propias de ellos):
2 Palabras Claves en C: auto const extern register switch continue goto static break double Float return typedef default if void case else int short union do signed volatile char enum long struct unsigned for sizeof while
Identificadores: Los nombres de las variables y de las funciones se denominan identificadores. Los identificadores en lenguaje C pueden contener letras del alfabeto y/o dgitos de 0 al 9 y/o el carcter subrayado (_). Sin embargo, no debe comenzar con un dgito. Los identificadores pueden estar formados por caracteres en mayscula y/o en minscula. Pero recuerde que C, hace diferencias entre maysculas y minsculas. Se recomienda programar en minscula para evitar que una misma variable sea escrita a veces en mayscula u otras en minscula.
Tipos de Datos Bsicos en C Un tipo de dato se define como un conjunto de valores y operaciones definidas para las variables de ese tipo en particular. Los tipos de datos bsicos en C son: Tipo Rango Descripcin Ejemplos int -32768 .. 32767 Nmero Entero (sin decimales). edad, nota, nro_de_hijos float 3.4*10 -38 .. 3.4*10 +38 Nmero Real (con o sin decimales). sueldo, precio, interes, promedio, porcentaje double 1.7*10 -308 .. 1.7*10 +308 Nmero Real de doble precisin (con o sin decimales). sueldo, precio, interes, promedio, porcentaje char -128 .. 127 (carcter) Carcter simple. letra, sexo, edo_civil, seccion.
Los caracteres (tipo char) se representan a nivel de mquina como un entero. Para hacer esto, las computadoras utilizan el cdigo ASCII (American Standard Code for Information Interchange: Cdigo Americano para el Intercambio de Informacin), que tiene enteros estndar asociados para cada uno de a-z, A-Z, 0-9, y todos los caracteres especiales como $,%,* y &. Por ejemplo, el carcter 'A' tiene el valor 65 en la tabla ASCII; el carcter 'a' se representa con el carcter ASCII 97. (ver Tabla ASCII al final de la gua).
Calificadores de Tipos de datos: Los tipos de datos bsicos pueden modificarse usando calificadores de datos, los cuales son: short, long, signed y unsigned. Estos calificadores, en algunos casos, modifican el rango de los tipos bsicos, dependiendo del compilador que se utilice. La siguiente tabla muestra los tipos bsicos usando calificadores (recuerde que el rango depende del compilador que se utilice y que algunos tipos no existen en algunos compiladores, tales como: long float y long double).
Tipo Rango int signed int -32768 .. 32767 unsigned int unsigned 0 .. 65535 short short int signed short int -32768 .. 32767 3
unsigned short unsigned short int 0 .. 65535 long long int signed long int -2147483648 .. 2147483647 unsigned long unsigned long int 0 .. 4294967295 float 3.4*10 -38 .. 3.4*10 +38
long float double 1.7*10 -308 .. 1.7*10 +308
long double 3.4*10 -4932 .. 3.4*10 +4932
char signed char -128 .. 127 (un carcter) unsigned char 0 .. 255 (un carcter)
Cada uno de los calificadores puede aplicarse al tipo bsico int, para generar: short int, long int, signed int o unsigned int. Tambin se puede escribir: short, long o unsigned (omitiendo el tipo bsico int) para referirnos a: short int, long int o unsigned int, respectivamente. Generalmente, short tiene un rango menor que int, mientras que long tiene un rango mayor que int. Esto depende del compilador que se utilice. El calificador unsigned puede ser agregado a short int y long int, para generar: unsigned short int o unsigned long int. Algunos compiladores permiten que el calificador long se pueda usar con float y double para generar: long float o long double. Los calificadores signed y unsigned pueden aplicarse al tipo de dato char. -------- o --------
Valores Enteros: Un valor entero es un nmero que consiste de una secuencia de dgitos precedida o no por un signo + o -. Los valores enteros pueden ser escritos en tres sistemas de numeracin diferentes:
Sistema Base Smbolos permitidos Precedido de Ejemplos Decimal 10 0,1,2,3,4,5,6,7,8,9,+,- +,- un dgito. 9, 4578, -234, 0, +34 Octal 8 0,1,2,3,4,5,6,7 0 (cero) 01234, 0, 01, 077 Hexadecimal 16 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 0X 0x 0Xa2b4C9, 0xFACE, 0x
El sistema decimal permite los dgitos de 0 a 9 y opcionalmente precedido de un signo + o -. No debe contener comas (,) ni caracteres especiales (como: $,%). No debe comenzar con cero a menos que sea el propio nmero cero (0). Ejemplo: 9, 4578, -234, 0 y +34 El sistema octal permite los dgitos de 0 a 7 y debe comenzar con cero (0). Ejemplo: 01234, 0, 01 y 077 El sistema hexadecimal permite los dgitos de 0 a 9 y las letras A,B,C,D,E y F. Se puede usar las letras maysculas o minsculas; y debe comenzar con 0X 0x. Ejemplo: 0Xa2b4C9, 0xFACE y 0x
Valores Reales: Un valor real es un nmero en base 10 (sistema decimal) que contiene dgitos y un punto decimal (.) o un exponente (o ambos). Ejemplo: 0.0, 1.0, 0.3, 1234.43, +2.6, -3.002 Ejemplos con notacin exponencial: 4E-3, 2.3E+4, 0.0034e4 En los ejemplos anteriores, 4E-3 significa: 4 x 10 -3 que es 0.004; 2.3E+4 significa: 2.3 x 10 +4
que es 23000.0 4
Valores de Carcter: Un valor de tipo carcter es cualquier carcter encerrado entre apstrofes. Ejemplo: 'a', 'C', '*', '8'.
Valores de Cadenas: Un valor de cadena consiste de cero o ms caracteres encerrados entre comillas dobles. Ejemplo: "PAMELA", "hola", "a". Tenga en cuenta que 'a' es diferente de "a", en el primer caso es el carcter a y en el segundo es la cadena a. -------- o --------
Instrucciones Bsicas de C Las instrucciones bsicas en un programa en C son: Entrada (lectura), Asignacin y Salida (escribir). A continuacin se explican cada una de ellas:
Instrucciones de Entrada (Lectura): Existen funciones que permiten la lectura o entrada de datos (realizadas por un usuario) al programa. Ejemplo: scanf ("%d", &edad); La funcin scanf lee un dato introducido por teclado. La cadena entre comillas se llama cadena de formato y especifica el tipo de dato a leer. Luego, se escribe el nombre de la variable precedido por el smbolo & (excepto para variables cadena). Cuando aparece la instruccin scanf, la ejecucin del programa se detiene hasta que el usuario introduce un valor y presiona la tecla Enter. Dicho valor se asigna (introduce) en la variable indicada entre parntesis (en este ejemplo, en la variable edad). Ejemplo: printf ("Introduzca Sueldo: "); scanf ("%f", &sueldo); En este ejemplo, se muestra por pantalla un mensaje (la cadena: Introduzca Sueldo:) antes de la lectura, para informar al usuario, que debe introducir un valor.
Especificadores: Especificador Tipo de dato %d %i int (nmero entero con signo) %u int (nmero entero sin signo) %f float (real) %c char (carcter) %s char (cadena string)
Otra funcin de lectura es getche(), la cual permite la lectura de un carcter por teclado, y asignar ese valor a una variable. No requiere pulsar la tecla Enter despus de introducir el carcter. Ejemplo: caracter = getche (); En el ejemplo anterior, la funcin getche() lee un carcter desde el teclado y asigna su valor a la variable char caracter. Ejemplo: printf ("Introduzca sexo (F/M): "); sexo = getche (); printf ("\n"); Ejemplo: printf ("Pulse una tecla para salir... "); getche (); En el ejemplo anterior, se utiliza la funcin getche() sin especificar una variable a la cual asignarle el valor ledo. Esto tambin es vlido. 5 Instruccin de Asignacin: Est compuesta por: <variable> = <Expresin>;. Se evala o resuelve la <expresin> a la derecha del smbolo de asignacin (=) y el resultado lo introduce (o asigna) en la <variable> de la izquierda. Donde, <expresin> puede ser: una expresin matemtica, lgica, una cadena, o una variable. Ejemplos: edad = 18; strcpy (nombre, "Alice"); suma = a + b; promedio = (n1 + n2 + n3) / 3; sexo = 'F'; encontrado = 0; Cabe destacar, que la variable que recibe el valor (a la izquierda) debe ser del mismo tipo que el resultado de la expresin o valor de la derecha. Las cadenas (string) se deben escribir entre comillas y los caracteres (char), se deben escribir encerrados entre apstrofes (Ejemplo: "Alice", 'F'). Las cadenas (ejemplo "Alice" ) no se asignan con el smbolo = sino a travs de la funcin strcpy. En el ejemplo, se asigna la cadena "Alice" a la variable nombre.
Instrucciones de Salida (Escritura): Las instrucciones de salida o escritura permiten imprimir o mostrar una cadena de caracteres, una expresin y/o un valor por pantalla. Ejemplo: printf ("Hola... "); En el ejemplo anterior se mostrar por pantalla la cadena Hola
Ejemplo: suma = 25; printf ("%d", suma); Para mostrar el valor de una variable se debe especificar la cadena de formato (entre comillas). Luego, separado por una coma, se escribe el nombre de la variable. En el ejemplo anterior se mostrar por pantalla el contenido de la variable suma, 25.
Nota: Si se va a mostrar una o ms variables y/o una o ms cadenas, se debe indicar el valor de la variable por medio de un especificador de formato (dentro de la cadena); y luego, escribir las variables correspondientes. Ejemplo: total = 20; printf ("El total es: %d", total); En el ejemplo anterior se mostrar en pantalla El total es: 20, es decir, se mostrar la cadena El total es: y el valor contenido en la variable total que es 20. Ejemplo: strcpy (nombre, "Tamara"; edad = 21; printf ("La edad de %s es: %d", nombre, edad); En este ejemplo se mostrar por pantalla: La edad de Tamara es: 21 Ejemplo: strcpy (apellido, "Parra"); edad = 21; nota = 17.5; sexo = 'M'; printf ("El apellido es: %s\n", apellido); printf ("La edad es: %d\n", edad); printf ("La nota es: %f\n", nota); printf ("El sexo es: %c", sexo);
En el ejemplo anterior se ha usado la secuencia de escape (\n), que inserta un salto de lnea, es decir, baja el cursor a la siguiente lnea. Las secuencias de escape se utilizan para insertar o enviar ciertos caracteres especiales. A continuacin se presentan algunas de las secuencias de escape: Nota: Las funciones printf() y scanf() estn definidas en la biblioteca stdio.h. Por lo tanto, si se va a utilizar alguna de ellas se debe especificar esta biblioteca en el programa. 6 Secuencias de Escape: Secuencia de Escape Carcter de salida \n Salto de lnea \a Suena la campana \b Retroceso de carro (Backspace) \r Retorno de carro (al inicio de lnea) \t Tabulador (6 caracteres) \' Representacin de apstrofe \" Representacin de comilla doble \\ Representacin de \ \? Representacin de ? -------- o --------
Estructura de un Programa en C Un programa en C tiene las siguientes partes: 1. llamadas a bibliotecas 2. declaracin de variables globales 3. main() { 4. declaracin de variables locales 5. instrucciones 6. }
Ahora se explicar cada una de estas partes:
1. llamadas a bibliotecas: Aqu se especifican las bibliotecas a utilizar en el programa. Una biblioteca es un programa (con extensin .h) que contiene la definicin de funciones que van a ser usados en nuestro programa. Ejemplo: #include <stdio.h> #include <conio.h> Para mejor comprensin, las funciones printf(), scanf() y getche() estn definidas en la biblioteca stdio.h; por lo tanto si nuestro programa utiliza alguna de estas funciones, se debe llamar a la biblioteca stdio.h.
2. declaracin de variables globales: Aqu se declaran las variables globales. Se llaman globales porque son reconocidas en el programa y en las funciones definidas por el programador. Se debe especificar el tipo de dato y luego el nombre de la variable. Ejemplo: int edad; float sueldo, promedio; char sexo; char nombre[20]; En el ejemplo anterior se ha definido la variable nombre de tipo cadena (string) de 20 caracteres.
3. main() {: Cualquier aplicacin hecha en lenguaje C debe constar de una funcin principal llamada main(), que ser la primera en ser llamada. Las llaves ({ }) que incluyen el cuerpo de esta funcin principal, definen el principio y el final del programa. En la estructura anterior, el main() comprende desde la lnea 4 a la lnea 7. Se puede decir que main() contiene las instrucciones del cuerpo principal del programa. Ejemplo: main() { nota = 18; printf ("%d", nota); } 7 Se puede utilizar int main(void) en sustitucin de main() debido a que son equivalentes. Es importante mencionar que la funcin principal main() por defecto devuelve un entero y no est definida para recibir argumento alguno.
4. declaracin de variables locales: Las variables definidas dentro de una funcin, son reconocidas solo en esa funcin. Las variables declaradas dentro de las llaves ({ }) de la funcin main() solo sern reconocidas dentro de la funcin main(). -------- o --------
Otras Consideraciones: Comentarios: Al escribir programas en C podemos colocar algunos comentarios para que el programa sea ms claro. Los comentarios no sern ejecutados por el programa. Estos comentarios se escriben encerrados entre /* y */. Ejemplo: scanf ("%d", ¬a); /* lectura de una nota */ mitad = nota / 2; /* aqu se calcula la mitad de la nota */
Uso de Maysculas y minsculas: El lenguaje C s hace diferencias entre maysculas y minsculas, es decir, una variable llamada edad es distinta a Edad. Para evitar confusiones se acostumbra a programar en minscula. Las palabras reservadas en C (tales como: int, float) se deben escribir en minscula. Ejemplo: letra = 'A'; Letra = 'a'; /*Existen dos variables distintas: letra y Letra*/
Uso del Punto y coma (;): El smbolo punto y coma (;) se usa como separador de instrucciones, tambin conocido como delimitador de instrucciones. Las llamadas a bibliotecas no requieren terminar con punto y coma. Debe tener cuidado al utilizar punto y coma (;) en las instrucciones de ciclo.
Identacin: Es conveniente respetar la identacin (o sangra) al escribir los programas. Esto ayuda a que los programas sean ms claros y supone una programacin de calidad.
Observaciones: Estas son otras consideraciones a tomar en cuenta en la programacin: a) Los nmeros con decimales utilizan un punto (no coma) para separar los decimales. Ejemplo: 3.14 b) Las expresiones que involucren una divisin, son de tipo float (se asignan a una variable float). c) El operador matemtico de divisin (/) devuelve un valor entero si los operandos de la divisin son enteros (aunque se le asigne a una variable de tipo real). Ejemplo: float divi; divi = 7 / 2; printf ("%f", divi) /* se mostrar: 3.000000 */ d) Se debe evitar la divisin por cero. Asegrese que el divisor es diferente de cero. e) Tenga en cuenta que una variable no sobrepase los lmites (inferior y superior) de su tipo de dato (valor fuera de rango). Por ejemplo: a = 20000 + 20000; el valor de a ser 40000. Si la variable a es de tipo int, se producir un error, porque el tipo int tiene un lmite superior de 32767. f) Tratar de asignar un valor de tipo no entero a una variable de tipo entero (int), por ejemplo 3.141 o el carcter 'A', producir que se asigne: 3 65 (cdigo ASCII para el carcter 'A') a la variable. g) No utilizar palabras reservadas o identificadores estndar de C para nombres de variables. h) Una instruccin larga se puede dividir en mltiples lneas, utilizando el carcter diagonal inversa (\). Una lnea de instruccin que termine con el carcter diagonal inversa (\) significa que contina en la siguiente lnea. Ejemplo: printf ("Esta linea de instruccin contina \ en la siguiente linea"; 8 Programacin Estructurada La programacin estructurada es una manera o tcnica de organizar y codificar programas que sean fciles de entender y modificar. La programacin estructurada permite optimizar los programas debido a la flexibilidad que brinda en las modificaciones y correcciones, a la facilidad de localizacin de errores y a la claridad y ordenacin lgica que presenta. Esto genera programas sencillos claros y eficientes.
Uso de Estructuras Lgicas en la construccin de Programas: La programacin estructurada tiene como principio el uso de tres Estructuras Lgicas bsicas: A. Estructura Secuencial: Las instrucciones o procesos se ejecutan en secuencia lgica, uno detrs de otro. B. Estructura Selectiva o de Decisin: Son estructuras o instrucciones que dependen de una condicin. C. Estructura Repetitiva: Son secuencias de instrucciones, bloques o procesos que se repiten un cierto nmero de veces, mientras o hasta que se cumpla una condicin. -------- o --------
A. Estructura Secuencial La estructura secuencial consiste en un conjunto de instrucciones sin condicin, ni repeticin u omisin de alguna de ellas. Las instrucciones se ejecutan, una detrs de otra, en el orden en que se escriben. Generalmente, son programas compuestos por instrucciones de Lectura, asignacin y salida.
Ejercicio N 1: Leer dos nmeros enteros y calcular la suma de ellos. #include <stdio.h>
main() { int num1, num2; int suma;
printf ("Introduzca un numero entero: "); scanf ("%d", &num1); printf ("Introduzca otro numero entero: "); scanf ("%d", &num2);
suma = num1 + num2;
printf ("La suma de los numeros es %d", suma); getche(); /* para detener la ejecucin */ return; }
Nota: Observe que se incluy la instruccin getche() para detener la ejecucin del programa y dar oportunidad al usuario de ver la salida en pantalla. -------- o --------
Hemos realizado el primer programa en C. A continuacin se explicar los operadores aritmticos o matemticos que se utilizan en expresiones aritmticas en la programacin en C. -------- o --------
9 Expresiones Aritmticas: Son combinaciones de valores numricos, variables, operadores aritmticos y/o funciones asociadas con operandos, que al ser evaluadas proporcionan un resultado numrico entero o real. Pueden ser usadas para realizar clculos matemticos.
Operadores Aritmticos: Operadores Descripcin Jerarqua * , / , % Multiplicacin, Divisin, Mdulo (o Resto). Mayor prioridad + , - Adicin, Resta. Menor prioridad El operador %, divide dos nmeros enteros y devuelve como resultado el resto o residuo de la divisin. El operador % es vlido slo cuando ambos operandos son enteros. Ejemplos: Expresin Aritmtica: Descripcin: 5 + 3 Suma 5 y 3. El resultado es 8. a 1 Resta 1 a la variable a. 3 * 4 Multiplica 3 por 4. El resultado es 12. b / c Divide la variable b entre c. 7 % 2 El resultado es 1, que es el resto de la divisin entera de 7 entre 2. Los operadores aritmticos pueden utilizarse con operandos enteros y/o reales. Sin embargo, el operador % debe ser usado con operandos enteros y su resultado tambin es entero. Las expresiones aritmticas Enteras (cuyo resultado es Entero) estn formadas por valores, variables y/o funciones de tipo entero. Las expresiones aritmticas reales (cuyo resultado es real) estn formadas por valores, variables y/o funciones de tipo entero y/o real. Cuando se usa el operador /, se debe tener cuidado de asegurar que el divisor no sea cero (0). Si se intenta dividir entre cero, el programa no funcionar. Al usar el operador %, cuando uno de los operandos es negativo, el resultado no est claro. La mayora de los compiladores de C hacen que el residuo tenga el mismo signo que el primer operando. Por ejemplo: -15 % 4, en la mayora de los compiladores el residuo ser 3. Si una expresin aritmtica est formada por ms de un operador, las operaciones se resuelven en orden, respetando la jerarqua o prioridad de estos operadores. En el caso en que se presenten operadores con la misma jerarqua, se resuelven en el orden en que aparecen, de izquierda a derecha. Los parntesis ( ) se usan para cambiar o dar prioridad a las operaciones. Tambin se usan para evitar confusiones. Ejemplos: Expresin Aritmtica: Descripcin: 2 + 3 * 5 Resuelve primero la multiplicacin y luego la suma. El resultado es 17. num / 2 * 3 Resuelve la divisin y luego la multiplicacin. 4 + 5 % 2 Resuelve el mdulo y luego realiza la suma. Resultado es 5. (n1 + n2) / 2 Resuelve la suma y luego la divisin. (50 + 10)/(4 * (2 + 3)) Resuelven los parntesis internos y luego los externos. Resultado es 3.
Una expresin aritmtica puede contener Funciones Aritmticas. Por ejemplo, la funcin sqrt (x) calcula la raz cuadrada de x.
Ejemplos: Expresin: Descripcin: abs(-12) Resuelve el valor absoluto de -12. El resultado es 12 sqrt(25.0) Calcula la raz cuadrada de 25.0. El resultado es 5.0 sqrt(81.0) + 0.5 El resultado es 9.5
-------- o --------
10 Ejercicio N 2: Leer tres nmeros enteros y calcular: a) El producto del segundo nmero por el tercero. b) La mitad del primer nmero. c) El Triple del segundo nmero. d) El cociente (divisin) del primer nmero entre el tercero.
#include <stdio.h> #include <conio.h>
main() { int n1, n2, n3; int producto, triple; float mitad, division;
clrscr(); /* Limpia la pantalla */ printf ("Introduzca el primer numero entero: "); scanf ("%d", &n1); printf ("Introduzca el segundo numero entero: "); scanf ("%d", &n2); printf ("Introduzca el tercer numero entero: "); scanf ("%d", &n3);
printf ("El producto del segundo por el tercero es: %d \n", producto); printf ("La mitad del primer numero es: %.2f \n", mitad); printf ("El triple del segundo numero es: %d \n", triple); printf ("El cociente del primero entre el tercero es: %.2f \n", division); getche(); /* para detener la ejecucin */ return; } -------- o --------
Nota: Las variables mitad y division son de tipo float, porque reciben el resultado de una expresin con una divisin (que puede no ser exacta). Adems, el tercer nmero a leer debe ser distinto de cero. Nota: La sentencia #include <conio.h> indica que se va a utilizar la biblioteca conio.h, ya que el programa hace referencia a la funcin clrscr() que permite limpiar o borrar la pantalla. Nota: En las instrucciones de clculo de mitad y division, los operandos son enteros por lo tanto deben convertirse a tipo float antes de asignarse a la variable respectiva, de lo contrario se asignar slo la parte entera. Nota: Las instrucciones de salida de las variables tipo float tiene la cadena de formato %.2f, que indica que se muestren dos cifras para los decimales.
-------- o --------
Ejercicio N 3: Leer tres edades y calcular la edad promedio.
#include <stdio.h> #include <conio.h>
11 main() { int edad1, edad2, edad3; float promedio;
clrscr(); /* Limpia la pantalla */ printf ("Introduzca la primera edad: "); scanf ("%d", &edad1); printf ("Introduzca la segunda edad: "); scanf ("%d", &edad2); printf ("Introduzca la tercera edad: "); scanf ("%d", &edad3);
promedio = (float) (edad1 + edad2 + edad3) / 3;
printf ("El promedio de Edad es: %6.2f\n", promedio); getche(); /* para detener la ejecucin */ return; } -------- o -------- Nota: A la variable promedio se le asign una divisin, por lo tanto es de tipo float. Nota: Se ha utilizado la cadena de formato %6.2f para indicar que el valor de tipo float se va a mostrar en seis (6) espacios o columnas (incluyendo la parte entera, punto y decimales); el segundo nmero (2) indica que de los seis (6) espacios, dos (2) corresponden a las cifras decimales. Es decir, al escribir el formato %6.2f se emplearn 3 espacios para la parte entera, un espacio para el punto y 2 espacios para decimales. -------- o --------
Ejercicio N 4: Leer un nmero entero de dos cifras. Calcular y mostrar el dgito izquierdo, el dgito derecho y el nmero ledo con los dgitos invertidos.
#include <stdio.h> #include <conio.h>
main() { int num, dig_izq, dig_der, num_inver;
clrscr(); /* Limpia la pantalla */ printf ("Introduzca un nmero entero de dos cifras: "); scanf ("%d", &num);
dig_izq = num / 10; dig_der = num % 10; num_inver = dig_der * 10 + dig_izq;
printf ("El digito izquierdo es: %d \n", dig_izq); printf ("El digito derecho es: %d \n", dig_der); printf ("El numero invertido es: %d \n", num_inver); getche(); /* para detener la ejecucin */ return; } -------- o --------
12 Ejercicio N 5: Leer el sueldo base y el nmero de hijos de un empleado. Calcular el sueldo neto, sabiendo que se descuenta Bs 20000 de un seguro y se da un bono de Bs 100000 por hijo.
#include <stdio.h> #include <conio.h>
main() { float sueldo_base, sueldo_neto; int num_hijos;
clrscr(); /* Limpia la pantalla */ printf ("Introduzca el sueldo base: "); scanf ("%f", &sueldo_base); printf ("Introduzca el numero de hijos: "); scanf ("%d", &num_hijos);
printf ("El Sueldo Neto es: %.2f \n", sueldo_neto); getche(); /* para detener la ejecucin */ return; }
-------- o --------
Ejercicios propuestos: P01.- Leer el lado de un cuadrado. Calcular su permetro. P02.- Leer Horas (entero) y calcular su equivalente en minutos y en segundos. P03.- Leer una medida en metros. Calcular su equivalente en Kilmetros y en centmetros. P04.- Leer una temperatura en grados Fahrenheit (tipo real). Calcular su equivalente en grados Celsius. Celsius = 5/9 (F-32). P05.- Leer un Precio y el porcentaje de IVA. Calcular el precio final (con iva). P06.- Leer la distancia recorrida y el tiempo empleado por un vehculo. Calcular su velocidad. P07.- Leer un nmero y calcular el cubo de ese nmero (n 3 ). P08.- Leer la base y la altura de un tringulo. Calcular el rea del tringulo. P09.- Leer el dimetro de una crculo. Calcular su rea ( rea = .R 2 ). P10.- Leer el radio y la altura de un cilindro. Calcular rea y volumen (rea=2..R.H, volumen =.R 2 .H). P11.- Leer dos ngulos internos de un tringulo. Calcular el tercer ngulo interno. P12.- Leer dos catetos de un tringulo rectngulo. Calcular la hipotenusa. P13.- Leer dos nmeros enteros diferentes (a y b). Intercambiar dichos valores e imprimirlos (por ejemplo, se lee 4 en a y 8 en b, al intercambiarlos, el contenido de a ser 8 y el de b ser 4. P14.- Leer un nmero entero de tres cifras. Calcular y mostrar cada dgito y el nmero ledo invertido. P15.- Leer las Horas que un automvil permaneci en un estacionamiento. Calcular el monto a pagar, sabiendo que la primera hora tiene un costo de Bs. 1000 y las horas adicionales Bs. 500. P16.- Leer un monto (entero) en Bs. Calcular cuntos billetes de 50.000, de 20.000, de 10.000, de 5.000, de 2.000 y de 1.000; y cuntas monedas de 500, de 100, de 50, de 20 y de 10 Bs. se necesitan. -------- o --------
13 Ejercicios de Porcentajes En la programacin, generalmente, se utilizan clculos matemticos, entre ellos los Porcentajes. Se recomienda el uso de reglas de tres. A continuacin veremos dos tipos de ejercicios de porcentaje:
Tipo A: Ejercicio N 6: Leer la cantidad de varones y la cantidad total de alumnos de un saln de clase. Calcular el porcentaje de varones y el porcentaje de hembras. #include <stdio.h> #include <conio.h> main() { int varones, total; float porcentvar, porcenthem;
clrscr(); /* Limpia la pantalla */ printf ("Introduzca la cantidad de varones: "); scanf ("%d", &varones); printf ("Introduzca la cantidad total de alumnos: "); scanf ("%d", &total); porcentvar = (float) varones * 100 / total; porcenthem = 100 - porcentvar; printf ("El porcentaje de Varones es: %.2f\n", porcentvar); printf ("El porcentaje de Hembras es: %.2f\n", porcenthem); getche(); /* para detener la ejecucin */ return; } -------- o -------- Tipo B: Ejercicio N 7: Leer la cantidad total de alumnos de un saln. Si el 25% estn aprobados, calcular la cantidad de aprobados y la cantidad de reprobados. #include <stdio.h> #include <conio.h> main() { int total; float aprobados, reprobados;
clrscr(); /* Limpia la pantalla */ printf ("Introduzca la cantidad total de alumnos: "); scanf ("%d", &total); aprobados = total * 25 / 100; /* o tambien: aprobados = total * 0.25 */ reprobados = total - aprobados; printf ("La cantidad de Aprobados es: %.0f\n", aprobados); printf ("La cantidad de Reprobados es: %.0f\n", reprobados); getche(); /* para detener la ejecucin */ return; } -------- o -------- Ejercicios propuestos: P17.- Leer un Sueldo base. Sabiendo que se descuenta el 8%, calcular el Descuento y el Sueldo final. P18.- Leer dos notas (A y B). Calcular La nota definitiva, que es, el 70% de A ms el 30% de B. P19.- Leer: total de Proyectos, Proyectos terminados y Proyectos en ejecucin de una Alcalda. Calcular: Cantidad de Proyectos No iniciados, Porcentaje de Proyectos terminados, Porcentaje de Proyectos en ejecucin y Porcentaje de Proyectos No iniciados. 14 Antes de entrar en materia de la Estructura Selectiva o de Decisin, abordaremos las expresiones relacionales y las expresiones lgicas, con sus respectivos operadores relacionales y conectores lgicos.
Expresiones Relacionales: Una expresin relacional es aquella que al evaluarla retorna un valor verdadero o falso. El valor que retorna una expresin relacional es realmente un entero; el valor 1 representa el valor verdadero y 2 representa el valor falso. Estas expresiones se pueden construir con valores, variables y/o expresiones aritmticas enlazadas con operadores relacionales o con operadores de igualdad.
Operadores Relacionales: Se utilizan para comparar valores o expresiones y as obtener un resultado booleano (verdadero o falso). Los operadores relacionales que podemos utilizar son: Operador Descripcin Ejemplo > Es mayor que nota >= 12 < Es menor que contador < 5 >= Es mayor o igual que edad >= 18 <= Es menor o igual que sueldo <= 900000.00 Los operadores relacionales tienen la misma prioridad o jerarqua entre ellos.
Operadores de Igualdad: Se utilizan para comparar la igualdad o no entre valores o expresiones y as obtener un resultado booleano (verdadero o falso). Los operadores de igualdad son: Operador Descripcin Ejemplo == Es igual a nota == 20 != No es igual a sexo != 'F' Observe en los ejemplos que se pueden comparar expresiones o valores enteros, reales o caracteres (char). La comparacin de cadenas se ver ms adelante. Nota: Los operadores relacionales ( >, <, >=, <= ) tienen mayor prioridad que los operadores de igualdad ( ==, != ). -------- o --------
Expresiones Lgicas: Una expresin lgica se construye con expresiones relacionales unidas con conectores lgicos que siempre producen un valor verdadero o falso. El valor que retorna una expresin lgica es realmente un entero; el valor de verdadero se representa por el valor 1 y el falso por 0.
Conectores Lgicos: Se utilizan para conectar expresiones relacionales. Los Conectores lgicos son: Conector lgico Descripcin Jerarqua && Y ( AND ) Mayor prioridad || O ( OR ) ! No ( NOT ) Menor prioridad El conector ! (NOT) se utiliza con un solo operando. Para comprender el comportamiento de estos conectores lgicos veamos la siguiente tabla:
Tabla de Verdad: a b a && b a || b ! a ! b V V V V F F V F F V F V F V F V V F F F F F V V Donde, a y b son expresiones relacionales; V y F significan Verdadero y Falso, respectivamente. Recuerde que el valor verdadero es realmente un entero con el valor 1 y falso es un entero con valor 0. 15 Otros Operadores: C proporciona otros operadores: operadores compuestos de asignacin y los operadores unarios.
Operadores Compuestos de Asignacin: Estos operadores se utilizan como atajos en instrucciones sencillas de asignacin. La siguiente tabla muestra los operadores compuestos de asignacin: Operadores Propsito Ejemplo (num=10) Equivalente Salida += Suma / Asignacin num += 5; num = num + 5; 15 -= Resta / Asignacin num -= num; num = num 5; 5 *= Multiplicacin / Asignacin num *= num; num = num * 5; 50 /= Divisin / Asignacin num /= num; num = num / 5; 2 %= Mdulo / Asignacin num %= num; num = num % 5; 0
Operadores Unarios: Los operadores que utilizan un solo operador se llaman unarios. C proporciona operadores unarios ++ y --, de incremento y decremento. Se pueden usar de cuatro maneras diferentes: Tipo Propsito Ejemplo (num=5) Salida i++ Post incremento printf("%d", num++); 5 i-- Post decremento printf("%d", num--); 5 ++I Pre incremento printf("%d", ++num); 6 --I Pre decremento printf("%d", --num); 4
Se debe tener cuidado cuando se usa un operador unario dentro de otra sentencia (como los ejemplos de la tabla anterior). Los operadores i++ e i-- (post incremento y post decremento), incrementan o decrementan el valor de la variable en 1 despus que la variable se use en la sentencia. Los operadores ++i e --i (post incremento y post decremento), incrementan o decrementan el valor de la variable en 1 antes que la variable se use en la sentencia. -------- o -------- Generalmente, en una expresin booleana, se utilizan los conectores lgicos con operadores relacionales y/o con operadores aritmticos. Es necesario conocer la jerarqua o prioridad entre conectores lgicos, operadores relacionales y operadores aritmticos (ver la siguiente tabla): Tabla General de Jerarquas de Operadores: Operadores Descripcin Jerarqua ++, -- Unarios Mayor prioridad *, /, % Multiplicacin, Divisin, Mdulo (resto) +, - Adicin, Substraccin >, <, >=, <= Operadores relacionales ==, != Operadores de igualdad && Y (AND) || O (OR) ! No (NOT) Menor prioridad Para evitar confusiones es recomendable utilizar los parntesis. Ejemplos: x = ! ( 2 > 5 ) /* resultado: 1 (Verdadero) */ x = ( 5 < 2 && abs(-1) == 1 ) /* resultado: 0 (Falso) */ x = ( 4 > 2 || 2 != 2 ) /* resultado: 1 (Verdadero) */ x = ( edad >= 18 && nota >= 12 ) x = ( sexo = 'F' || edad < 18 ) x = ( ((n1 + n2 + n3)/3) >= 12 && sqrt(n4) >= 9 ) -------- o -------- 16 B. Estructura Selectiva o de Decisin La estructura Selectiva o de Decisin involucra una expresin booleana (lgica) que determina la ejecucin de unas u otras instrucciones. La estructura selectiva en C est determinada por las sentencias: if() y switch().
Sentencia if(): Sintaxis: if ( <expresin booleana> ) <instruccin>; O tambin: if ( <expresin booleana> ) <instruccin1>; else <instruccin2>; O tambin: if ( <expresin booleana> ) { <instruccin1>; <instruccin2>; } else { <instruccin3>; <instruccin4>; }
En donde, <expresin booleana> es una expresin simple o compuesta que tiene un valor booleano (Verdadero o Falso), ejemplo: edad >= 18. <instruccin>, <instruccin1>, <instruccin2>, <instruccin3> e <instruccin4> son instrucciones o bloques de instrucciones. Si son bloques (varias instrucciones) se encierran entre llaves ({ }). La instruccin if evala la <expresin booleana> y si su valor es verdadero (1) se ejecuta la siguiente instruccin o el bloque de instrucciones entre llaves ({ }); si su valor es falso (0) se ejecuta la instruccin o instrucciones encerradas entre llaves ({ }) de la sentencia else (que es opcional).
Ejemplos: a) Indique si es Hombre o Mujer: if (sexo == 'M') printf("Es Hombre\n"); else printf("Es Mujer\n"); b) Indique si es mayor de edad: if (edad >= 18) printf("Es mayor de edad\n"); c) Indique si est aprobado o no: if (nota >= 12) printf("Est aprobado\n"); else printf("No est aprobado\n"); d) Indique si gana entre Bs. 500000 y Bs. 800000: if (sueldo >= 500000 && sueldo <= 800000) printf ("Gana entre Bs 500000 y Bs 800000\n"); e) Indique si es Mujer con Promedio de 18 puntos. if (sexo == 'F' && promedio == 18) printf ("Es mujer con promedio de 18 puntos\n"); 17 f) Indique si la nota est en el rango de 10 a 15. if (nota >= 10 && nota <= 15) printf ("la nota est en el rango de 10 a 15\n"); g) Indique si la nota NO est en el rango de 10 a 15. if (nota < 10 || nota > 15) printf ("la nota No est en el rango de 10 a 15\n"); -------- o -------- Ejercicio N 8: Leer Nombre y Edad de una persona. Indique si es mayor de edad o no. #include <stdio.h> #include <conio.h> main() { char nombre[20]; int edad;
clrscr(); /* Limpia la pantalla */ printf ("Introduzca el Nombre: "); scanf ("%s", nombre); printf ("Introduzca la Edad: "); scanf ("%d", &edad); if (edad >= 18) printf ("%s es mayor de edad.\n", nombre); else printf ("%s No es mayor de edad.\n", nombre); printf ("Presione Enter..."); getche(); /* para detener la ejecucin */ return; } Nota: Observe que se incluy un mensaje (Presione Enter...) y la instruccin getche() al final del programa. Esto se hace para que el programa se detenga (hasta que el usuario pulse la tecla Enter) y as dar tiempo para ver la salida en pantalla. -------- o -------- Ejercicio N 9: Leer Apellido y Nota de un alumno. Indique si su nota est entre 15 y 20. #include <stdio.h> #include <conio.h> main() { char apellido[20]; int nota;
clrscr(); /* Limpia la pantalla */ gotoxy (10,2); printf ("Introduzca Apellido: "); scanf ("%s", apellido); gotoxy (10,4); printf ("Introduzca Nota: "); scanf ("%d", ¬a); if (nota >= 15 && nota <= 20) { gotoxy (10,8); printf ("%s tiene nota entre 15 y 20.", apellido); }
gotoxy (10,24); printf ("Pulse la tecla Enter..."); getche(); /* para detener la ejecucin */ return; } Nota: Se incluy la funcin gotoxy() que ubica el cursor en la pantalla en las coordenadas dadas. El primer valor define la columna (mximo 80) y el segundo valor la fila (mximo 25). Se utiliza antes de una salida printf() o getche(), y/o de una lectura scanf(). La funcin gotoxy(), al igual que clrscr() forman parte de la biblioteca conio.h. 18 Ejercicio N 10: Leer el sexo (un solo carcter F o M). Se le pide que escriba la palabra Femenino o Masculino en la misma posicin donde se ley el carcter F o M respectivamente. #include <stdio.h> #include <conio.h> main() { char sexo;
clrscr(); /* Limpia la pantalla */ gotoxy (10,2); printf ("Introduzca Sexo (F o M): "); gotoxy (35,2); sexo = getche(); gotoxy (35,2); if (sexo == 'F' || sexo == 'f') printf ("Femenino"); if (sexo == 'M' || sexo == 'm') printf ("Masculino");
gotoxy (10,20); printf ("Presione Enter..."); getche(); /* para detener la ejecucin */ return; } -------- o -------- Ejercicio N 11: Leer dos nmeros reales diferentes. Indique el mayor de ellos. #include <stdio.h> #include <conio.h> main() { float num1, num2;
textcolor (WHITE); textbackground (BLUE); clrscr(); /* Limpia la pantalla */ gotoxy(20,2); printf("Introduzca primer numero: "); scanf ("%f", &num1); gotoxy(20,4); printf("Introduzca segundo numero: "); scanf ("%f", &num2); gotoxy(20,6); if (num1 > num2) printf ("El mayor es: %8.2f \n", num1); else printf ("El mayor es: %8.2f \n", num2); gotoxy(20,10); printf ("Presione Enter..."); getche(); /* para detener la ejecucin */ return; } -------- o -------- Nota: Se incluy las funciones textcolor() y textbackground(), los cuales definen el color de texto y el color de fondo (en pantalla), respectivamente. Entre parntesis se escribe un valor entero (o una constante predefinida) que representa el color definido. Para textcolor() existen 16 colores definidos por un valor entero entre 0 y 15. Para textbackground() solo se puede utilizar un entero en el rango de 0 a 7. Tabla de Colores: Valor Constante Valor Constante Valor Constante Valor Constante 0 BLACK 4 RED 8 DARKGRAY 12 LIGHTRED 1 BLUE 5 MAGENTA 9 LIGHTBLUE 13 LIGHTMAGENTA 2 GREEN 6 BROWN 10 LIGHTGREEN 14 YELLOW 3 CYAN 7 LIGHTGRAY 11 LIGHTCYAN 15 WHITE 19 Para que el texto aparezca intermitente se le suma el valor 128 (constante: BLINK) al valor entero o constante definido en textcolor(). Ejemplo: textcolor (14 + BLINK); /* color de texto Amarillo intermitente */ Ejemplo: textbackground(GREEN); /* define el color de fondo verde */ Si se va a utilizar textcolor() y/o textbackground(), se debe incluir la biblioteca conio.h. Se recomienda escribir clrscr(); despus de textcolor() o textbackground().
-------- o --------
if() anidados: Podemos utilizar la instruccin if dentro de otra instruccin if. Esto se llama If anidados. Sintaxis: if ( <expresin booleana1> ) if ( <expresin booleana2> ) <instruccin1>; else <instruccin2>; else if ( <expresin booleana3> ) <instruccin3>; else <instruccin4>; -------- o --------
Ejercicio N 12: Leer tres nmeros diferentes. Indique el mayor de ellos.
#include <stdio.h> #include <conio.h>
main() { float num1, num2, num3;
clrscr(); /* Limpia la pantalla */ printf ("Introduzca el primer numero: "); scanf ("%f", &num1); printf ("Introduzca el segundo numero: "); scanf ("%f", &num2); printf ("Introduzca el tercer numero: "); scanf ("%f", &num3); if (num1 > num2) if (num1 > num3) printf ("El mayor es: %.1f\n", num1); else printf ("El mayor es: %.1f\n", num3); else if (num2 > num3) printf ("El mayor es: %.1f\n", num2); else printf ("El mayor es: %.1f\n", num3);
printf ("Presione la tecla Enter..."); getche(); return; } -------- o --------
20 Ejercicio N 13: Resolver el ejercicio anterior utilizando el operador && (AND).
#include <stdio.h> #include <conio.h>
main() { float num1, num2, num3;
clrscr(); /* Limpia la pantalla */ printf ("Introduzca el primer numero: "); scanf ("%f", &num1); printf ("Introduzca el segundo numero: "); scanf ("%f", &num2); printf ("Introduzca el tercer numero: "); scanf ("%f", &num3); if (num1 > num2 && num1 > num3) printf ("El mayor es: %.1f\n", num1); if (num2 > num1 && num2 > num3) printf ("El mayor es: %.1f\n", num2); if (num3 > num1 && num3 > num2) printf ("El mayor es: %.1f\n", num3);
printf ("Presione la tecla Enter..."); getche(); return; } -------- o --------
Ejercicios propuestos: P20.- Leer un nmero, imprimir el opuesto (es decir, cambiarle el signo). P21.- Leer un nmero e indique si es positivo, negativo o cero. P22.- Leer un nmero e indique si es par o impar. P23.- Leer un nmero e indique si es mltiplo de 3 (divisible por 3). P24.- Leer dos nmeros. Indique el mayor, el menor o si son iguales. P25.- Leer tres nmeros diferentes. Imprimirlos en orden Creciente y luego en orden Decreciente. P26.- Leer un nmero entero de tres cifras. Verifique que el nmero es de tres cifras, si es as indique si es un palndrome o no (se lee igual de izquierda a derecha que a la inversa, ejemplo: 252) (ayuda: calcular los tres dgitos del nmero ledo). P27.- Leer la nota de tres asignaturas. Indique si Aprob una, dos o tres asignaturas. P28.- Leer tres lados de un tringulo. Indique si es un tringulo Equiltero, Issceles o Escaleno. P29.- Leer un determinado ao. Indique si es Bisiesto o no. P30.- Leer Da, Mes y Ao, correspondientes a una fecha. Indique si la fecha introducida es correcta. P31.- Leer Da, Mes y Ao, que corresponde a una fecha, indique Da, Mes y Ao, al da siguiente. P32.- Leer Hora, Minutos y Segundos que marca un reloj. Indique la hora, minutos y segundos al pasar cinco segundos. P33.- Leer el precio de un artculo. Calcular su Precio final, sabiendo que se ofrece un descuento del 10% si tiene precio menor a Bs. 50000, de lo contrario, un descuento del 20%. P34.- Leer el Nombre, Sexo, Edad y Sueldo Base de un empleado. Calcular el Sueldo Final, sabiendo que se aporta un Bono de Bs. 200000 a las mujeres y Bs. 100000 a los hombres; y se descuenta el 15% del Sueldo Base a los mayores de edad y el 8% a los menores de edad. P35.- Leer el monto (entero) menor a un milln. Indique el monto en letras. (Ejemplo: se lee 12345 imprimir: doce mil trescientos cuarenta y cinco). P36.- Leer a, b y c, que corresponden a los coeficientes de una ecuacin de segundo grado (ax 2 +bx+c=0). Imprimir la solucin o soluciones. Recuerde que b 2 -4ac debe ser mayor o igual que cero. Para a=0 no es necesario calcular dos soluciones. -------- o --------
21 Operador Ternario ?:: El operador ternario en C es una construccin if de una lnea la cual tiene tres trminos. Los smbolos y : se usan como operadores ternarios. Sintaxis: <condicin> ? <instruccinV> : <instruccinF>;
Si la <condicin> es verdadera entonces se ejecuta la instruccin que est despus de ? (<instruccinV>), sino se ejecuta la instruccin que est despus del : (<instruccinF>).
Ejemplo, usando la sentencia if: if (num1 > num2) printf ("El mayor es:%d", num1); else printf ("El mayor es:%d", num2);
Ejemplo equivalente al anterior, usando el operador ternario: (num1>num2) ? printf ("mayor es:%d", num1) : printf ("mayor es:%d", num2);
-------- o --------
Sentencia switch(): Sintaxis: switch ( <expresin> ) { case <valor1> : <instruccin1>; break; case <valor2> : <instruccin2>; break; ... ... case <valorN> : <instruccinN> break; default : <instruccinX>; }
En donde, <expresin> es un valor tipo entero (int) o carcter (char). Adems, <expresin> puede ser el nombre de una variable, funcin o expresin. <valor1> hasta <valorN> son los valores que se van a comparar con la <expresin>. La sentencia switch() compara el valor de <expresin> con los valores de las sentencias case. Si la <expresin> es igual a uno de estos valores ejecuta la o las instrucciones respectivas, a continuacin de los dos puntos (:). Debe insertar la sentencia break como ltima instruccin de cada case, sino se ejecutarn las instrucciones pertenecientes a los case siguientes. Si la <expresin> no es igual a ninguno de los valores de la lista de case se ejecuta la <instruccinX> correspondiente al default (que es opcional). -------- o --------
22 Ejercicio N 14: Leer un nmero entero entre 1 y 5. Indique (escriba) el valor ledo en letras. #include <stdio.h> #include <conio.h> main() { int numero;
clrscr(); /* Limpia la pantalla */ printf ("Introduzca un numero entre 1 y 5: "); scanf ("%d", &numero);
switch (numero) { case 1 : printf ("Uno\n"); break; case 2 : printf ("Dos\n"); break; case 3 : printf ("Tres\n"); break; case 4 : printf ("Cuatro\n"); break; case 5 : printf ("Cinco\n"); break; default: printf ("No es un numero entre 1 y 5\n"); } printf ("Presione Enter..."); getche(); return; } -------- o -------- Ejercicio N 15: Leer un Estado civil (S/C/D) (tipo char). Indique su nombre correspondiente: Soltero, Casado o Divorciado. #include <stdio.h> #include <conio.h> main() { char edo_civil;
clrscr(); /* Limpia la pantalla */ printf ("Introduzca el Estado civil (S/C/D): "); edo_civil = getche(); printf("\n");
switch (edo_civil) { case 's' : case 'S' : printf ("Es Soltero.\n"); break; case 'c' : case 'C' : printf ("Es Casado.\n"); break; case 'd' : case 'D' : printf ("Es Divorciado.\n"); break; default : printf ("Debe introducir una letra: S, C o D.\n"); } printf ("Presione Enter..."); getche(); return; } 23 Ejercicio N 16: Leer un nmero, un operador matemtico (+,-,*,/) (tipo char) y otro nmero. Realice el clculo de la suma, resta, multiplicacin o divisin entre los dos nmeros, de acuerdo al operador ledo.
#include <stdio.h> #include <conio.h>
main() { int num1, num2; char operador; float resultado;
clrscr(); /* Limpia la pantalla */ printf ("Introduzca el primer numero: "); scanf ("%d", &num1); printf ("Introduzca el operador (+,-,*,/): "); operador = getche(); printf("\n"); printf ("Introduzca el segundo numero: "); scanf ("%d", &num2);
printf ("Presione Enter..."); getche(); return; } -------- o --------
Ejercicios propuestos: P37.- Leer un carcter alfabtico (tipo char). Indique si es una vocal, sino indique que no es una vocal. P38.- Leer el precio de un artculo y la ubicacin (estante) (A, B, C o D). Indique el precio final, sabiendo que a los artculos del estante A se les descuenta Bs. 5000; a los del estante B se les descuenta el 15% del precio; los del estante C quedan a la mitad del precio; y a los del estante D se les descuenta la quinta parte del precio. P39.- Leer el tiempo (horas) que una persona naveg en Internet en un Cyber caf. Calcular el monto a cancelar, sabiendo que: una hora se paga a Bs. 1200; si naveg entre 2 y 4 horas cancela Bs. 1000 la hora; si naveg 5 horas solo cancela Bs. 4000; y si naveg ms de 5 horas cancela Bs. 800 la hora. P40.- Leer un nmero, un operador aritmtico (+, -, *, /) y un segundo nmero. Calcular e imprimir el resultado de esa operacin matemtica. (Utilice la sentencia Case). -------- o --------
24 C. Estructura Repetitiva La estructura repetitiva, se refiere a una instruccin o bloque de instrucciones que se repiten de acuerdo a una condicin que los controla. La estructura repetitiva es tambin llamada: ciclo, iteracin, bucle, lazo o loop.
Conceptos asociados: Contador: Variable que incrementa su valor en una unidad. Se utiliza para contar sucesos. Ejemplos: contador = contador + 1; contF = contF + 1; contF++;
Acumulador: Variable cuyo contenido se incrementa en un valor. Se utiliza para acumular o totalizar valores. Ejemplos: acumulador = acumulador + valor; acumed = acumed + edad; acumed += edad;
En C la estructura repetitiva est determinada por tres instrucciones repetitivas: a. while b. do .. while c. for -------- o --------
a. Estructura Repetitiva: while: Esta instruccin repite un determinado nmero de instrucciones mientras la condicin sea verdadera, es decir, mientras la expresin booleana que controla el ciclo tenga un valor verdadero (1). Sintaxis: while (<expresin Booleana>) { <instrucciones>; } En donde, <expresin Booleana> es una expresin simple o compuesta que tiene un valor booleano verdadero o falso (1 o 0), ejemplo: edad >= 18. <instrucciones> se refiere a una o ms instrucciones. Si el ciclo contiene una sola instruccin, se puede omitir las llaves ({ }) que delimitan el ciclo. Recuerde no colocar un punto y coma (;) despus de <expresin Booleana>, ya que esto provocara un resultado inesperado o Loop indefinido. A continuacin veremos dos tipos de construccin de ciclos con while: cuando se conoce el nmero de veces que se repite el ciclo y cuando no se conoce el nmero de veces que se repetir.
Tipo A: Cuando se conoce el nmero de veces que se repite el ciclo while: Se controla por medio de un contador. Ejemplo: cont = 0; while (cont < 3) { cont = cont + 1; <instrucciones>; } El ejemplo anterior repetir las <instrucciones> tres (3) veces. -------- o -------- 25 Ejercicio N 17: Leer Nombre y Sexo de 5 personas. Calcular cuntas hembras hay. #include <stdio.h> #include <conio.h> main() { char nombre[20], sexo; int cont, contF;
textcolor (LIGHTGREEN); textbackground (BLUE); clrscr(); /* Limpia la pantalla */
if (sexo == 'F' || sexo == 'f') contF = contF + 1; } printf ("La cantidad de hembras es: %d\n", contF); printf ("Presione Enter, para continuar..."); getche(); return; } -------- o -------- Ejercicio N 18: Leer Nombre y Edad de 10 personas. Calcular: a) La suma de las edades; b) Edad mayor. #include <stdio.h> #include <conio.h> main() { char nombre[20]; int edad; int cont=0, acumed=0, mayor=0;
while (cont < 10) { cont = cont + 1; clrscr(); /* Limpia la pantalla */ gotoxy (10,2); printf ("Introduzca Nombre: "); scanf ("%s", nombre); gotoxy (10,4); printf ("Introduzca Edad: "); scanf("%d", &edad); acumed = acumed + edad; if (edad > mayor) mayor = edad; } clrscr(); /* Limpia la pantalla */ gotoxy (10,2); printf ("Resultados: \n"); gotoxy (10,4); printf ("La suma de las edades es: %d\n", acumed); gotoxy (10,6); printf ("La edad mayor es: %d\n", mayor); gotoxy (10,8); printf ("Presione Enter, para continuar..."); getche(); return; } 26 Nota: En el ejemplo anterior se ha inicializado las variables (tipo int) cont, acumed y mayor con cero (0) en la instruccin de declaracin. Esto es vlido en C. -------- o --------
Tipo B: Cuando NO se conoce el nmero de veces que se repite el ciclo while: Se controla por medio de una lectura. Ejemplo: seguir = 'S'; while (seguir == 'S') { <instrucciones>; printf ("Desea seguir S/N: "); seguir = getche (); } El ejemplo anterior repetir la o las <instrucciones> mientras la variable seguir tenga el valor S. -------- o --------
Ejercicio N 19: Leer Nombre y Nota de N alumnos. Calcular la nota promedio. #include <stdio.h> #include <conio.h>
main() { char nombre[20]; int nota; char seguir; int contn, acumn; float promn;
27 Ejercicios propuestos: P41.- Leer Nombre y Nota de 15 alumnos. Imprima los nombres y notas de los aprobados. P42.- Leer el sueldo de 8 empleados. Calcular el Sueldo promedio. P43.- Leer Edad y sexo de N empleados. Calcular edad promedio de los varones y edad promedio de las hembras. P44.- Leer Edad de 7 personas. Calcular el porcentaje de mayores de edad y el porcentaje de menores. P45.- Leer el nombre, edad, sueldo y sexo de 20 empleados. Calcular: a) Edad promedio; b) Cuntos varones ganan entre Bs. 500000 y Bs. 900000; c) Suma de las edades de las hembras. P46.- Leer Nota de 5 estudiantes. Calcular la nota mayor y la nota menor. P47.- Escribir un programa de encuesta electoral para N personas. Leer el Apellido y si est inscrito para votar (S/N). Si est inscrito, leer si va a Votar o no (S/N). Si va a votar leer candidato (A o B). Se le pide calcular: a) Cuntos encuestados; b) Cantidad de inscritos y no inscritos. c) Porcentaje del candidato A, del candidato B y de abstencin (inscritos que no votarn); d) Indique el candidato ganador (A o B) o si hay un empate. -------- o --------
b. Estructura Repetitiva: do .. while: Esta instruccin repite un determinado nmero de instrucciones, mientras se cumpla una condicin. Sintaxis: do <instrucciones>; } while (<expresin Booleana>);
En donde, <expresin Booleana> es una expresin simple o compuesta que tiene un valor booleano verdadero o falso (1 0), ejemplo: cont < 5. <instrucciones> se refiere a una o ms instrucciones. Esta estructura repetitiva acta de la siguiente forma: se ejecuta la secuencia de <instrucciones> que estn entre los smbolos llaves ({ }), y se evala la <expresin Booleana>; si su valor es verdadero (1) entonces la ejecucin de la secuencia de <instrucciones> se repite; de lo contrario, si su valor es falso (0), finaliza el ciclo. Esta estructura repetitiva ejecuta las <instrucciones> del ciclo al menos una vez A continuacin veremos dos tipos de construccin de ciclos con do..while: cuando se sabe el nmero de veces que se repite el ciclo y cuando no se sabe el nmero de veces que se repetir.
Tipo A: Cuando se conoce el nmero de veces que se repite el ciclo do..while: Se controla por medio de un contador. Ejemplo: cont = 0; do { cont = cont + 1; <instrucciones>; } while (cont < 3); El ejemplo anterior repetir las <instrucciones> tres (3) veces. -------- o --------
Ejercicio N 20: Leer Nombre y Nota de 8 alumnos. Calcular la cantidad de Aprobados y Reprobados, y el porcentaje de aprobados y reprobados. #include <stdio.h> #include <conio.h> 28 const TOTAL = 8; char nombre[20]; int nota, cont, contap=0; float porcentap;
Nota: Se ha utilizado la sentencia const para declarar la constante TOTAL con el valor 8. -------- o --------
Tipo B: Cuando NO se conoce el nmero de veces que se repite el ciclo do..while: Se controla por medio de una lectura. Ejemplo: do { <instrucciones>; printf ("Desea seguir S/N: "); seguir = getche (); } while (seguir == 'S'); El ejemplo anterior repetir la o las <instrucciones> mientras la variable seguir tenga el valor S. -------- o --------
Ejercicio N 21: Leer Cdula, Sueldo y Sexo de N empleados. Indique quin tiene Sueldo Promedio ms alto, las hembras o los varones; o si tienen promedios iguales. #include <stdio.h> #include <conio.h>
if (sexo == 'F' || sexo == 'f') { acumsdoF = acumsdoF + sueldo; contF++; } else { acumsdoM = acumsdoM + sueldo; contM++; } printf ("Desea leer los datos de otro empleado S/N: "); seguir = getche(); printf("\n"); } while (seguir == 'S' || seguir == 's');
if (contF > 0) /* verifica que no ocurra division por cero */ promsdoF = acumsdoF / contF; else promsdoF = 0;
if (contM > 0) /* verifica que no ocurra division por cero */ promsdoM = acumsdoM / contM; else promsdoM = 0;
printf ("El Sueldo promedio de las hembras es: %10.2f \n", promsdoF); printf ("El Sueldo promedio de los varones es: %10.2f \n", promsdoM);
if ( promsdoF == promsdoM ) printf ("Las hembras y varones tienen igual Sueldo Promedio. \n"); else if ( promsdoF > promsdoM ) printf ("Las hembras tienen mayor Sueldo Promedio. \n"); else printf ("Los varones tienen mayor Sueldo Promedio. \n"); printf ("Presione Enter, para salir..."); getche(); return; } -------- o -------- Ejercicios propuestos: P48.- Leer la nota de 15 alumnos. Calcular la cantidad de alumnos con nota entre 15 y 20, y qu porcentaje de alumnos representa. P49.- Leer Nombre, Edad y Sexo de 10 personas. Calcular: a) Cantidad de mayores de edad y de menores; b) Edad mayor de los varones y edad menor de las hembras; c) Edad Promedio. P50.- Leer Cdula y asignatura inscrita por una cantidad no determinada de alumnos. Calcular cuntos alumnos inscribieron la asignatura Matemtica. -------- o -------- 30 c. Estructura Repetitiva: for: Esta instruccin repite un determinado nmero de instrucciones, por medio de un ndice (variable) que indica el nmero de veces que se repite el ciclo. Se debe especificar un valor inicial, una condicin y el incremento (o decremento). Para esta estructura es necesario saber el nmero de veces que se repite el ciclo. Sintaxis: for (<ndice> = <valor inicial>; <condicin>; <incremento>) { <instrucciones>; }
En donde, <ndice> es la variable que se incrementa (o decrementa) para controlar el ciclo. <valor inicial> es el valor inicial que tomar la variable <ndice>. Si la <condicin> tiene un valor verdadero (1) el ciclo se repite, sino el ciclo termina. <instrucciones> se refiere a una o ms instrucciones. Si el ciclo contiene una sola instruccin, se puede omitir las llaves ({ }) que delimitan el ciclo. Recuerde no colocar un punto y coma (;) despus de la sentencia for, ya que esto provocara un resultado inesperado (ejecutara las instrucciones del ciclo una sola vez). -------- o --------
Ejercicio N 22: Leer Apellido y Nota de 8 alumnos. Imprimir el apellido del alumno con nota menor.
main() { char apellido[20], apellidoaux[20]; int nota, i, menor;
clrscr(); /* Limpia la pantalla */ gotoxy (10,1); printf ("Introduzca Apellido: "); gotoxy (40,1); printf ("Introduzca Nota: "); menor = 21; for (i = 1; i <= 8; i++) { gotoxy (10,i+1); scanf ("%s", apellido); gotoxy (40,i+1); scanf ("%d", ¬a); if (nota < menor) { menor = nota; strcpy (apellidoaux, apellido); } } gotoxy (10,20); printf ("El alumno %s tiene la nota menor %d \n", apellidoaux, menor); gotoxy (10,22); printf ("Presione Enter, para salir..."); getche(); return; } -------- o --------
Nota: La funcin strcpy() pertenece a la biblioteca string.h, la cual permite copiar un string en otra variable string (permite asignar un string a otro). -------- o -------- 31 Ejercicio N 23: Leer Nombre, Sueldo y Sexo de 6 empleados. Calcular el sueldo promedio de los varones.
#include <stdio.h> #include <conio.h>
main() { char nombre[20], sexo; float sueldo, acumsdov, promsdov; int i, contv;
clrscr(); /* Limpia la pantalla */ acumsdov = 0; contv = 0; for (i = 1; i <= 6; i++) { printf ("Introduzca Nombre: "); scanf ("%s", nombre); printf ("Introduzca Sueldo: "); scanf ("%f", &sueldo); printf ("Introduzca Sexo F/M: "); sexo = getche(); printf ("\n"); if (sexo == 'M' || sexo == 'm') { acumsdov = acumsdov + sueldo; contv = contv + 1; } } if (contv == 0) /* para evitar la division por cero */ promsdov = 0; else promsdov = acumsdov / contv; printf ("El sueldo promedio de los varones es: %10.2f \n", promsdov); printf ("Presione Enter, para salir..."); getche(); return; } -------- o --------
Ejercicios de Series
Ejercicio N 24: Imprimir los 10 primeros nmeros enteros impares positivos. #include <stdio.h> #include <conio.h> main() { int i;
clrscr(); /* Limpia la pantalla */ for (i = 1; i <= 10; i++) { printf ("%d \n", i * 2 - 1); } getche(); return; } -------- o -------- Nota: El ejercicio anterior posee una expresin matemtica (un clculo) en la instruccin de salida printf(), lo cual es vlido en C. 32 Un ciclo for es controlado por un ndice de tipo ordinal (ejemplo: tipo integer o Char). El siguiente ejercicio es controlado por una variable de tipo char.
Ejercicio N 25: Imprimir las letras maysculas del alfabeto (desde la A hasta la Z), separados por una coma ( , ). #include <stdio.h> #include <conio.h> char x; main() { clrscr(); /* Limpia la pantalla */ for (x = 'A'; x <= 'Z'; x++) printf ("%c ,", x); getche(); return; }
Nota: Observe que el ejercicio anterior tiene una sola instruccin dentro del ciclo, y se omitieron las llaves ({ }) que delimitan el ciclo, lo cual tambin es vlido. -------- o -------- Ejercicio N 26: Imprimir los nmeros enteros pares, que hay entre 1 y 50 (en forma decreciente), separados por un espacio en blanco (' ' ). #include <stdio.h> #include <conio.h> int i; main() { clrscr(); /* Limpia la pantalla */ for (i = 50; i >= 1; i--) if ((i % 2) == 0) /*el operador % retorna el resto de la division */ printf ("%d ", i); getche(); return; } -------- o --------
Ejercicio N 27: Imprimir 10 nmeros de tres en tres, comenzando con el nmero 8 (en forma ascendente). #include <stdio.h> #include <conio.h> main() { int num, i;
clrscr(); /* Limpia la pantalla */ num = 8; for (i = 1; i <= 10; i++) { printf ("%d ", num); num = num + 3; } getche(); return; } -------- o -------- Nota: Otra forma de resolver el ejercicio anterior es la siguiente: 33 #include <stdio.h> #include <conio.h> main() { int num, i;
clrscr(); /* Limpia la pantalla */ for (i=1, num=8; i<=10; i++, num=num+3) printf ("%d ", num); getche(); return; } Nota: Observe que se puede inicializar ms de una variable en la sentencia for. Adems, el incremento o decremento no siempre es en una unidad. -------- o -------- Ejercicio N 28: Leer un nmero entero positivo. Calcular el Factorial (Ejemplo: 5! = 5 * 4 * 3 * 2 * 1 = 120). #include <stdio.h> #include <conio.h> main() { int n, i, factorial;
clrscr(); /* Limpia la pantalla */ printf ("Introduzca un numero entero positivo: "); scanf ("%d", &n); factorial = 1; for (i = 1; i <= n; i++) factorial = factorial * i; printf ("El Factorial de %d es: %d", n, factorial); getche(); return; } -------- o -------- Ejercicio N 29: Imprimir los primeros 10 nmeros de la serie Fibonacci. Secuencia de enteros, donde cada elemento es la suma de los dos elementos anteriores. Ejemplo: 0, 1, 1, 2, 3, 5, 8, 13, ... #include <stdio.h> #include <conio.h> main() { int a, b, c, i;
clrscr(); /* Limpia la pantalla */ printf ("Primeros 10 numeros de la serie Fibonacci: \n"); a = 0; b = 1; printf ("%d ", a); printf ("%d ", b); for (i = 1; i <= 8; i++) { c = a + b; printf ("%d ", c); a = b; b = c; } getche(); return; } 34 Ejercicios propuestos: P51.- Imprimir los nmeros enteros del 1 al 10. P52.- Imprimir la siguiente serie matemtica: 12, 11, 10, 9, 8, 7. P53.- Imprimir la serie: -2, -4, -6, -8, -10. P54.- Imprimir la serie: -1, 2, -3, 4, -5, 6, -7, 8, -9, 10. P55.- Imprimir la serie: 1, 10, 2, 9, 3, 8, 4, 7, 5, 6, 6, 5, 7, 4, 8, 3, 9, 2, 10, 1. P56.- Leer dos nmeros enteros diferentes. Imprimir los nmeros enteros que hay entre los dos nmeros ledos, en orden ascendente y luego descendente. Ejemplo: Se ley 2 y 5, imprimir 2,3,4,5 y 5,4,3,2. P57.- Imprimir los nmeros enteros entre 1 y 100 que tienen su raz cuadrada entera (sin decimales). P58.- Leer un nmero entero positivo e indique si es un nmero Primo. P59.- Imprimir los nmeros Armstrong que hay entre 1 y 500. Los nmeros Armstrong son aquellos donde la suma de sus dgitos individuales es el nmero original mismo. Ejemplo: 153; 1 3 +5 3 +3 3 =153. -------- o --------
Ciclos Anidados (Doble ciclo, Triple ciclo) Cuando un ciclo (instruccin de repeticin) se incluye completamente dentro de otro, se dice que conforman ciclos anidados. Se puede tener dos, tres o ms ciclos anidados. La construccin de dos ciclos anidados se conoce como doble ciclo. Tres ciclos anidados se conoce como Triple ciclo. En estructuras cclicas anidadas, un ciclo se ejecuta ms lento que otro interno a l; y un ciclo se ejecuta ms rpido que otro externo a l. Ejemplo: cont = 0; while (cont < 3) /* ciclo externo, ms lento */ { cont = cont + 1; for (i=1; i<=5; i++) /* ciclo interno, ms rpido */ printf (("Hola \n"); } En el ejemplo anterior la cadena Hola se imprimir 15 veces.
Ejemplo: for (i=1; i<=4; i++) for (j=1; j<=3; j++) printf ("%d", i); El ejemplo anterior imprimir: 111222333444.
Ejemplo: cont = 0; for (i=1; i<=4; i++) for (j=1; j<=2; j++) { cont++; printf ("%d", cont); } El ejemplo anterior imprimir: 12345678.
Ejemplo: for (i=1; i<=2; i++) for (j=1; j<=3; j++) for ('A'; k<='C'; k++) printf ("%c", k); El ejemplo anterior imprimir: ABCABCABCABCABCABC. -------- o -------- Un programa de doble ciclo, generalmente, tiene clculos que involucran: contadores, acumuladores, mayor y/o menor. Es importante ubicar correctamente la inicializacin de estas variables (Ejemplo: contF = 0), y las salidas correspondientes. 35 La instruccin de inicializacin (ya sabemos) se ubica antes de un ciclo, pero De cul? Supongamos un ejemplo de cinco (5) alumnos y cada alumno tiene tres (3) notas. Si se realiza un clculo general o total (por ejemplo: Suma de las notas), la inicializacin se ubica antes del ciclo externo. Esto genera una salida (respuesta) nica despus del ciclo externo. Si el clculo es especfico (por ejemplo: Nota mayor de cada alumno), la inicializacin se ubica antes del ciclo interno. La salida correspondiente se ubica despus del ciclo interno. Esta salida, en nuestro ejemplo, se ejecutar cinco (5) veces Ejemplo: main() { <Inicializaciones generales> Ciclo Externo { <Inicializaciones especficas> Ciclo Interno { <clculos> } /*fin del ciclo Interno*/ <Salidas Especficas> } /*fin del ciclo Externo*/ <Salidas Generales> } -------- o --------
Ejercicio N 30: Leer el nombre de cinco (5) alumnos, y por cada alumno leer tres (3) Notas (de exmenes). Calcular: a) Nota mayor de cada alumno; a) Suma de todas las notas.
#include <stdio.h> #include <conio.h> main() { char nombre[20]; int nota, acumn, mayorn, i, j;
textcolor (LIGHTCYAN); textbackground (BLUE); clrscr(); /* Limpia la pantalla */ acumn = 0; for (i = 1; i <= 5; i++) { printf ("Introduzca Nombre del alumno: "); scanf ("%s", nombre); mayorn = 0; for (j = 1; j <= 3; j++) { printf ("Introduzca Nota: "); scanf ("%d", ¬a); acumn = acumn + nota; if (nota > mayorn) mayorn = nota; } /*fin del for j*/ printf ("La nota mayor del alumno %s es: %d \n", nombre, mayorn); } /*fin del for i*/ printf ("La suma de todas las notas es: %d \n", acumn); printf ("Presione Enter, para salir..."); getche(); return; } -------- o --------
36 Ejercicio N 31: Leer el apellido y las N Ventas de tres (3) vendedores. Calcular: a) La venta promedio de cada vendedor; y b) Cantidad de ventas menores a Bs.100000.
#include <stdio.h> #include <conio.h>
main() { char apellido[20], seguir; float venta, acumvta, promvta; int i, contmenor, contvta;
textcolor (YELLOW); textbackground (BLUE); clrscr(); /* Limpia la pantalla */ contmenor = 0; for (i = 1; i <= 3; i++) { printf ("Introduzca el Apellido del Vendedor: "); scanf ("%s", apellido); acumvta = 0; contvta = 0; seguir = 'S'; while (seguir == 'S' || seguir == 's') { printf ("Introduzca Venta: "); scanf ("%f", &venta); if (venta < 100000) contmenor = contmenor + 1; acumvta = acumvta + venta; contvta = contvta + 1; printf ("Desea leer otra venta de este vendedor [S/N] ?: "); seguir = getche(); printf ("\n"); } /*fin del while*/ promvta = acumvta / contvta; printf ("La venta promedio de %s es: %.2f \n", apellido, promvta); } /*fin del for*/ printf ("La cantidad de ventas menores a Bs100000 es: %d \n", contmenor); textcolor (LIGHTGREEN); printf ("Presione Enter, para salir..."); getche(); return; } -------- o --------
Ejercicios propuestos: P60.- Leer el precio de N artculos comprados y la cdula de N clientes de un establecimiento. Calcular: a) Monto total y Monto a pagar con IVA (14%) por cada cliente. b) Cdula del cliente con el mayor Monto a pagar con IVA. c) Cantidad de artculos vendidos. P61.- Una empresa tiene cuatro sucursales. Cada sucursal tiene 5 empleados. Se pide: A) Calcular el Sueldo final a pagar a cada empleado, sabiendo que se da un bono de Bs.50000 por hijo, y se descuenta el 5% a los mayores de edad. b) Calcular el Sueldo final promedio por sucursal. c) Nombre de la Sucursal que cancel ms dinero en sueldos. Por cada sucursal leer: Nombre; y por cada empleado leer: Apellido, Edad, nmero de hijos y Sueldo base.
-------- o --------
37 Manejo de Datos Tipo char El tipo char es utilizado para almacenar un valor entero en el rango 0 a 127, correspondiente a un carcter del cdigo ASCII (American Standard Code for Information Interchange: Cdigo Americano para el Intercambio de Informacin). De forma similar el tipo unsigned char puede almacenar valores en el rango de 0 a 255, valores correspondientes a los nmeros ordinales de los 256 caracteres ASCII. Al definir una constante tipo char o al asignar un valor a una variable char, el valor debe escribirse entre apstrofes. Ejemplo: const letrak = 'k'; char vocal; main() { vocal = 'e'; printf ("%c %c", letrak, vocal); }
Si se quiere asignar el carcter apstrofe a una constante o variable char, se debe escribir el apstrofe precedido del smbolo \. ( Ejemplo: caracter = '\''; ). Los valores (carcter) que puede contener una constante o variable char son los caracteres alfabticos (A..Z, a..z), dgitos numricos (0..9) y los smbolos especiales (!, ?, *, ;, #, etc.). Este conjunto de (256) caracteres estn definidos y tienen un orden, es decir, un valor numrico que los representa en el cdigo ASCII. Por ejemplo, el carcter 'A' tiene el valor 65 en la tabla ASCII; el carcter 'a' se representa con el carcter ASCII 97. (ver Tabla ASCII al final de la gua).
Operadores: Podemos utilizar los operadores relacionales ( >, <, >=, <=, ==, != ), para comparar datos de tipo char. Un carcter es mayor que otro si su valor ASCII es mayor.
Ejemplo: if ('A' > 'a') printf ("el carcter A es mayor que a"); else printf ("el carcter a es mayor que A");
El ejemplo anterior imprimir el carcter a es mayor que A.
C ofrece algunas funciones asociadas con los datos de tipo char en la biblioteca ctype.h.
Funciones asociadas con char: Funcin Descripcin Operando Resultado toupper(car) Retorna la mayscula de la variable car char char tolower(car) Retorna la minscula de la variable car char char isalpha(car) Verifica si car es un carcter alfabtico (A-Z , a-z) char 0 no 0 isdigit(car) Verifica si car es un dgito (0-9) char 0 no 0 islower(car) Verifica si car es una letra minscula (a-z) char 0 no 0 isupper(car) Verifica si car es una letra mayscula (A-Z) char 0 no 0
38 Ejemplo de funcin toupper : letra = toupper('a'); /* se asigna 'A' a la variable letra */ printf ("%c", letra); En el ejemplo anterior, la funcin toupper retorna la mayscula de a y la asigna a la variable letra. Se imprimir el carcter: A. Nota: La funcin toupper solo afecta a los caracteres en el rango a..z. Si el carcter no est en el rango a..z, la funcin toupper retorna el mismo valor. -------- o --------
Ejemplo de funcin tolower : letra = tolower('F'); /* se asigna 'f' a la variable letra */ printf ("%c", letra); En el ejemplo anterior, la funcin tolower retorna la minscula de 'F' y la asigna a la variable letra. Se imprimir el carcter: f. -------- o --------
Ejemplo de funcin isalpha : caracter = 'h'; if (isalpha(caracter)) printf ("Es un caracter alfabetico"); else printf ("No es un caracter alfabetico"); El ejemplo anterior imprimir: Es un caracter alfabetico. -------- o --------
Ejemplo de funcin isdigit : digito = '7'; if (isdigit(digito)) printf ("Es un digito"); else printf ("No es un digito"); El ejemplo anterior imprimir: Es un digito. -------- o --------
Ejemplo de funcin islower / isupper : letra = 'G'; if (islower(letra)) printf ("Es una letra minuscula"); if (isupper(letra)) printf ("Es una letra mayuscula"); El ejemplo anterior imprimir: Es una letra mayuscula. -------- o --------
Nota: Recuerde que puede leer una variable char con la funcin getche(), especificando la biblioteca stdio.h. Adems, para mostrar el contenido de una variable char con la funcin printf() debe colocar el especificador "%c". -------- o --------
39 Ejercicio N 32: Leer una letra (utilice getche). Si la letra es mayscula imprimirla en minscula; si es minscula imprimirla en mayscula; si no es una letra, indquelo.
clrscr(); /* Limpia la pantalla */ printf ("Introduzca una letra: "); letra = getche(); printf ("\n");
if (isupper(letra)) /* si Letra esta entre: A y Z */ printf ("La letra %c en minuscula es: %c \n", letra, tolower(letra)); else if (islower(letra)) /* si Letra esta entre: a y z */ printf ("La letra %c en mayuscula es: %c \n", letra, toupper(letra)); else printf ("El caracter %c no es una letra \n", letra);
printf ("Presione Enter para Continuar..."); getche(); return; } -------- o --------
Ejercicio N 33: Leer una letra (utilice getche). Si la letra es mayscula imprimirla en minscula; si es minscula imprimirla en mayscula; si no es una letra, indquelo. No utilice las funciones: islower(), isupper(), tolower(), toupper()
#include <stdio.h> #include <conio.h>
main() { char letra;
clrscr(); /* Limpia la pantalla */ printf ("Introduzca una letra: "); letra = getche(); printf ("\n");
if (letra >= 'A' && letra <= 'Z') /* si Letra esta entre: A y Z */ printf ("La letra %c en minuscula es: %c \n", letra, letra+32); else if (letra>= 'a' && letra <= 'z') /* si Letra esta entre: a y z */ printf ("La letra %c en mayuscula es: %c \n", letra, letra-32); else printf ("El caracter %c no es una letra \n", letra);
printf ("Presione Enter para Continuar..."); getche(); return; } -------- o --------
40 Ejercicio N 34: Imprimir los caracteres de la tabla ASCII desde el valor 32 hasta el 254.
clrscr(); /* Limpia la pantalla */ for (x = 32; x <= 254; x++) printf ("%c ", x); getche(); return; } -------- o --------
Ejercicio N 35: Validar la lectura de sexo (F/M), es decir, repetir la lectura si es necesario, hasta que se introduzca un valor vlido (una F o una M).
clrscr(); /* Limpia la pantalla */ printf ("Introduzca Sexo (F/M): "); do { sexo = toupper(getch()); /*Lee un caracter y convierte a mayuscula*/ } while (sexo != 'F' && sexo != 'M'); printf ("%c \n", sexo);
printf ("Presione una Tecla para Continuar..."); getche(); return; } -------- o -------- Nota: El ejercicio anterior (modificado adecuadamente) sirve para validar la lectura de determinados caracteres, por ejemplo, validar la lectura de una S o N, validar la lectura de una vocal, etc.
Nota: En el ejercicio anterior se utiliz la funcin getch() la cual lee un carcter del teclado sin mostrarlo por pantalla (sin eco), y sin necesidad de pulsar la tecla Enter. -------- o --------
Manejo de Datos Tipo STRING Una variable de tipo String, es una cadena o tira de caracteres. Los valores tipo cadena se escriben entre comillas dobles. El nmero mximo de caracteres en una cadena es 255. Ejemplo: char cadena[20]; main() { printf ("Introduzca una cadena: "); scanf("%s", cadena); printf ("%s \n", cadena); } 41 En el ejemplo anterior, se declar una variable tipo cadena o string de 20 caracteres. Se envi una cadena entre comillas dobles por pantalla, por medio de la funcin printf(). Se ley la variable cadena por medio de scanf() utilizando el especificador de formato "%s". En C podemos especificar entre corchetes [ ] el tamao de la variable string, es decir, la cantidad mxima de caracteres permitida en esa variable. Si no se define el tamao (entre corchetes), la variable ser tipo char y podr contener un slo carcter. Para asignar una cadena a una variable string, no podemos utilizar el smbolo =. Debemos utilizar la funcin strcpy().
Lenguaje C ofrece funciones contenidas en la biblioteca string.h asociados con string.
Funciones asociadas con string: Funcin Descripcin strcpy(st1,st2) Copia el string st2 en el string st1 strcat(st1,st2) Agrega el string st2 al final del string st1 strlwr(str) Convierte el string str en minscula strupr(str) Convierte el string str en mayscula strrev(str) Invierte la cadena str strlen(str) Retorna un entero que es la longitud del string strcmp(st1,st2) Compara dos cadenas. Son iguales si strcmp retorna 0 strset(str,chr) Convierte cada caracter del string str al caracter chr strnset(str,chr,n) Convierte los primeros n caracteres del string str al caracter chr strstr(st1,st2) Verifica si la subcadena st2 est en el string st1 strchr(str,chr) Verifica si el caracter chr est contenido en el string str
A.- strcpy(): Esta funcin copia o asigna una cadena a una variable string. Sintaxis: strcpy (<string1>, <string2>); Donde <string1> es una variable de tipo string, que va a recibir la cadena <string2>. Ejemplo: char cadena[20]; strcpy (cadena, "Esta es Una Cadena"); printf ("cadena: %s \n", cadena);
Al ejecutarse las instrucciones, cadena contendr: Esta es Una Cadena. -------- o -------- 42 B.- strcat(): Esta funcin agrega una cadena al final de otro string. Sintaxis: strcat (<string1>, <string2>); Donde <string1> es una variable de tipo string, al cual se le agregar al final (concatenar) la cadena <string2>. Ejemplo: char cadena[20]; strcpy (cadena, "Programacion"); strcat (cadena, " en C"); printf ("cadena: %s \n", cadena);
Al ejecutarse las instrucciones, cadena contendr: Programacion en C. -------- o -------- C.- strlwr(): Esta funcin convierte cada carcter alfabtico de un string a minscula. Sintaxis: strlwr (<string>); Donde <string> es una variable de tipo string, cuyo contenido se convertir en minscula. Ejemplo: char cadena[20]; strcpy (cadena, "Lenguaje C"); strlwr (cadena); printf ("cadena: %s \n", cadena);
Al ejecutarse las instrucciones, cadena contendr: lenguaje c. -------- o -------- D.- strupr(): Esta funcin convierte cada carcter alfabtico de un string a mayscula. Sintaxis: strupr (<string>); Donde <string> es una variable de tipo string, cuyo contenido se convertir en mayscula. Ejemplo: char cadena[20]; strcpy (cadena, "Lenguaje C"); strupr (cadena); printf ("cadena: %s \n", cadena);
Al ejecutarse las instrucciones, cadena contendr: LENGUAJE C. -------- o -------- E.- strrev(): Esta funcin invierte un string. Sintaxis: strrev (<string>); Donde <string> es una variable de tipo string, cuyo contenido se invertir. Ejemplo: char cadena[20]; strcpy (cadena, "Programa"); strrev (cadena); printf ("cadena: %s \n", cadena);
Al ejecutarse las instrucciones, cadena contendr: amargorP. -------- o --------
43 F.- strlen(): Es una funcin que devuelve un entero que indica el nmero de caracteres de un string. Sintaxis: <variable> = strlen (<string>); Donde <variable> es una variable de tipo entero; y <string> es la cadena o string a evaluar. Ejemplo: char cadena[20]; int longit; strcpy (cadena, "Misin Sucre"); longit = strlen (cadena); printf ("La longitud del string %s es: %d \n", cadena, longit);
Al ejecutarse las instrucciones, se mostrar: La longitud del string Misin Sucre es: 12. -------- o -------- G.- strcmp(): Esta funcin compara dos strings. Si la funcin retorna un cero (0) las cadenas son iguales; si retorna un entero mayor que cero la primera cadena es mayor (alfabticamente); si retorna un entero menor que cero la segunda cadena es mayor. Sintaxis: strcmp (<string1>, <string2>); Donde <string1> y <string2> son cadenas o variables string, que se van a comparar. Ejemplo: char cadena[10]; strcpy (cadena, "abcd"); if (strcmp (cadena, "abcD") == 0) printf ("Las cadenas son iguales \n"); else printf ("Las cadenas NO son iguales \n");
Al ejecutarse las instrucciones, se mostrar: Las cadenas NO son iguales. -------- o -------- H.- strset(): Esta funcin sustituye cada carcter de un string por un carcter especificado. Sintaxis: strset (<string>, <chr>); Donde <string> es la variable tipo string, cuyos caracteres se sustituirn por el carcter <chr>. Ejemplo: char cadena[20], letra; strcpy (cadena, "Lenguaje C"); letra = 'v'; strset (cadena, letra); printf ("cadena: %s \n", cadena);
Al ejecutarse las instrucciones, cadena contendr: vvvvvvvvvv. -------- o -------- I.- strnset(): Esta funcin sustituye n caracteres de un string por un carcter especificado. Sintaxis: strnset (<string>, <chr>, <n>); Donde <string> es la cadena, cuyos <n> caracteres se sustituirn por el carcter <chr>. Ejemplo: char cadena[20], letra; strcpy (cadena, "Mi programa"); letra = 'x'; strnset (cadena, letra, 5); printf ("cadena: %s \n", cadena);
Al ejecutarse las instrucciones, cadena contendr: xxxxxograma. 44 J.- strstr(): Esta funcin verifica si un substring est contenido en un string. Sintaxis: strstr (<string1>, <string2>); Donde <string2> es la cadena a buscar en la cadena <string1>. Ejemplo: char cadena[20]; strcpy (cadena, "Sistemas"); if (strstr (cadena, "tema")) printf ("Si est \n"); else printf ("No est \n");
Al ejecutarse las instrucciones, se mostrar: Si est. -------- o --------
K.- strchr(): Esta funcin verifica si un carcter tipo char est contenido en un string. Sintaxis: strchr (<string>, <chr>); Donde <string> es la cadena donde se va a buscar el carcter <chr>. Ejemplo: char cadena[20], letra; strcpy (cadena, "Sistemas"); letra = 'e'; if (strchr (cadena, letra)) printf ("Si contiene el carcter %c \n", letra); else printf ("No contiene el carcter %c \n", letra);
Al ejecutarse las instrucciones, se mostrar: Si contiene el carcter e. -------- o --------
Ejercicio N 36: Leer un Nombre (string). Convertirlo a Mayscula. #include <stdio.h> #include <conio.h> #include <string.h>
char apellido[10]; char str=" "; /* declara str con un solo caracter inicializado en " " */ char caracter;
main() { clrscr(); /* Limpia la pantalla */ strcpy (apellido, ""); printf ("Introduzca Apellido: "); do { caracter = getch(); /*Lee un caracter, sin mostrarlo y sin Enter */ if (isalpha (caracter)) { strset (str, caracter); /* sustituye str por caracter */ strcat (apellido, str); /* agrega str al final de apellido */ printf ("%c", caracter); } if (caracter == '') { strset (str, caracter); /* sustituye str por caracter */ strcat (apellido, str); /* agrega str al final de apellido */ printf ("%c", caracter); } } while (caracter != '\r' && strlen(apellido) < 10); /* '/r' es Enter */ printf ("\n"); printf ("El Apellido es: %s \n", apellido); printf ("Pulse una tecla para salir..."); getche(); return; }
Nota: '/r' se refiere a la tecla Enter o Return.
Nota: La declaracin char *str=" "; define un string. El tamao del string est determinado por la cantidad de caracteres con que se inicializa el string (en este caso contiene un espacio en blanco, por lo tanto su tamao es 1).
-------- o --------
Ejercicio N 38: Validar la lectura de un Nmero Entero (entre -1000 y 1000). Aceptar solo: dgitos, + y -.
int numero; char *str=" "; char caracter; char cadena[10], temp[10];
46 main() { clrscr(); /* Limpia la pantalla */ strcpy (cadena, ""); printf ("Introduzca un Entero entre -1000 y 1000: "); do { caracter = getch(); /*Lee un caracter, sin mostrarlo y sin Enter */ if ((caracter == '+' || caracter == '-') && strlen(cadena) == 0) { strset (str, caracter); /* sustituye str por caracter */ strcat (cadena, str); /* agrega str al final de cadena */ printf ("%c", caracter); } if (isdigit (caracter)) { strset (str, caracter); /* sustituye str por caracter */ strcat (temp, str); /* agrega str al final de temp */ numero = atoi(temp); if (numero >= -1000 && numero <= 1000) { strset (str, caracter); /* sustituye str por caracter */ strcat (cadena, str); /* agrega str al final de cadena */ printf ("%c", caracter); } } } while (caracter!='\r' || strlen(cadena)==0 || strcmp(cadena,"+")==0 \ || strcmp(cadena,"-")==0);
printf ("\n"); numero = atoi(cadena); printf ("El numero es: %d \n", numero); printf ("Pulse una tecla para salir..."); getche(); return; }
Ejercicios propuestos: P62.- Leer una palabra. Indique cuntas vocales y cuntas consonantes tiene. P63.- Leer una oracin (cadena de caracteres). Indique cuntas palabras tiene. (Las palabras se separan con: espacio en blanco, coma y/o punto). P64.- Leer nombre y apellido en una sola variable string (separados por un espacio en blanco). Colocar en mayscula las iniciales del nombre y del apellido. P65.- Lea una palabra. Indique si es un Palndrome (se lee igual de izquierda a derecha que a la inversa). P66.- Leer un string. Invertirlo. P67.- Validar la lectura de un nmero real. Aceptar solo dgitos, el punto, + y -. P68.- Validar la lectura de un Apellido (string de 10 caracteres). Aceptar solo caracteres alfabticos (incluyendo la tecla BackSpace). P69.- Validar la lectura de un nmero entero. Aceptar solo dgitos, + y - (incluyendo la tecla BackSpace).
6 51 3 96 ` 141 186 231 7 BEEP 52 4 97 a 142 187 232 8 53 5 98 b 143 188 233 9 TAB 54 6 99 c 144 189 234 10 LineFeed 55 7 100 d 145 190 235 11 Home 56 8 101 e 146 191 236 12 FormFeed 57 9 102 f 147 192 237 13 Return 58 : 103 g 148 193 238 14 59 ; 104 h 149 194 239 15 60 < 105 i 150 195 240 16 61 = 106 j 151 196 241 17 62 > 107 k 152 197 242 18 63 108 l 153 198 243 19 64 @ 109 m 154 199 244 20 65 A 110 n 155 200 245 21 66 B 111 o 156 201 246 22 67 C 112 p 157 202 247 23 68 D 113 q 158 203 248 24 69 E 114 r 159 204 249 25 70 F 115 s 160 205 250 26 71 G 116 t 161 206 251 27 72 H 117 u 162 207 252 28 cursor dere 73 I 118 v 163 208 253 29 cursor izq 74 J 119 w 164 209 254 30 cursor arrib 75 K 120 x 165 210 255 FF 31 cursor abaj 76 L 121 y 166 211 32 Espacio 77 M 122 z 167 212 33 ! 78 N 123 { 168 213 34 79 O 124 | 169 214 35 # 80 P 125 } 170 215 36 $ 81 Q 126 ~ 171 216 37 % 82 R 127 172 217 38 & 83 S 128 173 218 39 84 T 129 174 219 40 ( 85 U 130 175 220 41 ) 86 V 131 176 221 42 * 87 W 132 177 222 43 + 88 X 133 178 223 44 , 89 Y 134 179 224
Nota: Para escribir los caracteres imprimibles en el editor de Turbo C, mantenga presionada la tecla Alt mientras pulsa los dgitos del valor ASCII. -------- o --------
Profesor-Asesor: Vladimir Gude Email: vladimirgude@yahoo.es Misin Sucre - Yaracuy Abril - 2007