Apunte Lenguaje C Resumido1
Apunte Lenguaje C Resumido1
Apunte Lenguaje C Resumido1
3
Características del lenguaje
auto break case char const continue default do double else enum extern
float for goto if int long register return short signed sizeof static struct
switch typedef union unsigned void volatile while
(1) indica al compilador que debe incluir información acerca de la biblioteca estándar de E/S
(Standard Input-Output).
(2) cualquier carácter entre /* y */ es ignorado por el compilador y es tratado como un
comentario, estos pueden aparecer en cualquier lugar dónde se pueda colocar un espacio en
blanco, un tabulador (\t) o un enter (\n).- Para comentar una sola línea //
Nota: los comentarios no se pueden anidar, por ej., este fragmento de código produciría un error
de compilación.
/*
if (x < 10) printf (“todo bien”); /* muestra estado */
else printf (“error”);
*/
Ejemplo de un programa en C
(3) define la función main( ), que es la función principal del programa, está seguida por un
par de paréntesis vacíos, lo que significa que no hay transferencia de argumentos. En otras
funciones entre los paréntesis se coloca la lista de argumentos que transfieren valores entre la
función que llama y la función llamada.-
(4) las proposiciones de main() o de cualquier otra función van entre llaves { }
(5) en C se deben declarar todas las variables antes de su uso, al principio de la función y antes
de cualquier proposición ejecutable. Una declaración está formada por un nombre de tipo y una
lista de variables.-
Ejemplo de un programa en C
(6) proposición de asignación, inicializa las variables. Cada proposición individual termina con “;”
Utilizar comentarios
Utilizar sangría
Tener en cuenta que x y X son dos caracteres distintos, que la mayor parte del
programa se escribe en minúscula de imprenta y se usa la mayúscula de imprenta
para escribir nombres de constantes
Algunas consideraciones al escribir un programa
#include
La directiva del preprocesador #include hace que el compilador incluya otro archivo fuente en el que
tiene la directiva #include. El nombre del archivo fuente que se incluirá se debe encerrar entre comillas
dobles “ … ” o entre los signos menor que y mayor que < … >.
Por ejemplo:
#include <stdio.h>
Variables, Constantes, Operadores y Expresiones
DIRECTIVAS DEL PRE-PROCESADOR
#define
La directiva #define se usa para definir constantes simbólicas o realizar sustitución de macros.
Su formato es el siguiente:
Por ejemplo:
#define CANT_ALUMNOS 100
#define FALSO 0
#define VERDADERO !FALSO
El preprocesador también permite configurar el lenguaje. Por ejemplo, se pueden cambiar los
delimitadores de bloque de código { ... } por otros delimitadores inventados por el programador
#define
La directiva #define tiene otra poderosa característica: el nombre de macro puede tener
argumentos.
Cada vez que el compilador encuentra el nombre de macro, los argumentos reales encontrados
en el programa reemplazan los argumentos asociados con el nombre de la macro.
Por ejemplo:
main( )
{
int x=10, y=20;
printf("EL mínimo es %d\n", MIN(x, y));
}
#define
Como se puede observar donde se coloque MIN, el texto será reemplazado por la definición
apropiada. Por lo tanto, si en el código se hubiera puesto algo como:
x = MIN(q+r, s+t);
#undef
Se usa #undef para quitar una definición de nombre de macro que se haya definido previamente.
Por ejemplo:
#undef LONG
#undef ANCHO
Las reglas a tener en cuenta para los nombres de los identificadores son:
• Puede estar formado por letras mayúsculas, letras minúsculas, dígitos y el carácter
de subrayado ‘_’, este último es útil para mejorar la legibilidad de nombres de identificadores
largos.
• El primer carácter no puede ser un dígito, y tampoco conviene que sea el carácter de
subrayado ‘_’, puesto que las rutinas de biblioteca con frecuencia usan tales nombres. Por lo
tanto conviene que el primer carácter sea una letra.
• Su longitud puede variar entre 1 y 32 caracteres. En general son significativos los primeros
31 caracteres, esto difiere según el compilador, aunque en general para nombres de funciones
y variables externas, el estándar garantiza distinguir un máximo de 6 u 8 caracteres.
• No debe coincidir con ninguna palabra clave.
NOMBRES DE IDENTIFICADORES
Se conocen como identificadores los nombres usados para referenciar las variables, las
funciones, las etiquetas y otros objetos definidos por el usuario.
El C proporciona además un tipo de dato de propósito especial cuyo significado es “sin valor”
y cuya palabra clave es void. Desde el punto de vista sintáctico este tipo se comporta como un
tipo fundamental, no obstante, se lo puede utilizar sólo como parte de un tipo derivado. No existen
variables de tipo void. Sirve para especificar que una función no devuelve ningún valor, o bien,
para declarar explícitamente una función sin parámetros.
Variables, Constantes, Operadores y Expresiones
Modificadores de Tipos
Los tipos de datos básicos pueden estar precedidos por modificadores que alteran el significado
del tipo base para que se ajuste más precisamente a cada necesidad. Los modificadores de tipo
que existen en C son:
short ............................ reduce a la mitad la longitud de almacenamiento
long .............................. duplica la longitud de almacenamiento
Para elegir el tipo de dato adecuado es necesario conocer muy bien la arquitectura de la máquina; en
general los conceptos fundamentales a tener en cuenta respecto al tamaño son:
tamaño char < tamaño short int < = tamaño int <= tamaño long int
tamaño float < tamaño double < tamaño long double
El siguiente cuadro muestra todas las combinaciones que se ajustan al estándar ANSI junto con sus
rangos y longitudes, suponiendo palabras de 16 bits:
Variables, Constantes, Operadores y Expresiones
Variables, Constantes, Operadores y Expresiones
DECLARACIÓN DE VARIABLES
En C todas las variables deben declararse antes de su uso, generalmente al principio de la
función y antes de cualquier proposición ejecutable.
tipo lista_de_variables
dónde, tipo debe ser un tipo de datos válido de C y la lista_de_variables puede consistir en
uno omás nombres de variables separados por comas.
Ejemplos:
int i, j, k;
char a, b, c;
double prom1;
Nota: Existen tres sitios básicos donde se pueden declarar variables: dentro de las
funciones, en la definición de parámetros de funciones y fuera de todas las funciones. Estas
variables son respectivamente, las variables locales, los parámetros formales y las variables
globales.
Variables, Constantes, Operadores y Expresiones
INICIALIZACIÓN DE VARIABLES
Inicializar significa especificar un valor de comienzo. Para aquellas que no se inicialicen
se debe asumir que contienen valores desconocidos, “basura”, porque si bien hay algunos
compiladores que inicializan automáticamente a cero, no conviene tomarlo como algo seguro
(globales a 0, locales con basura). La inicialización de cualquier variable se realiza mediante la
asignación de un valor constante que puede realizarse en la sentencia de declaración o en una
sentencia por separado.
o bien:
tipo nombre_de_variable;
nombre_de_variable = constante;
Ejemplos:
• Sólo pueden ser referenciadas por sentencias que estén dentro de esa función o de ese
bloque de código, ya que fuera de los mismos no se las conoce.
• Sólo existen mientras se está ejecutando la función o el bloque de código en el que están
declaradas. Se crea cuando se llama a dicha función o se entra a dicho bloque y se
destruye cuando se sale de ellos, por lo tanto no conservan los valores entre llamadas.
func2( )
{
int x;
x = 35;
·
·
}
Variables, Constantes, Operadores y Expresiones
{
int t;
if (t > 0) {
char s; /* esta existe únicamente en este bloque */
}
/* aquí no se conoce a la variable s */
}
Variables, Constantes, Operadores y Expresiones
VARIABLES LOCALES Y GLOBALES
Según el lugar dónde se declaran las variables se clasifican en distintos tipos, a saber:
Variables Globales:
Son conocidas a lo largo de todo el programa y por lo tanto se pueden usar en cualquier
parte del código.
Si una variable local y una variable global tienen el mismo nombre, toda referencia a ese
nombre de variable dentro de la función dónde se ha declarado la variable local se refiere a
ésta y no tiene efecto sobre la variable global.
Variables, Constantes, Operadores y Expresiones
EJEMPLO Variables Globales
#include <stdio.h>
void f1(void );
void f2(void );
int var; /* var es global */
main( ) {
var = 10;
f1( ); }
void f1( ) {
int h;
h = var;
f2( );
printf (“var es %d\n”, var); /* imprimirá 10 */ }
void f2( ) {
int var; /* var es local */
var = 34;
x = var * 2;
printf (“x = %d\n”, x); /* imprimirá 68 */ }
Variables, Constantes, Operadores y Expresiones
ALGUNAS CONSIDERACIONES SOBRE EL USO DE VARIABLES GLOBALES
Las variables globales son muy útiles cuando muchas funciones del programa usan los mismos
datos, sin embargo, se debe evitar el uso innecesario de variables globales, entre otras, por algunas
de las siguientes razones:
las variables globales usan memoria todo el tiempo que el programa está en ejecución, no
sólo cuando se necesitan (importante si la memoria es un recurso escaso).
usar una variable global dónde podría ir una local hace a la función menos general, ya que
depende de algo que debe estar definido fuera de ella.
Indican al compilador cómo debe almacenar la variable que le sigue, precede al resto de la
declaración de la variable, y su forma general es:
auto: sirve para declarar variables locales, por lo general no se usa ya que se
asume por omisión.
extern: la forma de hacer conocer a todos los archivos (caso compilación por separado)
las variables globales requeridas por el programa es declarando la totalidad de las
mismas en un archivo, y usar declaraciones extern en los otros. Este especificador
indica al compilador que los nombres y tipos de variables que siguen ya han sido
declarados en otra parte y por lo tanto no crea un nuevo almacenamiento para ellas.
Variables, Constantes, Operadores y Expresiones
ESPECIFICADORES DE CLASE DE ALMACENAMIENTO
EJEMPLO extern
Variables, Constantes, Operadores y Expresiones
ESPECIFICADORES DE CLASE DE ALMACENAMIENTO
static dentro de su propia función o archivo las variables static son permanentes. Difieren de
las variables globales en que no son conocidas fuera de su función o archivo, aunque mantienen
sus valores entre llamadas. Tienen efectos diferentes siendo locales que globales.
* Variables estáticas globales: sólo es conocida en el archivo en el que se declara, o sea, que
las rutinas de otros archivos no la reconocerán ni alterarán su contenido directamente.
register: sólo se aplica a variables de tipo int y char y sólo a variables locales y parámetros
formales. Se mantiene el valor de la variable así declarada de forma que se permita un acceso más
rápido a la misma. Por lo general se guarda en CPU en lugar de hacerlo en memoria, por lo tanto
no se requiere acceso a memoria para determinar o modificar su valor.
Variables, Constantes, Operadores y Expresiones
CONSTANTES
C permite declarar constantes. Declarar una constante es parecido a declarar una variable,
excepto que el valor no puede ser cambiado.
La palabra clave const se usa para declarar una constante, como se muestra a continuación:
const int a = 1;
Notas:
Se puede usar const antes o después del tipo.
Es usual inicializar una constante con un valor, ya que no puede ser cambiada de alguna otra
forma.
La directiva del preprocesador #define es un método más flexible para definir constantes en un
programa, a las constantes así definidas se las denomina constantes simbólicas.
La directiva #define indica al preprocesador que debe sustituir, en el código fuente del programa,
todas las ocurrencias del <nombre_de_la_constante> por la <secuencia_de_caracteres>, antes de la
compilación. #define <constante> <secuencia_de_caracteres>
Constantes Numéricas
Pueden ser enteras (contienen un número entero) o de coma flotante (contienen un número
en base 10 que contiene un punto decimal o un exponente o ambos).
Ejemplos de Constantes:
Enteras -> 5280 32767 0 -743
Enteras de Coma Flotante -> 0.2 1. 2e-8 12.3e-5
Constantes No Numéricas
- de carácter: es un carácter delimitado entre comillas simples. El valor de una constante de carácter
es el número correspondiente al código del procesador (generalmente el ASCII).
Hay algunos caracteres no imprimibles que se representan como constantes de carácter mediante una
secuencia de escape que aparece como 2 caracteres pero en realidad son sólo uno (‘\n’, ‘\0’, etc.).
- cadena de caracteres: es una secuencia de ninguno, uno o más caracteres encerrada entre comillas
dobles. El compilador ubica un carácter nulo (‘\0’) al final de cada cadena para que los programas
puedan encontrar el final. Técnicamente una cadena de caracteres es un vector cuyos elementos son
caracteres.
NOTA: no es lo mismo ‘x’ que “x”; en el primer caso se trata de un único carácter, x, cuyo valor
es el que le corresponde en el conjunto de caracteres del procesador, y en el segundo caso se trata de
una cadena que tiene 2 caracteres, una x y un \0.
Variables, Constantes, Operadores y Expresiones
OPERADOR DE ASIGNACIÓN ( = )
Provoca el almacenamiento de un valor en una variable. El formato general resulta:
dónde valor puede ser una constante, otra variable (ya inicializada), o una expresión.
Como en otros lenguajes la operación de asignación es una sentencia, pero a diferencia de
muchos de ellos se trata, en C, de un operador muy potente.
El C define muchos más operadores que otros lenguajes. Combinados con distintos
operandos pueden generar expresiones que siguen las reglas del álgebra, pudiendo los
paréntesis alterar el orden de evaluación que le correspondería por la prioridad propia de
cada operador.
ARITMÉTICOS
Suma ................ +
Resta ................ –
Multiplicación .. *
División ............ /
Módulo ............. % (resto de la división entera-no puede aplicarse a operandos float o double)
Incremento…… ++
Decremento….. --
Variables, Constantes, Operadores y Expresiones
OPERADORES
Incremento y decremento
C contiene dos operadores muy útiles que no existen generalmente en otros lenguajes.
Son el incremento y el decremento, ++ y --.
++ ............. aumenta en 1 el valor del operando
-- ............ disminuye en 1 el valor del operando
operador variable
variable operador
Incremento y decremento
C contiene dos operadores muy útiles que no existen generalmente en otros lenguajes.
Son el incremento y el decremento, ++ y --.
++ ............. aumenta en 1 el valor del operando
-- ............ disminuye en 1 el valor del operando
Ejemplos:
RELACIONALES
Mayor ................ >
Menor ................ <
Mayor o igual ..... >=
Menor o igual ..... <=
Igual ................... = =
Distinto .............. !=
Con éstos se pueden generar expresiones relacionales cuyos operandos pueden ser constantes,
variables u otro tipo de expresiones.
Cuando en una expresión se combinan distintos tipos de operadores, la prioridad en la
evaluación es:
1º > < >= <=
2º = = !=
Cuando en una expresión se combinan operadores de igual prioridad, la evaluación es de
izquierda a derecha. Los paréntesis alteran este orden de evaluación.
El resultado de una operación relacional es un número entero: 1 para verdadero y 0 para falso.
Variables, Constantes, Operadores y Expresiones
OPERADORES
LÓGICOS
Conjunción (y)................. &&
Opción (o) ....................... ||
Negación (no) ................. !
Con éstos se pueden generar expresiones lógicas cuyos operandos pueden ser constantes,
variables u otro tipo de expresiones.
El resultado de una operación lógica es un número entero: 1 para verdadero y 0 para falso .
Variables, Constantes, Operadores y Expresiones
OPERADORES
Cuando se usa en la parte derecha de una sentencia de asignación, el valor asignado es el valor de
la última expresión de la lista separada por comas.
Ejemplo:
x = (y = 3, y + 1); ===> x = 4
y = 10;
x = (y = y – 5, 25 / y); ===> x = 5
los ( ) son necesario por la precedencia: = > ,
Variables, Constantes, Operadores y Expresiones
OPERADORES
OPERADOR CONDICIONAL ( ?: )
C contiene un operador muy potente y conveniente que puede usarse para sustituir ciertas
sentencias de la forma if ... else. El operador ternario ?: toma la forma general:
El operador ?: actúa de la siguiente manera: evalúa Exp1, si es cierta evalúa Exp2 y toma
ese valor para la expresión. Si Exp1 es falsa evalúa Exp3 tomando su valor para la expresión.
Ejemplo:
y = x > 9 ? 100 : 200
Expresión
Representa una unidad de datos simple, tal como un número o un carácter.
La expresión puede consistir en una entidad simple, como una constante, una variable, un
elemento de un arreglo o una referencia a una función. También puede consistir en alguna
combinación de tales identidades interconectadas por uno o más operadores.
Por ejemplo:
a+b x=y c=a+b x==y
Sentencia
Consiste en una expresión seguida de un punto y coma (;) y hace que la computadora lleve a
cabo alguna acción. La ejecución de la sentencia de expresión hace que se evalúe la
expresión. Algunos ejemplos de sentencias son:
a = 3; ++ i; c = a + b; suma += 10;
Variables, Constantes, Operadores y Expresiones
CONVERSIÓN DE TIPOS DE DATOS
Regla Nº 1: en una expresión aritmética dónde se vinculan por lo menos 2 operandos, si estos
son de distinto tipo, el compilador C, previo a la resolución de la operación igualará los tipos de
datos convirtiéndolos automáticamente según una escala de dominio de tipos que podríamos
expresar como: char ---> int ---> float ---> double
FUNCIÓN printf( )
Es una función de salida por pantalla con formato, escribe datos en la misma con un formato
determinado. Esta función puede operar sobre cualquiera de los tipos de datos existentes,
incluyendo caracteres, cadenas y números. El formato de llamada a esta función es:
caracteres ordinarios que desean imprimirse y que se mostrarán por pantalla tal cual.
especificadores de conversión, cada uno de los cuales causa la conversión e impresión
de cada uno de los argumentos de la lista que aparecen a continuación de la cadena de
control (arg1, arg2, arg3, etc.).
FUNCIONES DE ENTRADA Y SALIDA
<stdio.h>
FUNCIÓN printf( )
La lista de argumentos (arg1, arg2, etc.) está formada por constantes, expresiones o variables
cuyos valores se desean imprimir.
Habrá un especificador de conversión por cada uno de los argumentos de la lista, si no hay
suficientes o no son del tipo correcto se producen resultados confusos. La sintaxis es la
siguiente:
comienza con el carácter %
termina con un carácter de conversión, que es una letra que indica con que forma
se imprimirán los argumentos de la lista. Si el carácter después del % no es una
especificación de conversión válida, el comportamiento no está definido.
FUNCIONES DE ENTRADA Y SALIDA
<stdio.h>
FUNCIÓN scanf( )
Esta función se comporta como la inversa de printf( ), puede leer todos los tipos de datos
que suministra el compilador y convierte los números automáticamente al formato interno
apropiado.
El formato de llamada a esta función es:
scanf(“cadena de control”, lista de argumentos);
La lista de argumentos (arg1, arg2, etc.) está formada por punteros a variables que indican
dónde deberá almacenarse la entrada correspondientemente convertida. Las reglas a seguir
son:
Si desea leer un valor perteneciente a cualquiera de los tipos básicos, coloque
el nombre de la variable precedido por un &.
Si lo que desea es leer una variable de tipo string (tira de caracteres), no anteponga el &.
FUNCIONES DE ENTRADA Y SALIDA
<stdio.h>
FUNCIÓN scanf( )
•gets(arg) lee una cadena de caracteres que se ingresa por teclado, asigna todos los caracteres
ingresados hasta que se pulse la tecla [enter]. Su único argumento es un arreglo
que contendrá a la cadena ingresada.
•puts(arg) muestra una cadena en pantalla, tiene un argumento que puede ser una constante
de cadena, un arreglo o un puntero a un arreglo de char.
•putchar(arg) muestra un carácter, tiene un argumento que puede ser una constante, variable
o función que devuelva un caracter.
Sentencias de Control
La mayoría de las sentencias de control de programa se basan en una prueba condicional que
determina la acción a seguir, o sea, especifican el orden en que se realiza el procesamiento.
Una prueba condicional produce un valor cierto o falso; en C cualquier valor distinto de cero
es cierto, incluyendo los números negativos. “El 0 (cero) es el único valor falso en C”.
PROPOSICIONES Y BLOQUES
Las llaves { } se emplean para agrupar declaraciones y proposiciones dentro de una proposición
compuesta o bloque, de modo que son sintácticamente equivalentes a una proposición sencilla. No
se coloca “;” después de la llave derecha que termina un bloque.
En C una sentencia puede consistir en una única sentencia, un bloque de sentencias o nada (en
el caso de sentencias vacías).
Sentencias de Control Condicionales
El lenguaje C soporta dos tipos de sentencias condicionales: if (decisión simple) y
switch (decisión múltiple). Además, el operador condicional ?: es una alternativa para if
en ciertas situaciones.
SENTENCIA if
Se utiliza para expresar decisiones. La forma general de la sentencia if es:
if (num > 10)
if (expresión) sentencia_1; num = num * 2;
else sentencia_2; else
printf (“num = %d\n”, num);
dónde sentencia_1 y sentencia_2 pueden ser una sentencia simple o un bloque y la cláusula
else es opcional.
if (expresión) {
NOTA: En cualquiera de los dos casos la expresión se evalúa, si
secuencia de sentencias_1 es verdadera (cualquier valor != 0) sentencia_1 se ejecuta, si es
} falsa (= 0) y existe una parte else sentencia_2 se ejecuta. Recordar
else { que sólo se ejecuta el código asociado al if o al else, nunca ambos.
secuencia de sentencias_2
}
Sentencias de Control Condicionales
LA ESCALA if – else – if
if (expresión_1)
sentencia_1;
else if (expresión_2)
sentencia_2;
else if (expresión_3)
sentencia_3;
·
·
else
sentencia_n;
Esta secuencia de proposiciones if es la forma más general de escribir una decisión múltiple. Las
expresiones se evalúan en orden de arriba abajo; tan pronto como se encuentra una expresión
cierta la sentencia asociada con ella se ejecuta y el resto de la escala se pasa por alto. Si ninguna
de las condiciones es verdadera se ejecuta el else final, o sea, el último else maneja el caso
“ninguno de los anteriores”; es decir, actúa como condición implícita, si todas las pruebas
condicionales fallan, se ejecuta la última sentencia else.
Sentencias de Control Condicionales
SENTENCIA switch
Si bien con la escala if-else-if se puede escribir una La forma general de la sentencia switch es:
decisión múltiple, este código puede ser bastante switch (variable) {
difícil de seguir. Por este motivo C incorpora una case constante_1:
sentencia de decisión de ramificación múltiple secuencia de sentencias;
denominada switch. Esta sentencia compara break;
sucesivamente una variable con una lista de case constante_2:
constantes enteras o de caracteres, cuando se secuencia de sentencias;
encuentra una correspondencia traslada el control break;
adecuadamente y se ejecuta una sentencia o bloque case constante_3:
de sentencias. secuencia de sentencias;
break;
Nota: la sentencia default se ejecuta si no se encuentra ·
ninguna correspondencia. La parte default es opcional, y ·
si no aparece, no se lleva a cabo ninguna acción al fallar ·
todas las pruebas. Cuando se encuentra una coincidencia, default:
se ejecuta la secuencia de sentencias asociadas con ese secuencia de sentencias;
case hasta encontrar la sentencia break o, en el caso de break;
default ( o el último case si no hay default), el final del }
switch con lo que sale de la estructura.
Sentencias de Control Condicionales
SENTENCIA switch switch (letra)
{
Resumiendo, cada caso empieza con un case y acaba donde hay case 'a':
un break. Si no ponemos break aunque haya un case el programa case 'e':
sigue hacia delante hasta encontrar un break o la llave de cierre case 'i':
del switch. Esto puede parecer una desventaja pero a veces es case 'o':
conveniente. Por ejemplo cuando dos case deben tener el mismo case 'u':
código, si no tuviéramos esta posibilidad tendríamos que escribir numvocal++;
dos veces el mismo código. break;
case ' ':
numesp++;
Puntos importantes a tener en cuenta sobre la sentencia switch: break;
Con switch sólo se puede comprobar la igualdad, no se default:
pueden evaluar expresiones relacionales o lógicas, mientras numotras++;
que con if puede usarse cualquier operador relacional. break;
}
Dentro de un switch no puede haber dos constantes case que
tengan los mismos valores. Por supuesto una sentencia switch
contenida en otra sentencia switch (switch anidados) puede
tener constantes case que sean iguales.
Sentencias de Iteración
Las sentencias de iteración o bucles son estructuras que permiten ejecutar partes del código
de forma repetida mientras se cumpla una condición. Esta condición puede ser simple o
compuesta de otras condiciones unidas por operadores lógicos.
Este bucle permite agrupar las tres acciones en un for (inicialización; condición; incremento)
sólo lugar: {
sentencia1;
La inicialización se realiza una única vez al sentencia2;
principio del bucle, normalmente es una }
sentencia de asignación que se utiliza para
inicializar la variable de control del bucle.-
La condición es una expresión relacional que determina cuando finaliza el bucle, se evalúa
antes de cada ejecución potencial del bucle, cuando la expresión es falsa, o sea, = 0, el bucle
finaliza. Esto permite que el for se ejecute de 0 a n veces, ya que si la condición es falsa
de entrada no se ejecuta nunca.-
El incremento define como cambia la variable de control cada vez que se repite el bucle, se
ejecuta al final de cada iteración.-
Sentencias de Iteración
LA SENTENCIA for
El flujo del bucle for transcurre de la siguiente forma:
Observaciones:
Estas tres secciones principales deben estar separadas por ; (punto y coma). Cualquiera de la tres secciones
pueden omitirse, pero deben permanecer los ;. Se utiliza el operador ‘coma’ para permitir que en el bucle se
inicialicen y/o se incrementen dos o más variables de control.
for (a=1, b=100; a!=b; a++, b- -){
……….. }
Se utilizan los operadores condicionales para permitir que en el bucle se evalúen dos o mas condiciones de
finalización
for (x = 0; x < 10 && z == 0; ++x){
………… }
El C permite generar bucles for sin cuerpo, generalmente se utilizan para generar retardos
for (t = 0; t <= valor; ++t);
El C permite generar bucles infinitos, esta iteración infinita será interrumpida por una sentencia break.
for ( ; ; ) {
……… }
Sentencias de Iteración
LA SENTENCIA while
while ( expresión) {
sentencia;
}
donde sentencia puede ser una sentencia única o un bloque de sentencias que se ejecutarán
repetidamente mientras el valor de expresión no sea 0. Esta sentencia debe incluir algo que altere
el valor de expresión (MUY IMPORTANTE PARA NO HACER UN BUCLE INFINITO).
Cuando el flujo del programa llega a esta instrucción, primero se revisa si la expresión es
verdadera para ejecutar la(s) sentencia(s), y después el ciclo while se repetirá mientras el valor de
expresión no sea cero.
Al igual que el for este bucle puede ejecutarse de 0 a n veces, si la expresión es falsa de entrada
el bucle no se ejecuta nunca.
Sentencias de Iteración
LA SENTENCIA while
En el siguiente ejemplo se muestra una rutina de entrada desde el teclado, la cual se cicla
mientras no se pulse A:
main()
{
char carac;
carac = '\0';
while( carac != 'A') carac = getchar();
}
Nota: Antes de entrar al ciclo se inicializa la variable carac a nulo. Después pasa a la sentencia while
donde se comprueba si carac no es igual a 'A', como sea verdad entonces se ejecuta la sentencia del
bucle (carac = getchar();. La función getchar() lee el siguiente carácter del flujo estándar (teclado) y
lo devuelve, que en nuestro ejemplo es el carácter que haya sido tecleado. Una vez que se ha pulsado
una tecla, se asigna a carac y se comprueba la condición nuevamente. Después de pulsar A, la
condición llega a ser falsa porque carac es igual a A, con lo que el ciclo termina.
Sentencias de Iteración
LA SENTENCIA while
De lo anterior, se tiene que tanto el ciclo for, como el ciclo while comprueban la
condición en lo alto del ciclo, por lo que el código dentro del ciclo no se ejecuta
siempre.
A continuación mostramos otro ejemplo que genera la siguiente salida en pantalla:
main()
{
int x=3;
while( x>0 )
{
printf("x = %d\n", x);
x--;
}
}
Sentencias de Iteración
LA SENTENCIA do while
Al contrario de los ciclos for y while que comprueban la condición en lo alto del bucle, el
bucle do ... while la examina en la parte baja del mismo. Esta característica provoca que
un ciclo do ... while siempre se ejecute al menos una vez. La forma general del ciclo es:
do {
sentencia1;
sentencia2;
} while(expresión );
En el siguiente programa se usa un ciclo do ... while para leer números desde el teclado
hasta que uno de ellos es menor que o igual a 100:
main()
{
int num;
do
{
scanf("%d", &num);
} while (num>100 );
}
Sentencias de Iteración
LA SENTENCIA do while
Otro uso común de la estructura do ... while es una rutina de selección en un menú, ya que
siempre se requiere que se ejecute al menos una vez.
do {
system("cls");
printf("\n1-Ingresar analisis\n2-Cargar resultado\n3-Emitir informe\n4-Salir\nOpcion: ");
scanf ("%c", &opc);
switch (opc) {
case '1':
system("cls");
cant_analisis = cargaAnalisis(p_analisis);
printf ("\n\nLa cantidad de analisis cargados son: %i\n\n", *cant_analisis);
break;
case '2':
system ("cls");
printf("Ingrese Id Paciente: ");
scanf("%s", idPaciente);
p_respuesta = cargaRes(p_analisis, idPaciente, idAnalisis, cant_analisis);
printf("\n\n %s \n\n",p_respuesta);
system("pause");
break;
case '3':
system ("cls");
printf("Ingrese Id Paciente: ");
scanf("%s", idPaciente);
p_listado = emision(p_analisis, idPaciente, cant_analisis, &cant_filas);
break;
}} while (opc!='4');
Sentencias de Iteración
USO DE break, continue, exit y goto
break: Como se comento uno de los usos de la sentencia break es terminar un case en la
sentencia switch. Otro uso es forzar la terminación inmediata de un ciclo, saltando la prueba
condicional del ciclo.
Cuando se encuentra la sentencia break en un bucle, la computadora termina inmediatamente
el ciclo y el control del programa pasa a la siguiente sentencia del ciclo.
Por ejemplo:
main()
{
int t;
for(t=0; t<100; t++)
{
printf("%d ", t);
if (t==10) break;
}
}
Este programa muestra en pantalla los números del 0 al 10, cuando alcanza el valor 10 se
cumple la condición de la sentencia if, se ejecuta la sentencia break y sale del ciclo.
Sentencias de Iteración
USO DE break, continue, exit y goto
main()
{
int x;
for( x=0; x<100; x++)
{
if ((x%2)!=0)
continue;
printf("%d ",x);
}
}
Sentencias de Iteración
USO DE break, continue, exit y goto
Finalmente se considera el siguiente ejemplo donde se leen valores enteros y se procesan
de acuerdo a las siguientes condiciones:
a. Si el valor que se ha leído es negativo, se imprime mensaje de error y se abandona el ciclo.
b. Si el valor es mayor que 100, se ignora y se continúa leyendo
c. Si el valor es cero, se desea terminar el ciclo.
main()
{
int valor;
while( scanf("%d", &valor) == 1 && valor != 0)
{
if ( valor<0 )
{
printf ("Valor no valido\n");
break;
/* Salir del ciclo */
}
if ( valor >100)
{
printf ("Valor no valido\n");
continue;
/* Pasar al principio del ciclo nuevamente */
}
printf ("Se garantiza que el valor leido esta entre 1 y 100");
}
}
Sentencias de Iteración
USO DE break, continue, exit y goto
exit: Permite salir anticipadamente de un programa. El prototipo de la función exit es: void
exit (int estado); y se encuentra en el archivo de cabecera <stdlib.h>. El valor de estado se
devuelve al sistema operativo.
#include<stdlib.h>
main(void)
{
if(!tarjeta_color()) exit(l);
jugar( );
}
donde tarjeta_color() es una función definida por el usuario que devuelve cierto si encuentra
la tarjeta de gráficos en color. Si no se encuentra en el sistema, tarjeta_color() devuelve falso, o
sea 0, el programa finaliza.
Sentencias de Iteración
USO DE break, continue, exit y goto
goto: La sentencia goto (ir a) nos permite hacer un salto a la parte del programa que deseemos.
En el programa debemos poner etiquetas, estas etiquetas no se ejecutan, es como poner un nombre
a una parte del programa. Estas etiquetas son las que nos sirven para indicar a la sentencia goto
dónde tiene que saltar. El goto sólo se puede usar dentro de funciones, y no se puede saltar desde
una función a otra.
#include <stdio.h>
main()
{
printf( "Línea 1\n" );
goto linea3; /*El goto busca la etiqueta linea3 */
printf( "Línea 2\n" );
linea3: /* Esta es la etiqueta */
printf( "Línea 3\n" );
}
Referencia
listanum[2] = 15; /* Asigna 15 al 3er elemento del arreglo listanum*/
num = listanum[2]; /* Asigna el contenido del 3er elemento a la variable num */
Declaración
int tabladenums[50][50];
Referencia
tabladenums[2][3] = 15; /* Asigna 15 al elemento de la 3ª fila y la 4ª columna*/
num = tabladenums[25][16];
Para asignar la entrada estándar a una cadena se puede usar la función scanf con la opción %s,
de igual forma para mostrarlo en la salida estándar, utilizando printf.
(O utilizar gets y puts).
Ejemplo
main() {
char nombre[15], apellido [30];
printf("Introduce tu nombre: ");
scanf("%s",nombre); // gets(nombre);
printf("Introduce tu apellido: ");
scanf("%s",apellido); // gets(apellido);
printf("Usted es %s %s\n", nombre, apellido); }
Como C no maneja cadenas de caracteres, lo siguiente no es válido:
struct nombre_de_la_estructura {
campos_de_estructura;
};
Declaración
struct datos_contacto {
char nombre[30];
char calle[40];
char ciudad[20];
char estado;
int codigo;
};
Referencias
contacto1.codigo = 22222 ;
contacto1.estado = ‘B’ ;
strcpy(contacto1.nombre,“Juan Perez”) ;
Estructuras
Arreglos de Estructuras
Dada la siguiente estructura:
struct identificacion {
char nombre[30];
char calle[40];
char ciudad[20];
char estado;
int codigo;
};
struct estruc_proveedor {
char nombre[40];
char telefono[10];
char direccion[100]; };
struct estruc_inventario {
char titulo[30];
char autor[40];
struct estruc_existencias existencias;
struct estruc_proveedor proveedor;
} inventario;
Declaración
tipo *nombre;
Operadores de punteros
Existen dos operadores especiales de punteros: & y *.
El operador de dirección (&) devuelve la dirección de memoria de su operando.
El operador de indirección (*) devuelve el contenido de la dirección apuntada por el
operando.
Inicialización
int x; // define la variable entera x
int *p1,*p2; // define los punteros a entero p1 y p2
p1=&x; // asigno al puntero p1 la dirección de la variable x
p2=p1; // asigno al puntero p2 el contenido del puntero p1
Punteros
Analizando un ejemplo
main() {
int x = 1, y = 2;
int *ap;
ap = &x;
y = *ap;
x = ap;
*ap = 3;
}
Aritmética de punteros
Existen sólo dos operaciones aritméticas que se puedan usar con punteros: la suma y la resta
entre un puntero y un entero.
main() {
float *flp, *flq, a=0;
flp= &a;
*flp = *flp + 10;
++*flp; // con *++flp muevo el puntero
(*flp)++; // con *flp++ muevo el puntero
flq = flp;
}
Punteros
Punteros y Arreglos
Existe una relación estrecha entre los punteros y los arreglos. En C, un nombre de un arreglo es
un índice a la dirección de comienzo del arreglo. En esencia, el nombre de un arreglo es un
puntero al arreglo.
int a[10], x;
int *ap;
ap = &a[0]; /* ap apunta a la dirección de a[0] */
x = *ap; /* A x se le asigna el contenido de ap (a[0] en este caso) */
*(ap + 1) = 100; /* Se asigna al segundo elemento de 'a' el valor 100 usando ap*/
Diferencias
• Un puntero es una variable. Se puede hacer ap = a y ap++.
• Un arreglo NO ES una variable. Hacer a = ap y a++ ES ILEGAL.
Características
• Se puede acceder a una misma función desde varios puntos del programa. Una vez completada la
ejecución de una función, se devuelve el control al punto desde el que se accedió a ella.
• A la función se le puede pasar información mediante unos identificadores denominados argumentos o
parámetros.
• Las funciones terminan y regresan automáticamente al procedimiento que las llamó.
• En C una función puede devolver datos mediante argumentos y puede devolver también un valor.
• Las funciones pueden ser llamadas desde la función main o desde otras funciones.
• Nunca se debe llamar a la función main desde otro lugar del programa.
Ventajas
• Reuso. Evitar la repetición innecesaria de código.
• Independencia: separando el código en funciones modulares se facilita el diseño y la comprensión de
los programas.
• Al realizar funciones independientes de la función principal e independientes entre sí permite
que las funciones puedan tener sus propias variables “locales", es decir, estas variables no pueden
ser accedidas desde fuera de la función. Esto significa que el programador no necesita preocuparse
por el uso accidental de los mismos nombres de variables en otros puntos del programa.
Funciones creadas por el programador
Estructura de las funciones
#include <stdio.h>
float calculaprom (int num1, int num2); /*prototipo*/
main() {
int a=7, b=10;
float resultado;
resultado = calculaprom (a, b); /*llamada*/
printf("Promedio=%f\n",resultado);
}
Prototipo
Este es el primer elemento relacionado con una función. Está formado por una línea antes del comienzo
de main(). El formato general de la línea del prototipo es:
tipo_de_retorno nombre_función (lista_de_parámetros);
Ejemplos
Ejemplos de llamada a la función factorial:
•Para el caso de la función factorial que devuelve un valor:
fact=factorial(n);
a = a + factorial(n);
printf("el factorial de %d es %ld\n",n,factorial(n));
if (factorial(n)>50)
switch(factorial(n)) {…
•Para el caso de la función factorial que no devuelve nada:
factorial(n);
Funciones creadas por el programador
Ejemplos
/*vemos que sucede si en la llamada no guardamos el valor de la variable retornada */
#include <stdio.h>
int suma(int,int); /* prototipo */
// realiza una suma
main() {
int a=10,b=25,t;
t=suma(a,b); // guardamos el valor
printf("%d=%d",suma(a,b),t);
suma(a,b); // el valor se pierde
}
Ejemplo:
# include <stdio.h>
void prueba_estatica(void);
main() {
int cont;
for(cont = 1; cont <= 3; cont++) { La salida del programa ejemplo será:
printf("iteracion numero %d:", cont); iteracion numero 1: local = 1 y estatica = 1
prueba_estatica(); iteracion numero 2: local = 1 y estatica = 2
} iteracion numero 3: local = 1 y estatica = 3
}
void prueba_estatica(void) {
int local = 1;
static int estatica = 1;
printf(“local = %d y estatica = %d\n", local, estatica);
local++;
estatica++; }