You are on page 1of 69

Introduccin al lenguaje C

Conceptos bsicos
Profesor: Dr. Wilfrido Gmez Flores

Lenguaje C
C es un lenguaje de programacin creado en 1972 por Dennis M.
Ritchie en los Laboratorios Bell como evolucin del anterior
lenguaje B.
Es un lenguaje de nivel medio ya que dispone de las estructuras
tpicas de los lenguajes de alto nivel as como de construcciones
del lenguaje que permiten un control a muy bajo nivel.
Cualquier programa escrito slo en C estndar sin cdigo
dependiente de un hardware determinado funciona correctamente
en cualquier plataforma que disponga de una implementacin de C
compatible.

Caractersticas de C
Un ncleo del lenguaje simple de propsito general que opera con
bibliotecas (e.g., operaciones de entrada/salida).
Lenguaje flexible que soporta la programacin estructurada.
Separacin de programas en mdulos.
Acceso a memoria de bajo nivel mediante el uso de punteros.
Conjunto reducido de palabras clave: sentencias de control
sencillas y funciones.
Sin una programacin mtodica puede ser propenso a errores
difciles de encontrar.

Primer programa en C
/* PRIMER PROGRAMA EN C */
#include <stdio.h>

Cuerpo de la funcin

int main()
{

Comentario

Invocacin a la biblioteca de entrada/salida

Funcin principal nica y siempre se llama main

Funcin que muestra en pantalla el texto


printf("Bienvenido al curso de programacion en C.\n");
return 0;

Salto de lnea
Terminado de sentencia
Siempre se espera que la funcin devuelva un valor.
En este caso el valor 0 se interpreta que no hubo error.

Segundo programa en C
/* LEE DOS ENTEROS Y LOS SUMA*/
#include <stdio.h>
int main ()
{
int num1, num2, suma;
printf("Ingrese el primer numero: ");
scanf("%d", &num1);
printf("Ingrese el segundo numero: ");
scanf("%d", &num2);
suma = num1 + num2;
printf("La suma es %d \n", suma);
}

return 0;

Crear un programa C
Escribir el programa en un editor de texto y guardarlo en un
archivo con extensin .c
En GNU/Linux se compila desde la Terminal como:
gcc programa.c -o programa
y se ejecuta desde la Terminal como:
./programa

Elementos de un programa C
Bsicamente el lenguaje C est compuesto por los siguientes
elementos:
Comentarios

Identificadores

Palabras reservadas

Variables y tipos de datos


Constantes

Operadores
7

Comentarios
Sirven para incrementar la legibilidad de los programas.
No se pueden anidar. Dentro de un comentario no puede aparecer
el smbolo /*.
Hay dos formas de escribir comentarios:
1./* Este es un comentario que
ocupa ms de una lnea */
2.// Este comentario ocupa una sola lnea

Identificador
Un identificador es el nombre que se le asigna a los distintos
elementos del programa (variables, funciones, etc.).
Debe comenzar con una letra del alfabeto y el resto puede ser
cualquier letra del alfabeto, cualquier dgito numrico o guin bajo,
por ejemplo: numero, area_circulo, A, valor_1
El lenguaje C hace distincin entre maysculas y minsculas, por
ejemplo, VARIABLE, Variable y variable son todos
distintos.
Los identificadores pueden tener hasta 255 caracteres de longitud.
La legibilidad de un programa aumenta al utilizar identificadores
descriptivos.
9

Palabras reservadas
El lenguaje C reserva algunas palabras que no pueden ser utilizadas
ms que para su debido propsito.
do

if

struct

auto

double

int

switch

break

else

long

typedef

case

enum

register

union

char

extern

return

unsigned

const

float

short

void

continue

for

sizeof

volatile

default

goto

static

while

10

Archivos de cabecera

Los archivos de cabecera contienen bibliotecas de funciones del


propio compilador o creadas por el usuario.
Estos archivos tienen la extensin .h y se invocan con la directiva
#include.
Por ejemplo, si se quiere obtener la raz cuadrada de un nmero
mediante la funcin sqrt, el programa debe llevar la directiva
#include <math.h> o #include math.h.

11

Tipos de datos

Un dato es un elemento que se maneja o almacena en un sistema


informtico y deben llevar asociados un identificador, un tipo y su valor.

Los tipos de datos se clasifican en bsicos y derivados (e.g., punteros).

Tipo

Tipos de datos bsicos


Rango
Palabra
reservada
Mnimo
Mximo

Formato

Tamao en
bytes

Sin valor

void

Caracter

char

-128

127

%c

Entero

int

-32768

32767

%d

-3.41038

3.41038

%f

-1.710308

1.710308

%lf

Punto flotante
float
(simple precisin)
Punto flotante
double
(doble precisin)

12

Tipos de datos

Los modificadores opcionales que pueden acompaar a los tipos bsicos


son: con signo, sin signo, largo y corto; y se aplican con las palabras
clave: long, short, signed, y unsigned.
Tipo

Modificador
unsigned

char

signed
short

int
long
float
double

long

unsigned
signed
unsigned
signed

Rango*

Especificador Tamao en
de formato
bytes

Mnimo

Mximo

255

%c

-128

127

%c

65535

%u

-32768

32767

%d

4294967295

%lu

-2147483648 -2147483647

%ld

-3.41038

3.41038

%f

-1.710308

1.710308

%lf

-1.7104932

1.7104932

%Lf

*Los tamaos y rangos de int, short y long dependen del tipo de compilador. En cualquier caso, mediante el operador
sizeof(tipo de dato) se podr determinar el nmero de bytes ocupados.
13

Tipos de datos
/* MUESTRA EN PANTALLA EL TAMANO EN BYTES DE LOS TIPOS DE DATOS EXISTENTES EN C*/
#include <stdio.h>
int main()
{
printf("\n
printf("\n
printf("\n
printf("\n
return 0;
}

Tamano
Tamano
Tamano
Tamano

en
en
en
en

bytes
bytes
bytes
bytes

de
de
de
de

un
un
un
un

CARACTER es: %d\n",sizeof(signed char));


ENTERO es: %d\n",sizeof(signed short int));
FLOAT es: %d\n",sizeof(float));
DOUBLE es: %d\n",sizeof(double));

14

Declaracin de variables

Una variable representa un espacio de memoria para almacenar un valor


de un determinado tipo y puede cambiar durante la ejecucin del
programa.

Todas las variables deben declararse antes de su uso.

Una declaracin asocia un tipo de dato determinado a una o ms


variables y su sintaxis es:
modificador tipo_de_dato identificador;

Declaraciones usando los


tipos de datos vistos

int a;
unsigned int b;
long int c;
short int d;
unsigned short int e;
unsigned long int f;
char g;
unsigned char f;
float g;
double h;

15

Declaracin de variables
// PROGRAMA QUE SUMA DOS NUMEROS DE TIPO ENTERO
#include <stdio.h>
int main ()
{
int valor_1 = 5, valor_2 = 7, suma;
suma = valor_1 + valor_2;
printf("%d + %d = %d \n", valor_1, valor_2, suma);
}

return 0;

16

Constantes simblicas
Se definen constantes simblicas para evitar el uso de valores
constantes dentro del cdigo.
Se declaran antes de la funcin main utilizando la directriz
#define.
El tipo de una constante es el tipo de valor asignado.
Suelen escribirse el nombre de la constante en maysculas.
No se usa punto y coma despus de la declaracin.
#define
#define
#define
#define
#define

PI 3.141593
DIAS_SEMANA 7
CIERTO 1
FALSO 0
MENSAJE "Pulse una tecla para continuar"
17

Constantes simblicas

Valores enteros:
Notacin decimal: 987
Notacin hexadecimal: 0x25 0X25
Notacin octal: 034
Enteros sin signo: 485U

Enteros tipo long: 485L


Enteros sin signo de tipo long: 485UL
Valores negativos: -987

Valores reales:
Ejemplos: 12, 14.8, .34
Notacin exponencial: .2e+9, 1.04E-12
Valores negativos: -12, -2e+9

18

Constantes simblicas
// PROGRAMA QUE LEE EL RADIO DE UN CIRCULO Y CALCULA SU AREA
#include <stdio.h>
#define PI 3.141593
int main()
{
float radio;
float area;
printf("Introduzca el radio: ");
scanf("%f",&radio);
area = PI*radio*radio;
printf("El area del circulo es %.4f\n",area);
return 0;
}

19

Operadores
Los operadores son smbolos que indican la realizacin de
determinadas operaciones matemticas, lgicas y numricas.
Se aplican a variables u otros objetos denominados operandos.
Pueden ser unarios, binarios o ternarios.

Tipos de operadores

Operadores de asignacin
Operadores unitarios
Operadores aritmticos
Operadores lgicos
Operadores relacionales
Operador condicional
20

Operadores de asignacin
Probablemente el operador ms importante sea el de asignacin:
identificador=expresin;
Ejemplos: a=3; area=lado*lado;
Se pueden realizar asignaciones mltiples y se asignan de derecha a
izquierda, por ejemplo, en i=j=5 a j se le asigna 5 y a i se le
asigna el valor de j.
Si los dos operandos en una sentencia de asignacin son de tipos
distintos, entonces el operando de la derecha ser automticamente
convertido al tipo del operando de la izquierda.
Es importante utilizar de forma correcta la conversin de tipos.

21

Operadores de asignacin
Conversin de tipos: (tipo de dato) expresin
int x;
float y;
x = 5;
y = x/2;
int x;
float y;
x = 5;
y = (float)x/2;
int x;
float y;
x = 5;
y = (float)(x/2);

El valor asignado a la variable y ser 2, ya que


se realiza una divisin entera.
El valor asignado a la variable y ser 2.5, ya que
se realiz primero la conversin de x a tipo
float.
El valor asignado a la variable y ser 2, ya que
(x/2) primero realiza la divisin entera y
luego la conversin a flotante.

22

Operadores de asignacin
Existen diferentes operadores de asignacin:
Operador
x=y

Descripcin
Asignacin

Equivalente
x=y

x+=y

Suma y asignacin

x=x+y

x-=y

Resta y asignacin

x=x-y

x*=y

Multiplicacin y asignacin

x=x*y

x/=y

Divisin y asignacin

x=x/y

x%=y

Mdulo y asignacin

x=x%y

23

Operadores unitarios
Son operadores unarios de incremento (++) y decremento (--).
Si el operador est de prefijo, la operacin se efecta antes que la
operacin de asignacin.
Si el operador est de sufijo, la asignacin se efecta primero
seguido de la operacin.
Tipo
Sufijo
Prefijo

Expresin Equivalente
i++

i=i+1

i--

i=i-1

++i

i=i+1

--i

i=i-1

#include <stdio.h>
int main()
{
int n = 8;
printf("n++ =
printf("++n =
printf("n-- =
printf("--n =
return 0;
}

%d
%d
%d
%d

\n",
\n",
\n",
\n",

n++);
++n);
n--);
--n);

//
//
//
//

POSTINCREMENTO
PREINCREMENTO
POSTDECREMENTO
PREDECREMENTO

24

Operadores aritmticos

Operador

Operacin

Suma

Resta

Multiplicacin

Divisin

Mdulo

Descripcin

Ejemplo
5+2!7

Los operandos pueden


ser enteros o reales

5-2!3
5*2!10
5/2!2.5

Los operandos tienen


que ser enteros

5%2!1

25

Operadores lgicos
Actan sobre operandos que son a su vez expresiones lgicas que
se interpretan como:
VERDADERO, cualquier valor distinto de cero

FALSO, el valor cero

Tabla de verdad
Tipo
Unario
Binario

Operador Operacin
!

NOT

&&

AND

||

OR

!a

a&&b a||b

26

Operadores relacionales
Se utilizan para formar expresiones lgicas.
El resultado es un valor entero que puede ser 1 para verdadero y
0 para falso.

Operador
>
>=
<

Operacin
Mayor que
Mayor o igual que
Menor que

<=

Menor o igual que

==

Igual que

!=

Diferente que

Ejemplo
a=1 y b=2
a>b!0
a>=b!0
a<b!1
(a+1)<=b!1
a==b!0
(a+b)!=3!0

27

Operador condicional
Es un operador ternario que se utiliza en expresiones
condicionales que tienen la siguiente forma:
operando1? operando2: operando3
La expresin del operando1 debe ser lgica. La ejecucin se
realiza de la siguiente manera:
Si el resultado de la evaluacin de operando1 es verdadero, el
resultado de la expresin condicional es operando2.
Si el resultado de la evaluacin de operando2 es falso, el
resultado de la expresin condicional es operando3.
28

Operador condicional

// PROGRAMA QUE MUESTRA CUAL ES EL MAYOR DE DOS NUMEROS


#include <stdio.h>
int main()
{
double a=10.2, b=20.5, mayor;
mayor = (a>b)? a : b;
printf("Entre %lf y %lf el MAYOR es %lf \n",a,b,mayor);
return 0;
}

29

Precedencia y asociatividad
El resultado de una expresin depende del orden en el que se
evalen las operaciones.

3+4*2
*
+

3+4*2
+
*

El orden de evaluacin de las operaciones puede modificarse


mediante parntesis:

3+(4*2)

(3+4)*2

Si no se usan parntesis, es necesario definir reglas para indicar el


orden con el que se ejecutan las expresiones.
30

Precedencia y asociatividad
Reglas de precedencia y asociatividad.
Nivel

Precedencia

Asociatividad

() [] -> .

izquierda a derecha

++ -- ! sizeof

derecha a izquierda

* / %

izquierda a derecha

+ -

izquierda a derecha

< <= > >=

izquierda a derecha

== !=

izquierda a derecha

&&

izquierda a derecha

||

izquierda a derecha

?:

izquierda a derecha

10

= *= /= %= += -=

derecha a izquierda
31

Funciones de E/S: printf


Las funciones de entrada/salida permiten al programa
comunicarse con el exterior.
Se utilizan para mostrar informacin en el monitor y capturar
valores por el teclado y se encuentran en el archivo stdio.h.
La funcin printf permite escribir bytes en stdout (monitor o
dispositivo de salida estndar) usando formatos especficos:
printf(formato,argumentos);
Ejemplos:

printf("Hola mundo\n");

printf("Imprimir %c %d %f\n",'a',28,3.0e+8);
32

Funciones de E/S: printf


Formatos.
Tipo de Especificador
argumento de formato

Numrico

Caracter

Puntero

%d
%i
%u
%o
%x
%X
%f
%e
%E
%g
%G
%c
%s
%%
%n
%p

Salida
(int) entero con signo base 10
(int) entero con signo base 10
(int) entero sin signo base 10
(int) entero sin signo base 8
(int) entero sin signo base 16 (0,1,,9,a,b,,f)
(int) entero sin signo base 16 (0,1,,9,A,B,,F)
(double) valor con signo de la forma [-]dddd.dddd
(double)valor con signo de la forma [-]d.dddde[]ddd
(double)valor con signo de la forma [-]d.ddddE[]ddd
(double)valor con signo en formato f e (el que sea ms compacto)
(double)igual que g, pero introduce E en vez de e
caracter simple
cadena de caracteres
imprime el caracter de porcentaje %
Usados para punteros
33

Funciones de E/S: printf


Secuencias de escape.
Secuencia

Descripcin

\n

Nueva lnea. El cursor pasa a la primera posicin de la siguiente lnea

\r

Retorno de carro. El cursor pasa a la primera posicin de la lnea actual

\t

Tabulador. El cursor pasa a la siguiente posicin de tabulacin

\a

Alarma. Emite un sonido beep

\b

Espacio atrs. Retrocede el cursor una posicin a la izquierda

\f

Alimentacin de pgina. Crea una nueva pgina

\v

Tabulacin vertical

\\

Muestra la barra invertida

\"

Muestra la doble comilla

\'

Muestra una comilla simple

\?

Muestra el caracter de interrogante


34

Funciones de E/S: printf

En un especificador de formato (e.g., %d) se puede agregar un entero


entre el smbolo % y la letra llamado especificador del ancho mnimo del
campo, asegurando que la salida alcance el ancho mnimo.

Por ejemplo, %10d asegura que la salida sea de por lo menos 10


caracteres de amplitud con alineacin a la derecha. Es til al imprimir
una columna de nmeros.
// ESPECIFICACION DEL ANCHO MINIMO DEL CAMPO
#include <stdio.h>
int main()
{
int num1, num2;
num1 = 12;
num2 = 12345;
printf("%d\n", num1);
printf("%d\n", num2);
printf("%5d\n", num1);
printf("%05d\n", num1);
printf("%2d\n", num2);
return 0;
}

35

Funciones de E/S: printf

Si coloca un signo de menos (-) como prefijo al especificador del ancho


mnimo del campo, la salida se alinea a la izquierda (%-8d).
//ALINEACION DE LA SALIDA
#include <stdio.h>
int main()
{
int num1, num2, num3, num4,
num1 = 1;
num2 = 12;
num3 = 123;
num4 = 1234;
num5 = 12345;
printf("%8d\t%-8d\n", num1,
printf("%8d\t%-8d\n", num2,
printf("%8d\t%-8d\n", num3,
printf("%8d\t%-8d\n", num4,
printf("%8d\t%-8d\n", num5,
return 0;
}

num5;

num1);
num2);
num3);
num4);
num5);

36

Funciones de E/S: printf

Un especificador de precisin combina un punto y un entero para indicar


el nmero de posiciones decimales para los nmeros de punto flotante y
se puede colocar justo despus del especificador del ancho mnimo del
campo.

Por ejemplo, %10.3d asegura que la longitud del ancho mnimo del
campo sea de 10 caracteres con 3 posiciones decimales.
// USO DE ESPECIFICADORES DE PRECISION
#include <stdio.h>
int main()
{
int num1;
double num2;
num1 = 123;
num2 = 123.456789;
printf("Formato de entero prederminado: %d\n",num1);
printf("Con especificador de precision: %2.8d\n",num1);
printf("Formato de punto flotante prederminado: %f\n",num2);
printf("Con especificador de precision: %-10.2f\n",num2);
return 0;
}

37

Funciones de E/S: scanf


La funcin scanf permite la entrada de bytes (caracteres ASCII)
desde el stdin (teclado o dispositivo de entrada estndar), los
interpreta de acuerdo a un formato especificado y los almacena en
los argumentos especificados:
scan(formato,argumentos);
Ejemplos:

scanf("%f",&real);

scanf("%c\n",&caracter);

scanf("%f %d %c",&real,&entero,&caracter);

scanf("%s",cadena); //No lleva &

scanf("ld",&entero_largo);
38

Funciones de E/S: scanf


// USO DEL SCANF CON DIFERENTES FORMATOS
#include <stdio.h>
int main()
{
char cadena[80];
int x, y;
float z;
printf("Introduzca dos enteros separados por un espacio:\n");
scanf("%d %d",&x, &y);
printf("Introduzca un real (punto flotante):\n");
scanf("%f",&z);
printf("Introduzca una cadena:\n");
scanf("%s",cadena);
printf("Usted introdujo:\n");
printf("%d %d\n%f\n%s\n",x,y,z,cadena);
}

return 0;

39

Funciones
Una funcin es un fragmento de cdigo que realiza una tarea bien
definida.
Las funciones permiten modularizar un programa. Se divide el
programa en componentes ms pequeos: reutilizacin.
Todas las variables declaradas en las definiciones de funcin son
variables locales.
Declaracin de una funcin:
tipo nombre_func(tipo1 arg1,...,tipoN argN)
{
/* CUERPO DE LA FUNCIN */
}
40

Funciones
Para llamar a una funcin se especifica su nombre y lista de
argumentos sin poner el tipo de dato:
nombre_func(var1,...,varN);
Argumentos formales: parmetros que aparecen en la deficin de
la funcin.
Argumentos reales: parmetros que aparecen en la llamada a la
funcin.
En una llamada habr un argumento real por cada argumento
formal, respetando el orden de la declaracin, y deben ser del
mismo tipo de dato que el argumento formal correspondiente.
Una funcin en C slo puede devolver un valor utilizando la
instruccin return expresion, y el valor de expresion
debe coincidir con el tipo de dato declarado en la funcin.
41

Funciones
Una funcin puede devolver mltiples valores haciendo llamadas
por referencia o utilizando estructuras.
Es conveniente incluir prototipos de funcin (antes de la funcin
main) que son utilizados por el compilador para la comprobacin
de errores entre las llamadas a una funcin y la definicin de la
funcin correspondiente:
tipo nombre_func(tipo1,...,tipoN);
No es necesario especificar nombres de parmetros en los
prototipos de funcin, pero se pueden especificar para mejorar la
comprensin del cdigo fuente.
Si no se incluyen los prototipos, las funciones deben estar
declaradas antes de la funcin main.
42

Funciones
// CALCULAR EL CUADRADO DE UN ENTERO
#include <stdio.h>
int cuadrado(int);

Prototipo de la funcin

int main()
Funcin principal
{
int a, b;
printf("Ingrese un numero entero: ");
scanf("%d", &a);
b = cuadrado(a);
Llamada a la funcin
printf("El cuadrado de %d es %d\n",a,b);
return 0;
}
int cuadrado(int x)
Declaracin de la
{
return x*x;
Regresa el resultado
}

funcin

43

Funciones

// INDICAR SI UN NUMERO ES CUADRADO PERFECTO


#include <stdio.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
void mensaje(void);
int es_cuadperf(int);
int main()
{
int n, perfecto;
mensaje();
scanf("%d", &n);
perfecto = es_cuadperf(n);
if (perfecto)
printf("%d es cuadrado perfecto.\n",n);
else
printf("%d es no cuadrado perfecto.\n",n);
return 0;
}

void mensaje(void)
{
printf("Este programa dice si un numero \n");
printf("es cuadrado perfecto \n");
printf("Introduzca un numero: ");
}
int es_cuadperf(int x)
{
int raiz;
raiz = (int) sqrt(x);
if (x==raiz*raiz)
return TRUE;
else
return FALSE;
}

44

Paso de parmetros por valor

Hasta ahora, la forma en que se han declarado y pasado los parmetros


de las funciones se conoce como por valor.

Esto quiere decir que cuando el control pasa a la funcin, los valores de
los parmetros en la llamada se copian a variables locales de la funcin,
de modo que al regresar a la funcin main los parmetros conservan sus
valores originales.
Llamada a la funcin
a toma el valor de x
b toma el valor de 2*y

int main()
{
int x, y, max;
x = 2;
y = 4;
max = maximo(x,2*y);
.
.
}

int maximo(int a,int b)


{
int max;
if (a>b)
max = a;
else
max = b;
return max;
}
La funcin devuelve el valor de max
45

Paso de parmetros por referencia


Si se quiere que los cambios realizados en los parmetros dentro
de la funcin se conserven al retornar de la llamada, se realiza un
paso de parmetros por referencia.
Es til si se desea devolver ms de un parmetro.
Declaracin de una funcin:
tipo nombre_func(tipo1 *arg1,...,tipoN *argN)
{
/* CUERPO DE LA FUNCIN */
}

Llamada a la funcin:
nombre_func(&arg1,...,&argN);
46

Paso de parmetros por referencia

En este tipo de llamadas los argumentos contienen direcciones de


variables.
Cualquier cambio en la funcin tiene efecto sobre la variable cuya
direccin se pas en el argumento. No hay un proceso de
creacin/destruccin de esa direccin.
Mediante & se pasan direcciones de variables en lugar de valores, y
trabajar internamente en la funcin con los contenidos mediante el
operador *.

47

Paso de parmetros por referencia


// CALCULAR LA HIPOTENUSA DE UN TRIANGULO
#include <stdio.h>
#include <math.h>
void leer(float *a,float *b);
void hipotenusa(float a, float b, float *h);
int main()
{
float a, b, h;
leer(&a,&b);
hipotenusa(a,b,&h);
printf("La hiponusa es %f\n",h);
return 0;
}
void leer(float *a,float *b)
{
printf("Introduce los valores de a y b:\n");
scanf("%f %f",*&a,*&b);
}
void hipotenusa(float a, float b, float *h)
{
*h = sqrt(a*a+b*b);
}

48

Estructuras y sentencias de control


Las estructuras de control permiten modificar el flujo de ejecucin
de las instrucciones de un programa.
Existen tres tipos de estructuras de control:
Secuenciales: ejecucin sucesiva de dos o ms operaciones.

Selectivas: se realiza una u otra operacin dependiendo de una


condicin.
Iterativas: repeticin de una operacin mientras se cumpla una
condicin.
La secuencia de pasos es la ms fcil de las estructuras de control,
ya que en lenguaje C basta con escribir los pasos en orden
descendente y las instrucciones se ejecutarn de manera secuencial.
49

Estructuras selectivas
Las estructuras de seleccin (o bifurcacin) se utilizan para elegir
entre diversos cursos de accin.
En lenguaje C existen tres tipos de estructuras de seleccin:
Seleccin simple: if

Seleccin doble: if-else

Seleccin mltiple: switch


Seleccin if:

if (expresion)
sentencia;

if (expresion)
{
sentencia1;
sentencia2;
..
sentenciaN;
}
50

Estructuras selectivas

Seleccin if-else:
if (expresion)
sentencia;
else
sentencia;

if (expresion)
{
sentencia1;
sentencia2;
..
sentenciaN;
}
else
{
sentencia1;
sentencia2;
..
sentenciaN;
}
51

Estructuras selectivas

Seleccin if-else if:


if (expresion)
sentencia;
else if (expresion)
sentencia;
else
sentencia;

if (expresion)
{
sentencia1;
sentencia2;
}
else if(expresion)
{
sentencia1;
sentencia2;
}
else
{
sentencia1;
sentencia2;
}
52

Estructuras selectivas
// INDICA SI UN NUMERO ES PAR O IMPAR
#include <stdio.h>
int main()
{
int n;
printf("Introduzca un numero: ");
scanf("%d",&n);
if ((n%2)==0)
printf("El numero %d es par.\n",n);
else
printf("El numero %d es impar.\n",n);
return 0;
}

53

Estructuras selectivas

Seleccin switch-case:

switch (expresion)
{
case 1: sentencias;
break;
case 2: sentencias;
break;
...
case N: sentencias;
break;
default: sentencias;
break;
}

// INDICA SI UNA LETRA ES VOCAL O CONSONANTE


#include <stdio.h>
int main()
{
char letra;
printf("Introduzca una letra: ");
scanf("%c",&letra);
switch(letra)
{
case 'a' | 'A':
printf("La letra %c es vocal\n",letra);
break;
case 'e' | 'E':
printf("La letra %c es vocal\n",letra);
break;
case 'i' | 'I':
printf("La letra %c es vocal\n",letra);
break;
case 'o' | 'O':
printf("La letra %c es vocal\n",letra);
break;
case 'u' | 'U':
printf("La letra %c es vocal\n",letra);
break;
default:
printf("La letra %c es consonante\n",letra);
break;
}
return 0;
}

54

Estructuras iterativas
Las estructuras iterativas permiten repetir una serie de veces la
ejecucin de unas lneas de cdigo.
Las iteraciones se realizan durante un nmero determinado de
veces o hasta que se cumpla una determinada condicin de tipo
lgico o aritmtico.
Se pueden anidar, aunque hay que estructurarlos de forma correcta.
En lenguaje C existen tres tipos de estructuras iterativas: for,
while, y do-while.
La sentencia for permite definir ciclos controlados por contador:
for(inicializacion;condicion;incremento)
{
sentencias;
}

55

Estructuras iterativas
Inicializacin: se inicializa algn parmetro que controla la
repeticin del ciclo.
Condicin: es una condicin que debe ser cierta para que se
ejecuten las sentencias.
Incremento: se utiliza para modificar el valor del parmetro.
// PROGRAMA QUE IMPRIME 100 NUMEROS
#include <stdio.h>
int main()
{
int n;
for (n=0;n<100;n++)
printf("%3d\n",n);
return 0;
}
56

Estructuras iterativas
La sentencia while se ejecutar mientras el valor de
condicion sea verdadero (distinto de 0).
La condicion se evala primero.
Se debe incluir algn elemento que altere el valor de condicion,
proporcionando la condicin de salida del ciclo.
El ciclo puede ejecutarse 0 veces si la condicin no se cumple.
La sintaxis del ciclo while es:
while(condicion)
{
sentencias;
}
57

Estructuras iterativas
// LEE UN NUMERO N Y CALCULA 1+2+...+N
#include <stdio.h>
int main()
{
int N;
int suma = 0;
printf("Introduce un numero entero: ");
scanf("%d",&N);
while (N>0)
{
suma=suma+N;
N--;
}
printf("1 + 2 + ... + N = %d\n",suma);
return 0;
}
58

Estructuras iterativas
El ciclo do-while es
s i m i l a r a l c i c l o while
excepto que la condicin se
realiza al final del ciclo, esto
fuerza a que se ejecute el ciclo
por lo menos una vez.
La sintaxis del ciclo dowhile es:
do {
sentencias;
}while(condicion);

#include <stdio.h>
int main () {
int a = 2;
do {
printf("%d\n", a);
a++;
}while(a < 20);
return 0;
}

59

Sentencias de salto
En C hay sentencias para evitar la ejecucin estrictamente
secuencial del programa:
return: Se usa para devolver el control del flujo de ejecucin
desde una funcin.
break: Se usa para romper el flujo de un ciclo (for, while,
do-while).
continue: Se puede usar en un bloque iterativo (for,
while, do-while) para forzar una nueva iteracin del ciclo
ignorando las sentencias que estn a partir de continue y
hasta el fin del ciclo.
goto: Permite efectuar un salto incondicional hasta otro punto
del programa, indicado por una etiqueta (evitarlo ya que su uso
es considerado como un estilo de programacin pobre).
60

Manejo de archivos

Desde el punto de vista de programacin, un archivo es una corriente


(stream) de bits o bytes que posee un final (generalmente indicado por
una marca de fin de archivo EOF).

Para leer un archivo se asocia un flujo (o secuencia), que es el elemento


que permite leer los datos del archivo, mediante una operacin de
apertura del archivo.

Clasificacin de los archivos:

Texto: contienen informacin en forma de caracteres.


Binarios: almacenan datos que no son interpretables como texto
(nmeros, imgenes, etc.).

En el archivo de cabecera stdio.h se define la estructura FILE que


representa la cabecera de los archivos.

Un programa requiere tener un puntero tipo *FILE a cada archivo


que se desee leer o escribir.
61

Apertura y cierra de archivos

La apertura de los archivos se realiza con la funcin fopen, la cual devuelve


un puntero tipo FILE:
FILE *archivo;
archivo = fopen(nombre_archivo,modo);
modo especifica la forma de apertura del archivo.
Si fopen devuelve NULL, el archivo no se pudo abrir.
modo

Descripcin

Abre un archivo slo para lectura. Si el archivo no existe se devuelve un puntero nulo y se genera
un error.

Crea un archivo para escritura. Si ya existe un archivo con este nombre, se sobreescribe,
perdindose el contenido anterior.

Abre o crea un archivo para aadir. Si el archivo existe, se abre apuntando al final del mismo. Si no
existe se crea uno nuevo.

r+

Abre un archivo para leer y escribir. Si el archivo no existe se devuelve NULL y se genera un
error. Si existe, pueden realizarse sobre l operaciones de lectura y de escritura.

w+

Crea un nuevo archivo para leer y escribir. Si ya existe un archivo con este nombre, se
sobreescribe, perdindose el contenido anterior.

a+

Abre o crea un archivo para leer y aadir. Si el archivo existe, se abre apuntando al final del mismo.
Si no existe se crea uno nuevo.
62

Apertura y cierra de archivos


Para cerrar un archivo y liberar el flujo asociado con fopen se usa
la funcin fclose:
int fclose(FILE *archivo);
Esta funcin devuelve 0 si el cierre fue correcto, en otro caso
devuelve un nmero diferente de cero.
// APERTURA Y CIERRE DE UN ARCHIVO
#include <stdio.h>
int main(){
FILE *Fpr;
Fpr = fopen("archivo.txt","w");
if (Fpr==NULL)
printf("No se pudo abrir el archivo\n");
else
/* PROCESAR ARCHIVO */
fclose(Fpr);
return 0;
}

63

Lectura de archivos de texto: fscanf

La funcin fscanf es equivalente al scanf de lectura de datos


por teclado.
Funciona igual que scanf slo que requiere un primer
parmetro que sirve para asociar la lectura a un puntero de archivo.
El resto de parmetros se manejan igual que en el caso de scanf:
int fscanf(FILE *archivo,formato,argumentos);

64

Lectura de archivos de texto: fscanf


#include <stdio.h>
int main(int argc, char *argv[])
{
char nombre [80];
int n;
float salario;
FILE *Fpr;
Fpr = fopen(argv[1],"r");
if (Fpr != NULL) {
while (!feof(Fpr)){
fscanf(Fpr,"%d\t%s\t%f\n",&n,nombre,&salario);
printf("%d\t%s\t%.2f\n",n,nombre,salario);
}
fclose(Fpr);
}
else
printf("No se puede abrir el archivo!!\n");
return 0;
}
65

Escritura de archivos de texto: fprintf

La funcin fprintf es equivalente al printf de lectura de


datos por teclado.
Funciona igual que printf slo que se aade un parmetro al
principio que es el puntero al archivo en el que se desea escribir.
El resto de parmetros se manejan igual que en el caso de
printf:
int fprintf(FILE *archivo,formato,argumentos);

66

Escritura de archivos de texto: fprintf


#include <stdio.h>
int main(int argc, char *argv[]){
char nombre [80];
int n;
float salario;
FILE *Fpr;
Fpr = fopen(argv[1],"w");
if (Fpr != NULL) {
do{
printf("Numero del empleado: ");
scanf("%d",&n);
if (n>0){
printf("Nombre del empleado: ");
scanf("%s",nombre);
printf("Salario: ");
scanf("%f",&salario);
fprintf(Fpr,"%d\t%s\t%f\n",n,nombre,salario);
}
}while(n>0);
fclose(Fpr);
}
else
printf("No se puede abrir el archivo!!\n");
return 0;
}

67

Ejercicios
1. Un vendedor recibe un sueldo base ms un 15% extra por comisin de sus
ventas. El vendedor desea saber la cantidad de dinero obtendr por concepto
de comisiones por las tres ventas que realiz en el mes y el total que recibir
tomado en cuenta su sueldo base y comisiones.
2. Un alumno desea saber su calificacin final (en el rango 0 a 10) en la materia de
programacin. La calificacin final est compuesta de los siguientes
porcentajes: 55% del promedio de sus tres tareas, 30% de la calificacin del
examen final y 15% de la calificacin de un trabajo final.
3. Una persona invierte $1000.00 en una cuenta de ahorros con un 5% de inters.
Se asume que todo el inters se deja en depsito dentro de la cuenta. Calcule y
despliegue el monto acumulado de la cuenta al final de cada ao durante 10
aos. Tambin guardar en un archivo de texto esta informacin. Utilice la
siguiente frmula para determinar el monto anual:
a = p(1+r)n
donde p es el monto de la inversin original, r es la tasa de inters anual, n es el
nmero de aos y a es el monto del depsito al final del ao n.
68

Ejercicios
4. Crear un programa que lea un nmero entero y a partir de l genere un
cuadrado de asteriscos con ese tamao. Los asteriscos slo se vern en el borde
del cuadrado, no en el interior.
5. Realice un programa que simule el lanzamiento de un dado para un nmero
determinado de tiros y que cuente las veces que apareci cada cara del dado. Se
debe pedir el nmero de lanzamientos. Se debe mostrar en pantalla la
frecuencia con la que apareci cada cara del dado.
6. Un histograma es una representacin grfica de una variable en forma de
barras, donde el tamao de cada barra es proporcional a la frecuencia de los
valores representados. Realizar un programa que lea un archivo de texto en
donde estn almacenados 300 valores enteros positivos en el rango [1, 20] e
imprima en pantalla el histograma de frecuencias de los valores almacenados.
Tambin debe guardarse el resultado en un archivo de texto.

69

You might also like