UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA LENGUAJE C: En 1983, el Instituto Americano de Normalización (ANSI) se dio a la tarea de estandarizar el lenguaje C, aunque esta tarea tardó 6 años en completarse, y además con la ayuda de la Organización Internacional de Normalización (ISO), en el año de 1989 definió el C Estándar. C++ es un lenguaje de nivel medio pero no porque sea menos potente que otro, sino porque combina la programación estructurada de los lenguajes de alto nivel con la flexibilidad del ensamblador. Dev-C++ es un Entorno Integrado de Desarrollo para el lenguaje de programación C/C++ que usa Mingw (Minimalist GNU for Windows, www.mingw.org) de GCC (GNU Compiler Collection www.gnu.org/home.es.html). Es un software de libre distribución (www.bloodshed.net) sujeto a los términos de la Licencia Pública General (GPL) de GNU. ESTRUCTURA BÁSICA DE UN PROGRAMA Un programa escrito en C está conformado por pequeños módulos de código llamados funciones. El módulo principal o programa principal está conformado por la función que denominamos main( ) las instrucciones que conforman ésta se encierran entre { }. Sobre la parte superior de la función main() y dentro de la función se pueden declarar los siguientes objetos que pueden manipular un programa. 1. Directivas para Incluir archivos, #include 2. Directivas para incluir macros y constantes #define 3. Declaración de Prototipos de funciones 4. Declaración de Variables globales 5. Declaración de tipos de datos. 6. Dentro del main() se encuentran las declaraciones de variables y las instrucciones que definen procesos que debe realizar la computadora. 7. Por fuera del main() y después de la llave } que cierra el main aparecen las declaración de las funciones. ENTRADA Y SALIDA EN C++ La biblioteca estándar de E/S para C, descrita por el archivo de cabecera stdio.h está disponible en C++. Sin embargo, C++ introduce sus propios archivos de cabecera; por ejemplo, iostream.h, fstream.h y strstream.h, que implementan su colección particular en funciones de E/S. cin, cout En C++ los flujos stdin, stdout son: cin, cout. Estos dos flujos se abren automáticamente cuando comienza la ejecución de programas, y se convierte en la interfaz entre el programa y el usuario. El flujo cin está asociado con el teclado del terminal. El flujo cout se asocia con el monitor de vídeo. 1 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA Los operadores >> y << La entrada y salida en C++ ha sido significativamente realzada y perfeccionada por la biblioteca de operadores de flujo >> ("get from" o extracción) y << ("put on" o inserción). Cada operador está sobrecargado propiedad de C++ que delega en el compilador la responsabilidad de determinar que operador lógico o función nombrada debe ejecutarse basándose en los tipos de datos de las variables asociadas. Cada uno de los operadores << y >> puede manipular todos los tipos de datos estándar, clases incluidas. Los siguientes dos ejemplos muestran de manera rápida la mayor facilidad de manejo de E/S (entrada y salida) Utilizando printf : printf("Un entero %d, un real %f", a,b); Ahora equivalente en C++: cout <<"Un entero" <<a<<"un real"<<b; Utilizando scanf para entrar datos: scanf("%d%f%c",&entero,&real,&caracter); ahora en C++: cin >> entero >>real>>caracter; DECLARACIÓN DE VARIABLES: Antes del main() o después de él se deben definir las variables, ejemplo: float a, b, x; Las variables que se declaran dentro del main() se dice que son variables locales, las que se declaran fuera se dicen globales. La siguiente tabla muestra los distintos tipos de dato que podemos usar en C para declarar variable en un programa en C. TIPO char int double float pointer long double TIPOS DE DATOS BÁSICOS RECONOCIDOS POR TURBO C TAMAÑO en RANGO de Valores que Puede Bytes de la Variable Almacenar Cuando Usamos 1 0..255 ‘Á’...’Z’, $ Para almacenar números 2 -32767..32768 enteros Para almacenar números 8 1.7E-308..1.7E308 Reales 4 3E-38..3E38 Variables que almacenan números reales. 2 byte Punteros near, __es, _es, ss Para variables que guardan direcciones de memoria 10 bytes 3.4E-4932 a 1.1 E 4932 Variables Reales OPERACIÓN DE ASIGNACIÓN: Es la operación mediante la cual se le asigna un valor determinado a una variable en memoria. SINTAXIS: <Identificador>=<expresión> Estamos indicando a la computadora que evalúe la expresión y la almacene en la variable que se identifica por el identificador. Una expresión puede ser un valor de constante, o fórmula matemática. Ejemplos: Horas=30; salario=5000; caracter='C'; salario=salario + 1000; NUNCA se escribe la expresión a la izquierda del operador de asignación: 2 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA salario*2 = sal_total INSTRUCCIONES DE CONTROL y CICLOS REPETITIVOS FLUJO DE CONTROL: Se llama flujo de control de un programa al orden en que se ejecutan las instrucciones que lo conforman. El flujo de control de los programas, es lineal, esto significa que la computadora ejecuta una a una las instrucciones que se le indican, sin alterar el orden en que se escriben. EXPRESION LÓGICA: Una expresión lógica en C es una sentencia que al ser evaluada, la computadora da un valor 0 si es falsa y un valor distinto de cero si es verdadera. OPERADORES DE RELACIÓN: Los siguientes operadores los utilizaremos para construir expresiones lógicas y establecen relaciones que pueden ser falsas o verdaderas. OPERADOR >= <= == != < > SIGNIFICADO Mayor o igual que Menor o igual que Igual que Diferente Menor que Mayor que EJEMPLO: A+B>=C*2; X= ='S'; X<>S; La expresión: z= a+b>=c*2; Compara el valor de la suma de a y b con el doble de c, si es menor almacena en z el valor 0 si es mayor o igual almacena un valor distinto de cero. OPERADORES LÓGICOS: OPERADORES && || ! SIGNIFICADO y o no EJEMPLOS: Si tenemos la expresión : !(5>3) al evaluarla el resultado que da es 0. La expresión: z=!(5>3); Almacena 0 en la variable z La expresión: z=!(a+b>=c*2) Almacena 1 en la variable z si el resultado de comparar a+b con el doble de c es menor, puesto que la proposición es falsa, al negarla da verdadera PRIORIDAD DE OPERADORES: Teniendo los operadores ya definidos, debemos definir la prioridad nuevamente así: 3 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA CATEGORÍA DEL OPERADOR OPERADORES ASOCIATIVA Operadores Monarios -,++,--,!, sizeof(tipo) Derecha a Izquierda Multiplicación división y *, /, % Izquierda a Derecha residuo Suma y sustracción aritmética +, Izquierda a derecha Operadores de relación <, <=, >, >= Izquierda a derecha Operadores de igualdad = = , != Izquierda a derecha y && Izquierda a derecha o || Izquierda a derecha Operadores de asignación =, +=, - =, *=, /=, %= Izquierda a derecha Las expresiones entre paréntesis se evalúan primero. Los operadores de asignación tienen menor prioridad que todos los otros operadores. Por tanto las operaciones monarios, aritméticos, de relación, de igualdad y lógicos se realizan antes que las de asignación. INSTRUCCIÓN if (expresión lógica) else: La instrucción si evalúa la expresión lógica, si ésta es verdadera, ejecuta la instrucción definida en <acción A>, si es falsa se ejecuta la instrucción inmediata al else definida en <acción B>, después de eso ejecuta la instrucción siguiente a la <acción B> y las que le siguen if (expresión lógica) Expresión lógica <Acción A>; Si else No Acción A Acción B <Acción B>; EJEMPLO: Escriba un programa en lenguaje C que le permita a un estudiante calcular la nota definitiva de tres notas, que tienen el mismo valor porcentual. El programa debe imprimir la nota definitiva y un mensaje adecuado que diga 'Gano la materia', o 'Perdió la Materia', según si la nota sea mayor igual que cero o menor que cero. #include <stdio.h> void main() { double nota1, nota2, nota3; double definitiva; clrscr(); printf("Escriba la primera nota\n"); scanf("%lf",&nota1); printf("Escriba la segunda nota\n"); scanf("%lf",&nota2); printf("Escriba la tercera nota\n"); scanf("%lf",&nota3); 4 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA definitiva=(nota1+nota2+nota3)/3; if (definitiva>=6) printf("Su nota es %f GANO",definitiva); else printf("Su nota es %f PERDIO",definitiva); getch(); } Otra versión del programa usando la instrucción que hemos visto es: #include <iostream.h> #include <conio.h> #define gano "Gano la Materia" #define perdio "Perdio la Materia" void main() { double nota1, nota2, nota3; double definitiva; clrscr(); cout<<"Escriba la primera nota"; cin>>nota1; cout<<"Escriba la segunda nota"; cin>>nota2; cout<<"Escriba la tercera nota"; cin>>nota3; definitiva=(nota1+nota2+nota3)/3; if (definitiva>=6) cout<<"Su nota es "<<definitiva<<gano; else cout<<"Su nota es "<<definitiva<<perdio; getch(); } SENTENCIA COMPUESTA: Cuando un programador, necesita que la computadora ejecute más de una instrucción en el momento de que la expresión lógica sea verdadera o sea falsa, lo indica encerrando entre llaves { } las instrucciones que siguen al then o al else. EJEMPLO: Escriba un programa que lea tres números reales a, b, c. Una vez leídos, el programa debe calcular la solución a la ecuación: A* X 2 B * X C 0 y debe escribir las soluciones reales si existen y las soluciones complejas. 5 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA Lea a,b,c discri:=b*b - 4*a*c b*b - 4*a*c >= 0 Si No x1 b b discri preal 2 * a 2*a x2 b discri pimag 2 *a discri 2*a Escriba: ''x1=',x1 Escriba: ''x1=',preal,'+i',pimag Escriba: ''x2=',x2 Escriba: ''x2=',preal,'-i',pimag Escriba: #include <iostream.h> #include <conio.h> #include <math.h> #define imagin 'i' void main(void) { double a,b,c, discri, preal, x1, x2, pimag; clrscr() ; cout<<"Escribe los coeficientes ?"; cin >>a>>b>>c; discri=pow(b,2)-4*a*c; if (discri>=0) { x1=(-b+sqrt(discri))/(2*a); x2=(-b-sqrt(discri))/(2*a); cout<<"X1="<<x1; cout<<"x2="<<x2; } '' Termine de resolver la ecuacion, presione Enter ' else { preal=-b/(2*a); pimag=sqrt(abs(discri))/(2*a); cout<<"\n x1="<<preal<<”imagin”<<pimag; cout<<"\n x1="<<preal<<”imagin”<<-pimag; } getch(); Lea: Enter } IF ANIDADOS: Tendremos situaciones lógicas en las cuales después de hacernos una pregunta se nos hace necesario hacer una nueva pregunta, en esos caso tenemos entonces que después del then y/o else es necesario volver a tener una sentencia if then else decimos entonces que anidamos if. EJEMPLO: Se requiere un programa que lea A y permita evaluar la función 5 * x x 1 x3 x2 y x 5 3 x 9 3 3 x 9 x 7* x #include <stdio.h> #include <math.h> void main() { double a,y; clrscr(); printf(" Entre un número real "); scanf("%lf",&a); if (a<3) y=5*a + sqrt(++a); 6 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA else if ((a>=3)&&(a<=9)) y=a+5-(a+2)/3; else y=exp(3*log(a))+7*a; printf("y=%7.2lf",y); getch(); } INSTRUCCIÓN while La instrucción while hace que la computadora repita la ejecución de las instrucciones mientras la condición es verdadera. while (expresión lógica ) Expresion lógica { Instrucciones a Repetir Instrucciones a Repetir } En el lenguaje C esa instrucción tiene la siguiente sintaxis: Dentro de las instrucciones a repetir debe haber al menos una instrucción que haga que la condición sea falsa, de lo contrario no saldrá del ciclo. EJEMPLO: Escribir un programa que lea un número entero n, luego de lo cual la computadora debe escribir t odos y cada uno de los números entre 1 y n luego debe escribir cuanto vale la suma de esos números. #include <iostream.h> #include <conio.h> void main() { float n, numero, suma ; gotoxy(10,10); textcolor(lightyellow); cout<<"\n Escriba numero hasta donde desea que cuente ?"; cin>>n; numero=1; suma=0; while (numero<=n) { suma += numero; cout<<numero; numero += 1; } 7 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA gotoxy(10,12);cout<<"La suma="<<suma; getch(); } EJEMPLO: Escriba un programa que lea un número entero n y luego calcule y escriba los n primeros términos de la serie 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89......... #include<iostream.h> #include<conio.h> void main() { double n, t, af, ai, an, suma; clrscr(); cout<<"Escriba el número de terminos a crear"; cin>>n; af=0; ai=1; an=0; t=1; suma=0; while (t<=n) { cout<<an<<",\t"; suma+=an; af = ai; ai= an; an =af + an; t+=1; } cout<<"\n\n\ala suma vale"<< suma; getch(); } INSTRUCCIÓN do / while (expresion lógica): La instrucción do/while la utilizan los programadores para indicarle al computador que debe ejecutar una o varias instrucciones mientras que una condición definida en la expresión lógica sea verdadera, a diferencia del while, la condición se evalúa después de ejecutar las instrucciones a repetir al menos una vez. do { Instrucciones a Repetir Instrucciones a Repetir }while(expresión lógica); Mientras expr. lógica EJEMPLO: Escriba un programa que lea un número entero n y luego calcule y escriba los n primeros términos de la serie 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89......... Este programa es el mismo que vimos en las páginas del while, observe como se puede realizar lo anterior usando el do/while. 8 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA #include<iostream.h> #include<conio.h> void main() { double n, t, af, ai, an, suma; clrscr(); textcolor(BLUE); cout<<"Escriba el número de termino a crear"; cin>>n; af=0; ai=1; an=0; t=1; suma=0; do { cout<<an<<",\t"; suma=suma + an; af = ai; ai= an; an=af + an; t=t+1; }while (t<=n); cout<<"\n\n\ala suma vale"<< suma; getch(); } LA INSTRUCCIÓN for: La utilizan los programadores para indicarle al computador que ejecute un conjunto finito de instrucciones mientras una condición dada se cumpla. La sintaxis de la forma general de la sentencia for es: for (inicialización; condición; incremento) sentencia_a_ejecutar; El bucle for permite muchas variaciones, pero existen tres partes principales: 1. La inicialización: Normalmente es una sentencia de asignación que se utiliza para la inicializar una variable de control del bucle. 2. La condición: Es una expresión lógica que determina cuando finaliza el bucle. 3. El incremento: Como cambia la variable de control cada vez que se repite el bucle. Las tres secciones se separan por; (punto y coma) el bucle se repite hasta que la condición sea falsa. EJEMPLO: Escriba un programa que calcule el factorial de un número entero n. #include <iostream.h> #include <conio.h> void main ( ) { float factorial = 1, n, factor; clrscr ( ); 9 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA cout<< "Entre un numero al cual le quiere calcular el factorial"; cin>> n; for (factor = n; factor; factor--) { factorial*=factor; } cout<<n<<"!="<< factorial; } EL OPERADOR COMA. La coma en "C" tiene como función encadenar varias expresiones. Esencialmente, la coma produce una secuencia de operaciones. Cuando se usa en la parte derecha de una sentencia de asignación, el valor asignado es el valor de la última expresión de la lista separada por coma. EJEMPLO: y =100; /* y toma el valor de 100*/ x = ( y = y-50,100/y); /* y vale 50 y 100/50 es 2*/ tras la ejecución x =2. Se puede pensar en el operador coma, teniendo el mismo significado que la palabra en español normal "haz esto y esto y esto". VARIACIÓN DEL CICLO for: Utilizando el operador coma se puede hacer que el ciclo for tenga dos o mas variables de control del bucle. EJEMPLO: Escribe un programa que lea un número entero n, el programa debe encontrar cuanto suman los n primeros números pares e impares. #include <iostream.h> #include <conio.h> void main ( ) { int n, par, sum,imp, sump, sumi, numeros; clrscr ( ); sum=sump=sumi = 0; cout<<"Cual es el valor de n"; cin>>n; for(numeros = 1, par=2, imp=1; numeros<= n; ++numeros, par+= 2, imp+= 2) { cout<<"\n\t\t impar "<<imp<<" par "<<par; sump+=par; sumi+=imp; } cout<<" \n\t S impares=\a"<<sumi<<" S pares=\a"<<sump; getch(); } 10 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA INSTRUCCIÓN break Se puede usar para forzar la terminación inmediata de un bucle, saltando la evaluación de la condición normal del ciclo. Cuando se encuentra la instrucción break dentro de un bucle finaliza inmediatamente, y la ejecución continua con la instrucciones que siguen al ciclo. INSTRUCCIÓN continue. La sentencia continue, fuerza una nueva iteración del bucle y salta cualquier código que exista entre medios. do { cout<<"Entre un número igual a 100"; cin>>x; if ( x<0) continue; cout<< x; } while (x!=100); El ciclo anterior repite la lectura mientras x sea negativo. Para los bucles while y do-while, una sentencia continue hace que: el control del programa no ejecute la prueba del condicional y continue el proceso de iteración. En el bucle for se ejecuta se ejecuta la parte del incremento del bucle, seguida de la prueba condicional y finalmente hace que el bucle continue. EJEMPLO: Escriba un programa que lea un número entero n y determine si n es primo o no. Recuerde que un número es primo si no existen números en el intervalo entre 2 y n/2 que dividan a n. #include <iostream.h> La variable es se hace 1 al #include <conio.h> empezar el ciclo, y se pone void main() cero si en algún momento { int n, divisor,es; clrscr(); algun divisor divide a n. cout<<"Escriba el número que va analizar?"; cin>>n; Solo al finalizar el proceso se divisor = 2; es=1; cheque si es es uno. while (divisor<=n/2) { if(n % divisor==0) { cout<<"\n"<<n<<" no es primo"; es =0; En C este if es break; equivalente a } escribir: else { divisor+=1; if (es==1) } } if (es) { cout<<"\n"<<n<<" es primo"; } getch(); } 11 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA La instrucción break hace que el ciclo termine en el momento en que se encuentra algún divisor de n. Cuando se termina el ciclo la computadora cheque si la variable es tiene almacenado un 1 si eso es verdad el número es primo. INSTRUCCIÓN switch: Esta instrucción permite verificar si una variable de tipo char o int tiene un valor determinado. switch(variable){ case constante1: instrucciones1; break; case constante2 : instrucciones2; break; ........ case constanten : instrucciones3; break; default : Instrucciones por defecto; } La instrucción switch compara el valor de la variable con la constante1, si son iguales ejecuta las instrucciones1 y llega al break, y ejecuta luego las instrucciones siguientes a la llave }. Si no son iguales compara el valor de la variable con el valor de la constante2, sino son iguales compara con el de la constante3, y así sucesivamente. Si no existe ninguna constante igual al valor de la variable ejecuta el default, si este existe, sino continua con la ejecución de las instrucciones después de la llave }. El break en cada caso es opcional, sino existe se ejecutan las instrucciones siguientes hasta encontrar un break. Ejemplo: Escriba un programa que presente un menú con tres opciones: La opción 1 Sumar, 2 Restar, 3 Salir. Si el usuario presiona la opción 1, la computadora le pregunta por dos números enteros y por el valor del resultado de la suma y le dice si el resultado es correcto o no. Si el número presionado es el 2, la computadora le pregunta por dos números enteros y por el valor de la diferencia y le dice si el resultado es correcto o no. Si es 3 termina con la ejecución del programa. #include <iostream.h> #include <conio.h> void main() { char opcion; float a,b,respuesta; do{ clrscr(); gotoxy(10,10); cout<<"Las opciones son:"; gotoxy(10,12); cout<<"1-Sumar dos numeros"; gotoxy(10,13); cout<<"2-Restar dos numeros"; gotoxy(10,14); cout<<"3-Terminar el proceso"; 12 UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA ESCUELA DE CIENCIAS BÁSICAS, TECNOLOGÍA E INGENIERÍA opcion=getch(); switch (opcion){ case '1':clrscr();gotoxy(10,12); cout<<"Escriba un número "; cin>>a; gotoxy(10,13); cout<<"Escriba el otro sumando "; cin>>b; gotoxy(10,14); cout<<"Cuanto suman "<<a<<"+"<<b; cin>>respuesta; if (respuesta==(a+b)) { gotoxy(10,16); cout<<"Respuesta correcta "; } else { gotoxy(10,16); cout<<"La respuesta no es "<<respuesta<<" la res correcta es "<<a+b; } gotoxy(10,17);cout<<"Termine presione cualquier tecla"; getch(); break; case '2':clrscr(); gotoxy(10,12); cout<<"Escriba un número "; cin>>a; gotoxy(10,13); cout<<"Escriba el sustraendo "; cin>>b; gotoxy(10,14); cout<<"Cual es la diferencia entre "<<a<<"-"<<b; cin>>respuesta; if (respuesta==(a-b)) { gotoxy(10,16); cout<<"Respuesta correcta "; } else { gotoxy(10,16); cout<<"La respuesta no es "<<respuesta<<" la res correcta es "<<a-b; } gotoxy(10,17); cout<<"Termine presione cualquier tecla"; getch(); break; case '3':clrscr(); gotoxy(10,10);cout<<"Termine"; break; default : gotoxy(10,17); cout<<"Presione solo 1,2 o 3"; } } while (opcion!='3'); } 13