3. Lenguaje de Programación C 3.1. Lenguajes de Programación: Definición y Características. 3.2. Anatomía de un Programa en C. 3.3. Variables y Constantes. 3.4. Tipos de Datos Básicos en C. 3.5. Operadores Básicos en C. 3.6. Sentencias de Entrada y Salida. 3.7. Estructuras de Control. 3.7.1. Iteración. 3.7.2. Selección 3.8. Tipos de Datos Construidos. Dennis Ritchie de AT&T Bell Laboratories inventó e implementó el primer C en un DEC PDP-11 que usaba el sistema Operativo UNIX. El Lenguaje C es el resultado de un proceso de desarrollo de un lenguaje llamado BCLP. Dicho lenguaje fue desarrollado en 1967 por Martin Richards con la idea de escribir software y compiladores en lenguaje ensamblador. A su vez el BCLP influyo en un lenguaje llamado B que invento Ken Thompson en 1970, este lenguaje surge para crear las primeras versiones del sistema operativo UNIX y se instalo en una máquina PDP-7, por los laboratorios BELL. C surge de la necesidad de re-escribir el UNIX en un lenguaje de alto nivel, pero que algunos procedimientos se manejaran a nivel ensamblador, es entonces cuando se comienza a desarrollar un lenguaje que solucionara dicho problema. C es un lenguaje de aplicación general que sirve para escribir cualquier tipo de programa, pero su éxito y popularidad están íntimamente ligados al sistema operativo UNIX. Si se quiere dar mantenimiento a un sistema UNIX, es preciso emplear C. C y UNIX se acoplaron tan bien que pronto no sólo los programas de sistemas, sino casi todos los programas comerciales que se ejecutaban bajo UNIX se escribieron en C. Este lenguaje se volvió tan popular que se escribieron versiones de él para otros sistemas operativos populares, así que su uso no está limitado a las computadoras que utilizan UNIX. Características del lenguaje C. • C es conocido como un lenguaje de nivel medio. Nivel medio no tiene propiamente un significado negativo, no significa que C sea menos poderoso, manejable o menos desarrollado que un lenguaje de alto nivel, tampoco implica que C es similar a un lenguaje ensamblador con sus problemas asociados. Se considera a C un lenguaje de nivel medio, ya que combina elementos de lenguajes de alto nivel con la funcionalidad y potencialidad del ensamblador. El sistema operativo UNIX se inició en una DEC PDP-7, en los Laboratorios Bell durante 1969. En 1973, Ritchie y Thompson re-escribieron el kernel (núcleo) de UNIX en C, rompiendo así con la tradición de que el software de sistemas está escrito en lenguaje ensamblador. Hacia 1974 fue introducido en las universidades "con fines educacionales" y al cabo de pocos años estaba ya disponible para uso comercial. El UNIX es un sistema portable (se ejecutan en una extensa variedad de computadoras), flexible, potente, con entorno programable, multiusuario y multitarea
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
��������������� �� ��� ��������������� ���
���������������� ����� � �� �
3. Lenguaje de Programación C
3.1. Lenguajes de Programación: Definición y Características.
3.2. Anatomía de un Programa en C.
3.3. Variables y Constantes.
3.4. Tipos de Datos Básicos en C.
3.5. Operadores Básicos en C.
3.6. Sentencias de Entrada y Salida.
3.7. Estructuras de Control.
3.7.1. Iteración.
3.7.2. Selección
3.8. Tipos de Datos Construidos.
Dennis Ritchie de AT&T Bell Laboratories inventó e implementó el primer C en un DEC PDP-11 que usaba el sistema
Operativo UNIX. El Lenguaje C es el resultado de un proceso de desarrollo de un lenguaje llamado BCLP. Dicho lenguaje
fue desarrollado en 1967 por Martin Richards con la idea de escribir software y compiladores en lenguaje ensamblador. A su
vez el BCLP influyo en un lenguaje llamado B que invento Ken Thompson en 1970, este lenguaje surge para crear las
primeras versiones del sistema operativo UNIX y se instalo en una máquina PDP-7, por los laboratorios BELL.
C surge de la necesidad de re-escribir el UNIX en un lenguaje de alto nivel, pero que algunos procedimientos se
manejaran a nivel ensamblador, es entonces cuando se comienza a desarrollar un lenguaje que solucionara dicho problema.
C es un lenguaje de aplicación general que sirve para escribir cualquier tipo de programa, pero su éxito y popularidad
están íntimamente ligados al sistema operativo UNIX. Si se quiere dar mantenimiento a un sistema UNIX, es preciso emplear
C.
C y UNIX se acoplaron tan bien que pronto no sólo los programas de sistemas, sino casi todos los programas
comerciales que se ejecutaban bajo UNIX se escribieron en C. Este lenguaje se volvió tan popular que se escribieron
versiones de él para otros sistemas operativos populares, así que su uso no está limitado a las computadoras que utilizan
UNIX.
Características del lenguaje C.
• C es conocido como un lenguaje de nivel medio.
Nivel medio no tiene propiamente un significado negativo, no significa que C sea menos poderoso, manejable o
menos desarrollado que un lenguaje de alto nivel, tampoco implica que C es similar a un lenguaje ensamblador con
sus problemas asociados. Se considera a C un lenguaje de nivel medio, ya que combina elementos de lenguajes de
alto nivel con la funcionalidad y potencialidad del ensamblador.
El sistema operativo UNIX se inició en una DEC PDP-7, en los Laboratorios Bell durante 1969. En 1973, Ritchie y Thompson re-escribieron el kernel (núcleo) de UNIX en C, rompiendo así con la tradición de que el software de sistemas está escrito en lenguaje ensamblador. Hacia 1974 fue introducido en las universidades "con fines educacionales" y al cabo de pocos años estaba ya disponible para uso comercial. El UNIX es un sistema portable (se ejecutan en una extensa variedad de computadoras), flexible, potente, con entorno programable, multiusuario y multitarea
��������������� �� ��� ��������������� ���
���������������� ����� � �� �
Lenguajes de Alto nivel Lenguajes de Nivel Medio Lenguajes de Bajo nivel
Ada C Macro-assembler
Modula-2 Forth Assembler
Pascal
COBOL
FORTRAN
BASIC
• El código C es muy transportable.
Esto quiere decir que se puede adaptar el software escrito para un tipo de computadora a otro tipo.
• Esta basado en funciones.
• Trabaja directo con bits, bytes y direcciones de memoria.
• Es un lenguaje diseñado por programadores para programadores.
Da al programador lo que el programador quiere: pocas restricciones, pocas quejas, código rápido y eficacia.
• C es un compilador, (BASIC es un interprete). Intérprete: Lee el código fuente de su programa de línea en línea y realiza las instrucciones específicas que están en esa línea.
Compilador: Lee el programa entero y entonces lo convierte en código objeto, que es una traducción del código fuente, de forma que el compilador puede
ejecutarlo directamente.
• Maneja una biblioteca estándar.
Dicha biblioteca esta formada por un conjunto de archivos donde cada archivo esta formado por un grupo de
funciones y/o procedimientos que permiten resolver problemas en forma rápida y eficiente.
• Define seis etapas para ejecutar un programa:
�� Etapa de Edición.
�� Etapa de pre-procesamiento.
�� Etapa de compilación.
�� Etapa de encadenamiento.
�� Etapa de carga.
�� Etapa de ejecución.
ANSI C estándar.
En 1978 Prentice Hall publica el libro “The C Programming” dando a conocer dicho lenguaje. Con la popularidad
creciente de las microcomputadoras, se crearon muchas implementaciones nuevas. En lo que se podría llamar un milagro, la
mayoría de estas implementaciones eran altamente compatibles entre sí a nivel de código fuente. Sin embargo, como no
existía un estándar, siempre había algunas discrepancias. Al principio del verano de 1983 se estableció un comité para
encargarse de esta situación. Este comité comenzó a trabajar en un estándar ANSI que definiría el lenguaje C.
En 1989 fue aprobado el lenguaje estándar de C, llamado ANSI C. El estándar fue dado a conocer en Estados Unidos
por el organismo ANSI y a nivel mundial por la organización ISO.
��������������� �� ��� ��������������� ���
���������������� ����� � �� �
El estándar ANSI C es un superconjunto del estándar UNIX, los programadores que migren de un compilador basado en
UNIX a uno con estándar ANSI encontrarán todas las características que habían usado.
Palabras clave de C.
Existe una clase especial de identificadores, llamados palabras clave o palabras reservadas, que en C y C++ tienen un
significado predefinido y que no podemos emplear como nombres de variables ni de ninguna otra cosa.
Palabras Clave C
auto do goto short typedef
break double if signed union
case else int sizeof unsigned
char enum long static void
const extern register struct volatile
continue float return switch while
default for
Identificadores: se usan como nombres de variables y otros elementos de un programa en C++. Un identificador debe comenzar con una letra o bien con el símbolo de subrayado, y los demás caracteres deben ser letras, dígitos o el símbolo de subrayado. Tomar en cuenta que estos deben ser mnemónicos. Anatomía de un programa en C.
Un programa en C se compone de una o más funciones. Una de las funciones debe ser obligatoriamente main. Una
función es un grupo de instrucciones o sentencias que realizan una o más acciones. Así mismo, un programa contendrá una
serie de directivas #include que permitirán incluir en el mismo archivos de cabecera que, a su vez constarán de funciones y
datos predefinidos en ellos.
Formato general:
/* Comentarios */ #include archivo /*directivas del preprocesador */ #define /*macros del preprocesador*/ Declaración de variables globales Declaración de funciones main() { declaración de variables locales secuencia de sentencias o cuerpo del main return 0; } funcion1() { }
��������������� �� ��� ��������������� ���
���������������� ����� � �� �
/* */
Encierran los comentarios de lo que el programa realiza, se pueden utilizar en cualquier parte del mismo. Es muy importante
ir documentado cada uno de los pasos del programa y sobre todo al inicio indicar que es lo que realiza así como su autor.
Estos símbolos representan comentarios tanto en C como en C++. En C++ también podemos utilizar // para indicar un
comentario pero el mismo terminara al final de la línea. Con /* y */ nos podemos extender por varias líneas.
Directivas:
El pre-procesador de C maneja las siguientes directivas:
#if , #else, #elif, #endif
Permiten compilar porciones del código fuente del programa selectivamente. Tienen la misma función que el if, else, endif
tradicional.
#ifdef, #ifndef
Método de compilación condicional que significa <<si definido>> y <<si no definido>> respectivamente.
#include
Instruye al compilador para incluir otro archivo fuente. El archivo debe encerrase entre paréntesis de ángulo o entre comillas
dobles. Ejemplo:
#include <stdio.h>
#define
Se usa para definir un identificador y una cadena que el compilador sustituirá por el identificador cada vez que se encuentren
en el archivo fuente. Dicha sustitución puede ser por un valor simple o por algo tan elaborado como el cuerpo de una función.
Al identificador se le llama MACRO y al proceso de reemplazamiento se le llama SUSTITUCION DE LA MACRO.
Ejemplo: #define TRUE 1
Esto provocara que el compilador sustituya 1 cada que encuentre TRUE
#undef
Se usa para quitar una definición del nombre de macro que sigue y que se hizo antes.
#line
Se usa para cambiar los contenidos de _ _LINE_ _ y _ _FILE_ _, que son identificadores predefinidos.
#error
Fuerza al compilador a parar la compilación cuando se encuentra.
#pragma
��������������� �� ��� ��������������� ���
���������������� ����� � �� �
Es una directiva definida por la implementación que permite dar diversas instrucciones, definidas por el creador del
compilador, al compilador.
Declaración de Variables Globales y Funciones:
Representa la parte declarativa del programa. Las variables declaradas en esta parte se podrán utilizar durante todo el
programa, incluyendo dentro de las otras funciones.
main():
Indica el encabezado de la función principal del programa y el cuerpo del mismo deberá estar encerado entre paréntesis de
llave {}.
Declaración de variables locales:
Representa la parte declarativa de las variables que serán utilizadas únicamente en esta función.
Cuerpo del main:
Representan a las instrucciones ejecutables necesarias para la solución a un problema.
Funcion1():
Representa a una o mas funciones creadas por el programador para estructurar el programa.
Notas importantes:
• Toda sentencia o instrucción en un programa debe de terminar con punto y coma.
• Puede haber más de una instrucción por línea siempre y cuando vayan separadas por puntos y coma.
• Los comentarios deberán ser claros y concisos. Se puede utilizar un numero variable de los mismos siempre y cuando el programa
así lo requiera.
Variables y Constantes
Tipos de datos de C.
Los operadores manipulan variables constantes para formar expresiones. Estos cuatro: variables, constantes,
operadores y expresiones son el abecedario del lenguaje C.
• Variables: es una posición de memoria con nombre que se usa para mantener un valor que puede ser modificado
por el programa. Todas las variables en C han de ser declaradas antes de poder ser usadas. La forma general de
declaración es: tipo lista_de_variables;
• Constante: se refieren a valores fijos que no pueden ser alterados por el programa. La forma en que se
representan depende de su tipo.
• Operador: es un símbolo que le dice al compilador que realice manipulaciones matemáticas o lógicas especificas.
Existen cuatro clases de operadores: Aritméticos, Relacionales, Lógicos y a nivel de bits.
• Expresiones: Cualquier combinación valida de los elementos atómicos de C: los datos (variables o constantes) y los
operadores.
��������������� �� ��� ��������������� ���
���������������� ����� � �� �
En C existen cinco tipos básicos de datos, Carácter (char), Entero (integer), Flotante (float), Doble flotante (double), vacío
(void).
• char: Carácter. Se usa para guardar caracteres de 8 bits.
• int: Entero. Se usa para guardar cantidades enteras. También se usan para controlar los bucles y las sentencias
condicionales.
• float y double: Flotante y doble flotante. Se usan para guardar valores que necesiten componente fraccional. La
diferencia entre ellos es la magnitud del numero.
• void: vacío. Se usa para mejorar la comprobación de tipos. Declarar explícitamente una función como que no
devuelve valor alguno. Declarar una función explícitamente sin parámetros. Para crear puntero genéricos.
La siguiente tabla muestra el tamaño y el rango de valores para los cuales están definidos cada uno de los tipos de datos:
Tipo Ancho Rango
Char 8 bits o 1 byte 0 a 255 o –128 a 127
Int 16 bits o 2 bytes -32768 a 32767
Float 32 bits o 4 bytes 3.4 E – 38 a 3.4 E + 38
Double 64 bits o 8 bytes 1.7 E –308 a 1.7 E +308
Void 0 Sin Valor
Modificadores de Tipo:
Excepto para void, los tipos de datos básicos tienen varios modificadores que los preceden. Se usa un modificador
para alterar el significado de un tipo para que se ajuste a las necesidades de cada momento. Dichos modificadores son:
Signed (con signo), Unsigned (sin signo), Long (largo), Short (corto).
La siguiente tabla muestra todas las combinaciones que se ajustan al estándar ANSI. Es importante recordar que
los datos de la tabla son valores muestra para dar una idea general de las diferencias entre tipos, ya que las máquinas
pueden emplear una longitud de palabra de 16, 32 o 64 bits y esto produciría cambios significativos a dicha tabla.
Tipo Tamaño aproximado Rango mínimo Char 8 bits ó 1 byte -128 a 127
Unsigned char 8 bits ó 1 byte 0 a 255 Signed char 8 bits ó 1 byte -128 a 127
Int 16 bits ó 2 bytes -32,767 a 32,767 Unsigned int 16 bits ó 2 bytes 0 a 65,535
Signed int 16 bits ó 2 bytes -32,767 a 32,767 Short int 16 bits ó 2 bytes -32,767 a 32,767
Unsigned short int 16 bits ó 2 bytes 0 a 65,535 Signed short int 16 bits ó 2 bytes -32,767 a 32,767
Long int 32 bits ó 4 bytes -2,147,483,647 a 2,147,483,647 Signed long int 32 bits ó 4 bytes -2,147,483,647 a 2,147,483,647
Unsigned long int 32 bits ó 4 bytes 0 a 4,294,967,295 Float 32 bits ó 4 bytes Seis dígitos de precisión
Double 64 bits ó 8 bytes Diez dígitos de precisión Long double 128 bits ó 16 bytes Diez dígitos de precisión
��������������� �� ��� ��������������� ���
���������������� ����� � �� �
La diferencia entre los enteros con y sin signo es la forma en que la computadora interpreta el bit más alto (más
significativo) del entero. Si se especifica un entero con signo, entonces el compilador genera código que asume que el bit
más significativo va a ser usado como indicador de signo.
En el caso de los números con signo. Si el identificador de signo es 0 entonces el numero es positivo; si es 1
entonces el numero será negativo.
Los enteros con signo son importantes en muchos algoritmos, pero sólo tienen la mitad de la magnitud absoluta que
el correspondiente sin signo. Por ejemplo:
01111111 11111111 corresponde al 32767
Si el primero fuese 1, estaríamos hablando del mismo numero negativo.
En el caso de que el número fuese unsigned y el mas significativo fuera 1 entonces representaría el numero 65535.
Modificadores const y volatile.
Los números presentan dos problemas en los programas de computadora. El primero es que no poseen valor
mnemónico. Por ejemplo, si encontramos el numero 10 en un programa, nada nos dice acerca de su significado. Si el
programa se usa en un banco, podría tratarse del número de sucursales o del número de ventanillas en la oficina matriz.
Para entender el programa, necesitamos conocer el significado de cada constante. El segundo problema es que si es
necesario cambiar algunos números de un programa, la modificación suele introducir errores. Supongamos que el 10 ocurre
doce veces en el programa del banco, y que en cuatro ocasiones representa el número de sucursales y en las otras ocho
ocasiones representa el número de ventanillas en la oficina matriz. Si el banco abre una nueva sucursal y se hace necesario
actualizar el programa, hay una buena posibilidad de que algunos de los 10 que deberían cambiarse a 11 no se cambien, y
que algunos de los que no deberían cambiarse sí lo hagan. La forma de evitar estos problemas es dar un nombre a cada
número y utilizar el nombre en lugar del número dentro del programa. Por ejemplo, el programa del banco podría tener dos
constantes con los nombres NO_SUCURSALES y NO_VENTANILLAS. Ambos números podrían tener el valor 10, pero en el
momento en que el banco abre una nueva sucursal lo único que hay que hacer para actualizar el programa es modificar la
definición de NO_SUCURSALES.
Sin embargo, este método de nombrar constantes numéricas tiene un problema; podríamos modificar
inadvertidamente el valor de una de estas variables. C++ ofrece un mecanismo para marcar una variable inicializada de
modo que no se pueda modificar. Si el programa trata de modificar una de estas variables, se produce una condición de
error. Este mecanismo es llamado const y tiene las siguientes características.
El modificador de tipo const se utiliza para informar al compilador de que el valor de la siguiente variable no puede
ser cambiado por ninguna sentencia del programa. (Sin embargo debe ser inicializada). Por ejemplo:
const int NO_SUCURSALES = 10
��������������� �� ��� ��������������� ���
���������������� ����� � �� �
Informa al compilador de que NO_SUCURSALES no puede aparecer en la parte izquierda de una sentencia de
asignación y fija el valor inicial a 10.
Una variable const recibe su valor bien por una inicialización explícita o bien por algún medio dependiente del
hardware.
Las variables de tipo const tienen dos propósitos principales. En primer lugar, permitir al compilador situarlas en
ROM (memoria de sólo lectura). En segundo lugar, permiten asegurarse de que cuando pasan punteros a una función,
ninguna parte del código de la función pueda modificar los objetos a que apuntan.
Nota: Una variable que se declara usando el modificador const se conoce como constante declarada. El lenguaje C no exige escribir las
constantes declaradas exclusivamente con mayúsculas, pero ello es una práctica estándar entre los programadores en C.
volatile:
Se utiliza para decir al compilador que la variable que le sigue puede ser modificada de alguna forma que no sea
bajo el control del programa. Por ejemplo la dirección de una variable global puede ser pasada a la rutina de reloj del sistema
operativo y usada para mantener el tiempo real del sistema o bien una variable puede ser actualizada por el reloj del sistema
cada 10 segundos.
El propósito de declarar una variable como volatile es evitar ciertas optimizaciones del compilador que pudieran
evitar el acceso al valor de la variable según indique una expresión. Esto es muy importante porque la mayoría de los
compiladores de C automáticamente optimizan ciertas expresiones asumiendo que el contenido de una variable no cambia si
no aparece en la parte izquierda de una sentencia de asignación; así, puede que no se vuelva a comprobar la variable cada
vez que se referencia. Además algunos compiladores cambian el orden de evaluación de una expresión durante el proceso
de compilación. El modificador volatile previene que se hagan esos cambios.
Nota: Es posible usar const y volatile juntos. Por ejemplo, si se asume que 0x30 es el valor de un puerto que cambia por
una condición externa exclusivamente, entonces la siguiente declaración es precisamente la que se necesita para prevenir
cualquier posibilidad de efectos secundarios accidentales:
const volatile unsigned char *puerto=0x30;
Conversiones de Tipos de Datos.
La mayoría de los programas procesan información de varios tipos. A veces todas las operaciones son del mismo
tipo. Por ejemplo, la adición de un entero a otro produce un entero. Pero con frecuencia es necesario convertir datos de un
tipo a otro. La conversión de tipos se refiere a la situación en la que variables de un tipo se mezclan con las de otro tipo.
Cuando se da esta mezcla en la sentencia de asignación, la regla de la conversión de tipo es sencilla; C convierte el valor del
lado derecho (lado de la expresión) de la asignación al tipo del lado izquierdo (la variable destino).
Cuando se convierten desde enteros hasta caracteres, los enteros largos a enteros y los enteros a enteros cortos, la
regla básica que se sigue es la cantidad apropiada entre los bits más altos se quitará. Así se perderán 8 bits cuando va
desde un entero hasta un carácter o un entero corto y 16 bits cuando va de un entero largo a un entero.
��������������� �� ��� ��������������� ���
���������������� ����� � �� �
La siguiente tabla sintetiza estas conversiones de tipo. Se debe recordar un punto importante: la conversiones de
un int a un float, un float a un double, y así sucesivamente, no añadirá precisión o rendimiento. Estas clases de conversiones
sólo cambiarán el formato en que se representa el valor.
Hacia Desde Posible pérdida de Información
char Unsigned char Si el valor > 127, el objetivo será negativo.
char Short int Mayor de 8 bits
char Int Mayor de 8 bits
char Long int Mayor de 24 bits
short int Int Ninguna
short int Long int Mayor de 16 bits
Int Long int Mayor de 16 bits
Int Float Parte fraccional y posiblemente más
float Double Precisión, resultado redondeado
double Long double Ninguna
Para hacer la conversión que la tabla no muestra directamente, simplemente convertir un tipo de un momento hasta
el final. Por ejemplo, para convertir desde un double hasta un int, primero convertimos de double a float y entonces de float a
un int.
Operadores.
C es un lenguaje muy rico en operadores incorporados. C define cuatro clases de operadores: aritméticos,
relacionales, lógicos y a nivel de bits.
Aritméticos: Los operadores de suma, resta, multiplicación y división funcionan de la misma manera en C que en la mayoría
de los lenguajes de computadora. Cuando se aplica la división a un entero, la computadora truncará cualquier resto. El
operador módulo de la división almacena el resto de una división entera. Sin embargo, no se puede usar % sobre los tipos
float o double.
Símbolo Operación Símbolo Operación
- Resta % Módulo división
+ Suma -- Decremento
* Multiplicación ++ Incremento
/ División
Es importante mencionar que el tipo de valor producido y el valor exacto del resultado dependen de los tipos de
números que se están combinando. Si ambos operandos son de tipo int, el resultado de combinarlos con un operador
aritmético es de tipo int. Si uno de los operadores, o ambos, son de tipo double, el resultado es de tipo double.
��������������� �� ��� ��������������� ���
���������������� ����� � �� ��
El tipo del resultado puede ser más importante de lo que podríamos pensar. Por ejemplo, 7.0/2 tiene un operando
de tipo double, por lo tanto el resultado es el número de tipo double 3.5. En cambio, 7/2 tiene dos operandos de tipo int, y por
ello produce el resultado de tipo int 3. Aunque la parte fraccionaria del resultado valga cero, hay una diferencia. Por ejemplo,
6.0/2 tiene un operando de tipo double, por lo tanto, el resultado es el valor de tipo double 3.0, que sólo es una cantidad
aproximada. En cambio, 6/2 tiene dos operandos de tipo int; por lo tanto, produce el resultado 3 que es de tipo int y por lo
mismo es una cantidad exacta. El operador de división es el que más se ve afectado por el tipo de sus argumentos.
Cuando se emplea con uno o dos operandos de tipo double, el operador de división se comporta como se debería
esperar. En cambio, cuando se utiliza con dos operando de tipo int, dicho operador produce la parte entera del cociente. En
otras palabras, la división entera desecha la parte que sigue al punto decimal. Así pues, 10/3 es 3 (no 3.333...), 5/2 es 2 (no
2.5). Observe que el número no se redondea; la parte que sigue al punto decimal se desecha, por más grande que sea.
Podemos emplear el operador % con operandos de tipo int para recuperar la información que se pierde cuando
usamos / para dividir números de tipo int. Cuando se emplean con valores de tipo int, los dos operadores / y % producen los
dos números que se obtienen cuando se ejecuta el algoritmo de división larga que se aprende en la primaria. Por ejemplo, 17
dividido entre 5 da 3 con un residuo de 2. La operación / produce el número de veces que un número “cabe” en otro. La
operación % da el residuo.
Incremento y Decremento:
C contiene dos operadores muy útiles que no existen generalmente en otros lenguajes de computadora. Son el de
incremento, añade 1 a su operando, y el decremento, resta 1 a su operando. En otras palabras:
x = x + 1; es lo mismo que x++;
y
x = x - 1; es lo mismo que x—;
Estos operadores pueden preceder o seguir al operando la diferencia es que cuando lo precede, C lleva a cabo la
operación antes de utilizar su valor. Si el operador sigue al operando, C utiliza su valor antes de realizar la operación. Por
ejemplo:
x = 10;
y= ++x;
Valor de y: 11
x = 10;
y= x++;
Valor de y: 10
La mayoría de los compiladores de C generan un código objeto muy rápido y eficiente para las operaciones de
incremento y decremento, siendo mejor que el que se obtendría usando la sentencia de asignación correspondiente. Por esta
razón, se debe usar estos operadores siempre que sea posible.
La precedencia de los operadores aritméticos es de mayor a menor como se muestra a continuación:
Mayor: ( )
++ --
* / %
Menor: + -
��������������� �� ��� ��������������� ���
���������������� ����� � �� ��
Los operadores del mismo nivel de precedencia son evaluados por el compilador de izquierda a derecha. Por
supuesto, se pueden utilizar paréntesis para alterar el orden de evaluación. Los paréntesis en C son tratados prácticamente
igual que en otros lenguajes. Los paréntesis fuerzan a que una operación, o un conjunto de las mismas, tenga un nivel de
precedencia mayor.
Relacionales y Lógicos:
En el término operador relacional la palabra relacional se refiere a la relación entre unos valores y otros. En el
término operador lógico la palabra lógico se refiere a las formas en que esas relaciones pueden conectarse entre sí. Los
discutiremos a la vez, ya que a menudo los operadores relacionales y lógicos actúan juntos.
La siguiente tabla muestra los operadores relacionales y lógicos.
Operadores Relacionales Operadores Lógicos
Operador Acción Operador Valor
> Mayor que && Y
>= Mayor o igual que || O
< Menor que ! No
<= Menor o igual que
== Igual
!= Diferente
La clave de los conceptos de operadores relacionales y lógicos es la idea de cierto (true) y falso (false). En C
cualquier valor distinto de 0 es cierto y el valor 0 es falso.
A continuación se muestra la tabla de verdad para los operadores lógicos usando 0 y 1
Cuando dicha sentencia es procesada, el compilador asigna un valor que comienza en 0 a cada uno de los
elementos enumerados. Después de declarar un tipo de dato enumerado, se pueden crear variables de ese tipo. Por
ejemplo se puede definir una variable de tipo frutas:
frutas fruta_preferida=manzana;
Declaración de Variables:
C++ nos exige declarar y definir todas las variables antes de ser usadas. Dicha declaración deberá indicar el tipo de
la variable y su nombre. Si esta declaración aparta memoria para la variable, entonces estaremos hablando de una
definición.
La declaración de variables permite separar por comas una lista de variables, así como también asignarles un valor.
Ejemplo:
int secuencia;
char letra, codigo;
float cantidad=25.50;
int valor=1, dato=5;
Errores más comunes.
• La conversión de un tipo de datos más alto en la jerarquía de promoción a un tipo menor puede cambiar su valor.
• Utilizar el operador de incremento o decremento en una expresión que no sea nombre de variable simple, por ejemplo: ++(x+1), es
un error de sintaxis.
• Aunque 3<x<7 es una condición matemáticamente correcta, en C++ no se evalúa correctamente. Para obtener en C++ la
evaluación correcta, utilice (3<x && x<7)
ANSI: El instituto Estadounidense de Estándares Nacionales, es una organización de científicos y representantes de la industria que nombran comités encargados de crear estándares para
lenguajes de programación y otras cosas. En 1989 se estableció el comité ANSI para estandarizar C++. En 1991, ISO, la organización Internacional de Estándares (un cuerpo similar a
ANSI) se unió al proyecto ANSI de C++. En noviembre de 1997 el comité unido aprobó el estándar de C++.
��������������� �� ��� ��������������� ���
���������������� ����� � �� ��
Bibliotecas estándar de C y C++.
La biblioteca estándar de C contiene el código objeto de las funciones proporcionadas con el compilador. Para la
mayor parte de los compiladores de C la biblioteca estándar está contenida en un archivo. Sin embargo, algunas
implementaciones han agrupado las funciones relacionadas en sus propias bibliotecas por razones de eficiencia o
restricciones de tamaño.
El C del estándar ANSI tiene definido el contenido y la forma de la biblioteca estándar de C. Sin embargo, muchos
compiladores incorporan funciones que no están especificadas por el estándar. Por ejemplo, es muy común encontrar
funciones gráficas, rutinas de manejo de ratón además de las normales. Mientras que no transporte los programas que
escriba a un nuevo entorno, es perfectamente válido utilizar esas funciones no estándar. Sin embargo, si su código debe ser
portable, debe restringir su uso.
Aunque las bibliotecas son parecidas a los archivos objeto, hay una diferencia crucial: no todo el código de una
biblioteca se añade a su programa. Cuando enlaza un programa que consiste en varios archivos objeto, todo el código de
cada archivo objeto se convierte en parte del programa ejecutable final. Esto ocurre se esté o no utilizando el código. En
otras palabras, todos los archivos objeto especificados en tiempo de enlace se unen para formar el programa. Sin embargo,
este no es el caso de los archivos de biblioteca.
Una biblioteca es una colección de funciones. A diferencia de un archivo objeto, un archivo de biblioteca guarda el
nombre de cada función, los códigos objeto de las funciones y la información de re-ubicación necesaria para el proceso de
enlace. Cuando su programa se refiera a una función contenida en una biblioteca, el enlazador toma esa función y añade el
código objeto a su programa. De esta forma, sólo se añadirán al archivo ejecutable aquellas funciones que realmente se
utilicen en el programa.
Como las funciones se añaden de forma selectiva al programa cuando se utiliza una biblioteca, las funciones
estándar de C están contenidas en bibliotecas en lugar de archivos objetos.
Archivos de cabecera:
Muchas funciones que se encuentran en la biblioteca estándar trabajan con sus propios tipos de datos y variables a
las que su programa debe acceder. Estas variables y tipos están definidos en los archivos de cabecera, proporcionados junto
con el compilador, y deben incluirse (utilizando #include) en cualquier archivo que utilice funciones especificas que hagan
referencias a ellas.
Por ejemplo, para utilizar la función de raíz cuadrada, sqrt(valor) es necesario incluir el archivo de cabecera como
#include “math.h”
��������������� �� ��� ��������������� ���
���������������� ����� � �� ��
En la siguiente tabla se muestran los archivos de cabecera definidos por el estándar ANSI.
Archivo de Cabecera Propósito
ALLOC.H Funciones de asignación dinámica.
ASSERT.H Define la macro assert( ).
BCD.H Define la clase bcd (C++).
BIOS.H Funciones del ROM-BIOS.
COMPLEX.H Define la clase número complejo (C++).
CONIO.H Funciones de manejo de pantalla.
CTYPE.H Funciones de manejo de caracteres.
DIR.H Funciones de manejo de directorios.
DOS.H Funciones de interfaz con el DOS.
ERRNO.H Define códigos de error.
FCNTL.H Define constantes usadas por la función open( ).
FLOAT.H Define valores en coma flotante dependientes de la implementación.
FSTREAM.H Definiciones de clases de E/S de archivos (C++).
GENERIC.H Macros para falsificar declaraciones de clase genérica (C++).
GRAPHICS.H Funciones de gráficos.
IO.H Rutinas de E/S de tipo UNIX.
IOMANIP.H Define manipuladores de E/S (C++).
IOSTREAM.H Define clase flujo de E/S (C++).
LIMITS.H Define varios límites dependientes de la implementación.
LOCALE.H Funciones de especificación de país e idioma.
MATH.H Definiciones para la biblioteca matemática.
MEM.H Funciones de manipulación de memoria.
PROCESS.H Funciones spawn( ) y exec( ).
SETJMP.H Soporte a saltos no locales.
SHARE.H Compartición de archivos.
SIGNAL.H Define valores de señalización.
STDARG.H Soporte a listas de argumentos de longitud variable.
STDDEF.H Define algunas constantes de uso común.
STDIO.H Definiciones y declaraciones para secuencias de E/S estándar.
STDLIB.H Declaraciones variadas.
STREAM.H Definiciones para la antigua clase de flujo (C++).
STRSTREA.H Definiciones de clase Instrstream y ostrstream (C++).
STRING.H Soporte a las funciones cadena.
SYS\STAT.H Define constantes para la apertura de archivos.
SYS\TIMEB.H Declaraciones necesarias para la función ftime( ).
SYS\TYPES.H Declaraciones de tipo usadas con las funciones de tiempo.
TIME.H Soporte a las funciones de tiempo del sistema.
VALUES.H Constantes dependientes de la máquina.
��������������� �� ��� ��������������� ���
���������������� ����� � �� ��
Sentencias de Entrada y salida.
C es prácticamente único en su tratamiento de las operaciones de entrada/salida. Esto se debe a que el lenguaje C
no define ninguna palabra clave para realizar la E/S. Por el contrario, la entrada y salida se realizan a través de funciones de
biblioteca.
Las funciones más simples de E/S son getchar(), que lee un carácter del teclado y putchar(), que imprime un
carácter en la pantalla.
La función getchar() espera hasta que se pulsa una tecla y entonces devuelve su valor. La tecla pulsada aparece
automáticamente en la pantalla. La función putchar() escribe su argumento de carácter en la pantalla en la posición actual
del cursor. Los prototipos de estas funciones son:
int getchar(void);
int putchar(int c);
El archivo de cabecera requerido para estas funciones es STDIO.H
Existen algunos problemas potenciales con getchar(). El ANSI ha definido getchar() de forma que sea compatible
con la versión original de C basada en UNIX. En su forma original esta función guarda lo que llega hasta que se pulsa
ENTER (esto se debe a que los terminales de línea de los sistemas UNIX originales guardaban en un buffer la entrada y
había que pulsar ENTER para que la entrada fuera enviada a la computadora). Esto hace que se queden uno o más
caracteres esperando en la cola de entrada una vez que getchar() vuelve, lo cual es problemático en entornos interactivos.
Alternativas:
Dos de las funciones alternativas son getch() y getche(), que tienen estos prototipos:
int getch(void);
int getche(void);
La función getch() espera que se pulse una tecla e inmediatamente después devuelve el valor, pero no muestra el
carácter en la pantalla.
La función getche() trabaja de la misma forma que la anterior la diferencia es que si muestra el carácter en la
pantalla.
El archivo de cabecera requerido es CONIO.H
Escritura y lectura de cadenas:
El siguiente paso en la E/S de consola, en términos de complejidad y potencia, son las funciones gets() y puts().
Estas permiten leer y escribir cadenas de caracteres por la consola.
La función gets() lee una cadena de caracteres introducida por el teclado y la sitúa en la dirección apuntada por su
argumento de tipo puntero a carácter. Se pueden escribir caracteres por el teclado hasta pulsar un salto de carro. El salto de
��������������� �� ��� ��������������� ���
���������������� ����� � �� ��
carro no formará parte de la cadena; en su lugar, un terminador nulo es situado al final y después gets() termina. De hecho,
no se puede utilizar gets() para devolver un salto de carro (aunque getchar() puede hacerlo). Se pueden corregir errores de
escritura utilizando la tecla de retroceso antes de pulsar INTRO. El prototipo de esta función es:
char *gets(char *cadena);
Donde cadena es un array de caracteres donde se colocan los caracteres tecleados por el usuario. gets() también
devuelve un puntero a cadena. El prototipo de esta función se encuentra en STDIO.H.
Para la función puts() escribe su argumento de tipo cadena en la pantalla seguido de un carácter de salto de línea.
Su prototipo es:
int puts(char *s);
Una llamada a puts() requiere mucho menos tiempo que la misma llamada a printf(), porque puts() sólo puede
imprimir una cadena de caracteres, no puede imprimir números o hacer conversiones de formato. Por esto, requiere menos
espacio y se ejecuta más rápido. Esta función se utiliza a menudo cuando es importante tener un código muy optimizado. Es
importante también saber que devuelve EOF si ocurre algún error. Si no devuelve un valor distinto de cero. Sin embargo,
cuando se está escribiendo en la consola, se puede asumir que no va a ocurrir ningún error.
Función: Operación: getchar() Lee un carácter del teclado, espera un salto de carro. getche() Lee un carácter con eco. No espera un salto de carro. No está definida por el ANSI, pero es
una extensión común. getch() Lee un carácter sin eco. No espera un salto de carro. No está definida por el ANSI, pero es
una extensión común. putchar() Escribe un carácter en la pantalla. gets() Lee una cadena del teclado. puts() Escribe una cadena en la pantalla.
E/S por consola con formato.
Las funciones printf() y scanf() realizan la entrada y salida con formato. La función printf() escribe datos en la
consola y la función scanf(), su complementaria, lee datos desde el teclado. Ambas funciones pueden operar sobre
cualquiera de los tipos de datos existentes, incluyendo caracteres, cadenas y números.
Función printf()
El prototipo de esta función se encuentra en STDIO.H. Esta función devuelve el número de caracteres escritos o
bien un valor negativo si produce error.
int printf (char * cadena_de_control,lista_argumentos);
La cadena de Control esta formada por dos tipos de elementos, el primer elemento es el carácter que se mostrará en
pantalla. El segundo elemento contiene especificadores de formato que definen la forma en que se muestran los argumentos
posteriores. El especificador de formato empieza con un % y va seguido por el código del formato. Debe haber exactamente
el mismo número de argumentos que especificadores de formato y ambos deben coincidir en su orden de aparición de
izquierda a derecha. Por ejemplo:
printf(“El %c es muy %s”,’C’,”facil”);
��������������� �� ��� ��������������� ���
���������������� ����� � �� ��
La siguiente tabla muestra los especificadores de formato que acepta esta función.
Código Formato %c Carácter. %d Enteros decimales con signo. %i Enteros decimales con signo. %e Notación Científica (e minúscula). %E Notación Científica (E mayúscula). %f Coma Flotante. %g Usar %e o %f, el más corto. %G Usar %E o %F, el más corto. %o Octal sin signo. %s Cadena de caracteres. %u Enteros decimales sin signo. %x Hexadecimales sin signo (letras minúsculas). %X Hexadecimales sin signo (letras mayúsculas). %p Mostrar puntero. %n El argumento asociado es un puntero a entero al que se asigna el numero
de caracteres escritos. %% Imprimir el signo %.
Notas Importantes:
• Para imprimir un solo carácter se utiliza %c, para una cadena se utiliza %s.
• Los especificadores %d y %i son equivalentes.
• Para imprimir una dirección de memoria utilice %p.
El especificador de formato %n es diferente al resto. En lugar de hacer que printf() imprima algo, produce en
printf() el efecto de cargar la variable apuntada por su correspondiente argumento con un valor igual al número de caracteres
que han sido impresos. En otras palabras, el valor que corresponde al especificador de formato %n debe ser un puntero a
una variable.
Después de terminada la ejecución de printf() esa variable tendrá el número de caracteres que se han impreso
hasta el punto en el cual se encontró %n.
Para alterar el numero de dígitos a imprimir en los formatos entero y flotante se pone el numero de lugares que
necesite entre el signo de porciento y el especificador de formato. (%05d muestra 00123). Este formato se utiliza
principalmente para crear tablas alineadas. De igual forma este formato se utiliza para especificar las posiciones decimales a
imprimir.
Función scanf()
��������������� �� ��� ��������������� ���
���������������� ����� � �� ��
Es la rutina de entrada por consola de propósito general. Puede leer todos los tipos de datos que suministra el
compilador y convierte los números automáticamente al formato interno apropiado. Su prototipo se encuentra en STDIO.H y
este es:
int scanf(char *cadena _de control, lista de argumentos)
Esta función devuelve el número de datos a los que se ha asignado un valor con éxito. Si se produce un error
devuelve EOF. La cadena de control determina cómo se leen los valores en las variables a las que se hace referencia en la
lista de argumentos.
La siguiente tabla muestra los especificadores de formato que acepta esta función.
Código Formato %c Leer un único carácter. %d Leer un entero decimal. %i Leer un entero decimal. %e Leer un número de tipo coma flotante. %f Leer un número de tipo coma flotante. %g Leer un número de tipo coma flotante. %o Leer un número octal. %s Leer una cadena. %x Leer un número hexadecimal. %p Leer un puntero. %n Recibe un valor entero igual al número de caracteres leídos. %u Leer un entero sin signo. %[ ] Muestrea un conjunto de caracteres.
Estructuras de Control:
El estándar ANSI clasifica las sentencias de C en los siguientes grupos:
De selección.
De iteración.
De salto.
De etiquetado.
De expresión.
De bloque.
Entre las sentencias de selección se incluyen if y switch (a menudo se usa “sentencia condicional” en lugar de
“sentencia de selección”. Sin embargo, el estándar ANSI utiliza selección). Las sentencias de iteración son while, for y do
while. También se conocen normalmente como sentencias de bucles. Las sentencias de salto son break, continue, goto y
return. Las sentencias de etiquetado son case, default y label. Las sentencias de expresión son las compuestas por
expresiones válidas en C. Las sentencias de bloque son simplemente bloques de código.
��������������� �� ��� ��������������� ���
���������������� ����� � �� ��
Muchas sentencias de C se basan en una prueba condicional que determinan la acción que se ha de llevar a cabo.
Una expresión condicional tiene como resultado un valor cierto o falso. A diferencia de muchos lenguajes cualquier valor
distinto de cero es cierto, incluyendo los números negativos. El cero es el único valor falso.
Sentencias de Selección:
Como se menciono anteriormente C soporta las sentencias if y switch. Además, el operador ? puede ser utilizado
para ciertas situaciones.
If:
Su forma general es: Representación Gráfica:
if (expresión) sentencia;
else sentencia;
Donde sentencia puede ser una sentencia simple, un bloque de sentencias o nada (en el caso de sentencias
vacías). La cláusula else es opcional.
Si la expresión de if es cierta, se ejecuta la sentencia o el bloque de sentencias que constituye el objeto del if. En
cualquier otro caso se ejecuta la sentencia o bloque de sentencias que constituye el objetivo del else, si existe. Recuerde que
sólo se ejecuta el código asociado al if o al else, nunca ambos.
La sentencia condicional que controla el if debe producir un resultado escalar. Un escalar es cualquiera de los tipos
entero, de carácter o de coma flotante. Sin embargo, es raro usar un número en coma flotante para controlar una sentencia
condicional, ya que disminuye la velocidad de ejecución considerablemente.
Ifs anidados.
Un if anidado es un if que es el objeto de otro if o else. Los ifs anidados son muy comunes en programación. En c
una sentencia else siempre se refiere al if más próximo que esté en el mismo bloque que el else y que no esté ya asociado a
un if.
Por Ejemplo.
If (i) {
If (j) sentencia 1;
Condición
Sentencia o Bloque de Sentencias
Sentencia o Bloque de Sentencias
Sentencias
V F
��������������� �� ��� ��������������� ���
���������������� ����� � �� ��
If (k) sentencia 2; Else sentencia 3;
}
else sentencia 4;
If-else-if
Una construcción común en programación es la escala if-else-if. Su forma general es:
If (expresión) sentencia; Else
If (expresión) sentencia;
Else If (expresión) sentencia;
.
.
.
Else sentencia;
Las condiciones se evalúan desde arriba hasta abajo. Tan pronto como se encuentre una condición cierta, se
ejecuta la sentencia asociada con ella y se pasa por alto el resto de la escala. Si ninguna de las condiciones es cierta, se
ejecuta el else final. Es decir, si todas las pruebas condicionales fallan, se ejecuta la última sentencia else. Si no hay else
final, no tiene lugar ninguna acción si todas las condiciones son falsas.
Switch
Esta sentencia de selección múltiple compara sucesivamente el valor de una expresión con una lista de constantes
enteras o de caracteres. Cuando se encuentra una correspondencia, se ejecutan las sentencias asociadas con la constante.
Su forma general es: Su representación gráfica es:
switch (expresión) {
case constante 1: secuencia de sentencias;
break;
case constante 2: secuencia de sentencias;
break;
.
.
.
. case constante n:
secuencia de sentencias;
break; default:
secuencia de sentencias;
}
Variable
Secuencia de Sentencias
Secuencia de Sentencias
Secuencia de Sentencias
Secuencia de Sentencias
. . ..
Constante 1
Constante 2 Constante n
default
Sentencias
��������������� �� ��� ��������������� ���
���������������� ����� � �� ��
Se comprueba el valor de la expresión, por orden, con los valores de las constantes especificadas en las sentencias
case. Cuando se encuentra una correspondencia, se ejecuta la secuencia de sentencias asociadas con ese case, hasta que
se encuentra la sentencia break. La sentencia default se ejecuta si no se ha encontrado ninguna correspondencia. Esta
ultima sentencia es opcional y si no esta presente no se ejecuta ninguna acción al fallar todas las comparaciones.
El estándar ANSI especifica que una sentencia switch debe poder tener al menos 257 sentencias case. En la
practica, se limita el número de estas sentencias a muchas menos por razones de eficiencia. Cabe aclarar que la sentencia
case, aunque es una sentencia de etiquetado, no tiene efecto fuera del switch.
La sentencia break es una de las sentencias de salto del lenguaje C. Cuando se encuentra una de estas sentencias
dentro de una sentencia switch, la ejecución del programa salta a la línea de código que sigue a dicha sentencia switch.
Importante:
• La sentencia switch se diferencia de la sentencia if en que switch sólo puede comprobar la igualdad, mientras if puede evaluar
expresiones relacionales o lógicas.
• No puede haber dos constantes case en el mismo switch que tengan los mismos valores. Por supuesto, una sentencia switch
puede estar contenida dentro de otra.
• Si se utilizan constantes de tipo carácter en la sentencia switch, se convierten automáticamente en valores enteros.
Switch anidados:
Se puede tener un switch formando parte de la secuencia de sentencia de otro switch. Incluso si las constantes
case del switch interior y del exterior contienen valores comunes, no provocara ninguna dificultad.
Ejemplo:
switch (expresión) { case constante 1:
switch (expresión) {
case constante 1: .
.
. }
break; case constante 2:
secuencia de sentencias; break; . . .
case constante n: secuencia de sentencias; break;
default: secuencia de sentencias; }
��������������� �� ��� ��������������� ���
���������������� ����� � �� ��
El operador condicional ?:
Se puede usar este operador para reemplazar las sentencias if-else con la forma general:
if (condición)
Expresión
else
Expresión
Sin embargo, el objetivo de if y else debe ser una expresión simple, no otra sentencia de C.
La ? es un operador ternario, ya que necesita tres operandos y tiene la forma general:
Exp1? Exp2: Exp3
Donde Exp1, Exp2 y Exp3 son expresiones. Observe el uso y la posición de los dos puntos.
El valor de una expresión con ? se determina de esta forma: se evalúa Exp1. Si es cierta, se evalúa Exp2 y se
convierte en el valor de la expresión completa. Si Exp1 es falsa, se evalúa Exp3 y su valor se convierte en el valor de la
expresión completa. Por ejemplo:
x = 10; x = 10;
y = x > 9 ? 100 : 200; if (x>9) y = 100;
else y = 200;
El uso del operador ? para sustituir las sentencias if-else no está limitado únicamente a sentencias de asignación.
Es posible utilizar funciones como parte de las expresiones que formen la parte verdadera y/o falsa del operador condicional.
��������������� �� ��� ��������������� ���
���������������� ����� � �� ��
Estatutos de ciclos: Iteración
Para empezar diremos que un ciclo (bucle, lazo, loop, etc.) es un segmento de un algoritmo o programa, cuyas
instrucciones se repiten un número determinado de veces mientras se cumple una determinada condición. Se debe
establecer un mecanismo para determinar las tareas repetitivas. Este mecanismo es una condición que puede ser verdadera
o falsa y que se comprueba una vez a cada paso o iteración del ciclo.
Un ciclo consta de tres partes:
1. Decisión,
2. Cuerpo del ciclo,
3. Salida del ciclo.
Ciclos en programas: while, for, do-while.
for:
El formato general del ciclo for de C se encuentra de una forma o de otra en todos los lenguajes de programación