ESCUELA SUPERIOR POLITÉCNICA DE CHIMBORAZO
FACULTAD DE CIENCIAS
ESCUELA DE FISICA Y MATEMÁTICA
ING. ESTADÍSTICA INFORMÁTIC...
Título: Lenguajes de programación

Antecedentes:

El período comprendido entre finales de 1960 y finales de 1970 trajo un ...
Prolog, diseñado en 1972 por Colmerauer, Roussel y Kowalski, fue el primer lenguaje de
programación lógica.
ML construyó u...
ML y Lisp. La investigación en Miranda, un lenguaje funcional, con evaluación perezosa,
comenzó a tomar fuerza en esta déc...
La década de 1990: la era de Internet
El rápido crecimiento de Internet en la década de 1990 fue el siguiente gran acontec...
Definición:

Las personas se comunican con los computadores mediante programas de computador, que
permiten la participació...
Marco teórico:
Tipos de lenguajes de programación.
Existen muchos tipos de lenguajes de programación, que han ido aparecie...
Los microprocesadores procesan exclusivamente señales electrónicas binarias. Dar una
instrucción a un microprocesador supo...
Un programa, en este caso, puede expresarse del siguiente modo:
programa = funciones + estructuras de datos.
Las caracterí...
Un programa se compone de:
programa= reglas + asertos + estructuras de datos + control.
Las características de estos lengu...
b) Son compilativos, es decir, precisan de un proceso de compilación para poder ser
ejecutados.
c) Son objetuales no proce...
Lenguaje C

Empezaremos nuestra práctica en lenguajes de programación utilizando el programa Turbo
C, ya que pedagógicamen...
CAPITULO 2.- TIPOS DE OPERADORES Y EXPRESIONES
2.1 NOMBRES DE VARIABLES
2.2 TIPOS DE DATOS Y LARGOS
2.3 CONSTANTES
2.4 DEC...
Estas desventajas son aproximadas del curso, lo mas notable es que la historia completa de
un lenguaje característico en p...
La instrucción printf es una función de biblioteca que imprime la salida del terminal.
Para imprimir una secuencia de cara...
}

