Professional Documents
Culture Documents
P ROGRAMACIN
Lenguaje C
01/08/2013
CAPTULO 3
TEORA DE LENGUAJE C
3.1. COMENZANDO A TRABAJAR EN C
El lenguaje C facilita un mtodo estructurado y disciplinado para el diseo de programas de
computacin.
En el siguiente captulo presentaremos las funciones elementales para trabajar en el lenguaje C, basados
en el programa CODE BLOCKS.
Al abrir un nuevo proyecto en CODE BLOCKS aparece lo siguiente:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello world!\n");
return 0;
}
Analicemos cada una de las lneas de este cdigo
Las lneas #include <stdio.h> e #include <stdlib.h>
Son directrices del procesador de C.
C tiene ciertos procesos ya desarrollados y guardados ordenadamente, segn sus aplicaciones, en
distintas carpetas: entrada/salida, pantalla, string, matemtica, etc.. Estas carpetas se llaman en general
bibliotecas.
Las lneas que se inician con # son procesadas o ejecutadas por el procesador, antes de la compilacin
del programa. Esta lnea le indica al procesador que incluya dentro del programa, el contenido del
"archivo de cabecera de entrada/salida estndar (stdio.h)".
Este archivo de cabecera contiene informacin y declaraciones utilizadas por el compilador al compilar
funciones estndar de la biblioteca de entrada/salida como son: scanf (leer) y printf (mostrar).
La lnea int main ( ) forma parte de todo programa en C.
Los parntesis despus de main indican que es un bloque constructivo del programa conocido como una
funcin.
Todos los programas de C empiezan a ejecutarse en la funcin main.
La llave izquierda { inicia el cuerpo de la funcin main. La llave derecha } da por terminada la funcin
main.
Este par de llaves y el conjunto de instrucciones que abarca recibe el nombre de bloque.
Antes de la llave de cierre, colocamos return 0;. Esta instruccin brinda informacin de cmo el
programa finaliza su ejecucin. Todo programa que ha terminado exitosamente retorna el valor 0 (cero)
al sistema operativo
La lnea printf ("Hello World!\n");
printf ( ) es una funcin que permite mostrar o imprimir en la pantalla una leyenda.
Los parntesis se escriben despus del nombre de toda funcin para escribir entre ellos el argumento.
En este programa se quiere mostrar la cadena de caracteres enunciada entre comillas dobles; al
ejecutarlo, aparecer en la pantalla Hello World!.
La cadena de caracteres escrita entre comillas tambin se llama mensaje, leyenda o literal, y al
mostrarla se respetan exactamente todos los caracteres que aparecen all, salvo la barra invertida \y el
carcter escrito inmediatamente despus.
La \ se llama carcter de escape y siempre se combina con el siguiente carcter:
\n significa lnea nueva (el cursor se coloca al comienzo de la siguiente lnea).
\t tabulador horizontal
\\ imprime una diagonal invertida \
\% imprime el smbolo %
\" imprime la doble comilla
Para indicar que luego de una instruccin se debe seguir en secuencia con la siguiente lnea, todo
enunciado debe terminar con ";" (punto y coma).
En el programa se puede indicar o agregar una lnea como comentario para documentar los programas
y mejorar la legibilidad de los mismos.
Si el comentario ocupa slo una lnea, se coloca // al comenzar el mismo; si ocupa ms de una lnea,
comienza con /* y termina con */. Al ejecutar el programa los comentarios no realizan ninguna accin.
Son instrucciones no ejecutables.
Todo se escribe en minscula salvo las constantes y otros casos que ya se detallarn.
Declaracin:
La forma general para la declaracin de variables es:
tipo
nombre_variable;
Punto flotante
Doble punto
flotante
Caracter
String
DESCRIPCIN
Nmero sin
decimales entre
32768 y 32767
Nmero sin
decimales entre
2.147.483.647
Nmero con
decimales entre
3.4E-38
decimales(6)
Nmero con
decimales entre
1.7E-308
decimales(10)
Un caracter
Cadena de
caracteres
PALABRA CLAVE
Int
-
FORMATO y
TAMAO
%d
2 byte
Long
%ld
4 byte
Float
%f
6 byte
Double
%lf
8 byte
Char
%c
1 byte
%s
tantos byte como
caracteres
char variable[longitud]
Por ejemplo, para declarar la variable a como flotante, b como entera, nom como una cadena
de caracteres de a lo sumo 10 caracteres y z como carcter:
float a;
int b;
char nom[10];
char z;
3.3. OPERADORES
OPERADOR
ACCION
Resta
Suma
Multiplica
Divide
Resto de la
divisin
--
Disminuye de
a uno
++
Incrementa de
a uno
OPERADORES RELACIONALES:
Los operadores relacionales son smbolos que se usan para comparar dos valores.
Si el resultado de la comparacin es correcto la expresin considerada es verdadera,
en caso contrario es falsa.
OPERADOR
SIGNIFICADO
>
Mayor que
>=
<
Menor que
<=
==
Igual
!=
No igual
OPERADORES LGICOS:
Los operadores lgicos retornan un valor lgico basados en las tablas de verdad.
OPERADOR
SIGNIFICADO
&&
and (y)
||
or (o)
not (negacin)
La precedencia es:
Ms alta
!
>= > < <=
= = !=
&&
||
Ms baja
Variable 1 = Variable 2;
x = y;
x = y + z;
Por ejemplo:
x = x + 10;
y = y /z;
x = x+10;
por
x +=10;
y = y /z;
por
y /= z;
x = x - 23;
por
x -= 23;
x = x * y;
por
x *= y;
En una asignacin del tipo f = ini, donde las variables fueron declaradas como
float f;
int ini;
Convierte ini a float antes de la asignacin.
if ( f <= ini)
En la primera parte de este captulo vimos como usar la funcin printf para mostrar por
pantalla o imprimir una cadena de caracteres.
Existen dos formas de escribir esta funcin:
1) Con un argumento
printf ("argumento");
Si tiene solo un argumento es porque es una leyenda o secuencia de caracteres donde se
respeta la escritura entre comillas dobles. DENTRO DE ESA LEYENDA NO HAY VARIABLES
Por ejemplo:
printf (Este es un ejemplo);
2) Con ms de un argumento:
Corresponde al caso en el que se desea mostrar el o los valores de alguna/s variable/s
printf ( "argumento", lista de argumentos);
printf ("leyenda que contiene uno o varios formatos de variables", nombre de la o las variables);
Si hay ms de una variable se deben nombrar en el orden en que sus formatos fueron
escritos dentro de la leyenda.
Por ejemplo:
printf(Juan tiene %d aos y Pedro %d , aosjuan , aospedro);
Permite mostrar en la pantalla la leyenda Juan tiene ..aos y Pedro ., reemplazando
a cada %d por los respectivos valores de las variables aosjuan y aospedro.
EJEMPLO
Cmo hacer un programa para sumar 2 nmeros enteros?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a, b, sum;
/*declara las variables*/
printf("Ingrese el primer numero entero\n");
scanf("%d", &a);
/*lee el primer nmero entero*/
printf("Ingrese el segundo numero entero\n");
scanf("%d", &b);
/*lee el segundo numero entero*/
sum = a + b;
/*asigna el resultado de la suma entre a y b a la variable sum*/
printf("La suma entre %d y %d es %d", a, b, sum);//muestra el resultado de la suma
return 0;
}
La lnea de asignacin sum = a + b; calcula la suma de los dos valores y asigna el resultado
a la variable sum.
La lnea printf ("La suma entre %d y %d es %d", a, b, sum); utiliza la funcin printf para
mostrar por pantalla la leyenda La suma entre .y . es apareciendo en los puntos
suspensivos el valor numrico de las ingresadas y la suma de las mismas, en el orden en
que aparecen despus de la coma.
Dentro de un printf tambin se pueden hacer clculos.
Se puede reemplazar:
sum= a+b;
printf ("La suma es %d", sum);
Por:
printf("La suma es % d", a+b);
y en este caso no es necesario el uso de la variable sum.
IMPORTANTE
campo de 6 lugares
Salida:
Para mostrar 2 nmeros en distinto rengln y alineados a derecha, debo saber cul es la
cantidad mxima de dgitos y colocar ese nmero antepuesto a la d.
Por ejemplo, para mostrar 2 nmeros, sabiendo que el que ocupa ms tiene 6 dgitos
123 de los 6 lugares ocupa los 3 ltimos
154378 considera el campo de 6 lugares alineando de derecha a izquierda
Para mostrar el sueldo no se necesitan tantos decimales, con dos es suficiente; podramos
mejorar la salida de la siguiente forma:
printf (El sueldo a cobrar es de %.2f,sueldo);
En la pantalla aparece El sueldo a cobrar es de 12359.50
% 6.1f muestra en total 6 caracteres, de los cuales 1 es decimal
Si delante del . no hay ningn dgito significa que la cantidad de caracteres totales no
est restringida, pero el dgito que est detrs del . es la cantidad de decimales que se
mostrarn. %.2f muestra un nmero con dos decimales
if (condicin)
{
acciones;
}
else
{
acciones;
}
IMPORTANTE
Utilizar sangras para identificar visualmente los bloques de acciones que corresponden a cada
estructura. Un programa que no siga reglas de esparcimiento uniformes es difcil de leer y de
corregir.
10
Ejemplo
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x, a, b;
printf("Ingrese un numero:");
scanf("%d", &a);
printf("Ingrese otro nmero, distinto del anterior:\n");
scanf("%d", &b);
if (a>b)
x = a;
else
x = b;
printf("El mayor de los dos numeros es %d",x);
return 0;
}
3.5.1 ANIDAMIENTO DE IF
Si la lgica del programa indica que hay que usar ms de un if, stos deben quedar anidados.
Se deben usar correctamente las llaves para que suceda.
Sintaxis:
if (condicin 1)
{
if (condicin 2)
{
sentencia 1;
}
}
else
sentencia 2;
/* siguiente instruccin ejecutable */
Al colocar las { } estamos indicando que el else pertenece al primer if. Esas llaves son
obligatorias ya que estamos alterando el orden de pertenencia de los else. Si no se escriben
las llaves, cada else se asocia con el if que est ms prximo a l.
En el caso anterior, la ejecucin de las sentencias segn el valor de verdad de cada condicin
es:
11
Condicin 1
Condicin 2
Sentencia 1
Sentencia 2
NO
SI
NO
SI
INSTRUCCION
SIGUIENTE
SI
NO
if (condicin 1)
if (condicin 2)
sentencia 1;
else
sentencia 2;
/* siguiente instruccin ejecutable */
El else corresponde al segundo if. La ejecucin de las sentencias segn el valor de verdad de
cada una de las condiciones es:
Condicin 1
Condicin 2 Sentencia 1
Sentencia 2
INSTRUCCIN
SIGUIENTE
INSTRUCCIN
SIGUIENTE
NO
SI
SI
NO
IMPORTANTE
if ( (condicin 1) || (condicin 2) )
12
Ejemplo 1
En un aviso del diario piden ingenieros en sistemas con 5 aos de experiencia a lo sumo.
Se presenta:
pues la primera
pues la segunda
Un ingeniero en sistemas con 4 aos de experiencia: SE TOMA, pues las 2 condiciones son
verdaderas.
Ejemplo 2:
Nos pidieron comprar 1 kilo de helado de chocolate o de vainilla, despus de ir a varios lados
encontramos:
PARA RECORDAR:
En un && (y), la salida es verdadera slo si ambas condiciones son
VERDADERAS.
En un || (o), la salida es falsa slo si ambas condiciones son
FALSAS.
13
Ejemplo
Realizar un programa para sumar dos nmeros reales tales que, si la suma es mayor que 10, se
divide por 2 y si la suma es menor que 10 se multiplica por 3, si es 10 no se modifica. Listar
en todos los casos el resultado logrado.
#include <stdio.h>
int main( )
{
float sum, num1, num2, res=0;
printf ("Ingresa el primer nmero ");
scanf ("%f",&num1);
printf ("Ingresa el segundo nmero ");
scanf ("%f",&num2);
sum=num1+num2;
if (sum>10)
res=sum/2;
else
if(sum<10)
res=sum*3;
else
res=sum;
printf ("Resultado %.2f",res);
return 0;
}
default:
sentencia n;
}
14
IMPORTANTE
Despus de cada sentencia o bloque de sentencias de los case se coloca la instruccin BREAK.
El break del ltimo case es opcional.
La instruccin break se utiliza para terminar la ejecucin de bucles o salir de una instruccin
switch, while, do while o for.
Si en los CASE hay ms de una sentencia no son necesarias las { }.
Por default se ejecuta si no encuentra el valor en las entradas anteriores.
Ejemplo
Leer un nmero, si est entre 4 y 7 mostrarlo en nmero y letras.
#include <stdio.h>
int main ( )
{
int n;
printf (Ingrese un nmero);
scanf (%d, &n);
if (n >= 4 && n <= 9)
switch (n)
{
case 4: printf (%d (CUATRO)\n,n);
break;
case 5: printf (%d (CINCO)\n,n);
break;
case 6: printf (%d (SEIS)\n,n);
break;
case 7: printf (%d (SIETE)\n,n);
}
// fin del switch
return 0;
}
15
while (condicin)
{
sentencia 1;
sentencia 2;
sentencia n;
}
/* prxima sentencia ejecutable */
Ejemplo:
Leer nmeros mientras sean positivos y contar cuntos se ingresaron
# include <stdio.h>
int main ( )
{
int num, cont = 0;
printf(Ingrese un numero\n);
scanf(%d,&num);
while (num > 0)
{
cont++;
printf(Ingrese un numero\n);
scanf(%d,&num);
}
printf(Se ingresaron %d nmeros mayores a
cero\n,cont);
return 0;
}
16
ACLARACIN
cont ++ es una forma abreviada de escribir cont = cont +1, o sea que cont++ permite
incrementar a la variable cont en uno.
Para disminuir a la variable con en uno, la notacin es cont --.
Sintaxis:
do
{
sentencia 1;
sentencia 2;
} while (condicin);
//instruccin siguiente
Ejemplo:
Visualizar los dgitos 0 al 9 apareciendo cada uno en una lnea.
17
# include <stadio.h>
int main ( )
{
int digito = 0;
do
{
printf ("%d", digito);
digito ++;
}while (digito < = 9);
return 0;
}
IMPORTANTE!
La/s variable/s que se encuentran en la condicin del WHILE o del DO-WHILE deben
modificarse dentro del bloque que corresponde a la estructura. De lo contrario, la condicin
seguira cumplindose infinitamente y el programa no podra seguir con las dems
instrucciones.
En el caso de repeticiones controladas por contadores se requiere:
El nombre de una variable de control (controlador del ciclo).
El valor inicial de dicha variable.
El incremento (o decremento) con el cual, cada vez que se termine un ciclo, la variable
de control se modifica.
La condicin que compruebe la existencia del valor final de la variable de control.
En caso de no ser variables de tipo controlador siempre debe haber una primer lectura
antes de la condicin en el while (sino la condicin se comparara contra "basura") y las
siguientes lecturas antes de la llave de fin del while.
primer lectura;
while (condicin)
{
sentencias;
siguiente lectura;
}
18
Ejemplos:
1) Mostrar los mltiplos de 7 comprendidos entre 7 y 112.
# include <stdio.h>
int main ( )
{
int x;
for (x = 7; x < = 112; x + = 7)
{
printf ("%d ", x);
}
return 0;
}
19
# include <stdio.h>
int main ( )
{
int k;
for (k = 9; k > = 1 ; k - - )
{
printf ("%d ", k);
}
return 0;
}
En este caso el valor inicial es 9, pero el final es 1 (valor final menor al inicial); es por eso
que la condicin debe ser con >=1 y el incremento es de 1, ya que la variable tiene que ir
disminuyendo.
#include <stdio.h>
int main( )
{
int n, i, suma = 0;
float prom;
for (i =1; i <10; i++)
{
printf(Ingrese un nro );
scanf(%d,&n);
suma+ = n;
}
prom = 1.0*suma/10;
printf(\nEl promedio de los nmeros ingresados es %.2f, prom);
return 0;
}
20
ACLARACIN
suma+=n es una forma abreviada de escribir suma = suma + n, o sea que suma+= permite
acumular en la variable suma los valores ingresados en n.
INICIO
leer num
mximo = num
para i = 1 hasta 9 hacer
leer num
si
num>maximo
no
maximo=num
mostrar maximo
FIN
Fin para
Por cada valor ingresado en la variable num se lo compara con el valor guardado en mximo.
Si el valor que contiene num es mayor que el guardado en mximo, se asigna el valor de num
a mximo, en caso contrario no se hace nada.
La variable mximo siempre debe inicializarse en un valor. Si ese valor puede ser el primero
del lote de valores del cual buscamos el mximo, mejor; sino se puede inicializar en un valor
ABSURDO (en caso de mximo un nmero muy chico, y en caso de mnimo un valor muy
grande), el cual debe ser reemplazado en la primer pregunta por el primer valor del lote de
datos que se ingrese.
Por ejemplo: si tenemos que calcular el mximo de un conjunto de sueldos, podemos
inicializar mximo en -1, pues es un valor no posible para un sueldo. Ante la pregunta, con el
primer sueldo ingresado, de sueldo > mximo, siempre ser mayor el sueldo y se le asignar
su valor a la variable mximo, perdiendo sta el valor irreal asignado al comienzo para
continuar comparando el valor del primer sueldo con los restantes.
21
EJEMPLO 1
EJEMPLO 2
#include <stdio.h>
#include <stdio.h>
int main( )
{
int n, i, max;
printf(ngrese un nro );
scanf(%d, &n);
max = n;
for (i = 1; i < 10; i++)
{
printf(Ingrese un nro );
scanf(%d,&n);
if (n > max)
max = n;
}
printf(El mximo es %d, max);
int main()
{
int i;
float sueldo, max = -1;
for (i = 1; i <=10; i++)
{
printf( Ingrese su sueldo );
scanf (%f, &sueldo);
if (sueldo > max)
max = sueldo;
}
printf(El mximo es %.2f , max);
return 0;
}
return 0;
}
22