En C todas las variables deben ser declaradas antes de usar, para el comienzo de la función,
antes de una declaración e...
Un punto decimal en una constante indica que esta es de punto flotante, así es como 5.0 /
9.0 es 0,555.... Que es lo que s...
int fahr;
for (fahr = 0; fahr <= 300; fahr = fahr + 20)
printf ("%4d %6.1fn",fahr,(5.0 / 9.0)*(fahr - 32));
}
Esto produce...
1.5 UNA COLECCION DE PROGRAMAS UTILES
Vamos ahora a considerar una serie de programas relacionados para hacer operaciones
...
++ndigit[c-'0'];
else if (c == ' ' || c == 'n' || c == 't')
++nwhite;
else
++nother;
printf ("dígitos = ");
for ( i = 0; i...
else
++nother;
El modelo
if (condición)
instrucción
else if ( condición)
instrucción
else
instrucción
Ocurre frecuentement...
C no tiene operador de exponenciacion parecido al ** de Fortran o PL/1, ilustraremos el
mecanismo de esta función escribie...
power(x,n) /* eleva x a la enesima potencia; n>0,
segunda versión */
int x,n;
{
int p;
for (p = 1; n > 0; --n)
p = p * x;
...
Esta estructura divide el programa en partes. Una parte entrega una nueva línea, otra
pregunta, otra graba, y el resto con...
for (i=0;i<lim-1 && (c=getchar()) != EOF &&
c!='n';++i)
s[i] = c;
if (c == 'n') {
s[i] = c;
++i;
}
s[i] ='0';
return(i);
}...
Es escrito en un programa C, el compilador crea un arreglo de caracteres conteniendo los
caracteres del string, y lo termi...
permitiremos reescribir el programa de las líneas mas largas con line, save y max como
variables externas. Esto requiere c...
line [i] = c;
++i;
}
line [i] = '0';
return(i);
}
copy() /* versión especializada */
{
int i;
extern char line[], save[];
...
CAPITULO 2 TIPOS DE OPERADORES Y EXPRESIONES

Las variables y constantes son los datos objetos básicos manipulados en un p...
float Punto flotante, simple precisión.
double Punto flotante de doble precisión.
En suma, hay un número de cualidades que...
Las variables pueden también ser inicializadas en su declaración, aunque hay algunas
restricciones. Si el nombre es seguid...
logicos && y ||. Las expresiones conectadas por && o || son evaluadas de izquierda a
derecha, y la evaluación detenida tan...
char s[];
{
int i,n;
n = 0;
for (i=0; s[i] >= '0' && s[i] <= '9'; ++i)
n = 10 * n + s[i] - '0';
return(n);
}
Como ya vimos...
char c;
c = getchar();
if (c == EOF)
En una máquina que no indica extensión, c es siempre positivo porque este es un char,...
Cada vez que ocurre un no-c, esto es copiado en la posición j actual, y solo entonces j es
incrementado para que este list...
i += 2
usando un operador de asignamiento como +=. Muchos operadores binarios tienen un
correspondiente operador de asigna...
z = (a > b) ? a : b ; /* z = max(a,b) */
Debería notarse que la expresión condicional es en efecto una expresión, y esta p...
== != izqu. a der.
& izqu. a der.
^ izqu. a der.
| izqu. a der.
&& izqu. a der.
|| izqu. a der.
?: der. a izqu.
= += -= et...
que rodean las instrucciones de una función son un ejemplo obvio; paréntesis alrededor de
múltiples instrucciones después ...
else if (expresión)
instrucción
else
instrucción
ocurre a menudo; es equivalente a una breve discusión separada. Esta secu...
La instrucción switch es una multidecision especial, fabricante de preguntas, así una
expresión que tiene un numero de exp...
Los switchs evalúan las expresiones enteras entre paréntesis (en este programa el carácter
c) y compara su valor con todos...
las partes puede omitirse, aunque el punto y coma debe permanecer. Si la exp1 o exp3 es
omitida, es sencillamente desprend...
#define MAXLINE 1000
main () /* remueve arrastrando blancos y tabs */
{
int n;
char line[MAXLINE];
while (( n = getline(li...
a la reinicializacion del step. (continue se aplica solo a loops, no a switch. Un continue
interior a un switch, interior ...
Ejercicios resueltos:
1._ Imprima en pantalla su nombre utilizando un salto de línea para su apellido.
#include <stdio.h>
...
2.1._ Imprima en pantalla: Hola Luis soy docente de física y matemática y tengo 30
anios utilizando asignación de variable...
getch();
}
4._Ingrese un ciclo de repetición FOR para que se imprima 5 veces su nombre en
pantalla.
#include <conio.h>
#in...
getch();
}
6._ Utilice un ciclo FOR para que se imprima en pantalla 10 veces el número 100
#include <conio.h>
#include <st...
printf("%fn",x);
}
getch();
}

8._ Imprima en pantalla el número 7 y después de un salto de línea imprima su
nombre utiliz...
scanf("%f",&y);
z=x+y;
printf("El resultado es ,%f",z);
getch();
}

10._ Ingrese un número y retorne si el número es par o...
{
clrscr();
printf("Ingrese un numeron");
float x;
scanf("%f",&x);
if(x>0)
{
printf("El numero %f es mayor que 0",x);
}
ge...
#include <conio.h>
#include <stdio.h>
int main(void)
{
clrscr();
int a=1;
while (a<10)
{
printf("Alexandern");
a++;
}
getc...
case 1:
printf("nnIngrese la base del rectangulo: ");
scanf("%f",&x);
printf("nIngrese la altura del rectangulo: ");
scanf...
scanf("%f",&x);
if(x<=0)
{
printf("nLas cantidades a ingresar para las areas deben ser positivas");
}
else
{
z=x*x*3.14;
p...
{
printf("nLas cantidades a ingresar para las calificaciones deben ser positivas");
}
else
{
w=(x+y+z)/3;
if(w<12)
{
print...
int x;
scanf("%d",&x);
if(x<=0)
{
printf("nLa persona no ha nacido aun (las edades deben ser mayores que cero)");
}
else
{...
getch();
}
17._ Realice un programa que reciba su edad y le indique si puede o no votar en las
elecciones
#include <conio....
scanf("%d",&x);
printf("Ingrese el segundo numero:n");
scanf("%d",&y);
printf("Ingrese el tercer numero:n");
scanf("%d",&z...
getch();
}
20._ Realice un programa que calcule el área de un triangulo
#include <conio.h>
#include <stdio.h>
void main()
...
printf("nnEl numero %d es multiplo de 3",x);
}
else
{
printf("nnEl numero %d no es multiplo de 3",x);
}
getch();
}
22._ In...
case 5:
printf("Mayo");
break;
case 6:
printf("Junio");
break;
case 7:
printf("Julio");
break;
case 8:
printf("Agosto");
b...
23._ Realice un programa en el que usted presione 1 si quiere sumar dos números y
presione dos si quiere restarlos.
#inclu...
getch();
return 0;
}
24._ Realice un menú en el que usted pueda escoger entre hallar el área de un
triángulo o realizar la...
scanf("%d",&c);
printf("Ingrese el cuarto numero: ");
scanf("%d",&d);
printf("Ingrese el quinto numero: ");
scanf("%d",&e)...
printf("
5=Mayon");
printf("
6=Junion");
printf("
7=Julion");
printf("
8=Agoston");
printf("
9=Septiembren");
printf("
10=...
printf("nJulio tiene 31 dias");
break;
case 8:
printf("nAgosto tiene 31 dias");
break;
case 9:
printf("nSeptiembre tiene 3...
int a;
printf("*Presione 1 para letrasn*Presione 2 para numerosnnIngrese la opcion deseada: ");
scanf("%d",&a);
switch(a)
...
printf("2._ Restan");
printf("3._ Multiplicacionn");
printf("4._ Divisionn");
printf("************************************...
z=x/y;
printf("nEl resultado es: %.2f",z);
break;
default:
printf("nnERROR: Revise las opciones establecidas en el menu");...
case 4:
printf("Jueves");
break;
case 5:
printf("Viernes");
break;
case 6:
printf("Sabado");
break;
case 7:
printf("Doming...
clrscr();
int a;
printf("***************** MENU *****************n");
printf("Escoja la opcion que desee:nn");
printf("1._...
if(x>z)
{
if(x>w)
{
printf("nEl mayor de los 4 numeros es %d",x);
}
else //si w>x>z>y
{
printf("nEl mayor de los 4 numeros...
break;
case 3://De cm a pulgada
float d,e;
printf("nnIngrese una cantidad en cm: ");
scanf("%f",&d);
e=d*2.5;
printf("nEl ...
getch();
return 0;
}

Conclusiones:
Programación es imprescindible en la formación de cualquier profesional ya que en
cual...
Upcoming SlideShare
Loading in …5
×

Lenguajes de programacion

671 views
517 views

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
671
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
18
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Lenguajes de programacion

  1. 1. ESCUELA SUPERIOR POLITÉCNICA DE CHIMBORAZO FACULTAD DE CIENCIAS ESCUELA DE FISICA Y MATEMÁTICA ING. ESTADÍSTICA INFORMÁTICA LENG. PROGRAMACIÓN II Nombre: Alexander Andrade Saltos Código: 445 Semestre: Tercero Tema: Lenguajes de programación 1
  2. 2. Título: Lenguajes de programación Antecedentes: El período comprendido entre finales de 1960 y finales de 1970 trajo un gran florecimiento de lenguajes de programación. La mayoría de los paradigmas de lenguajes de programación más importantes y actualmente en uso se inventaron en este período: Simula, inventado en la década de 1960 por Nygaard y Dahl como un superconjunto de Algol 60, fue el primer lenguaje diseñado para apoyar la programación orientada a objetos. C, en principio un lenguaje de programación sistemas, fue desarrollado por Dennis Ritchie y Ken Thompson en los Laboratorios Bell entre 1969 y 1973. Smalltalk (mediados de los 70) proporcionaron un completo diseño de un lenguaje orientado a objetos. 2
  3. 3. Prolog, diseñado en 1972 por Colmerauer, Roussel y Kowalski, fue el primer lenguaje de programación lógica. ML construyó un sistema de tipos polimórfico (inventado por Robin Milner en 1973) en el tope de Lisp, pionero en los lenguajes funcionales de programación con tipado estático. Cada uno de estos lenguajes generó toda una familia de descendientes, y los lenguajes más modernos cuentan al menos uno de ellos en su ascendencia. En los años 60 y 70 también suscitó un debate considerable sobre los méritos de la "programación estructurada", que esencialmente significaba programación sin el uso de GOTO. Este debate estaba estrechamente relacionado con el diseño del lenguaje: algunos lenguajes no incluían GOTO, lo que obligó a la programación estructurada en el programador. Aunque el debate se recrudecía acaloradamente en ese momento, casi todos los programadores están de acuerdo en que, incluso en lenguajes que ofrecen GOTO, es una mala práctica de programación usarlo, excepto en raras circunstancias. Como resultado de ello, las generaciones posteriores de diseñadores de lenguajes han encontrado el debate sobre programación estructurada tedioso e incluso desconcertante. Algunos lenguajes importantes que se desarrollaron en este período fueron: 1968 - Logo 1969 - B (precursor C) 1970 - Pascal 1970 - Forth 1972 - C 1972 - Smalltalk 1972 - Prolog 1973 - ML 1975 - Scheme 1978 - SQL (inicialmente sólo un lenguaje de consulta, posteriormente ampliado con construcciones de programación) La década de 1980 fueron años de consolidación relativa en los lenguajes imperativos. En vez de inventar nuevos paradigmas, se comenzó a trabajar a partir de las ideas inventadas en la década anterior. C++ combinaba la programación orientada a objetos y la programación de sistemas. El gobierno de Estados Unidos estandarizó Ada, un lenguaje de programación de sistemas destinado a ser utilizado por contratistas de defensa. En Japón y en otras partes, se gastaron enormes sumas investigando los llamados lenguajes de programación de quinta generación que incorporaban construcciones de la programación lógica. La comunidad de los lenguajes funcionales llevaron a cabo la estandarización de 3
  4. 4. ML y Lisp. La investigación en Miranda, un lenguaje funcional, con evaluación perezosa, comenzó a tomar fuerza en esta década. Una nueva tendencia importante en el diseño de lenguajes era un mayor enfoque en la programación de sistemas a gran escala a través del uso de módulos, una organización a gran escala de unidades de código. Modula, Ada, y ML desarrollaron sistemas de módulos notables en la década de 1980. Los sistemas de módulos eran relacionados con frecuencia con construcciones de programación genéricas, que serían, en esencia, módulos parametrizados (véase también polimorfismo en programación orientada a objetos). Aunque no aparecían nuevos paradigmas de lenguajes de programación imperativos, muchos investigadores expandieron las ideas de los lenguajes anteriores y las adaptaron a nuevos contextos. Por ejemplo, los lenguajes de los sistemas Argus y Emerald adaptaron la programación orientada a objetos para sistemas distribuidos. La década de 1980 también trajo avances en la implementación de lenguajes de programación. El movimiento de RISC en la arquitectura de computadoras postulaba que el hardware debía estar diseñado para los compiladores más que para los programadores de ensamblador humanos. Con la ayuda de las mejoras en la velocidad del procesador, permitiendo técnicas de compilación cada vez más agresivas, el movimiento RISC despertó un mayor interés en la tecnología de compilación de los lenguajes de alto nivel. Las tecnologías de los lenguajes continuaron sobre estas líneas entrando en la década de 1990. Algunos lenguajes importantes que se desarrollaron en este período son: 1980 - C++ (C con clases, el nombre cambió en Julio de 1983) 1983 - Ada 1984 - Common Lisp 1984 - MATLAB 1985 - Eiffel 1986 - Objective-C 1986 - Erlang 1987 - Perl 1988 - Tcl 1988 - Mathematica 1989 - FL (Backus); 4
  5. 5. La década de 1990: la era de Internet El rápido crecimiento de Internet en la década de 1990 fue el siguiente gran acontecimiento histórico para los lenguajes de programación. Con la apertura de una plataforma totalmente nueva para los sistemas informáticos, Internet creó una oportunidad adoptar nuevos lenguajes. En particular, el lenguaje de programación Java se hizo popular debido a su pronta integración con el navegador web Netscape Navigator, y varios lenguajes de scripting alcanzaron un amplio uso en el desarrollo de aplicaciones personalizadas para servidores web. La década de 1990 no vio ninguna novedad fundamental en los lenguajes imperativos, pero sí mucha recombinación y la maduración de viejas ideas. Esta era comenzó la difusión de los lenguajes funcionales. Una filosofía de conducción grande era la productividad del programador. Surgieron muchos lenguajes de “aplicaciones de desarrollo rápido” (RAD), los cuales usualmente venían con un IDE, recolector de basura, y eran descendientes de lenguajes anteriores. Todos estos lenguajes eran orientados a objeto. Estos incluían Object Pascal, Visual Basic y Java. Java, en particular, recibió mucha atención. Pero más radicales e innovadores que los lenguajes de RAD eran los nuevos lenguajes de script. Estos no descendían directamente de otros lenguajes y ofrecieron nuevas sintaxis e incorporación más liberal de otras características. Muchos consideran estos lenguajes de script más productivos que los lenguajes de RAD, aunque esto se debe a menudo a que es más difícil escribir y mantener largos programas que pequeños programas simples. Sin embargo, no es menos cierto que los programas de script llegaron para convertirse en los más prominentes en la conexión con la Web. Algunos lenguajes importantes que se desarrollaron en este período son: 1990 - Haskell 1991 - Python 1991 - Visual Basic 1991 - HTML (lenguaje de marcado de hipertexto) 1993 - Ruby 1993 - Lua 1994 - CLOS (parte del ANSI Common Lisp) 1995 - Java 1995 - Delphi (Object Pascal) 1995 - JavaScript 1995 - PHP 1996 - WebDNA 1997 - Rebol 1999 – D 5
  6. 6. Definición: Las personas se comunican con los computadores mediante programas de computador, que permiten la participación de personas y máquinas en un proceso. Los lenguajes de programación -como tal- sólo son comprensibles por las personas, pero su utilidad radica en que son de fácil traducción al lenguaje de máquina, que es el lenguaje “natural” de los computadores. Un programa escrito en un lenguaje de programación se denomina programa fuente y el programa en lenguaje de máquina se denomina programa objeto o ejecutable. Objetico general: Dar a conocer de manera fácil y entendible todo el ámbito de la programación, enfocándonos principalmente en usuarios inexpertos, principiantes que quieren iniciarse en el mundo de los lenguajes de programación. Objetivos específicos:  Definir que es un lenguaje de programación.  Explicar, dar a entender, el uso que tienen dichos lenguajes.  Partiendo de las bases históricas, brindar el conocimiento a los lectores acerca de la importancia de este tema.  Ofrecer las herramientas suficientes para que los estudiantes estén en la capacidad de realizar programas básicos pero dejando en claro el concepto de los lenguajes que van a necesitar en este ámbito. Alcances y limitaciones: El proyecto está destinado al área pedagógica es decir a la enseñanza docente. Dedicado principalmente a estudiantes de pregrado que están inmiscuidos en el tema de la programación. 6
  7. 7. Marco teórico: Tipos de lenguajes de programación. Existen muchos tipos de lenguajes de programación, que han ido apareciendo a través de la historia entre ellos tenemos: 1.1 Lenguaje Máquina: Está formado por instrucciones internas de un ordenador que se almacenan y tratan en el mismo como cadenas de 0’s y 1’s. Sin embargo, dado que es una forma muy engorrosa de escribir y manejar estas instrucciones, se suelen representar en notación hexadecimal (número entre el 0 y el 15 que corresponde a F). El lenguaje máquina es muy sencillo y se compone de una serie de instrucciones de máquina, que contienen: *Operación a realizar (suma, producto, etc.). *Identificación de los operandos sobre los que debe realizarse la operación. *Destino del resultado, esto es, la identificación del lugar donde debe almacenarse. *Ubicación de la siguiente instrucción, para poder leerla. Otra característica importante del lenguaje máquina es que es diferente para cada tipo o familia de computadoras, de ahí que las computadoras no pueden ejecutar programas de otras computadoras, a no ser que sean compatibles a nivel de lenguaje máquina. Así, una computadora de tipo P.C. de I.B.M. es compatible con otras computadoras del tipo P.C., pero es incompatible con un Macintosh de Apple, por ejemplo. El lenguaje máquina establece y describe las capacidades básicas de la computadora, por lo que constituye una de las características más importantes de su arquitectura. 1.2 Lenguaje de Bajo Nivel: Los lenguajes de bajo nivel permiten crear programas muy rápidos, pero que son a menudo difíciles de aprender. Más importante es el hecho de que los programas escritos en un bajo nivel son prácticamente específicos para cada procesador. 7
  8. 8. Los microprocesadores procesan exclusivamente señales electrónicas binarias. Dar una instrucción a un microprocesador supone en realidad enviar series de unos y ceros espaciadas en el tiempo de una forma determinada. Esta secuencia de señales se denomina código máquina. El código representa normalmente datos y números e instrucciones para manipularlos. Un modo más fácil de comprender el código máquina es dando a cada instrucción un mnemónico, esta abstracción da como resultado el ensamblador, un lenguaje de muy bajo nivel que es específico de cada microprocesador, si se quiere ejecutar el programa en otra máquina con otra tecnología, será necesario reescribir el programa desde el principio. Un programa escrito en lenguaje ensamblador no puede ser ejecutado directamente por la computadora –en esto se diferencia esencialmente del lenguaje máquina-, sino que requiere una fase de traducción al lenguaje máquina. 1.3 Lenguaje de Alto Nivel: Los lenguajes de alto nivel son normalmente fáciles de aprender porque están formados por elementos de lenguajes naturales, como el inglés. Son los más utilizados por los programadores, ya que han sido diseñados para que las personas escriban y entiendan los programas de un modo mucho más fácil que los lenguajes máquina y ensambladores. Este tipo de lenguajes tienen muchas ventajas sobre los lenguajes anteriores como: a) El tiempo de formación de los programadores es relativamente corto comparado con otros lenguajes. b) La escritura de programas se basa en reglas sintácticas similares a los lenguajes humanos. c) Las modificaciones y puestas a punto de los programas son más fáciles. d) Reducción del costo de los programas y transportabilidad. Dentro de este grupo de lenguajes podemos encontrar los siguientes: LENGUAJES DE PROGRAMACIÓN FUNCIONAL LENGUAJES DE PROGRAMACIÓN IMPERATIVA LENGUAJES DE PROGRAMACIÓN LÓGICA LENGUAJES DE PROGRAMACIÓN ORIENTADA A OBJETOS 1.3.1. Lenguajes de Programación Funcional Los lenguajes de alto nivel son normalmente fáciles de aprender porque están formados por elementos de lenguajes naturales, como el inglés. Son no requieren que se construya un algoritmo que exprese cómo se tiene que resolver el problema, sino que se tienen que describir los elementos (funciones) que van a servir para resolverlo. 8
  9. 9. Un programa, en este caso, puede expresarse del siguiente modo: programa = funciones + estructuras de datos. Las características de estos lenguajes son: *Su base es la recursividad, puesto que las funciones se definen de forma recursiva. *Las funciones son los elementos principales de los programas. *Son lenguajes interpretativos: necesitan de un proceso de interpretación (traducción) para que sea comprensible a la computadora. *Son lenguajes deterministas: en el sentido de que se tienen siempre los mismos resultados del programa para las mismas entradas. Al ser lenguajes con una componente matemática alta su mejor campo de aplicación es el científico. Los lenguajes más representativos dentro de este grupo son Lisp, Camel y Hope. 1.3.2. Lenguajes de Programación Imperativa Son los más difundidos y son adecuados para resolver aquellos problemas que tienen soluciones expresables en un algoritmo. Para este tipo de lenguajes un programa se puede expresar como sigue: programa = algoritmo + estructuras de datos. Las características de estos tipos de lenguajes son las siguientes: *Procedimentales: En el sentido de que describen cómo se ha de resolver el problema y no qué problema es. *Deterministas: En el sentido de que se tienen siempre los mismos resultados del programa para las mismas entradas. *Necesitan de la existencia de un proceso que traduzca el código al lenguaje que entiende la computadora (lenguaje máquina). *Algorítmicos: Como ya se ha visto, expresan cómo resolver el problema mediante un algoritmo. Dentro de este grupo están los lenguajes Pascal, C, Basic, Cobol y Fortran. 1.3.3. Lenguajes de Programación Lógica Se definen los programas en función de un conjunto de reglas y asertos (afirmaciones). Para obtener resultados de un programa, se hacen preguntas a la computadora, y ésta, en función de las reglas y afirmaciones que tiene almacenadas, responde. 9
  10. 10. Un programa se compone de: programa= reglas + asertos + estructuras de datos + control. Las características de estos lenguajes son: *Se describe qué problema ha de resolverse, no cómo resolverlo. *Son lenguajes conversacionales, es decir, es como si la computadora fuera una persona a la que se le pregunta de acuerdo a un lenguaje de interrogación definido y responde con las conclusiones que obtiene. *Son lenguajes recursivos, la definición de las reglas generalmente se realiza, al igual que en los lenguajes funcionales, de forma recursiva. *Este tipo de lenguaje informático es muy utilizado en áreas como la inteligencia artificial, puesto que tratan de simular la forma de razonamiento humano. 1.3.4. Lenguajes de Programación Orientado a Objetos Se examina el universo del problema en términos de “entidades” y de relaciones entre esas “entidades”. Las entidades son representadas como objetos en el programa. El objetivo es tener una correspondencia entre entidades en el problema físico y objetos en el programa. Dentro de cada objeto está almacenada toda la información representativa del objeto (variables) y todas las operaciones que se pueden realizar con ese objeto (métodos o funciones). A esta particularidad se la denomina encapsulación de datos y funciones dentro de un objeto. Cuando se quiera ejecutar una función de un objeto, sólo se tendrá que hacer una llamada a esa función del objeto mediante el envío de un mensaje al objeto correspondiente, con el nombre de la función que se desee ejecutar. La última característica importante dentro de estos lenguajes es la herencia, concepto análogo de la biología. Se pueden declarar objetos que sean “hijo” de otro objeto, de manera que heredan todas las propiedades de su padre “padre”. Así, se define una jerarquía de herencias que ayudan a describir los problemas. Por tanto, un programa de este tipo puede expresarse como sigue: programa= objetos + mensajes. Las características de estos lenguajes son: a) Están orientados a reutilizar el software que desarrollan, con el fin de resultar más sencilla la modificación de los programas y, sobre todo, que sean útiles para ser utilizados completa o parcialmente a posteriori. 10
  11. 11. b) Son compilativos, es decir, precisan de un proceso de compilación para poder ser ejecutados. c) Son objetuales no procedimentales, es decir, se basan en los objetos y no en los procedimientos (algoritmos). En la actualidad está más difundido el lenguaje C++. Representación gráfica tipos de lenguajes de programación: 11
  12. 12. Lenguaje C Empezaremos nuestra práctica en lenguajes de programación utilizando el programa Turbo C, ya que pedagógicamente es el más simple y cumplirá el propósito que nos hemos planteado de aprender a utilizar correctamente los lenguajes de programación. Manual básico de Turbo C: CAPITULO 1.- INTRODUCCION 1.1 ESTRUCTURA DE UN PROGRAMA EN C 1.2 ARITMETICA Y VARIABLES 1.3 LA DECLARACION FOR 1.4 CONSTANTES SIMBOLICAS 1.5 UNA COLECCION DE PROGRAMAS UTILES - COPIANDO ARCHIVOS - CONTANDO CARACTERES - CONTANDO LINEAS - CONTANDO PALABRAS 1.6 ARREGLOS 1.7 FUNCIONES 1.8 ARGUMENTOS - LLAMADA POR VALORES 1.9 ARREGLOS DE CARACTERES 1.10 VARIABLES EXTERNAS 12
  13. 13. CAPITULO 2.- TIPOS DE OPERADORES Y EXPRESIONES 2.1 NOMBRES DE VARIABLES 2.2 TIPOS DE DATOS Y LARGOS 2.3 CONSTANTES 2.4 DECLARACIONES 2.5 OPERADORES ARITMETICOS 2.6 OPERADORES LOGICOS Y DE RELACION 2.7 TIPOS DE CONVERSION 2.8 OPERADORES DE INCREMENTO Y DECREMENTO 2.10 OPERADORES Y EXPRESIONES DE ASIGNAMIENTO 2.11 EXPRESIONES CONDICIONALES 2.12 PRECEDENCIA Y ORDEN DE EVALUACION CAPITULO 3.- CONTROL DE FLUJO 3.1 INSTRUCCIONES Y BLOCKS 3.2 IF - ELSE 3.3 ELSE - IF 3.4 SWITCH 3.5 CICLOS WHILE Y FOR 3.6 CICLOS DO-WHILE 3.7 BREAK 3.8 CONTINUE 3.9 GOTO'S Y LABELS CAPITULO 1 INTRODUCCION Comenzaremos con una rápida introducción al lenguaje C. Mostraremos algunos elementos esenciales del lenguaje en programas reales, pero sin caer en grandes detalles, reglas formales y excepciones. En este sentido no trataremos de ser completos o aun precisos. Deseamos en este sentido que Ud. adquiera estos elementos tan rápidamente como sea posible, y nos concentraremos en lo básico: variables y constantes aritméticas, control de flujo, funciones, y las viejas instrucciones de I/O. Así, en efecto, intencionalmente dejamos fuera de este CAPITULO características de C que son de vital importancia para escribir grandes programas. Esto incluye punteros, estructura; la mayoría de los lenguajes C son ricos en set de operadores, varias declaraciones de control de flujo, y también en innumerables detalles. 13
  14. 14. Estas desventajas son aproximadas del curso, lo mas notable es que la historia completa de un lenguaje característico en particular no es fundado en un único lugar. En cualquier caso, programadores experimentados pueden ser capaces de extrapolar desde el material de este CAPITULO hasta sus propias necesidades de programación. Los principiantes pueden reforzarse escribiendo programas cortos. 1.1 ESTRUCTURA DE UN PROGRAMA EN C El único camino para aprender un nuevo lenguaje de programación es escribiendo o programando en este, esta es la barrera básica, al superarla Ud. será capaz de crear sus propios programas texto en alguna parte, compilarlos sucesivamente, cargarlos y correrlos. Cabe hacer notar que esto dependerá del sistema en que Ud. trabaje. Como un primer ejemplo veamos el siguiente programa: main () { printf (" hola , Freddyn "); } En nuestro ejemplo main es como una función. Normalmente Ud. tendrá libertad para dar a cualquier función el nombre que guste, pero main es un nombre especial, sus programas comenzaran ejecutándose con la expresión main; esto significa que todo programa debe tener algún main en alguna parte. main usualmente invocara otras funciones para ejecutar esta tarea . Un método de comunicación de datos entre funciones, es por argumentos. El paréntesis seguido de un nombre de función rodea la lista de argumentos; aquí main es una función de argumentos, indicado por (). Las llaves encierran un conjunto de declaraciones. 14
  15. 15. La instrucción printf es una función de biblioteca que imprime la salida del terminal. Para imprimir una secuencia de caracteres deben ser encerradas entre comillas. Por el momento solo usaremos el de carácter string. La secuencia n en el string, es en C notación para indicar nueva línea (i.e.) después de escribir, el cursor avanza al margen izquierdo de la próxima línea; un printf nunca suministra una nueva línea automáticamente. El ejemplo anterior también puede ser escrito como: main () { printf ("hola, "); printf ("Freddy"); printf ("n"); } Para producir una salida idéntica. Note que n representa un solo carácter. Entre los varios otros escapes de secuencia, que C posee, están t para TAB, b para espacios en blanco, " para doble cremilla y para el backslash. 1.2 ARITMETICA Y VARIABLES El próximo programa imprime una tabla de temperatura Fahrenheit y su equivalencia a Celsius usando la fórmula: C = ( 5/9 )*( F-32 ) main () { int lower,upper,step; float fahr,celsius; lower = 0; upper = 300; step = 20; fahr = lower; while ( fahr <= upper ) { celsius = (5.0 / 9.0)*(fahr - 32.0); printf ("%4.0f %6.1fn",fahr,celsius); fahr = fahr + step ; } 15
  16. 16. } En C todas las variables deben ser declaradas antes de usar, para el comienzo de la función, antes de una declaración ejecutable. Una declaración consiste de una expresión y una lista de variables, como en: int lower , upper, step, float fahr, celsius; La declaración int indica que las variables son enteras; float representada por punto flotante, es decir números que pueden tener parte fraccionaria. La precisión de ambas depende de la máquina que esté usando. C entrega varias otras expresiones básicas además de int y float: char carácter - un solo byte short entero corto long entero largo double doble precisión de punto flotante En el programa de cálculo y conversión de temperatura empieza con los asignamientos: lower = 0; upper = 300; step = 20; fahr = lower; De esta manera se fijan las variables para sus valores iniciales. Cada declaración individual es terminada en punto y coma. Cada línea de la tabla es calculada de la misma manera, por tanto se una un loop que se repite una vez por línea; este es el propósito de la declaración while que es la misma que se usa en otros lenguajes. Recomendamos escribir solo una declaración por línea, y usualmente permitiendo blancos alrededor de los operadores; la posición de las llaves es muy importante. La temperatura en Celsius es calculada Y asignada a la variable celsius por la declaración: celsius = ( 5.0 / 9.0 ) * ( fahr - 32.0 ); La razón para usar 5.0 / 9.0 en lugar de la simple forma 5/9 es que en C como en muchos otros lenguajes, la división de enteros es truncada. 16
  17. 17. Un punto decimal en una constante indica que esta es de punto flotante, así es como 5.0 / 9.0 es 0,555.... Que es lo que se desea. También escribimos 32.0 en vez de 32, aunque sin embargo fahr es una variable float, 32 seria automáticamente convertido a float antes de la sustracción. Veamos ahora el asignamiento fahr = lower; y la pregunta while (fahr <= upper) Ambas palabras como es de esperar el int es convertido a float antes que la operación es hecha. La siguiente declaración muestra un trozo de como imprimir variables: printf("%4.0f %6.1fn"fahr,celsius); La especificación %4.0f quiere decir que un numero de punto flotante será imprimido en un espacio de ancho al menos de cuatro caracteres, con ningún dígito después del punto decimal, %6.1f describe otro numero que al menos ocupara 6 espacios para su parte entera, con un dígito después del punto decimal, analogo a los F6.1 de Fortran o el F(6.1) de PL/1. Parte de una especificación puede ser omitida : %6f quiere decir que el numero es escrito al menos en 6 caracteres de ancho; %.2f quiere decir 2 espacios después del punto decimal. La anchura no es forzada si escribimos meramente %f ya que esto quiere decir que el numero a imprimir es de punto flotante. printf también reconoce a %d para enteros, %x para hexadecimal, %c para caracteres, %s para string, y %% para %. En toda construcción de printf, % es el primer argumento y todos los demás deben ponerse en fila, propiamente por numero y expresión o Ud. obtendrá respuestas sin sentido. Cabe hacer notar que printf no es una instrucción propiamente del lenguaje C sino una función útil que es parte de las bibliotecas standares o subrutinas que son normalmente accesibles en programas C. 1.3 LA DECLARACION FOR Como Ud. podrá esperar, hay abundantes y diferentes maneras de escribir un programa; veamos una diferencia en el programa anterior: main() { 17
  18. 18. int fahr; for (fahr = 0; fahr <= 300; fahr = fahr + 20) printf ("%4d %6.1fn",fahr,(5.0 / 9.0)*(fahr - 32)); } Esto produce la misma respuesta, pero es ciertamente diferente. El mayor cambio es la eliminación de la mayoría de las variables; solo fahr permanece como un int. Los limites inferior, superior y el incremento aparecen solo como constantes en la declaración for. Así mismo se tiene una nueva construcción, y la expresión que calcula la temperatura en celsius aparece como un tercer argumento del printf en el lugar de ser una declaración separada. Este ultimo cambio es un ejemplo de una regla completamente general en C, en algn contexto esto es permisible para el uso de valores de alguna variable o de alguna expresión, se puede usar una expresión de cualquier tipo, ya que el tercer argumento es punto flotante para la pareja del %6.1f. El for es una generalización del while; nótese que las tres partes constantes están separadas por punto y coma. La forma del loop puede ser una sola declaración, o un grupo de declaraciones encerradas en paréntesis de llave. 1.4 CONSTANTES SIMBOLICAS Afortunadamente C nos provee una manera para evitar números mágicos, tales como 300 y 20. Con la construcción #define, en el comienzo de un programa puede definir un numero o constante simbólica. Después de esto el compilador sustituirá todo sin cotizar la ocurrencia de los nombres. Esto no es limitado para los números. #define LOWER 0 /* limite menor */ #define UPPER 300 /* limite superior */ #define STEP 20 /* incremento */ main() { int fahr; for (fahr = LOWER;fahr <= UPPER;fahr = fahr + STEP) printf ("%4d %6.1fn",fahr,(5.0/9.0)*(fahr-32)); } Las cantidades LOWER, UPPER y STEP son constantes, por lo tanto ellas no aparecen en declaraciones. 18
  19. 19. 1.5 UNA COLECCION DE PROGRAMAS UTILES Vamos ahora a considerar una serie de programas relacionados para hacer operaciones simples sobre datos de caracteres de I/O. La biblioteca standard esta provista de funciones para leer y escribir un carácter al mismo tiempo, getchar() va a buscar la próxima entrada del carácter al mismo tiempo que esta es llamada: c = getchar(); La variable c contiene el próximo carácter de entrada. Los caracteres normalmente vienen del terminal, La función putchar(c) es el complemento de getchar : putchar(c); Imprime el contenido de la variable c en algn medio de salida, usualmente en el terminal. Llamar al putchar y printf puede ser intercalado; la salida aparecerá en el orden que las llamadas son hechas. Como con printf, no hay nada acerca del getchar y putchar. Ellas no son parte del lenguaje C, pero son universalmente aprovechables. 1.6 ARREGLOS Escribiremos un programa para contar el numero de ocurrencias de cada dígito, espacios en blanco, y otros caracteres. Esto es artificial, pero nos permite usar varios aspectos de C en un programa. Hay doce categorías de input, es conveniente usar un arreglo para tener el numero de ocurrencias de cada dígito, en vez de usar diez variables individuales. Aquí esta una versión del programa: main () { int c,i,nwhite,nother; int ndigit[10]; nwhite = nother = 0; for (i = 0;i < 10;++i) ndigit[i] = 0; while ((c = getchar()) != EOF) if (c >= '0' && c <= '9') 19
  20. 20. ++ndigit[c-'0']; else if (c == ' ' || c == 'n' || c == 't') ++nwhite; else ++nother; printf ("dígitos = "); for ( i = 0; i < 10; ++i) printf ("%d ",ndigit[i]); printf ("n espacios en blanco = %d,otros = %dn", nwhite,nother); } La declaración int ndigit[10]; declara que el arreglo es de enteros. El arreglo siempre es subindicado en el comienzo por cero en C; por lo tanto los elementos son ndigit[0],..., ndigit[9]. Una subindicacion puede ser alguna expresión entera, que incluye variables enteras como i, y constantes enteras. Este programa hace un relieve importante en las propiedades de los caracteres en la representación de los dígitos. Por ejemplo, la pregunta if (c >= '0' && c <= '9') Determina si el carácter en c es un dígito. Si este lo es, el valor numérico de ese dígito es: c - '0' Esto trabaja solo si '0', '1', etc. son positivos en orden creciente si hay solo dígitos entre '0' y '9'. Afortunadamente esto es verdadero para todos los conjuntos de caracteres convencionales. Por definición, la aritmética envuelve a char's e int's convirtiendo todo en int antes de proceder, Así las variables char y constantes son escencialmente idénticas a int's en el contexto aritmético. Esto es bastante natural y conveniente; por ejemplo c - '0' es un entero con valor entre cero y nueve correspondiendo a los caracteres '0' y '9' almacenado en c, es así una subindicacion valida para el arreglo ndigit. La decisión referente a si un carácter es un dígito, un espacio en blanco, o algo mas es hecho por la secuencia if ( c >= '0' && c <= '9' ) ++ndigit[c-'0']; else if (c == ' ' || c == 'n' || c == 't') ++nwhite; 20
  21. 21. else ++nother; El modelo if (condición) instrucción else if ( condición) instrucción else instrucción Ocurre frecuentemente en programas como una forma de expresar una multidecision. El código es simplemente leído desde el tope hasta que alguna "condición" es satisfecha; hasta ese punto la correspondiente "instrucción" es ejecutada, y la construcción entera es finalizada. (La "instrucción" en curso pueden ser varias instrucciones encerradas en paréntesis.) Si ninguna de las condiciones es satisfecha, la "instrucción" después del else final es ejecutada si esta presente. Si el else final y "instrucción" son omitidos (como en el programa que cuenta palabras), la acción no toma lugar. Allí puede estar un numero arbitrario de else if (condición) instrucción Grupos entre el if inicial y el else final. Como un estilo de modelo, es aconsejable formatear esta construcción como hemos mostrado. 1.7 FUNCIONES En C una función es equivalente a una subrutina o función en Fortran, o una procedure en PL/1, Pascal, etc. Una función proporciona una manera conveniente para envasar algn calculo en una caja negra. Las funciones son realmente la nica manera de hacer frente a la potencial complejidad de grandes programas. Con funciones construidas en forma apropiada es posible ignorar "como" es hecha una tarea; sabiendo que esta hecho es suficiente. C esta hecho para servirse de funciones fáciles, convenientes y eficientes; Ud. vera a menudo llamar una función solo una vez en unas pocas líneas, justo porque esto clarifica alguna parte del código. Hasta ahora hemos usado funciones como printf, getchar y putchar que han sido proporionadas por nosotros; es tiempo de escribir unos pocos de nuestra propiedad. Ya que 21
  22. 22. C no tiene operador de exponenciacion parecido al ** de Fortran o PL/1, ilustraremos el mecanismo de esta función escribiendo la definición de una función power(m,n) que eleva un entero m a un entero positivo n. Así el valor power (2,5) es 32. Esta función ciertamente no hace todo el trabajo que hace ** ya que es manejable solo con powers positivos (n > 0) de enteros menores que 30, pero es mejor confundir un problema a la vez. Aquí esta la función power y un programa principal para ejercitarlo, así Ud. puede ver toda la estructura a la vez. main () { int i; for (i = 0; i < 10; ++i) printf ("%d %d %dn",i,power(2,i),power(-3,i)); } power (x,n) int x, n; { int i,p; p = 1; for (i = 1; i <= n; ++i) p = p * x; return (p); } 1.8 ARGUMENTOS - LLAMADA POR VALORES Un aspecto de las funciones en C pueden ser desconocidas para programadores que han usado otros lenguajes, particularmente Fortran y PL/1. En C, todo argumento de función es traspasado "por su valor". Esto significa que la función llamada tiene dados los valores de sus argumentos en variables temporales (actualmente en un stack) mas bien que sus direcciones. Esto conduce a algunas diferentes propiedades que son vistas con "llamada por referencia" con lenguajes como Fortran y PL/1, en que la rutina llamada es guiada a la direccion del argumento, no su valor. La distincion principal es que en C, la función llamada no puede alterar a una variable en la función llamada; esto puede alterar su privacidad, es una copia temporal. La llamada por valores, usualmente esta dirigida a programas mas compactos con menos variables externas, porque los argumentos pueden ser tratados como variables locales, convenientemente inicializadas en la rutina llamada. Por ejemplo, aquí esta una versión de power que hace uso de esta realidad. 22
  23. 23. power(x,n) /* eleva x a la enesima potencia; n>0, segunda versión */ int x,n; { int p; for (p = 1; n > 0; --n) p = p * x; return(p); } El argumento n es usado como una variable temporal, y es decrementado hasta que llega a ser cero; no hay un largo necesario para la variable i. Todo lo que es hecho para n dentro de power no tiene efecto en el argumento con que power fue originalmente llamado. Cuando es necesario, es posible arreglar una función para modificar una variable en una rutina de llamada. El que llama debe proporcionar la "direccion" de la variable a ser colocada (técnicamente un "puntero" para la variable), y la función llamada debe declarar el argumento que será un puntero y referencie indirectamente a traves de la variable actual. Cuando el nombre de un arreglo es usado como un argumento, el valor pasado a la función es actualmente la localizacion o direccion del comienzo del arreglo.(No hay copia de elementos del arreglo) Suscribiendonos a este valor, la función puede accesar y alterar algún elemento del arreglo. Este es el tópico de la próxima seccion. 1.9 ARREGLOS DE CARACTERES Probablemente el tipo de arreglo mas común en C es el de caracteres. Para ilustrar el uso de arreglo de caracteres, y funciones que manipularemos, escribamos un programa que lee un conjunto de líneas e imprime la mas larga. La estructura del programa es bastante simple : while ( hay otra línea?) if ( es mas largo que el anterior?) grabarla y su largo imprima largo y línea 23
  24. 24. Esta estructura divide el programa en partes. Una parte entrega una nueva línea, otra pregunta, otra graba, y el resto controla el proceso. De acuerdo con lo anterior escribiremos una función separada, getline para ir a buscar la próxima línea de entrada; esta es una generalización de getchar. Para que la función sea útil en otros contextos, probaremos tratando de hacerlo tan flexible como sea posible. En lo mínimo, getline tendrá que devolver una indicacion acerca del posible EOF; una utilidad mas general seria la construcción para devolver el largo de la línea o el cero si el EOF es encontrado. Cero nunca es una longitud valida para una línea, ya que toda línea tiene al menos un carácter; aun una línea conteniendo solo un newline tiene largo 1. Cuando encontramos una línea que es mas larga que las anteriores, esto debe ser guardado en alguna parte. Esto sugiere una segunda función, copy, para copiar la nueva línea en un lugar seguro. Finalmente, necesitaremos un programa principal para el control de getline y copy. Aquí esta el resultado. #define MAXLINE 1000 /* largo maximo de la línea de entrada */ main() /* encuentra la línea mas larga */ { int len; /* largo de la línea en curso */ int max; /* largo maximo visto hasta ahora */ char line [MAXLINE]; /* línea de entrada actual */ char save [MAXLINE]; /* línea mas larga, grabada */ max = 0; while ((len = getline(line, MAXLINE)) >0) if (len > max) { max = len ; copy (line,save); } if (max > 0) /* hubo una línea */ printf ("%s",save); } getline(s,lim) /* entrega la línea en s, devuelve el largo */ char [s]; int lim; { int c,i; 24
  25. 25. for (i=0;i<lim-1 && (c=getchar()) != EOF && c!='n';++i) s[i] = c; if (c == 'n') { s[i] = c; ++i; } s[i] ='0'; return(i); } copy(s1,s2) /* copia s1 en s2; asume s2 bastante grande */ char s1[], s2[]; { int i; i=0; while((s2[i] = s1[i]) != '0') ++i; } Main y getline se comunican a traves de un par de argumentos y un valor devuelto. En getline, los argumentos son declarados por las líneas char s ; int lim; Las cuales especifican que el primer argumento es un arreglo, y el segundo es un entero. La longitud del arreglo s no esta especificada en getline ya que esta determinada en main. getline usa return para enviar un valor de vuelta al llamado, justo como lo hizo la función power. Algunas funciones devuelven un valor til; otras como copy son solo usadas para sus efectos y no devuelven un valor. getline pone el carácter O (el carácter nulo cuyo valor es cero) para el fin del arreglo, para marcar el fin del string de caracteres. Esta convención es también usada por el compilador C : cuando un string constante parecido a "hellon" 25
  26. 26. Es escrito en un programa C, el compilador crea un arreglo de caracteres conteniendo los caracteres del string, y lo termina con 0 así esas funciones tales como printf pueden detectar el final. El formato de especificación %s en printf espera un string representado en esta forma. Si Ud. examina copy, descubrirá que esto también cuenta en realidad con que su argumento de entrada s1 está terminado por 0, y esto copia los caracteres en el argumento de salida s2.(Todo esto implica que 0 no es parte de un texto normal) Mencionamos de pasada que un programa tan chico como este presenta algunos problemas de construcción. Por ejemplo que debería hacer main si al encontrar una línea la cual es más grande que su límite? getline trabaja oportunamente, es decir detiene la recolección de caracteres cuando el arreglo está lleno, aun si el newline no ha sido visto. Preguntando por la longitud y el último carácter devuelto, main puede determinar cuando la línea fue demasiado larga. No hay manera de usar un getline para conocer el avance de cuan larga debe ser una línea de entrada, así getline es un obstáculo para overflow. 1.10 VARIABLES EXTERNAS Las variables en main (line, save, etc.) son privadas o locales a main; porque ellas son declaradas dentro del main, otras funciones no pueden tener acceso directo a ellas. Lo mismo ocurre con las variables en otras funciones; por ejemplo, la variable i en getline no esta relacionada con la i en copy. Cada una de las variables locales va dentro de una rutina solo cuando la función en existencia es llamada y desaparecera cuando la función es dejada de lado. Es por esta razón que tales variables son usualmente conocidas como variables automaticas, siguiendo la terminologia de otros lenguajes usaremos el término automatico de aquí en adelante para referirnos a estas variables locales dinamicas. Porque las variables automaticas van y vienen con la invocacion de una función, ellas no retienen sus valores desde una llamada a la próxima, y deben estar explicitamente sobre cada entrada de un set. Si ellas no están en un set, contendran basura. Como una alternativa para variables automaticas, es posible definir variables, que son externas para todas las funciones, esto es, variables globales que pueden ser accesadas por el nombre de alguna función.(Este mecanismo es semejante al Fortran common o al pl/1 external) Porque las variables externas son globalmente accesibles, pueden ser usadas en vez de listas de argumentos para comunicar datos entre funciones. Además porque las variables permanecen en existencia permanentemente, mas bien que apareciendo y desapareciendo mientras que las funciones son llamadas y dejadas de lado, ellas retienen sus valores aun después que el set de funciones es ejecutado. Una variable externa es definida fuera de una función. Las variables deben ser declaradas también en cada función que se desee accesar; esto puede ser hecho por una declaración explicita externa o implicita en el contexto. Para hacer mas concreta la discusion, nos 26
  27. 27. permitiremos reescribir el programa de las líneas mas largas con line, save y max como variables externas. Esto requiere cambiar los llamados, declaraciones, y cuerpos de las tres funciones. #define maxline 1000 /*largo maximo de entrada */ char line [MAXLINE]; /* línea de entrada */ char save [MAXLINE]; /* línea mas larga grabada aquí */ int max ; /* largo de la línea mas larga vista hasta aquí */ main () /* encuentra línea mas larga; versión { especializada */ int len; extern int max; extern char save[]; max = 0; while ((len = getline()) > 0) if (len > max) { max = len; copy(); } if (max > 0) /* aquí hubo una línea */ printf ("%s",save); } getline () /* versión especializada */ { int c,i; extern char line ; for (i=0; i < MAXLINE-1 && (c=getchar()) != EOF && c!='n';++i) line [i] = c; if ( c == 'n') { 27
  28. 28. line [i] = c; ++i; } line [i] = '0'; return(i); } copy() /* versión especializada */ { int i; extern char line[], save[]; i = 0; while ((save[i] = line[i]) != '0') ++i; } Las variables externas en main, getline y copy son definidas por las primeras líneas del ejemplo anterior. Sintácticamente, las definiciones externas son justamente semejantes a las declaraciones que hemos usado previamente, pero desde que ellas ocurren fuera de las funciones, las variables son externas. Antes una función puede usar una variable externa, el nombre de la variable debe ser conocida para la función. Una manera de hacer esto es escribir una declaración extern en la función; la declaración es la misma de antes, excepto por el agregado de extern. En ciertas circunstancias, la declaración extern puede ser omitida: si la definición externa de una variable ocurre en el archivo fuente antes de usarla en una función particular, entonces no hay necesidad de una declaración extern en la función. Las declaraciones extern en main, getline y copy son así redundantes. En efecto, en la práctica común es ubicar definiciones de todas las variables externas al comienzo del archivo fuente, y entonces omitir todas las declaraciones extern. Ud. debería notar que hemos usado cuidadosamente las palabras declaración y definición cuando nos referimos a variables externas en esta seccion. Definición se refiere al lugar donde la variable es actualmente creada o asignada a un almacen, declaración se refiere al lugar donde la naturaleza de la variable es declarada pero no almacenada. De esta forma, hay una tendencia para hacer todo con miras a una variable extern porque esto parece simplificar las comunicaciones ( las listas de argumentos son cortas y las variables están siempre ahi cuando Ud. las requiera. Pero las variables externas están siempre ahi aun cuando Ud. no las requiera). 28
  29. 29. CAPITULO 2 TIPOS DE OPERADORES Y EXPRESIONES Las variables y constantes son los datos objetos básicos manipulados en un programa. Las declaraciones listan las variables a usar, y declaran de que tipo seran ellas y quizas cual es su valor inicial. Los operadores especifican que es hecho por ellas. Las expresiones combinan variables y constantes para producir nuevos valores. 2.1 NOMBRES DE VARIABLES Hay algunas restricciones en los nombres de variables y constantes simbólicas. Los nombres son formados con letras y dígitos; el primer carácter debe ser una letra. El underscore (_) se cuenta como una letra, esto es útil para mejorar la calidad legible de largos nombres. Solo los primeros ocho caracteres de un nombre interno son significativos, aunque pueden utilizarse mas de ocho. Para nombres externos tales como nombres de funciones y variables externas, el número puede ser menor que ocho, porque los nombres externos son usados por diferentes assemblers y loaders. El apendice A lista los detalles. Además, las keywords como if, else, int, float, etc.,son reservadas, es decir, Ud. no las puede usar como nombre de variables. (A menos que se use el underscore entre las letras) Naturalmente es prudente elegir nombres de variables que signifiquen algo, que son relativas al propósito de la variable, y que son improbable de obtener una mezcla tipo gráfica. 2.2 TIPOS DE DATOS Y LARGOS Hay solo unos pocos tipos de datos básicos en C: char Un solo byte, capaz de retener un carácter en el set de caracteres local int Un entero, reflejando típicamente el largo natural de enteros en la máquina anfitriona. 29
  30. 30. float Punto flotante, simple precisión. double Punto flotante de doble precisión. En suma, hay un número de cualidades que pueden ser aplicadas a enteros: short, long y unsigned. Los números short y long se refieren a diferentes largos de enteros. Los números unsigned obedecen a la ley de aritmética modulo '2 elevado a n', donde n es el número de bits en un int; los números unsigned son siempre positivos. Las declaraciones para estos calificativos se asemejan a: short int x; long int y; unsigned int z; La palabra "int" puede ser omitida en tales situaciones. 2.3 CONSTANTES int y float son constantes que ya han sido dispuestas, excepto para notar que la usual 123.456e-7 o 0.12E3 notación cientifica para float es también legal. Cada constante de punto flotante es tomada para ser double, así la notación "e" sirve para ambos. Las constantes largas son escritas en el estilo 1326. Un entero constante común que es demasiado grande para encajar en un int es también tomado para ser un long. 2.4 DECLARACIONES Todas las variables deben ser declaradas antes de ser usadas, aunque ciertas declaraciones pueden ser hechas implicitamente en el contexto. Una declaración especifica un tipo y es seguida por una lista de una o mas variables de ese tipo, como en: int lower, upper, step; char c, line[1000]; Las variables pueden ser distribuidas entre varias declaraciones en cualquier forma; las listas de arriba son equivalentes a: int lower; int upper; int step; char c; char line[1000]; Esta forma toma mas espacio, pero es conveniente para agregar un comentario a cada declaración o para modificaciones subsecuentes. 30
  31. 31. Las variables pueden también ser inicializadas en su declaración, aunque hay algunas restricciones. Si el nombre es seguido por un signo igual y una constante que sirve como inicializador, como en: char backslash = ''; int i = 0; float eps = 1.0e-5; Si la variable en cuestión es externa o estática, la inicializaciones hecha solamente una vez, conceptualmente antes de que el programa comience sus ejecución. Explicitamente la inicialización automatica de variables es inicializada al momento que la función es llamada. Las variables automaticas para las cuales no hay inicializador explicito, tienen basura. Las variables externas y estaticas son inicializadas en cero por omisión, pero, de todos modos esto es un buen estilo para el estado de la inicialización. 2.5 OPERADORES ARITMETICOS Los operadores aritmeticos binarios son +, -, +, /, y el operador de modulos %. La división de enteros trunca alguna parte fraccional. La expresión x % y produce el resto cuando x es dividido por y, y así es cero cuando y divide exactamente a x . Por ejemplo, un "leap year" es divisible por 4 pero no por 100, excepto que "year" sea divisible por 400 son "leap years". Por lo tanto if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) es un año bisiesto else no lo es El operador % no puede ser aplicado a float o double. Los operadores + y - tienen la misma precedencia, la que es menor que la precedencia de *, /, y %, que son mas bajos que el unario -. El orden de evaluación no es especificado por asociatividad o conmutatividad de operadores como * y +; el compilador debe redistribuir un paréntesis que envuelve a uno de estos computos. Así a+(b+c) puede ser evaluado como (a+b)+c. Esto raramente hace alguna diferencia, pero si un orden particular es requerido deben explicitarse las variables temporales que deban ser usadas. 2.6 OPERADORES LOGICOS Y DE RELACION Los operadores de relación son: > >= < <= Todos ellos tienen la misma precedencia. Les siguen en precedencia los operadores de igualdad: == != los cuales tienen la misma precedencia. Estas relaciones tienen menor precedencia que los operadores aritmeticos, así, expresiones parecidas a i < lim-1 son tomadas como i < (lim-1), como debería ser esperado. Mas interesante son los conectores 31
  32. 32. logicos && y ||. Las expresiones conectadas por && o || son evaluadas de izquierda a derecha, y la evaluación detenida tan pronto como la verdad o falsedad del resultado es conocida. Estas propiedades criticas para la estructura de los programas en donde trabajan. Por ejemplo, este es un loop de la función getline que escribimos en el cap.1. for ( i=0; i<lim-1 && (c=getchar()) != 'n' && c != EOF; ++i) s[i] = c; Claramente, antes de leer un nuevo carácter es necesario chequear que hay un espacio para marcarlo en el arreglo s, así la pregunta i < lim-1 debe hacerse primero. No solo esto, pero si esta pregunta falla, no deberiamos ir a leer otro carácter. Similarmente, seria desafortunado si c fuera evaluado con EOF antes de que getchar fuera llamada: la llamada debe ocurrir antes de que el carácter en c sea evaluado. La precedencia de && es mayor que la de ||, y ambas son menores que los operadores de relación e igualdad, así expresiones como: i < lim-1 && ( c = getchar()) != 'n' && c != EOF no necesitan paréntesis extra. Pero ya que la precedencia de != es mayor que un asignamiento los paréntesis son necesarios en (c =getchar()) != 'n' para conseguir el resultado deseado. El operador de negación unario ! convierte un operando verdadero o no-cero, en un cero; y un operando falso o cero en 1. Se usa comunmente en construcciones como if (!inword) en vez de if (inword == 0) Es dificil generalizar acerca de cual forma es mejor. Construcciones mas complicadas que !inword pueden ser dificiles de entender. 2.7 TIPOS DE CONVERSION Cuando operandos de diferentes tipos aparecen en expresiones, son convertidos a un tipo común de acuerdo a un reducido número de reglas. En general, solo las conversiones que suceden automáticamente son aquellas que tienen sentido, tal como convertir un entero a float en una expresión como f + i. Las expresiones que no tienen sentido, como usar un float como un subindice, no son permitidas. Primero, char's e int's pueden ser libremente entremezclados en expresiones aritméticas: cada char en una expresión es automáticamente convertido a un int. Esto permite una considerable flexibilidad en cierta clase de caracteres. Una es ejemplificada por la función atoi, que convierte un string de dígitos a su equivalente numérico. atoi(s) /* convierte s a entero */ 32
  33. 33. char s[]; { int i,n; n = 0; for (i=0; s[i] >= '0' && s[i] <= '9'; ++i) n = 10 * n + s[i] - '0'; return(n); } Como ya vimos en el cap.1, la expresión s[i] - '0' da el valor numérico del carácter almacenado en s[i] porque los valores de '0', '1', etc., forman una secuencia de números positivos contiguos en orden creciente. Otro ejemplo de conversión de char a int es la función lower, que convierte letras mayusculas a minusculas solo para caracteres ASCII, si el carácter no es una letra mayuscula, lower devuelve el mismo carácter ingresado. lower(c) /* convierte c a minuscula; solo ASCII */ int c; { if (c >= 'A' && c <= 'Z') return(c + 'a' - 'A'); else return(c); } Hay un punto muy sutil acerca de la conversión de caracteres a enteros. El lenguaje no especifica si la variables de tipo char son cantidades indicadas o no indicadas. Cuando un char es convertido a un int, puede esto aún producir un entero negativo? Desafortunadamente, esto varía de máquina a máquina, reflejando diferencias en la arquitectura. En algunas mquinas (PDP-11, por ejemplo), un char cuyo bit de mas a la izquierda es 1 será convertido a un entero negativo ("flag de extension"). En otras, un carácter es promovido a un int por suma de ceros al final de la izquierda, y así es siempre positivo. La definición de C garantiza que cualquier carácter en las máquinas standards el set de caracteres nunca será negativo; así estos caracteres pueden ser usados libremente en expresiones como cantidades positivas. Pero arbitrariamente modelos de bit almacenados en caracteres variables pueden aparecer negativos en algunas máquinas, y positivos en otras. La ocurrencia mas común de esta situación es cuando el valor -1 es usado para EOF. Considerar el código: 33
  34. 34. char c; c = getchar(); if (c == EOF) En una máquina que no indica extensión, c es siempre positivo porque este es un char, sin embargo EOF es negativo. Como resultado, la pregunta siempre falla. Para evitar esto, hemos sido ciudadosos para usar int en lugar de char para alguna variable que espera un valor devuelto por getchar. La verdadera razón para usar int en lugar de char no esta relacionado con alguna pregunta de una posible indicación de extensión. Es simplemente que getchar debe devolver todos los caracteres posibles (así que esto puede ser usado para leer entradas arbitrarias) y, en suma, un valor distinto de EOF. Así este valor no puede ser representado como un char, pero debe en cambio ser almacenado como un int. 2.8 OPERADORES DE INCREMENTO Y DECREMENTO C provee dos inusuales operadores para incrementar y decrementar variables. El operador de incremento ++ suma su operando; el operador de decremento -- sustrae uno. Hemos usado frecuentemente ++ para incrementar variables, como en if (c == 'n') ++nl; El aspecto inusual es que ++ y -- pueden ser usados como operadores prefijos (antes de la variable, como en ++n), o sufijo (después de la variable : n++). En ambos casos el efecto es el incremento de n. Pero la expresión ++n incrementa n antes de usarse el valor, mientras que n++ incrementa n después que el valor ha sido usado. Esto significa que en un contexto donde el valor esta siendo usado, ++n y n++ son diferentes. Si n es 5, entonces x = n++; pone en x un 5, pero x = ++n; pone en x un 6. En ambos casos , n llega a ser 6. Los operadores de incremento y decremento pueden solo ser aplicados a variables; una expresión como x = (i+j)++ es ilegal. En un contexto donde el valor no es deseado, justo el efecto de incrementar, como en if (c == 'n') nl++; elegir prefijo o sufijo es cuestion de gusto. Pero hay situaciones donde una u otra es especificamente llamada. Por ejemplo, considerar la función squeeze(s,c) que traslada todas las ocurrencias del carácter c desde el string s. squeeze(s,c) /* borra todo c desde s */ char s[]; int c; { int i,j; for (i = j = 0; s[i] != '0'; i++) if (s[i] != c) s[j++] = s[i]; s[j] = '0'; } 34
  35. 35. Cada vez que ocurre un no-c, esto es copiado en la posición j actual, y solo entonces j es incrementado para que este listo para el próximo carácter. Esto es exactamente equivalente a: if (s[i] != c) { s[j] = s[i]; j++; } 2.9 OPERADORES LOGICOS BITWISE C provee un número de operadores para la manipulación de bit; estos no debe ser aplicados a float o double. & bitwise AND | bitwise OR inclusive ^ bitwise OR exclusive << cambio a la izquierda >> cambio a la derecha ~ complemento (unario) El operador & es usado frecuentemente para desmascarar algn set de bits; por ejemplo, c = n & 0177; pone todos en cero, pero los 7 bits de mas bajo orden de n. El operador bitwise | es usado para activar bits: x = x | MASK pone un uno en x los bits que están puestos en uno en MASK. Ud. debería distinguir cuidadosamente los operadores bitwise & y | de los conectivos logicos && y ||, que implican evaluación de derecha a izquierda de un valor verdadero. Por ejemplo, si x es 1 e y es 2, entonces x & y es cero mientras x&&y es uno. (porque?) los operadores shift << y >> ejecutan cambios de izquierda a derecha de su operando izquierdo el número de posiciones de bit dadas por el operando de la derecha. Así, x<<2 mueve x a la izquierda 2 posiciones, llenando los bits vacantes con 0; esto es equivalente a la multiplicación por 4. Corriendo a la derecha una cantidad unsigned llena los bits vacantes con 0. Corriendo a la derecha una cantidad indicada llenara con signos los bits ("shift aritmético") en algunas mquinas tales como el PDP-11, y con 0 bits ("shift logico") en otras. El operador binario ~ yields los complementos de un entero; esto es, convierte cada l-esimo bit a cero y viceversa. Este operador se usa típicamente en expresiones como x & ~077 que enmascara los ultimos 6 bits de x a cero. Note que x&~077 es independiente del largo de la palabra, es preferible así, por ejemplo x&0177700, asume que x es una cantidad de 16-bit. La forma mas fácil no involucra un costo extra, ya que ~077 es una expresión constante y es evaluada a tiempo compilado. 2.10 OPERADORES Y EXPRESIONES DE ASIGNAMIENTO Expresiones tales como: i=i+2 en que el lado izquierdo esta repetido en la derecha puede ser escrito en la forma resumida 35
  36. 36. i += 2 usando un operador de asignamiento como +=. Muchos operadores binarios tienen un correspondiente operador de asignamiento op=, donde op es uno de + - * / % << >> & ^ | Si e1 y e2 son expresiones, entonces e1 op= e2 es equivalente a e1 = (e1) op (e2) excepto que e1 es computado solo una vez. Notar el paréntesis alrededor de e2: x *= y + 1 es actualmente x = x * (y + 1) mas bien que x = x * y + 1 Como un ejemplo, la función bitcount cuenta el número de l-bit en su argumento de enteros. bitcount(n) /* cuenta l bits en n */ unsigned n; { int b; for (b = 0; n != 0 ; n >>= 1) if ( n & 01) b++; return(b); } 2.11 EXPRESIONES CONDICIONALES Las instrucciones if (a > b) z = a; else z = b; en curso calculan en z el máximo de a y b. La expresión condicional, escrita con el operador ternario ?:, provee una alternativa para escribir esto y construcciones similares. en la expresión e1 ? e2 : e3 la expresión e1 es evaluada primero. Si no es cero (verdadero), entonces la expresión e2 es evaluada, y ese es el valor de la expresión condicional. De otro modo e3 es evaluado, y ese es el valor. Solo una de e2 y e3 es evaluada. Así en z queda el maximo de a y b, 36
  37. 37. z = (a > b) ? a : b ; /* z = max(a,b) */ Debería notarse que la expresión condicional es en efecto una expresión, y esta puede ser usada justo como alguna otra expresión. Si e2 y e3 son de diferente tipo, el tipo del resultado es determinado por las reglas de conversión discutidas tempranamente en este CAPITULO. Por ejemplo, si f es un float, y n es un int, entonces la expresión (n > 0) ? f : n es de tipo double sin tomar en consideración si n es positivo o no. Los paréntesis no son necesarios alrededor de la primera expresión de una expresión condicional, ya que la precedencia de ?: es muy baja, justo el asignamiento anterior. Ellos son aconsejables de cualquier modo, ya que ellas hacen que en la expresión la condición sea fácil de ver. La expresión condicional frecuentemente dirige al código breve. Por ejemplo, este loop imprime n elementos de un arreglo, 10 por línea, con cada columna separada por un blanco, y con cada línea (incluyendo la última) terminada exactamente por un newline. for (i=0; i < n; i++) printf("%6d %c", a[i], (i%10==9 || i == n-1) ? 'n' : ' '); Un newline es impreso después de cada decimo elemento, y después del enesimo. Todos los otros elementos son seguidos por un blanco. Aunque esto debería parecer falso, es instructivo intentar escribir esto sin la expresión condicional. 2.12 PRECEDENCIA Y ORDEN DE EVALUACION La tabla de mas abajo hace un sumario de las reglas para precedencia y asociatividad de todos los operadores, incluyendo aquellos que no han sido aun discutidos. Los operadores en la misma línea tienen la misma precedencia; las filas están en orden de precedencia decreciente, así, por ejemplo, *, /, y % todos tiene la misma precedencia, que es mayor que la de + y -. Operador Asociatividad  () [] -> . izqu. a der. ! ++ -- -(tipo) * & sizeof der. a izqu. * / % izqu. a der. + - izqu. a der. << >> izqu. a der. < <= > >= izqu. a der. 37
  38. 38. == != izqu. a der. & izqu. a der. ^ izqu. a der. | izqu. a der. && izqu. a der. || izqu. a der. ?: der. a izqu. = += -= etc. der. a izqu. , (cap.3) izqu. a der. Á CAPITULO 3 CONTROL DE FLUJO Las instrucciones de control de un lenguaje específico es el orden en el que se hacen los cómputos. /*Rolando = Corima*/ 3.1 INSTRUCCIONES Y BLOCKS Una expresión tal como x=0, i++ o printf("...") llega a ser una instrucción cuando es seguida por un punto y coma, como en : x = 0; i++; printf("..."); En C, el punto y coma es el término de una instrucción más bien que un separador como en otros lenguajes. Las llaves { y } son usadas para grupos de declaraciones en instrucciones dentro de un block de instrucciones, así que ellas son equivalentes a una sola instrucción. Los paréntesis 38
  39. 39. que rodean las instrucciones de una función son un ejemplo obvio; paréntesis alrededor de múltiples instrucciones después de un if, else, while o for son otros. (Las variables pueden ser declaradas dentro de un block). Nunca hay un punto y coma después de la llave derecha que pone fin a un block. 3.2 IF – ELSE La instrucción if-else en C es usada para tomar decisiones. Formalmente, la sintaxis es: if (expresión) instruccion-1 else instruccion-2 donde el else es opcional. La "expresión" es evaluada; si es verdadera (si "expresión" tiene un valor no-cero), la instruccion-1 es ejecutada. Si es falsa (la expresión es cero) y si hay un else la instruccion-2 es efectuada al instante. Desde un if,simplemente se pregunta por el valor numérico de una expresión, lo más obvio es escribiendo: if (expresión) en lugar de if (expresión != 0) Algunas veces esto es natural y claro; en otras veces esto está escondido. Porque el else de un if-else es opcional, hay una ambiguedad cuando un else es omitido desde una secuencia de if anidado. Este es resuelto en la manera usual, por ejemplo en: if (n > 0) if (a > b) z = a; else z = b; 3.3 ELSE - IF La construcción: if (expresión) instrucción else if (expresión) instrucción 39
  40. 40. else if (expresión) instrucción else instrucción ocurre a menudo; es equivalente a una breve discusión separada. Esta secuencia de if's es la manera más general de escribir una multidecision. Las expresiones son evaluadas en orden, si alguna expresión es verdadera, la instrucción asociada con ella es ejecutada, y esta termina toda la cadena. El código para cada instrucción es una instrucción cualquiera, o un grupo de ellas entre llaves. El último else dirige el "ninguna de las anteriores", u omite el caso cuando ninguna de las otras condiciones fue satisfecha. Algunas veces no hay una acción explicita para la omisión; en ese caso else instrucción puede ser omitido, o puede ser usada para chequear un error o hallar una condición "imposible". Para ilustrar una decisión triple, hay una función de búsqueda binaria que decide si un particular valor de x se encuentra en el arreglo v, ordenado. Los elementos de v pueden estar en orden creciente. La función devuelve la posición (un numero entre 0 y n-1) si x se encuentra en v, y -1 si no. binary(x,v,n) /* encuentra x en v[0]...v[n-1] */ int x, v[], n; { int low, high, mid; low = 0; high = n-1; while (low <= high) { mid = (low + high ) / 2; if (x < v[mid]) high = mid +1; else if (x > v[mid]) low = mid +1; else /* encuentra la pareja */ return(mid); } return(-1); } La decisión fundamental es, si x es menor que, mayor que o igual al elemento central de v[mid] en cada incremento; esto es natural para else-if. 3.4 SWITCH 40
  41. 41. La instrucción switch es una multidecision especial, fabricante de preguntas, así una expresión que tiene un numero de expresiones constantes y bifurcaciones adecuadas. En el CAPITULO 1 escribimos un programa que contaba las ocurrencias de cada dígito, espacios en blanco y otros caracteres, usando una secuencia de if...else if... else. Aquí está el mismo programa con un switch. { int c,i,nwhite,nother,ndigit[10]; nwhite = nother = 0; for ( i= 0; i<10;i++) ndigit[i] = 0; while ((c = getchar()) != EOF) switch (c) { case '0' : case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' : ndigit[c - '0']++; break; case ' ' : case 'n' : case ' ' : nwhite ++; break; default : nother++; break; } printf ("dígitos = "); for (i = 0; i < 10; i++) printf ("%d",ndigit[i]); printf ("n espacios en blanco= %d, otros = %dn",nwhite,nother); } 41
  42. 42. Los switchs evalúan las expresiones enteras entre paréntesis (en este programa el carácter c) y compara su valor con todos los demás casos. Cada caso debe ser rotulado por un entero, carácter constante o expresión constante. Si un caso marca la expresión evaluada, la ejecucion parte desde ese caso. El caso rotulado default es ejecutado si ninguno de los otros casos es satisfecho. Un default es opcional; si este no esta alli, y ninguno de los casos aparejados, ninguna acción toma lugar. Los cases y default pueden suceder en algn orden. Los cases deben ser todos diferentes. La instrucción break provoca una inmediata salida desde el switch porque los cases sirven justamente como rotulos, después que el código para un caso es hecho, la ejecucion desciende al próximo a menos que Ud. tome acción explicita para escape. break y return son las maneras mas comunes para abandonar switchs. Una instrucción break también puede ser usada para forzar una salida inmediata de los ciclos while,for y do como será discutido mas tarde en este mismo CAPITULO. En el lado positivo permite múltiples casos para una simple acción, como son los blancos, TAB o newline, en este ejemplo. 3.5 CICLOS WHILE Y FOR Ya nos hemos encontrado con los ciclos while y for. En while (expresión) instrucción "expresión" es evaluada si es no-cero, la "instrucción" es ejecutada y "expresión" es reevaluada. El ciclo continua hasta que "expresión" llegue a ser cero, en lo que indica que la ejecución se reanuda después de "instrucción". La instrucción for for (exp1;exp2;exp3) instrucción es equivalente a exp1; while (exp2) { instrucción exp3; } Gramaticalmente, las tres componentes de un for son expresiones. Mas comunmente, exp1 y exp3 son asignaciones o función de llamadas y exp2 es una expresión relativa. Alguna de 42
  43. 43. las partes puede omitirse, aunque el punto y coma debe permanecer. Si la exp1 o exp3 es omitida, es sencillamente desprendida de la expansión. Si la pregunta, exp2 no está presente, es tomada como permanentemente verdadera, así for ( ;; ) { ... } es un loop infinito, presumiblemente será interrumpido por otros medios tal como un break o un return. Usar while o for es gran parte cuestión de gusto. Por ejemplo en while ((c = getchar ()) == ' ' || c == 'n' || c == 't') ; /* salta caracteres con espacio en blanco */ no hay inicializacion o reinicializacion, así el while parece mas natural. 3.6 CICLOS DO-WHILE El tercer loop en C, es el do-while, prueba el bottom después de hacer cada paso a través del cuerpo del loop; el cuerpo es siempre ejecutado una vez, la sintaxis es: do instrucción(es) while (expresión); "instrucción" es ejecutada, en seguida "expresión" es evaluada. Si es verdadera, "instrucción es evaluada nuevamente, si "expresión" es falsa, el loop termina. Como podria esperarse, do-while es mucho menos usado que while y for. 3.7 BREAK Algunas veces es conveniente ser capaz de controlar la salida de un loop, con otras instrucciones. La instrucción break proporciona una temprana salida del for, while y do, precisamente como desde el switch. Una instrucción break provoca la inmediata salida del loop mas interno. El siguiente programa remueve, arrastrando blancos y tabs desde el final de cada línea de entrada, usando un break para salir de un loop cuando el no-blanco, no-tab es encontrado mas a la derecha. 43
  44. 44. #define MAXLINE 1000 main () /* remueve arrastrando blancos y tabs */ { int n; char line[MAXLINE]; while (( n = getline(line,MAXLINE)) > 0) { while (--n >= 0) if (line[n] != ' ' && line[n] != 't' && line[n] != 'n') break; line[n+1] = '0'; printf("%sn",line) } } getline devuelve el largo de la línea. El while interno comienza en el último carácter de line, y examina al revés mirando al primer carácter que no es un blanco, TAB o newline. El loop es interrumpido cuando uno es encontrado, o cuando n es negativo (esto es, cuando la línea entera ha sido examinada). Ud. debería verificar que esto es correcto al proceder, cuando la línea contiene caracteres en blanco. Una alternativa para break es poner la condición en el loop mismo: while((n = getline(line, MAXLINE)) > 0) { while(--n >= 0 && (line[n] == ' ' || line[n] == 't' || line[n] == 'n')) ; ... } Esto es inferior a la versión previa, porque la pregunta es difícil de entender. Las preguntas que requieran una mezcla de &&, ||, ! o paréntesis deberían generalmente ser evitadas. 3.8 CONTINUE La instrucción continue esta relacionada con break, pero menos frecuentemente usada; provoca que la próxima iteracion del loop(for, while, do) comience. En el while y do, esto significa que la parte de la pregunta es ejecutada inmediatamente en el for, controla el paso 44
  45. 45. a la reinicializacion del step. (continue se aplica solo a loops, no a switch. Un continue interior a un switch, interior a un loop, provoca la próxima iteracion del loop). Como un ejemplo, este fragmento procesa solamente elementos positivos en el arreglo a; los valores negativos son saltados. for(i = 0;i < N;i++) { if( a[i] < 0) /* se salta los negativos */ continue; ... /* hace elementos positivos */ } La instrucción continue es usada frecuentemente cuando la parte del loop que sigue es complicada. 3.9 GOTO'S Y LABELS C proporciona la infinitamente til instrucción goto, y rotulos para bifurcaciones. Formalmente el goto nunca es necesario, y en la practica es siempre facil para escribir códigos sin el. Sugeririamos unas pocas situaciones donde los goto's tendrían lugar. El uso mas comn es el abandono del proceso en alguna estructura anidada profundamente, (tales como la ruptura de los loops a la vez). La instrucción break no puede ser usada directamente desde que deja solo el loop mas interno. Así : for (...) for (...) { ... if( desastre) goto error; } ... error : borrar – mensaje 45
  46. 46. Ejercicios resueltos: 1._ Imprima en pantalla su nombre utilizando un salto de línea para su apellido. #include <stdio.h> #include <conio.h> void main() { clrscr(); printf("Alexander"); printf("nAndrade"); getch(); } 2._ Imprima en pantalla: Hola Luis soy docente de física y matemática y tengo 30 anios utilizando asignación de constantes a Luis, docente, Física y Matemática y 30. #include <stdio.h> #include <conio.h> void main() { clrscr(); char* x="Luis"; char* y="docente"; char* z="Fisica y Matematica"; int w=30; printf("Hola %s ",x); printf("soy %s ",y); printf("de %s ",z); printf("y tengo %d ",w); printf("anios"); getch(); } 46
  47. 47. 2.1._ Imprima en pantalla: Hola Luis soy docente de física y matemática y tengo 30 anios utilizando asignación de variables para Luis, docente, Física y Matemática y 30. #include <stdio.h> #include <conio.h> void main() { clrscr(); char x,y,z; //int w; printf("Hola "); scanf("%s",&x); printf("soy "); scanf("%s",&y); printf("de "); scanf("%s",&z); printf("y tengo "); scanf("%d ",w); printf("anios"); getch(); } 3._ Ingrese su nombre dimensionando el número de caracteres a 5, su apellido dimensionando a 5 caracteres y su edad dimensionando a dos caracteres. #include <stdio.h> #include <conio.h> void main() { clrscr(); char y[5]; char z[5]; int x[2]; printf("Ingrese su nombren"); scanf("%s",&y); printf("Ingrese su apellidon"); scanf("%s",&z); printf("Ingrese su edadn"); scanf("%d",&x); 47
  48. 48. getch(); } 4._Ingrese un ciclo de repetición FOR para que se imprima 5 veces su nombre en pantalla. #include <conio.h> #include <stdio.h> void main() { clrscr(); int i; for(i=1;i<=5;i=i+1) { printf("Alexandern"); } getch(); } 5._ Utilice un ciclo de repetición FOR para que usted pueda ingresar un número 5 veces. #include <conio.h> #include <stdio.h> void main() { clrscr(); float a; int i; for(i=1;i<=5;i=i+1) { printf("nIngrese un numeron"); scanf("%f",&a); //printf("%f ",a); } 48
  49. 49. getch(); } 6._ Utilice un ciclo FOR para que se imprima en pantalla 10 veces el número 100 #include <conio.h> #include <stdio.h> void main() { clrscr(); int i; for(i=1;i<=10;i=i+1) { printf("100nn"); } getch(); } 7._ Utilice un ciclo de repetición FOR para que después de ingresar un número, dicho número se repita 8 veces. #include <conio.h> #include <stdio.h> void main() { clrscr(); float x; scanf("%f",&x); int i; for(i=1;i<=8;i=i+1) { 49
  50. 50. printf("%fn",x); } getch(); } 8._ Imprima en pantalla el número 7 y después de un salto de línea imprima su nombre utilizando asignación de constantes. #include <stdio.h> #include <conio.h> void main() { clrscr(); int x=7; printf("%dnn",x); char* y="Alexander"; printf("%s",y); getch(); } 9._ Realice un programa en el que el usuario ingrese dos números y me retorne el resultado de su suma (Suma de dos números). #include <conio.h> #include <stdio.h> void main() { clrscr(); float x,y,z; printf("Ingrese el primer numeron"); scanf("%f",&x); printf("ingrese el segundo numeron"); 50
  51. 51. scanf("%f",&y); z=x+y; printf("El resultado es ,%f",z); getch(); } 10._ Ingrese un número y retorne si el número es par o impar. #include <conio.h> #include <stdio.h> void main() { clrscr(); printf("Ingrese un numeron"); int x; scanf("%d",&x); if(x%2==0) { printf("El numero %d es par",x); } else { printf("El numero %d es impar",x); } getch(); } 11._ Ingrese un número y retorne si dicho número es mayor que cero. #include <conio.h> #include <stdio.h> void main() 51
  52. 52. { clrscr(); printf("Ingrese un numeron"); float x; scanf("%f",&x); if(x>0) { printf("El numero %f es mayor que 0",x); } getch(); } 12._ Realice un programa en el que usted pueda ingresar el nombre, apellido, cedula de identidad y materia de estudio de 5 estudiantes, utilice un ciclo de repetición FOR. #include <conio.h> #include <stdio.h> void main() { clrscr(); char name,apellido,materia; float ci; int i; for(i=1;i<=5;i=i+1) { printf("nIngrese la informacion del estudiante numero %dn",i); printf("Nombre: "); scanf("%s",&name); printf("Apellido: "); scanf("%s",&apellido); printf("Cedula de identidad: "); scanf("%f",&ci); printf("Materia: "); scanf("%s",&materia); } getch(); } 13._ Utilice un ciclo de repetición para que se imprima en pantalla su nombre 10 veces 52
  53. 53. #include <conio.h> #include <stdio.h> int main(void) { clrscr(); int a=1; while (a<10) { printf("Alexandern"); a++; } getch(); return 0; } 14._ Realice un menú en el cual se pueda escoger las opciones para obtener: el área de un rectángulo, triangulo, cuadrado, circulo. #include <conio.h> #include <stdio.h> int main() { clrscr(); int a; float x,y,z; printf("*************** MENU ***************n"); printf("Escoja la opcion que desee:nn"); printf("1._ Area de un rectangulon"); printf("2._ Area de un triangulon"); printf("3._ Area de un cuadradon"); printf("4._ Area de un circulon"); printf("************************************nn"); printf("Escoja la opcion deseada: "); scanf("%d",&a); switch(a) { 53
  54. 54. case 1: printf("nnIngrese la base del rectangulo: "); scanf("%f",&x); printf("nIngrese la altura del rectangulo: "); scanf("%f",&y); if(x<=0 || y<=0) { printf("nLas cantidades a ingresar para las areas deben ser positivas"); } else { z=x*y; printf("nEl area del rectangulo es: %.2f",z); } break; case 2: printf("nnIngrese la base del triangulo: "); scanf("%f",&x); printf("nIngrese la altura del triangulo: "); scanf("%f",&y); if(x<=0 || y<=0) { printf("nLas cantidades a ingresar para las areas deben ser positivas"); } else { z=x*y/2; printf("nEl area del triangulo es: %.2f",z); } break; case 3: printf("nnIngrese el lado del cuadrado: "); scanf("%f",&x); z=x*x; printf("nEl area del cuadrado es: %.2f",z); break; case 4: printf("nnIngrese el radio del circulo: "); 54
  55. 55. scanf("%f",&x); if(x<=0) { printf("nLas cantidades a ingresar para las areas deben ser positivas"); } else { z=x*x*3.14; printf("nEl area del circulo es: %.2f",z); } break; default: printf("nnERROR: Revise las opciones establecidas en el menu"); break; } getch(); return 0; } 15._ Realice un programa en el que el usuario ingrese tres calificaciones, el programa las promediará y nos dirá si el promedio aprueba, reprueba o queda a suspenso. #include <conio.h> #include <stdio.h> void main() { clrscr(); float x,y,z,w; printf("Ingrese la primera nota: "); scanf("%f",&x); printf("Ingrese la segunda nota: "); scanf("%f",&y); printf("Ingrese la tercera nota: "); scanf("%f",&z); if(x<=0 || y<=0 || z<=0) 55
  56. 56. { printf("nLas cantidades a ingresar para las calificaciones deben ser positivas"); } else { w=(x+y+z)/3; if(w<12) { printf("Reprueba"); } else //1 { if(12<=w & w<14) { printf("Suspenso"); } else //2 { if(14<=w) { printf("Aprueba"); } }//2 }//1 } getch(); } 16._ Realice un programa en el que se ingrese la edad de una persona y nos diga si es niño, adolescente, joven, adulto o anciano. #include <conio.h> #include <stdio.h> void main() { clrscr(); printf("Ingrese la edad de la personan"); 56
  57. 57. int x; scanf("%d",&x); if(x<=0) { printf("nLa persona no ha nacido aun (las edades deben ser mayores que cero)"); } else { if(x<=10) { printf("La persona es un ninio"); } else //1 { if(11<=x & x<=17) { printf("La persona es un adolecente"); } else //2 { if(18<=x & x<=26) { printf("La persona es un joven"); } else //3 { if(27<=x & x<60) { printf("La persona es un adulto"); } else //4 { if(x>=60) { printf("La persona es un anciano"); } }//4 }//3 }//2 }//1 } 57
  58. 58. getch(); } 17._ Realice un programa que reciba su edad y le indique si puede o no votar en las elecciones #include <conio.h> #include <stdio.h> void main() { clrscr(); printf("Ingrese su edad:n"); int x; scanf("%d",&x); if(x>=18) { printf("nPuede votar en las elecciones"); } else { printf("nNo puede votar en las elecciones"); } getch(); } 18._ Un programa en el que se ingresen 5 números y me retorne la suma de ellos. #include <conio.h> #include <stdio.h> void main() { clrscr(); int x,y,z,a,b,s; printf("Ingrese el primer numero:n"); 58
  59. 59. scanf("%d",&x); printf("Ingrese el segundo numero:n"); scanf("%d",&y); printf("Ingrese el tercer numero:n"); scanf("%d",&z); printf("Ingrese el cuarto numero:n"); scanf("%d",&a); printf("Ingrese el quinto numero:n"); scanf("%d",&b); s=x+y+z+a+b; printf("nEl resultado es %d",s); getch(); } 19._ Realice un programa en el que usted ingrese cuantos estudiantes son hombres y cuantos mujeres y nos retorne sus respectivos porcentajes #include <conio.h> #include <stdio.h> void main() { clrscr(); int h,m,s; int a,b; printf("Ingrese el numero de estudiantes que son hombres:n"); scanf("%d",&h); printf("Ingrese el numero de estudiantes que son mujeres:n"); scanf("%d",&m); s=h+m; a=h*100/s; b=m*100/s; printf("nEl porcentaje de hombres es: %d porciento aproximadamente",a); printf("nnEl porcentaje de mujeres es: %d porciento aproximadamente",b); 59
  60. 60. getch(); } 20._ Realice un programa que calcule el área de un triangulo #include <conio.h> #include <stdio.h> void main() { clrscr(); float b,h,a; printf("Ingrese la base del triangulo:n"); scanf("%f",&b); printf("Ingrese la altura del triangulo:n"); scanf("%f",&h); a=b*h/2; printf("nEl area del triangulo es: %f",a); getch(); } 21._ Ingrese un número y diga si dicho numero es múltiplo de 3. #include <conio.h> #include <stdio.h> void main() { clrscr(); printf("Ingrese un numero: "); int x; scanf("%d",&x); if(x%3==0) { 60
  61. 61. printf("nnEl numero %d es multiplo de 3",x); } else { printf("nnEl numero %d no es multiplo de 3",x); } getch(); } 22._ Ingrese un número y diga a que mes del año pertenece. #include <conio.h> #include <stdio.h> int main() { clrscr(); int x=1; printf("Escoja un numero entero del 1 al 12:n"); scanf("%d",&x); switch (x) { case 1: printf("Enero"); break; case 2: printf("Febrero"); break; case 3: printf("Marzo"); break; case 4: printf("Abril"); break; 61
  62. 62. case 5: printf("Mayo"); break; case 6: printf("Junio"); break; case 7: printf("Julio"); break; case 8: printf("Agosto"); break; case 9: printf("Septiembre"); break; case 10: printf("Octubre"); break; case 11: printf("Noviembre"); break; case 12: printf("Diciembre"); break; default: printf("ERROR: (Escoja un numero entero del 1 al 12)"); break; } getch(); return 0; } 62
  63. 63. 23._ Realice un programa en el que usted presione 1 si quiere sumar dos números y presione dos si quiere restarlos. #include <conio.h> #include <stdio.h> int main() { clrscr(); int x,y,a,b; printf("*Presione 1 si quiere sumar dos numerosn*Presione 2 si quiere restar dos numerosn"); scanf("%d",&a); switch(a) { case 1: printf("Ingrese el primer numero: "); scanf("%d",&x); printf("Ingrese el segundo numero: "); scanf("%d",&y); b=x+y; printf("nEl resultado es: %d",b); break; case 2: printf("Ingrese el primer numero: "); scanf("%d",&x); printf("Ingrese el segundo numero: "); scanf("%d",&y); b=x-y; printf("nEl resultado es: %d",b); break; default: printf("ERROR: (Solo puede escoger la opcion 1 o la opcion 2)"); break; } 63
  64. 64. getch(); return 0; } 24._ Realice un menú en el que usted pueda escoger entre hallar el área de un triángulo o realizar la suma de 5 números #include <conio.h> #include <stdio.h> int main() { clrscr(); int x,y,a,b,c,d,e; printf("************************************n"); printf("Escoja la opcion que desee:nn"); printf("1._ Hallar el area de un triangulon"); printf("2._ Realizar la suma de 5 numerosn"); printf("3._ Salirn"); printf("************************************nn"); scanf("%d",&a); switch(a) { case 1: printf("nIngrese la base del triangulo: "); scanf("%d",&x); printf("Ingrese la altura del triangulo: "); scanf("%d",&y); b=x*y/2; printf("nEl area del triangulo es: %d",b); break; case 2: printf("nIngrese el primer numero: "); scanf("%d",&x); printf("Ingrese el segundo numero: "); scanf("%d",&y); printf("Ingrese el tercer numero: "); 64
  65. 65. scanf("%d",&c); printf("Ingrese el cuarto numero: "); scanf("%d",&d); printf("Ingrese el quinto numero: "); scanf("%d",&e); b=x+y+c+d+e; printf("nEl resultado es: %d",b); break; case 3: break; default: printf("ERROR: Revise las opciones establecidas en el menu"); break; } getch(); return 0; } 25._ Realice un programa en que usted ingrese un número del 1 al 12 y le devuelva cuantos días tiene el correspondiente mes. #include <conio.h> #include <stdio.h> int main() { clrscr(); int x; printf("Escoja un numero entero del 1 al 12 si se saben"); printf("que cada numero representa lo siguiente:n"); printf("**********************************************n"); printf(" 1=Eneron"); printf(" 2=Febreron"); printf(" 3=Marzon"); printf(" 4=Abriln"); 65
  66. 66. printf(" 5=Mayon"); printf(" 6=Junion"); printf(" 7=Julion"); printf(" 8=Agoston"); printf(" 9=Septiembren"); printf(" 10=Octubren"); printf(" 11=Noviembren"); printf(" 12=Diciembren"); printf("**********************************************n"); printf("nEl programa le devolvera el numero de dias quen"); printf("tiene cada mes segun la opcion que escojan"); printf("nnEscoja una opcion: "); scanf("%d",&x); switch (x) { case 1: printf("nEnero tiene 31 dias"); break; case 2: printf("nFebrero tiene 28 dias"); break; case 3: printf("nMarzo tiene 31 dias"); break; case 4: printf("nAbril tiene 30 dias"); break; case 5: printf("nMayo tiene 31 dias"); break; case 6: printf("nJunio tiene 30 dias"); break; case 7: 66
  67. 67. printf("nJulio tiene 31 dias"); break; case 8: printf("nAgosto tiene 31 dias"); break; case 9: printf("nSeptiembre tiene 30 dias"); break; case 10: printf("nOctubre tiene 31 dias"); break; case 11: printf("nNoviembre tiene 30 dias"); break; case 12: printf("nDiciembre tiene 31 dias"); break; default: printf("nERROR: (Escoja un numero entero del 1 al 12)"); break; } getch(); return 0; } 26._ Realice un programa en el que si usted ingresa la opción 1 se imprime de la A a la I y si ingresa la opción 2 se imprime desde el 1 hasta el 9. #include <conio.h> #include <stdio.h> int main() { clrscr(); 67
  68. 68. int a; printf("*Presione 1 para letrasn*Presione 2 para numerosnnIngrese la opcion deseada: "); scanf("%d",&a); switch(a) //scanf("%d",&a); { case 1: printf("A,B,C,D,E,F,G,H,I"); break; case 2: printf("1,2,3,4,5,6,7,8,9"); break; default: printf("ERROR: (Solo puede escoger la opcion 1 o la opcion 2)"); break; } getch(); return 0; } 27._ Realice un menú en el que usted pueda escoger entre las opciones de suma, resta, multiplicación y división de dos números. #include <conio.h> #include <stdio.h> int main() { clrscr(); int a; float x,y,z; printf("*************** MENU ***************n"); printf("Escoja la opcion que desee:nn"); printf("1._ Suman"); 68
  69. 69. printf("2._ Restan"); printf("3._ Multiplicacionn"); printf("4._ Divisionn"); printf("************************************nn"); printf("Escoja la opcion deseada: "); scanf("%d",&a); switch(a) { case 1: printf("nnIngrese el primer numero: "); scanf("%f",&x); printf("nIngrese el segundo numero: "); scanf("%f",&y); z=x+y; printf("nEl resultado es: %.2f",z); break; case 2: printf("nnIngrese el primer numero: "); scanf("%f",&x); printf("nIngrese el segundo numero: "); scanf("%f",&y); z=x-y; printf("nEl resultado es: %.2f",z); break; case 3: printf("nnIngrese el primer numero: "); scanf("%f",&x); printf("nIngrese el segundo numero: "); scanf("%f",&y); z=x*y; printf("nEl resultado es: %.2f",z); break; case 4: printf("nnIngrese el primer numero: "); scanf("%f",&x); printf("nIngrese el segundo numero: "); scanf("%f",&y); 69
  70. 70. z=x/y; printf("nEl resultado es: %.2f",z); break; default: printf("nnERROR: Revise las opciones establecidas en el menu"); break; } getch(); return 0; } 28._ Realice un programa en el que usted ingrese números del 1 al 7 y se imprima a que día de la semana le corresponde cada número #include <conio.h> #include <stdio.h> int main() { clrscr(); int x=1; printf("Escoja un numero entero del 1 al 7:n"); scanf("%d",&x); switch (x) { case 1: printf("Lunes"); break; case 2: printf("Martes"); break; case 3: printf("Miercoles"); break; 70
  71. 71. case 4: printf("Jueves"); break; case 5: printf("Viernes"); break; case 6: printf("Sabado"); break; case 7: printf("Domingo"); break; default: printf("nERROR: (Escoja un numero entero del 1 al 7)"); break; } getch(); return 0; } 29._ Realice un menú en el que las opciones sean las siguientes: 1._ Área de un cuadrado 2._ El mayor de cuatro números 3._ Conversión de centímetros a pulgadas 4._ Tabla de multiplicar 5._ Área de una circunferencia 6._ Perímetro de un rectángulo #include <conio.h> #include <stdio.h> int main() { 71
  72. 72. clrscr(); int a; printf("***************** MENU *****************n"); printf("Escoja la opcion que desee:nn"); printf("1._ Area de un cuadradon"); printf("2._ El mayor de cuatro numerosn"); printf("3._ Conversion de centimetros a pulgadasn"); printf("4._ Tabla de multiplicarn"); printf("5._ Area de una circunferencian"); printf("6._ Perimetro de un rectangulon"); printf("****************************************nn"); printf("Escoja la opcion deseada: "); scanf("%d",&a); switch(a) { case 1://Area de un cuadrado float a,b,c; printf("nnIngrese la medida de un lado del cuadrado: "); scanf("%f",&a); c=a*a; printf("nEl resultado es: %.2f",c); break; case 2://Mayor de 4 numeros int x,y,z,w; printf("nIngrese cuatro numeros diferentes:nn"); printf("Ingrese el primer numeron"); scanf("%d",&x); printf("Ingrese el segundo numeron"); scanf("%d",&y); printf("Ingrese el tercer numeron"); scanf("%d",&z); printf("Ingrese el cuarto numeron"); scanf("%d",&w); if(x>y) { 72
  73. 73. if(x>z) { if(x>w) { printf("nEl mayor de los 4 numeros es %d",x); } else //si w>x>z>y { printf("nEl mayor de los 4 numeros es %d",w); } } else //si z>x>y { if(z>w) { printf("nEl mayor de los 4 numeros es %d",z); } } } else { if(y>z) { if(y>w) { printf("nEl mayor de los 4 numeros es %d",y); } else { printf("nEl mayor de los 4 numeros es %d",w); } } else { if(z<w) { printf("nEl mayor de los 4 numeros es %d",w); } } } //fin 73
  74. 74. break; case 3://De cm a pulgada float d,e; printf("nnIngrese una cantidad en cm: "); scanf("%f",&d); e=d*2.5; printf("nEl resultado es: %.2f",e); break; case 4://Tabla de multiplicar int c=0; for(c=1;c<=10;c++) { printf("2 x %d = %dn",c,2*c); } break; case 5://Area de una circunferencia float f,g; printf("nnIngrese el radio de la circunferencia: "); scanf("%f",&f); g=f*f*3.14; printf("nEl area de la circunferencia es: %.2f",g); break; case 6://Perimetro de un rectangulo float h,i,j; printf("nnIngrese la base del rectangulo: "); scanf("%f",&h); printf("nIngrese la altura del rectangulo: "); scanf("%f",&i); j=2*(h+i); printf("nEl resultado es: %.2f",j); break; default: printf("nnERROR: Revise las opciones establecidas en el menu"); break; } 74
  75. 75. getch(); return 0; } Conclusiones: Programación es imprescindible en la formación de cualquier profesional ya que en cualquier plaza de trabajo una persona se desenvuelve en el ámbito informático, he ahí la importancia de este tema, imaginen un ingeniero que cuente con esta importante herramienta, de seguro será tomado en cuenta por encima de los demás. Al saber programar se puede enfocar, direccionar estos conocimientos al área en la que usted sea experto, creando programas útiles para su labor, esta es una de las ventajas con las que cuenta este aprendizaje. Recomendaciones: Se recomienda a los que no tengan mucha experiencia en programación, empezar con un lenguaje de programación básico en el que se pueda aprender principalmente la organización (estructura) y los comandos (sintaxis), esta es la razón por la cual en este documento se les presenta un pequeño manual de Turbo C que es un lenguaje de programación básico, para que después de entender el concepto, usted pueda usar otros lenguajes más completos como Java o C++. Bibliografía: http://es.wikipedia.org/wiki/Historia_de_los_lenguajes_de_programaci%C3%B3n#Tendencias_actuale s http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n 75

×