You are on page 1of 152

ESCUELA DE ING.

ELECTRNICA TELECOMUNICACIONES Y REDES

LENGUAJE DE PROGRAMACIN I

Ing. JOS GUERRA


j_guerra@espoch.edu.ec

CAPITULO I
CONCEPTOS BSICOS
HISTORIA DEL LENGUAJE C CARACTERSTICAS DEL C

VENTAJAS DE C DESVENTAJAS DE C
ESTRUCTURA Y ELEMENTOS DE UN PROGRAMA INSTRUCCIONES DE E/S

HISTORIA DEL LENGUAJE C


Fue inventado por Dennis Ritchie en un en los

Laboratorios BELL, basndose en el lenguaje B, creado por Ken Thompson. En 1983 el Instituto de Estndares Americanos estableci un estndar que definiera al lenguaje C, conocido como ANSI C. Los principales compiladores de C llevan implementado el estndar ANSI C.

LOS CREADORES

Ken Thompson (* Nueva Orleans- 4 de febrero de 1943) (izda.) y Dennis Ritchie (* Nueva York- 9 de septiembre de 1941 - 12 de octubre de 2011) (dcha.) Creadores del sistema operativo UNIX (LINUX) En Japn 2011 dos leyendas de la INFORMTICA reciben reconocimiento , una medalla de oro conmemorativa y un premio unos 450.000 euros.

CARACTERSTICAS DEL C

C es un lenguaje de nivel medio. El cdigo C es muy portable. No es un lenguaje de tipos fuertes. C tiene slo 32 palabras reservadas.
27 por parte del estndar de Kernighan y Ritchie 5 incorporadas por el comit de estandarizacin ANSI

C es un lenguaje estructurado. C es un lenguaje para programadores. Ventajas respecto al lenguaje ensamblador. Portabilidad del C, Eficiencia del C. Compiladores frente a intrpretes. Distingue entre maysculas y minsculas. (pi != PI)

VENTAJAS DE C
Enorme flexibilidad y adaptabilidad.
Slo tiene 32 palabras reservadas. Bibliotecas

Compiladores pequeos y fciles de transportar. Concisin en la sintaxis.


Instrucciones crpticas. {

Hecho por y para programadores.

xito de UNIX, distribucin gratuita en ambientes

universitarios. Eficiencia en la produccin de cdigo objeto. Amplio juego de operadores. Auge de los PCs y compiladores para DOS y Windows.

DESVENTAJAS DE C
No se comprueban los lmites de los vectores.
La precedencia de los operadores no es

totalmente intuitiva. (Ej

i=i+1

i++ i+=i)

La sintaxis puede llegar a ser demasiado

concisa.

ESTRUCTURA Y ELEMENTOS DE UN PROGRAMA


Comentarios. Identificadores. Constantes. Variables. Operadores. Sentencias o

instrucciones. Macros del preprocesador.

COMENTARIOS
Comentarios de una sola lnea
Comienzan al principio de la lnea con //
Ejemplo : //Esto es un comentario

Comentarios multi-lnea
Comienzan con /* y terminan con */ No puede anidarse un comentario dentro de otro.
Ejemplo:

/* Esto tambin es un comentario */

IDENTIFICADORES
Se utilizan para nombrar variables, funciones,

etiquetas y elementos definidos por el usuario. Los primeros seis caracteres deben ser significativos (distinguirse de otro similar) y mximo puede tener hasta 31 caracteres. El primer carcter debe de ser una letra o subguin (_). Posteriormente pueden ser letras, nmeros, signos de subrayado. Existe diferencia entre maysculas y minsculas.

IDENTIFICADORES
No pueden emplearse palabras reservadas como

identificadores. No pueden emplearse nombres de funciones que ya existan en el programa o en la librera de funciones de C. No puede llamarse main.

EJEMPLOS DE IDETIFICADORES
Vlidos:

camiones
No vlidos:

numero a1 _sueldo

1abc
Nota:

nombre?

suel-bas

Maysculas para definir constantes. PI = 3.141516. Los identificadores deben referir al contenido que manejan.

32 PALABRAS RESERVADAS
char int float double void if else do default break continue goto return auto extern register

long
short signed unsigned

while
for switch case

struct
union enum typedef

const
static volatile sizeof

VARIABLES
Cuando usamos un programa es muy importante manejar datos. En C podemos almacenar los datos en variables. El contenido de las variables se puede ver o cambiar en cualquier

momento. Estas variables pueden ser de distintos tipos dependiendo del tipo de dato que queramos entrar. No es lo mismo guardar un nombre que un nmero. Para poder usar una variable primero hay que declararla (definirla) Por ltimo es interesante sealar que el C distingue entre maysculas y minsculas. Por lo tanto: seran tres variables distintas. Nombre nombre NOMBRE

VARIABLES
Una variable es una localidad de memoria cuyo valor

puede ser cambiado durante la ejecucin del programa. Todas las variables deben de ser declaradas para se utilizadas. <tipo de dato> espacio(s) <identificador>; Ejemplo:
int a; float area, radio, volumen;

DECLARACIN DE VARIABLES
Ejemplos
unsigned int anio_nacimiento, numero_socios; float importe, total_compra; double distancia_sol, peso; char letra, digito ;

Es posible iniciar una variable en el momento de su declaracin:


int dia = 15; // declaracin e inicializacin short int coord_x =10, coord_y =12 ; char caracter = z; int blancos=11, negros=15, verdes=30;

TIPOS DE DATOS BSICOS


Tipo de datos Descripcin Requerimiento tpico de memoria Intervalo tpico de valores
int

enteros con signo

2 bytes

de -32768 a 32767

char

caracteres nums. reales en coma flotante de simple precisin nums. reales en coma flotante de doble precisin (ms cifras significativas y posibilidad de mayor exponente)

1 byte

de -128 a 127 de ~1.2E-38 a ~3.4E+38

float

4 bytes

double

8 bytes

de ~2.2E-308 a ~1.7E+308

TIPOS DE DATOS BSICOS


MODIFICADORES DE TIPO

Tipo de datos

Requerimiento tpico de memoria 2 bytes 4 bytes 2 bytes 4 bytes 1 byte

Intervalo tpico de valores de -32.768 a 32.767 de -2.147.483.647 a +2.147.483.648 de 0 a 65535 de 0 a 4.294.967.295 de 0 a 255

short int long int unsigned int unsigned long int unsigned char

TIPOS DE DATOS BSICOS


Tratndose de enteros, se pueden utilizar las palabras unsigned, short o long sin el identificador int, Ejemplo: unsigned int unsigned Se pueden mezclar caracteres expresiones aritmticas:
int n; char c; n = 10 * n + c - 0;

enteros

en

Todos estos tipos de datos colectivamente tipos aritmticos

son

llamados

Los tipos enteros y el tipo char se denominan tipos integrales.

TIPOS DE DATOS BSICOS


Se dispone de un operador sizeof que devuelve en bytes el tamao del tipo de datos o expresin que se le pasa

como parmetro.
Su sintaxis es:
sizeof( nombre_de_tipo ) sizeof expresin

Ejemplo:
main() { printf( El tamao de short es %d bytes\n, sizeof(short) ); }

CONSTANTES
C soporta las constantes de tipo cadena que se encierran entre comillas dobles. Las constantes de tipo carcter se encierran entre comillas simples (apstrofos). Las cadenas son simplemente vectores de caracteres, se tratarn ms adelante. Algunos caracteres son imposibles de introducir desde el teclado. C utiliza las constantes de carcter especiales de barra invertida que equivale a un carcter nico.

CONSTANTES
Cdigo
\n \t \v \b \ \r \ \f

Significado
nueva lnea tabulador horizontal tabulador vertical retroceso apstrofo retorno de carro comillas salto de pgina

\0
\a \ooo \xhh \\

carcter nulo
alarma constante octal (ooo = valor octal) constante hexadecimal (hh = valor hexadecimal) barra atrs

EJEMPLOS DE CONSTANTES
Tipo de dato char int long int Ejemplos a \n 9 974 21000 -345 20000L -15000L

short int
unsigned int

-100 120
20000U 50000U

float
double

475.231F 9.87e2
987.654 -0.00345

EJEMPLOS DE CONSTANTES
Constantes de carcter. Ej. a, 0, \0x5, \0, \n, \t, $, \\, NULL Constantes enteras. Ej. 5, +5, -5, \05, \0x5, 5L, 5U, 5lu, etc. Constantes reales. Ej. 0.5f, 0.5, 5e-01f, 5.0e-01, (float)5, etc. Constantes de texto (Cadenas o Strings) Esto es una cadena

DECLARACIN DE CONSTANTES
Se utiliza para asignar un identificador a una constante. #define PI 3.1416 #define NCOLS 20
El pre-procesador de C, sustituye la ocurrencia de PI por

el valor 3.1416 en todo el programa antes de efectuar la compilacin, del mismo modo se sustituye NCOLS por 20.

CONVENCIONES
Empezar los nombres de funciones y de variables con

una letra minscula. Las constantes escritas con #define van con maysculas como #define PI 3.1416 Las palabras intermedias comienzan con maysculas.
sumaMatrices

Utilizar el subguin para separar palabras intermedias.


suma_Matrices

Emplear nombres cortos para optimizar.


(i, j, k, cont)

DECLARACIN DE CONSTANTES
#include <stdio.h> #include <conio.h> #define PI 3.1415 /* ejemplo de manejo de constantes */ const int valor=12; int main () { //valor=23; printf("VISUALIZA CONSTANTE \n\n"); printf(" El valor de PI=%f\n",PI); printf("El valor de constante = %d",valor); getch(); }

SALIDA FORMATEADA POR PANTALLA:

printf

printf(<cadena_formato>,<item1>,<item2>, );

El prototipo de la funcin printf() se encuentra en stdio.h.

cadena_formato

es una tira de caracteres que contiene aquellos que se han de imprimir tal como aparecen en el entrecomillado y/o los especificadores de formato (% ).

item1, item2,..

son las distintas variables, constantes o expresiones, cuyo valor se quiere imprimir. No tienen que aparecer obligatoriamente. De este modo, la funcin printf() describe la manera en que han de imprimirse los items en caso de que existan. Debe aparecer una especificacin de conversin por cada item.

SALIDA FORMATEADA POR PANTALLA:


Cdigo %c %d %i %e %E %f %g %G Formato Carcter Enteros decimales con signo Enteros decimales con signo Notacin cientfica (e min.) Notacin cientfica (E may.) Coma flotante El ms corto entre %e y %f El ms corto entre %E y %f Cdigo %o %s %u %x %X %p %n %% Formato

printf

Octal sin signo Cadenas de caracteres Enteros decimales sin signo Hexadecimales sin signo (min.) Hexadecimales sin signo (may.) Puntero Argumento asociado es un ptro. Imprime smbolo %

SALIDA FORMATEADA POR PANTALLA:

printf

printf (el dato es % [-] [X] [.Y] [longitud] conversin, dato);

Modificadores Son apndices que se agregan a los especificadores de conversin bsicos para modificar la salida. Se colocan entre el smbolo % y el carcter que define el tipo de conversin:

% [-] [X] [.Y] [longitud] conversin

SALIDA FORMATEADA POR PANTALLA: printf


printf (el dato es % [-] [X] [.Y] [longitud] conversin, dato);

Indica que el tem comience a escribirse empezando por

la izquierda del campo que tenga asignado.

X
Anchura mnima del campo; si no es suficiente se usa

uno mayor.

.Y
Nmero de decimales o mximo nmero de caracteres a

imprimir. Por defecto en punto flotante se usan 6 decimales.


06/04/2014 12:04 Administracin de Sistemas Informticos

SALIDA FORMATEADA POR PANTALLA:


longitud
Si la conversin es un n entero : h trata al argumento como short l trata al argumento como long Si la conversin es un n real: L trata al argumento como long double

printf

printf (el dato es % [-] [X] [.Y] [longitud] conversin, dato);

Consejos.
Para imprimir columnas de datos utilizar campos de

anchura fija lo suficientemente grandes. Cuando un nmero deba aparecer dentro de una frase conviene usar un campo igual o menor que el esperado que eviten blancos innecesarios.
06/04/2014 12:04 Administracin de Sistemas Informticos

EJEMPLO: printf
printf(Ingrese el dato); printf(Ingrese el dato\n); printf(\n); printf(el resultado es %f y %d, y,j); printf(el resultado es %5.3f y %2d, y,j); printf(el resultado es %2c y %d ,c);

ENTRADA FORMATEADA POR TECLADO:

scanf

Permite leer todos los tipos de datos predefinidos y convierte los nmeros automticamente al formato interno apropiado. El prototipo de la funcin scanf() se encuentra en stdio.h.
scanf(<cadena-formato>, <lista-argumentos>);

La cadena-formato determina cmo se deben leer los valores y cmo se almacenan en la variables apuntadas por los argumentos de la lista.

ENTRADA FORMATEADA POR TECLADO: scanf(<cadena-formato>, <lista-argumentos>);

scanf

La cadena de formato est constituida por tres clases de caracteres:


Especificadores de formato. Caracteres de espacio en blanco. Caracteres distintos del espacio en blanco.

La funcin scanf() devuelve el nmero de campos que constituyen la entrada. Especificadores de formato.
Van precedidos por el signo % e indican el tipo de dato

que se va a leer. Se asocian de izquierda a derecha con los argumentos de la lista de argumentos.

ENTRADA FORMATEADA POR TECLADO:

scanf

ENTRADA FORMATEADA POR TECLADO:


scanf

Para un nmero decimal %d o %i . Para un entero sin signo %u. Para un nmero en coma flotante %e, %f o %g. Para enteros en octal y hexadecimal %o y %x. La funcin scanf() detiene la lectura de un nmero cuando encuentra un carcter no numrico. Ejemplo: int aux; float aux1; Scanf(%d %f, &aux,&aux1);

ENTRADA FORMATEADA POR TECLADO: scanf


Lectura de caracteres individuales.
Con scanf() se hace mediante el especificador %c.

Se

pueden leer caracteres individuales utilizando getchar() o una funcin alternativa.

Cuando se leen otros tipos de datos, los espacios en blanco, tabuladores y caracteres de nueva lnea

son separadores de campo. Cuando se lee un nico carcter, los caracteres de espacio en blanco se leen como cualquier otro carcter.

ENTRADA FORMATEADA POR TECLADO: scanf


Para leer una cadena se utiliza el especificador de formato %s. Lee caracteres hasta que encuentre un carcter de espacio en blanco (o similar). Los caracteres se van introduciendo en el array de caracteres y se aade un terminador nulo al resultado. gets() lee una cadena hasta que se introduce un retorno de carro scanf() lee una cadena hasta que se introduce el primer carcter de espacio en blanco.
06/04/2014 12:04 Administracin de Sistemas Informticos

LENGUAJE C: INSTRUCCIONES DE E/S cin cout


cin, que toma caracteres de la entrada estndar (teclado); cout, pone caracteres en la salida estndar (pantalla); Estos objetos se utilizan mediante los operadores << y >>. El operador << se denomina operador de insercin; y apunta al

objeto donde tiene que enviar la informacin.

cout<<variable1<<variable2<<...<<variablen;
No olvidemos que las cadenas de texto son variables y se ponen entre " "

(comillas dobles).

cin>>variable1>>...>>variablen;

< iostream.h>

El operador >> se denomina operador de extraccin, lee informacin

del flujo cin (a la izquierda del operador) y las almacena en las variables indicadas a la derecha). Se encuentran en : iostream.h

LENGUAJE C: INSTRUCCIONES DE E/S


Un ejemplo de cdigo utilizando ambos objetos podra ser el siguiente: #include <iostream.h> // objetivo: demostrar el manejo de cout y cin main () { int i;

cout<<"Introduce un nmero"; cin>>i; ... }

LENGUAJE C: INSTRUCCIONES DE E/S


#include <stdio.h> #include <conio.h> /* manejo de getch(), putchar() */ char letra; int main () { printf("INGRESE UNA CARACTER = "); letra=getch(); // getche() scanf(%c, &letra) printf("\n EL CARACTER INGRESADO ES = "); putchar(letra); // printf( %c ,letra) getchar(); }

DECLARACIN YMANEJO DE CADENAS 1


#include <stdio.h> #include <conio.h> #include <iostream.h> /* ejemplo de manejo de cadenas */ char cadena[]= "esto es una prueba"; int main () { printf("-%s-\n", cadena); printf("-%10s-\n", cadena); printf("-%10.5s-\n", cadena); printf("-%-10.5s-\n", cadena); cout <<cadena <<"\n"; getchar(); }

DECLARACIN Y MANEJO DE CADENAS 2


#include <stdio.h> #include <conio.h> /* ejemplo de manejo de cadenas */ char cadena[20]; int main () { printf("INGRESE UNA CADENA = "); scanf(%s,cadena); printf(%s,cadena); getch(); }

DECLARACIN Y MANEJO DE CADENAS 3


#include <stdio.h> #include <conio.h> /* ejemplo de manejo de cadenas */ char cadena[20]; int main () { printf("INGRESE UNA CADENA = "); gets(cadena); puts(cadena); getch(); }

Recordando: CALIFICADORES DE TIPO


Sirven para dar caractersticas especiales a los objetos

(variables) que estn siendo declarados:


const: se puede inicializar, pero despus no puede

cambiarse el valor volatile: le indica al compilador que su contenido puede variar mas all del flujo del programa (no son optimizables)

EJEMPLOS CONST Y VOLATILE


const double e = 2.7182 ; const char mensaje [] = ERROR; const int hex = 0x80A; /* 2058 en decimal */ const int oct = 012; /* 10 en decimal */ volative int k=2;

ENUMERADOS
Enumeracin: es una lista de valores enteros constantes.
enum dia {LUNES=1, MARTES=2, ...DOMINGO=7} dia k; dia=LUNES; dia=3;

EJEMPLO DE MANEJO TIPOS ENUMERADOS


#include <stdio.h> #include <conio.h> /* ejemplo de manejo de ENUMERADOS */ enum dias {LUNES=1, MARTES,MIERCOLES,JUEVES,VIERNES,SABADO,DOMINGO}; enum dias dia=LUNES; declarando variables main () el inicio y fin {
dia=3; printf("VISUALIZA ENUMERADOS \n\n"); printf(" El valor de DIA=%d\n",dia); visualiza el 3 por que es entero dia=SABADO; printf("El valor de DIA = %d",dia+1); getch(); }

CAPITULO II
OPERADORES Y EXPRESIONES

OPERADORES ARITMTICOS
Operador * / Nombre Multiplicacin Division definicion Multiplica x por y Divide x por y

% + ++ -+

Modulo Suma Susbtraccin Incremento Decremento Negacin Suma unaria

Resto de x dividido y Suma x mas y Resta y de x ++X X++ --X X-Multiplica x por -1

OPERADORES LGICOS
Operador > >= < <= == != Ejemplo x>y x >= y x<y x <= y x == y x != y Definicin 1 si x es mayor que y, en caso contrario es 0 1 si x es mayor o igual a y, en caso contrario es 0 1 si x es menor que y, en caso contrario es 0 1 si x es menor o igual a y, en caso contrario es 0 1 si x es igual que y, en caso contrario es 0 1 si x no es igual que y, en caso contrario es 0

OPERADORES LGICOS
! && || !x x && y x || y 1 si x es 0, en caso contrario es 0 0 si x o y es 0, en caso contrario 1 0 si x e y son 0, en caso contrario 1

MANEJO DE OPERADORES
#include <stdio.h> #include <conio.h> #define PI 3.1415 /* objetivo:ejemplo de manejo de operaores en expresiones fehca: 04-04-2010 */ enum dias {LUNES=1, MARTES,MIERCOLES,JUEVES,VIERNES,SABADO,DOMINGO}; enum dias dia=LUNES; main () { printf("VISUALIZA RESULTADO DE EXPRESIONES\n\n"); printf("El valor de LUNES>MARTES%d\n",LUNES>MARTES); printf("El valor de DIA<MARTES%d\n",dia<MARTES); printf("El valor de !(5<=6)= %d\n",!(5<=6)); printf("El valor de (1<=2)||(3==4) = %d\n",(1<=2)||(3==4)); getch(); }

Existen tres partes donde se puede declarar una variable:

TIPOS DE ALMACENAMIENTO DE VARIABLES


Fuera de todas las funciones incluida la funcin main();

este tipo de variable es global y se puede utilizar en cualquier parte del programa.
Dentro de las funciones; estas variables se denominan

locales y slo se pueden utilizar dentro del bloque en que se declaran.


Como parmetros formales de funciones; se utilizan para

recibir argumentos cuando se invoca a una funcin.

TIPOS DE ALMACENAMIENTO DE VARIABLES


Se refiere alcance y permanencia de la variable dentro

del programa.
Especifica la forma en que se deben almacenar las

variables, siendo los posibles especificadores:

EXTERN, STATIC, AUTO, REGISTER

ALMACENAMIENTO : EXTERN
El lenguaje permite que se enlacen distintos mdulos de

un programa despus independientemente.

de

haber

sido

compilados

Como consecuencia de lo anterior tiene que existir alguna

forma de indicar cules son las variables globales de un programa para que exista una sola copia de las mismas.
La solucin es el especificador extern, que indica que las

variables a las que acompaa se definen en algn otro lugar.

PRUEBA TIPOS DE ALMACENAMIENTO


#include <stdio.h> #include <conio.h> /* objetivo:prueba tipos de almacenamientos fehca: 04-04-2010 */ extern float i=12.0; int prueba () { i=20.0; return 0; } main () { printf("PRUEBA DE TIPOS DE ALMACENAMIENTO\n\n"); printf("El valor de i=%f\n",i); prueba(); printf("El valor de I=%f\n",i); i=34.5 ; prueba(); getch(); }

ALMACENAMIENTO STATIC
Cuando se define como static una variable interna se genera

almacenamiento permanente para ella de tal forma que mantiene su valor entre ejecuciones sucesivas del bloque en que est definida, y su mbito se limita a este bloque.
Cuando se define como static una variable externa se genera

almacenamiento permanente para ella y su mbito se limita al fichero en que est definida.

ALMACENAMIENTO STATIC
#include <stdio.h> #include <conio.h> /* objetivo:prueba tipos de almacenamientos fehca: 04-04-2010 extern int j=12; int prueba () { static int j=20; printf("El valor de funcion j=%d\n",j); j++; return 0; } main () { printf("PRUEBA DE TIPOS DE ALMACENAMIENTO\n\n"); printf("El valor del programa j=%d\n",j); prueba(); prueba(); printf("El valor del programa j=%d\n",j); getch(); } */

ALMACENAMIENTO AUTO
Las variables (locales) automticas se crean cada vez

que se entra en el bloque en el que han sido definidas y desaparecen cuando se sale de l
No conservan su valor de una ejecucin del bloque a la siguiente, y slo son accesibles en el interior del bloque en el que se definen. Una variable por defecto se toma por auto.

ALMACENAMIENTO AUTO
#include <stdio.h> #include <conio.h> /* objetivo:prueba tipos de almacenamientos int j=12; fehca: 04-04-2010 */

int prueba () { auto int j=20; printf("El valor de funcion j=%d\n",j); j++; return 0; } main () { printf("PRUEBA DE TIPOS DE ALMACENAMIENTO\n\n"); printf("El valor del programa j=%d\n",j); prueba(); prueba(); printf("El valor del programa j=%d\n",j); getch(); }

ALMACENAMIENTO REGISTER
Cuando a una variable se aade el especificador register se indica al compilador que la almacene en algn registro de la CPU. El especificador register slo se puede aplicar a variables automticas, o a los parmetros formales

de una funcin.
Cuando las variables declaradas como register no se pueden almacenar en registros de la CPU se toman por auto y se almacenan en memoria. Dado que el acceso a variables de este tipo es muy rpido son ideales para el control de bucles

GENERALIDADES
Las variables estticas y externas se inicializan una

nica vez al comienzo del programa; si no se inicializan explcitamente se inicializan a 0.


Las variables automticas y de clase register se

inicializan cada vez que se ejecuta el bloque donde estn definidas. Si la inicializacin no es explcita, se inicializan con valores indefinidos (basura)

EXPRESIONES CONDICIONALES
expresin1 ? expresin2 : expresin3
Se evala expresin1 y si es distinta de 0 (true) el resultado de la expresin condicional es expresin2. Si el resultado de expresin1 es 0 (false) el resultado es expresin3.
Se asigna al identificador de la izquierda el valor de la expresin condicional.
min = ( f < g ) ? f : g;

EJEMPLO USO EXPRESIONES CONDICIONAL


ELABORE UN PROGRAMA QUE INGRESADO TRES NMERO EN LAS VARIABLES A,B,C SIEMPRE SE CUMPLA QUE A<B<C
#include <stdio.h> main() { int a,b,c,aux; char pausa; printf("INGRESE A B C \n"); EJECUTANDO scanf("%d %d %d",&a,&b,&c); printf(" a=%d b=%d c=%d \n",a,b,c); (a>b)? (aux=a, a=b, b=aux): a=a; (a>c)? (aux=a, a=c, c=aux):a=a ; (b>c)? (aux=b, b=c, c=aux):a=a ; printf(" a=%d b=%d c=%d",a,b,c); scanf(" %c",&pausa); }

PRECEDENCIA DE OPERADORES
Precedencia
( ) [ ] -> . - ! ++ -- (tipo) & sizeof * * / % + -

Asociatividad I-D D-I I-D I-D I-D

<< >> < <= > >=

I-D I-D I-D

== != & (and a nivel de bits)

PRECEDENCIA DE OPERADORES
Precedencia
^ (or exclusiva a nivel de bits) | (or a nivel de bits) && || ? : (operador condicional) = += -= *= /= %= >>= <<= &= ^= |= ,

Asociatividad I-D I-D I-D I-D D-I D-I I-D

CONVERSIONES DE TIPOS
En

cualquier operacin en que se mezclan operandos de diferentes tipos se produce una conversin del tipo inferior al tipo superior antes de efectuarse la operacin, siendo este ltimo el tipo del resultado.

El rango o categora de tipos de mayor a menor es: double, float , long, int, short, char En una sentencia de asignacin, el resultado final de

los clculos se reconvierte al tipo de la variable a la que van a ser asignados.

CONVERSIONES DE TIPOS: OPERADOR DE MOLDEADO


El operador de moldeado (o cast) sirve para forzar

conversiones explcitas del tipo de una expresin.


Su sintaxis es: ( tipo de datos ) expresin .

El resultado de la expresin se convierte al tipo de datos

especificado entre parntesis.


Tiene la misma precedencia que el resto de los

operadores unarios.
Ejemplo:

(int) 4.5/6.4

(float) 5/4

CONVERSIONES DE TIPOS: ADVERTENCIAS


Una asignacin que implica una conversin de tipos

conlleva una promocin o prdida de rango del valor asignado, segn el tipo de la variable a la que se asigna.
La promocin suele ser inocente, suele pasar inadvertida.
La prdida de rango puede provocar autnticas catstrofes

CONVERSIN DE TIPOS 1
Para Obtener
char char char char

Desde
unsigned char short int int long int

Observaciones
Si el valor > 127, el resultado es negativo Se pierden los 8 bits ms significativos Se pierden los 8 bits ms significativos Se pierden los 24 bits ms significativos

short int
int

long int
float

Se pierden los 16 bits ms significativos


Se pierde la parte fraccionaria (resultado indefinido si el valor no se ajusta al rango de int) Se redondea o se trunca, dependiendo de la implementacin, segn la precisin del resultado (resultado indefinido si el valor no se ajusta al rango de float)

float

double

CONVERSIONES DE TIPOS 2
Para Obtener Desde Valor Resultado

unsigned unsigned
int int long long unsigned unsigned

short short
unsigned unsigned unsigned unsigned long long

positivo negativo

no cambia depende de la representacin

dentro del rango no cambia del int


fuera del rango dentro del rango fuera del rango positivo negativo depende de la representacin no cambia depende de la representacin no cambia depende de la representacin

EVALUAR LAS SIGUIENTES EXPRESIONES:


a) 3*12/16*12- int(4) b) (13+5.6-8)*-1 c) int (44.6-16.8+5)/3 d) +45/5%5%12 e) sqrt(56-+12+3) f) 3.0+6/8*2-4 g) int(12.2*.5)%C h) 'c'-'a'+'f'
a) ES DE TIPO ENTERO ( 20) b) ES DE TIPO REAL (10.6) c) ES DE TIPO ENTERO (10) d) ES DE TIPO ENTERO (4) e) ES DE TIPO REAL (6.855655) f) ES DE TIPO REAL (-1.0) g) ES DE TIPO ENTERO (6) h) ES DE TIPO CHAR (h)

FUNCIONES DE BIBLIOTECA 1

FUNCIONES DE BIBLIOTECA 2

FUNCIONES DE BIBLIOTECA 3

FUNCIONES DE BIBLIOTECA 4

FUNCIONES DE BIBLIOTECA 5

FUNCIONES DE BIBLIOTECA 6

EJERCICIO 1: DETERMINE EL VALOR RESULTANTE DE CADA UNA DE LAS SIGUIENTES EXPRESIONES ARITMTICAS:
a) 2+3+45/23 b) 24+12*5/6 c) 16/.5-12 d) 45.8/3 e) 16+ int(34) f) 3.0+6/8*2-4 g) 12%int(2*A/2) h) 8+a-34/2
a) = 6 b) = 34 c) = 20.0 d) = 15.266667 e) = 50 f) = -1.0 g) = 12 h) = 88

EJERCICIO 2:CONSIDERANDO LAS VARIABLES a=12, b=4.0 Y c=2 OBTENGA EL VALOR QUE GENERA CADA UNA DE LAS SIGUIENTES EXPRESIONES ARITMTICAS:

a) ++a+--b b) -a+--c c) a<12 && c>1.5 d) c!=45 || b/3 >= 2.5 e) 2*a+(a==12)*c f) !(48!=a*int(12/3)) g) c*sqrt(int(b)/2) h) 5*c!=20/a==b/2 >3/.5

= 16.0 = 37 =0 =1 = 73 =1 = 69.296 =0

EJERCICIO 2:DETERMINE EL RESULTADO DE LAS SIGUIENTES EXPRESIONES QUE COMBINAN FUNCIONES DE BIBLIOTECA:

a) abs(45.5)- abs(-45.7) b) sqrt(4/78.9/4) c) isdigito(c) d) pow(34%4, 45/8-4) e) floor((4.9*5)/45%13) f) toascii(65+5/4) g) ceil(abs(8-12.16)+7%2) h) exp(short(6*(4%5)/9))

=0 =0.112580 =1 =2.0 =4.0 =B =5.0 =148.413159

CAPITULO III INSTRUCCIONES DE CONTROL


IF ELSE

SWITCH
WHILE DO WHILE

FOR
BREAK Y CONTINUE GOTO Y ETIQUETA

IF ELSE
if ( Condicin) sentencia V; else sentencia F;

IF ELSE
if ( Condicin) sentencia V;

IF ELSE
if (expresin) { sentencia V1; sentenciaV2; } else { sentencia F1; sentencia F2; }

IF ELSE
if (expresin) { sentencia V1; sentenciaV2; }

SWITCH
switch(expresin) { case <const1>: { sentencias; break; } case <cten>: { sentencias; break; }

default: { senten def; break; }

WHILE
while (condicin) { Bloque (modifica condicin) }

DO WHILE
do {
Bloque (modifica condicin)

} while (condicin);

FOR
For (exp1;expr2;exp3) { Bloque }
exp1 : Expresin que sirve para la Inicializacin de variables. exp2 : Es la expresin que se ha de cumplir para ejecutar las iteraciones. exp3 : Sirve para modificar las variables contadoras de iteraciones

EJEMPLO CON WHILE


#include <stdio.h> #include <conio.h> #include <math.h> #include <windows.h> #include <iostream.h> //***************************************** // Objetivo: INVERTIR UN ENTERO USANDO WHILE // fecha: 28-04-2010 //***************************************** main() { int digito=0, numero=0, n, potencia=10; char continuar='S'; while (continuar=='S') { numero=0 ; clrscr(); cout<<"\nINVIERTE UN ENTERO \n";

do { cout<<"\nINGRESE EL NUMERO (N >0) ="; cin>>n; } while(n<0); while ( n>0) { digito=n%10; numero=(numero*potencia+digito); n=n/10; } cout<<" EL NUMERO INVERTIDO ES= " << numero; cout<<"\nREPETIR CALCULO (S/N)"; continuar=toupper(getch()); } }

EJEMPLO CON DO WHILE


#include <stdio.h> #include <conio.h> #include <math.h> #include <windows.h> #include <iostream.h> // Objetivo: INVERTIR UN NUM ENT CON DO WHILE main() { int digito=0,numero, n,potencia=10; char continuar; do { numero=0; clrscr(); cout<<"\nINVIERTE UN NUMERO ENTERO \n"; do { cout<<"\nINGRESE EL NUMERO (N >0) ="; cin>>n; if (n<=0) cout<< "ERROR: EL NUMERO DEBE SER MAYOR A CERO!!!\n"; } while(n<=0); do { digito=n%10; numero=(numero*potencia+digito); n=n/10; } while ( n>0); cout<<" EL NUMERO INVERTIDO ES= " << numero; cout<<"\nREPETIR CALCULO (S/N)"; continuar=toupper(getch()); } while (continuar=='S'); }

EJEMPLO CON FOR


#include <stdio.h> #include <conio.h> #include <math.h> #include <windows.h> #include <iostream.h> // Objetivo: CALCULA EL FACTORIAL CON FOR // fecha: 28-04-2010 main() { long numero, i,factorial; char continuar; do { factorial=1; clrscr(); cout<<"\nCALCULA EL FACTORIAL \n"; do { cout<<"\nINGRESE EL NUMERO (N >=0) ="; cin>>numero; if (numero<0) cout<< "ERROR: EL NUMERO DEBE SER POSITIVO!!!\n"; } while(numero<0); for (i=1; i<=numero;i++) factorial=factorial*i; cout<<" EL FACTORIAL DE " << numero << " ES = " << factorial; cout<<"\nREPETIR CALCULO (S/N)"; continuar=toupper(getch()); } while (continuar=='S'); }

MANEJO DEL FOR


#include <stdio.h> #include <conio.h> #include <math.h> #include <windows.h> #include <iostream.h> //******************************************************* // Objetivo: MANEJO DEL FOR // fecha: 28-04-2010 //****************************************************** main() { long numero, i,j; char continuar; do { clrscr(); cout<<"\nMANEJO DEL FOR \n"; cout<<"\nINGRESE UN NUMERO (N >=0) ="; cin>>numero; cout<<"VALOR DE I VALOR DE J\n"; cout<<" ---------- -----------\n"; for (i=1,j=numero; i<=numero;i++,j--) { cout<< i <<" " <<j << "\n"; } cout<<"\nREPETIR PROCESO (S/N)"; continuar=toupper(getch()); } while (continuar=='S'); }

EJECUTANDO

EJEMPLO SWITCH
#include <stdio.h> #include <ctype.h> #include <string.h> /* Objetivo: ESCRIBIR EL DIA DE LA SEMANA MANEJO DE SWITCH */ char continuar='S'; char pdia[13], orden[]=" "; int dia; main() { printf("ESCRIBE EL DIA DE LA SEMANA \n\n"); while (toupper(continuar)=='S') { printf("INGRESE EL NUMERO DEL DA (1<=X<=7) : "); scanf("%d",&dia);

switch (dia) { case 1: { strcpy(pdia," ES LUNES"); strcpy(orden,"er."); break; } case 2: { strcpy(pdia,"ES MARTES"); strcpy(orden,"do."); break; }

case 3: { strcpy(pdia,"ES MIERCOLES"); strcpy(orden,"er."); break; } case 4: { strcpy(pdia,"ES JUEVES"); strcpy(orden,"to."); break; } case 5: { strcpy(pdia,"ES VIERNES"); strcpy(orden,"to."); break; } case 6: { strcpy(pdia,"ES SABADO"); strcpy(orden,"to."); break; } case 7: {strcpy(pdia,"ES DOMINGO");strcpy(orden,"mo."); break; } default: { strcpy(pdia,"NO !!EXISTE!!"); break; } } printf("\nEL %d%s DIA DE LA SEMANA %s",dia,orden,pdia); printf("\n\nDESEA INGRESAR NUEVOS DATOS (S/N) ? "); scanf(" %c",&continuar); strcpy(orden," "); }}

EJECUTANDO

EJEMPLO SWITCH
. int esvocal; char letra; cin >> letra; switch(letra) { case 'a': case 'e': case 'i': case 'o': case 'u': esvocal = 1; break; default: esvocal = 0; }

GOTO ETIQUETA
La instruccin goto permite pasar a ejecutar el cdigo a partir de una instruccin cuya etiqueta se indica en el goto. La sintaxis de uso de esta instruccin es: goto <etiqueta>; <etiqueta>:

GOTO ETIQUETA

#include <stdio.h> #include <ctype.h> #include <iostream.h> /* Objetivo: MANEJO GOTO */ int main() { char opcion; arriba: // etiqueta cout << "MANEJO DE ETIQUETAS" << endl; cout << endl; cout << "QUIERES SALIR? (Y/N)"; cin >> opcion; if (opcion == 'N') goto arriba; // salta a etiqueta arriba return 0; }

EJECUTANDO

CAPITULO IV FUNCIONES Y ESTRUCTURA DE UN PROGRAMA


QUE ES UNA FUNCIN DEFINICIN DE UNA FUNCIN

ACCESO A UNA FUNCIN


TIPOS DE PARMETROS PROTOTIPO DE FUNCIN

RECURSIVIDAD

QUE ES UNA FUNCIN


Adems de las funciones de biblioteca, el

programador puede definir sus propias funciones que realicen determinadas tareas.

El uso de funciones definidas por el

programador permite dividir un programa grande en varios pequeos.


mediante el uso inteligente de las funciones. repetir las mismas instrucciones de forma redundante. de una lista de argumentos entre parntesis.

Un programa en C se puede modular

El uso de funciones evita la necesidad de

Una funcin se invoca al nombrarla, seguida

DEFINICIN DE UNA FUNCIN


<tipo> <nombre> ( [Parmetros] ) { <cuerpo> } EJEMPLO 1 // regresar el cuadrado de un nmero double cuadrado(double n) { return (n*n); } EJEMPLO 2 // regresar el cuadrado de un nmero double cuadrado(double n) { n*=n; return n; }

ACCESO A UNA FUNCIN


Una vez que en su programa se ha definido una funcin, esta puede ser llamada las veces que sean necesarias.

<nombre> ( [Parmetros] )
Por ejemplo:
cout << cuadrado(25); cout << cuadrado(X); R = cuadrado(X); // guardar en R el cuadrado de X

TIPOS DE PARMETROS
PARMETRO POR VALOR O COPIA El mismo puede pasarse como una constante literal o como una variable No pueden ser alterados por la funcin que los recibe, es decir, la funcin puede manipular a su antojo al parmetro, pero ningn cambio hecho sobre este se reflejar en el parmetro original.
Ejemplo

// regresar el cuadrado de un nmero double cuadrado(double n) { n*=n; return (n); }

x=cuadrado(25); r=cuadrado(x);

PARMETROS POR REFERENCIA


PARMETROS POR REFERENCIA No se les podr pasar valores literales ya que las referencias apuntan a objetos (variables o funciones) residentes en la memoria . Estos pueden ser alterados por la funcin que los reciba.
Ejemplo:
// regresar el cuadrado de un nmero double cuadrado(double &n) { n*=n; return (n); } r=cuadrado(x);

IMPLEMENTACIN
#include <stdio.h> #include <conio.h> // Objetivo: MANEJO DE FUNCIONES int numero1,numero2,n; cuadrado(int n) { n*=n; return(n); } main() { printf("MANEJO DE FUNCIONES\n"); printf("INGRESE EL NUMERO:"); scanf("%d",&n); numero1=cuadrado(n); printf("\nEL CUADRADO DE %d ES %d",n,numero1); printf("\nEL CAUDRADO DE %d ES %d",n,cuadrado(n)); printf("\nEL CAUDRADO DE %d ES %d",n,numero2=cuadrado(n)); printf("\nEL CAUDRADO DE 2 ES %d",2+cuadrado(2)); printf("\nEL CAUDRADO DE %d MENOS %d ES %d ",n,n,cuadrado(n)-n); printf("\n\nUNA TECLA PARA CONTINUAR "); getche(); }

EJECUTANDO

PROTOTIPO DE FUNCIONES
#include <stdio.h> #include <conio.h> // Objetivo: MANEJO DE FUNCIONES; int numero1,numero2,n; cuadrado(int n); main() { printf("MANEJO DE FUNCIONES\n"); printf("INGRESE EL NUMERO:"); scanf("%d",&n); numero1=cuadrado(n); printf("\nEL CUADRADO DE %d ES %d",n,numero1); printf("\nEL CAUDRADO DE %d ES %d",n,cuadrado(n)); printf("\nEL CAUDRADO DE %d ES %d",n,numero2=cuadrado(n)); printf("\nEL CAUDRADO DE 2 ES %d",2+cuadrado(2)); printf("\nEL CAUDRADO DE %d MENOS %d ES %d ",n,n,cuadrado(n)-n);

EJECUTANDO

printf("\n\nUNA TECLA PARA CONTINUAR "); getche(); } cuadrado(int n) { n*=n; return(n); }

EJEMPLO: ENCUENTRA EL MAYOR DGITO QUE TIENE UN NMERO ENTERO (CON FUNCIONES)
#include <stdio.h> #include <ctype.h> EJECUTANDO // Objetivo: DETERMINAR EL DIGITO MAYOR DE UN NUMERO int numero; char continuar='s'; int digitomayor(int numero) { int digito=0; while (numero>0) { if (digito< numero%10) digito=numero%10; numero=numero/10; } return(digito); } main() { printf("ENCUENTRA DGITO MAYOR DE UN NUMERO USANDO FUNCIONES\n"); while (toupper(continuar)=='S') { printf("INGRESE EL NUMERO: "); scanf("%d",&numero); printf("EL DIGITO MAYOR DE %d ES %d ",numero, digitomayor(numero)); printf("\n\n EJECUTAR NUEVAMENTE (S/N) ? "); scanf(" %c",&continuar); }}

EJEMPLO: ENCUENTRA EL MAYOR DGITO QUE TIENE UN NMERO ENTERO ( CON PROTOTIPO DE FUNCIN)
#include <stdio.h> #include <ctype.h> // Objetivo: DETERMINAR EL DIGITO MAYOR DE UN NUMERO int digitomayor(int numero); int numero; char continuar='s'; main() { printf("ENCUENTRA DGITO MAYOR DE UN NUMERO USANDO FUNCIONES\n"); while (toupper(continuar)=='S') { printf("INGRESE EL NUMERO: "); scanf("%d",&numero); printf("EL DIGITO MAYOR DE %d ES %d ",numero, digitomayor(numero)); printf("\n\n EJECUTAR NUEVAMENTE (S/N) ? "); scanf(" %c",&continuar); }} int digitomayor(int numero) { int digito=0; while (numero>0) { if (digito< numero%10) digito=numero%10; numero=numero/10; } return(digito); }

EJECUTANDO

Intercambiar valores sin auxiliar


A=3

B=4

1) 2) 3)

A= A+B B=A-B A=A-B

A=3+4=7 A=7 B=4 B=7-4=3 A=7 B=3 A=7-3 = 4 A=4 B=3

PRCTICA: REALICE UN PROGRAMA CON FUNCIONES QUE:


MULTIPLIQUE DOS NMEROS ENCUENTRE EL MAYOR DE TRES NMEROS INVIERTA UN NMERO ENTERO X=INVNUM(345) => X= 543 CUENTE CUANTOS DGITOS PARES TIENE UN NMERO P=DIGPAR(7654)=> P= 2

Ejemplo: INTERCAMBIAR DOS VALORES CON FUNCIONES


EJECUTANDO EJECUTANDO
#include <stdio.h> #include <conio.h> #include <iostream.h> cambia(int a1, int b1) { int cambio; cambio=a1; a1=b1; b1=cambio; return(0); } main() { int a, b; cout<<"INGRESE EL VALOR DE A = " ; cin >> a; cout<<"INGRESE EL VALOR DE B = " ; cin >>b; cambia(a,b); cout<<"EL VALOR DE A ES= " <<a<<endl; cout<<"EL VALOR DE B ES= " <<b<< endl; getche(); } #include <stdio.h> #include <conio.h> #include <iostream.h> cambia(int *a1, int *b1) { int cambio; cambio=*a1; *a1=*b1; *b1=cambio; return(0); } main() { int a, b; cout<<"INGRESE EL VALOR DE A = " ; cin >> a; cout<<"INGRESE EL VALOR DE B = " ; cin >>b; cambia(&a,&b); cout<<"EL VALOR DE A ES= " <<a<<endl; cout<<"EL VALOR DE B ES= " <<b<< endl; getche(); }

RECURSIVIDAD

La Matrioshka es una artesana tradicional rusa (1890)

Qu es la recursividad?
La recursividad es un concepto fundamental en matemticas y en computacin. Es una alternativa diferente para implementar estructuras de repeticin (ciclos). Los mdulos se hacen llamadas de si mismos. Se puede usar en toda situacin en la cual la solucin pueda ser expresada como una secuencia de movimientos, pasos o transformaciones gobernadas por un conjunto de reglas no ambiguas.

Funcin recursiva
Las funciones recursivas se componen de:

Caso base: una solucin simple para un caso particular (puede haber ms de un caso base). Ejemplo : Factorial N=5 F= 5*4*3*2*1 caso base: Nmero=1 f=1

Funcin recursiva
Caso recursivo: una solucin que involucra volver a utilizar la funcin original, con parmetros que se acercan ms al caso base. Los pasos que sigue el caso recursivo son los siguientes:

El procedimiento se llama a s mismo El problema se resuelve, resolviendo el mismo problema pero de tamao menor La manera en la cual el tamao del problema disminuye asegura que el caso base eventualmente se alcanzar
Ejemplo: Factorial F= n! n!= n* (n-1)!

CONSIDERACIONES RECURSIVIDAD
Una funcin es recursiva cuando se define en funcin de si

misma.
Deben estar diseadas especialmente para que sean

recursivas, de otro modo podran conducir a bucles infinitos, o a que el programa termine Inadecuadamente.
NO TODOS LOS LENGUAJES DE PROGRAMACIN

permiten usar recursividad. (C++ permite la recursividad).

CONSIDERACIONES RECURSIVIDAD
Cada vez que se llama a una funcin, se crea un juego de variables locales, de este modo, si la funcin hace una llamada a si misma, se guardan sus variables y parmetros, usando la pila, y la nueva instancia de la funcin trabajar con su propia copia de las variables locales. Cuando esta segunda instancia de la funcin retorna, recupera las variables y los parmetros de la pila y continua la ejecucin en el punto en que haba sido llamada.
Caso simple (su respuesta no requiere clculo)

Var

Var

Var

Var

Var

Var

RECURSIVIDAD: Factorial
n! = n * (n-1) * (n-2) * (n-3) .. * 1 5! = 5 * 4 * 3 * 2 * 1
n! = n* (n-1)! 5! = 5 * 4!

(n-1)!=(n-1)*(n-2)!
(n-2)!=(n-2)*(n-3)! (n-3)!=(n-4)*(n-5)! (n-5)!=1

4! = 4 * 3!
3! = 3 * 2! 2! = 2 * 1! 1! = 1

120 24 6 2 1

RECURSIVIDAD: Factorial
#include <conio.h> #include <iostream.h> // CALCULA EL FACTORIAL DE N double factorial(double n) { double f=1.0; if( n>1) f=n*factorial(n-1); return(f); } main() { double n,f; cout<<"CALCULA EL FACTORIAL" ; cout<<"INGRESE EL NUMERO = " ; cin >>n; f= factorial(n); cout<<"EL FACTORIAL DE "<< n << " ES= " <<f<<endl; getche(); }

EJECUTANDO

EJERCICIOS:
1. FUNCIN RECURSIVA QUE SUME LOS DGITOS DE UN NMERO ENTERO 2. FUNCIN RECURSIVA QUE LEA UNA LNEA DE TEXTO Y ESCRIBA LOS CARACTERES EN ORDEN INVERSO

3. INVIERTA UN NMERO ENTERO POSITIVO CON EL USO DE FUNCIONES RECURSIVAS.

INVIERTE UNA CADENA EN FORMA RECURSIVA


invierte (char cadena)
{ if ((cadena=getchar())!='\n')

invierte(cadena); putchar(cadena); }

CAPITULO V: PUNTEROS
DECLARACIN DE PUNTEROS
PASO DE PUNTEROS A UNA FUNCIN PUNTEROS Y FORMACIONES OPERACIONES CON PUNTEROS

Qu es un PUNTERO?
Un puntero es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la direccin de memoria de otra variable.
No hay que confundir una direccin de memoria con el contenido de esa direccin de memoria. int x = 25;
Direccin 1502 1504 1506 1508 1510 1512

...

...

25

...

...

...

...

La direccin de la variable x (&x) es 1502 El contenido de la variable x es 25

DECLARACIN DE PUNTEROS
Deben de ser declarados antes de que puedan ser

utilizados. El tipo de un apuntador lo proporciona implcitamente el tipo de la variable a la que apunta. La sintaxis general de declaracin es: <tipo> * <variable> = <expresin>; Ejemplos: int *ptr, var; float *res=1.0; unsugned int *nosigno; char *mensaje =ESTO ES VERDAD;

LOS OPERADORES: Operador de direccin &


Operador unario que regresa la direccin de su operando Ejemplo: #include <stdio.h> #include <conio.h> int main() { int y; int *yPtr; y = 5; yPtr = &y; printf("Valor de y: %d \n", y); printf("Valor de yPtr: %d \n",yPtr); getche(); }
EJECUTANDO

LOS OPERADORES: Operador de direccin &


Operador unario que regresa la direccin de su operando Ejemplo: #include <stdio.h> #include <conio.h> int main() { int y; int *yPtr; y = 5; yPtr = &y; printf("Valor de y: %d \n", y); printf("Valor de yPtr: %d \n",yPtr); getche(); }
EJECUTANDO

LOS OPERADORES: indireccin (CONTENIDO) *


Regresa el valor del objeto hacia el cual su operando apunta. #include <stdio.h> EJECUTANDO #include <conio.h> #include <stdlib.h> main() { int x,y; int *py; y = 5; py=&x; *py = y; x = *py + 5; printf("Valor de x: %d y de y: %d \n",*py,x); getche(); }

LECTURA Y ESCRITURA DE PUNTEROS


#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <iostream.h> int main( ) { int *pn; pn= (int*) malloc(1*sizeof(int)); cout<<"LEE Y VISUALIZA PUNTEROS"<<endl; scanf("%d",pn); printf("%d",*pn); getche(); }

PASO DE PUNTEROS A UNA FUNCIN


#include <stdio.h> #include <conio.h> #include <iostream.h> // Objetivo: MANEJO PUNTEROS; void intercambia(n1,n2) int *n1,*n2; { int aux; aux=*n1; *n1=*n2; *n2=aux; } main() { int n1,n2; printf("MANEJO DE PUNTEROS EN FUNCIONES\n"); printf("INGRESE EL NUMERO1:"); scanf("%d",&n1); printf("INGRESE EL NUMERO2:"); scanf("%d",&n2); intercambia(&n1,&n2); printf("\n VALOR 1= %d VALOR 2=%d ",n1,n2); getche(); } EJECUTANDO

FORMACIONES (ARREGLOS, VECTOR)


Coleccin ordenada de elementos de un mismo tipo.
Ordenada significa que cada elemento tiene una ubicacin

determinada dentro del arreglo y debemos conocerla para accederlo.

<tipo> <variable>[<dimensin>] = {<valores>};


Ejemplos: int x[10]={2,-5,10,3,42,7,8,-34,6,15}; float v1[20]; char mensaje[] =ESTO ES VERDAD; char s[20] = {'H', 'o', 'l', 'a', '\0'};

MANEJO DE ARREGLOS
ASIGNACIN: <n_variable>[ndice] = <expresin del tipo>; Ejemplo: v[i]=v[i-1]+4; LECTURA: En C el ndice de los elementos va desde 0 hasta N-1, siendo N scanf(%<>, <nvariable>[ndice]); el nmero de componentes (elementos) del vector. cin>> <nvariable>[ndice]; Ejemplo: scanf(%d,v[i++]); cin>>v[i]; ESCRITURA: printf(%<>, <nvariable>[ndice]); cout<< Declaracin: int v[3]; Ejemplo: printf(%d,v[i]); cout<<v[i]<<endl;

PASO DE VECTORES A FUNCIONES: EJEMPLO


#include <stdio.h> #include <ctype.h> // Objetivo: ORDENA UN VECTOR EN FORMA //ASCENDENTE

visualizar(int vector[ ], int n)


{ int i; for (i=0; i<n;i++) printf("V[%d]: %d\n", i,vector[i]); return 0; }

main() EJECUTANDO { char continuar='S'; int i,n, vector[80]; printf("ORDENA UN VECTOR EN FORMA ASCENDENTE\n"); do { printf("\n CUANTOS ELEMENTOS TIENE EL VEC?: "); scanf("%d",&n); for (i=0; i<n;i++) { printf("INGRESE EL ELEMENTO V[%d]: ", i); scanf("%d",&vector[i]); }

ordenar(int vector[ ], int n)


{ int i,j,aux; for (i=0; i<n;i++) for (j=i; j<n;j++) if (vector[i]>vector[j]) { aux=vector[i]; vector[i]=vector[j]; vector[j]=aux; } return 0; }

ordenar(vector, n); visualizar(vector,n);

printf("\n\n EJECUTAR NUEVAMENTE (S/N) ? "); scanf(" %c",&continuar); } while(toupper(continuar)=='S'); }

OPERACIONES CON PUNTEROS Y EQUIVALENCIAS COMO ARREGLOS


declaracin: v[o] = v[1] = v[2] = v[i-1] = v[i++] = scanf(%d, &v[i]); = cout<< v[i]; = cint>>v[i]; = int v[12]; *v *(v+1) *(v+2) *(v+i-1) *(v+i++) *(v++) scanf(%d,(v+i)); cout<<*(v+i); cint>>*(v+i);

PUNTEROS Y ARREGLOS EJEMPLO


#include <stdio.h> #include <ctype.h> #include <stdlib.h> // Objetivo: ORDENA UN VECTOR EN FORMA //ASCENDENTE main() { char continuar='S'; int i,n, *vector;

EJECUTANDO

visualizar(int *vector, int n)

{ int i; for (i=0; i<n;i++) printf("V[%d]: %d\n", i,*(vector+i)); return 0; }

ordenar(int *vector, int n)


{ int i,j,aux; for (i=0; i<n;i++) for (j=i; j<n;j++) if (*(vector+i)>*(vector+j)) { aux=vector[i]; *(vector+j)=aux; }

*(vector+i)=*(vector+j);

printf("ORDENA UN VECTOR EN FORMA ASCENDENTE\n"); do { printf("\n CUANTOS ELEMENTOS TIENE EL VEC ?: "); scanf("%d",&n); vector=(int *) malloc(n*sizeof(int)); for (i=0; i<n;i++) { printf("INGRESE EL ELEMENTO V[%d]: ", i); scanf("%d",(vector+i)); } ordenar(vector, n); visualizar(vector,n); printf("\n\n EJECUTAR NUEVAMENTE(S/N) ? "); scanf(" %c",&continuar); } while(toupper(continuar)=='S'); }

return 0; }

OPERACIONES CON PUNTEROS


#include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <iostream.h> // Objetivo: NUEVA FORMA DE // MANEJAR VECTORES main() { char continuar='S'; for (i=0; i<n;i++) { printf("INGRESE EL ELEMENTO V[%d]: ", i);

cin>>i[vector]; } for (i=0; i<n;i++) { printf(" V[%d]: ", i); cout<<i[vector]<<endl;


} printf("\n\n EJECUTAR NUEVAMENTE EL PROGRAMA (S/N) ? "); scanf(" %c",&continuar);

int i,n, vector[12]; printf("LEE VECTOR\n"); do { printf("\n CUANTOS ELEMENTOS TIENE EL VECTOR ?: "); scanf("%d",&n);

} while(toupper(continuar)=='S'); }
EJECUTANDO

VECTORES DE CARACTERES
char cadena[20]; Scanf (%scadena); gets(cadena); cin>>cadena;

char cadena[20]; For (i=0;i<n, i++) { scanf (%c,&cadena[i]); candena[i]=getchar(); cin>>cadena[i]; }

EJERCICIOS
REALICE UN PROGRAMA QUE LEA UNA CADENA

DE CARACTERES Y LA ORDENE REALICE UN PROGRAMA QUE LEA N NUMERO DE NOTAS (ENTRE 0 Y 20) LAS ORDENE Y ENCUENTRE CUANTAS VECES SE REPITEN LOS VALORES INGRESADOS EJEMPLO: N= 6 1, 12, 10, 12, 13, 15 => 1,10,12,12,13,15 EL 1 SE REPITE 1 VEZ EL 10 SE REPITE 1 VEZ EL 12 SE REPITE 2 VECES, ETC.

main() {

REGISTROS
// ARREGLOS DE VARIABLES REGISTROS struct libros { char titulo[20]; char autor[15]; char editorial[5]; int anio; float valor; };

struct libros alibros[20];


int i,n; char continuar='S'; do { printf("MANEJA DATOS SOBRE LIBROS EN ARREGLOS DE REGISTRO \n"); do { printf("\n INGRESE EL NMERO DE LIBROS A REGISTRAR (N>0) = "); scanf("%d", &n); } while(n<=0); for (i=0;i<n; i++) { printf("\n INGRESE LOS DATOS DEL LIBRO No.%d\n", i+1); printf("\nTTULO: "); scanf("%s", &alibros[i].titulo); printf("\nAUTOR: "); scanf("%s", &alibros[i].autor); printf("\nEDITORIAL: "); scanf("%s", &alibros[i].editorial); printf("\nAO: "); scanf("%d", &alibros[i].anio); printf("\nVALOR: "); scanf("%f", &alibros[i].valor); clrscr(); } printf("%3s %20s %15s %5s %4s %s\n","No.","TTULO","AUTOR","EDI.","AO", "VALOR"); printf("_________________________________________________________\n"); for (i=0; i<n; i++) printf("%3d %20s %15s %5s %4d %5.2f\n",i+1, alibros[i].titulo, alibros[i].autor, alibros[i].editorial, alibros[i].anio,alibros[i].valor); printf("\n\EJECUTAR NUEVAMENTE (S/N) ? "); scanf(" %c",&continuar);} while(toupper(continuar)=='S');}

REGISTROS EN FUNCIONES
ordenaregistro(struct libros vector[],int n) { int i,j; struct libros aux; for (i=0; i<n;i++) for (j=i; j<n;j++) if (strcmp(vector[i].titulo,vector[j].titulo)>=0) { aux=vector[i]; vector[i]=vector[j]; vector[j]=aux; } return 0; }

#include <stdio.h> #include <conio.h>

// Objetivo: DETERMINAR EL MANEJO DE LAS UNIONES EN C

UNIONES
#include <stdio.h> #include <conio.h>
DETERMINAR EL MANEJO DE LAS UNIONES EN C

union tiposdedatos
{ int entero; float real; char caracter; char arreglo[15]; };

visualizar(union tiposdedatos prueba)


{ clrscr(); printf("\n\nMUESTRA EL CONTENIDO DE LOS CAMPOS DE LA VARIABLE UNIN \n"); printf(" AL IR INGRESADO INFORMACIN ORENADAMENTE\n"); printf(" ________________________________________\n"); printf(" 1. CAMPO ENTERO : %d\n",prueba.entero); printf(" 2. CAMPO REAL : %f\n",prueba.real); printf(" 3. CAMPO CARACTER : %c\n",prueba.caracter); printf(" 4. CAMPO CADENA : %s\n",prueba.arreglo); printf(" ________________________________________\n"); } union tiposdedatos prueba; char continuar; main() { visualizar(prueba); printf("\n\n ASIGNANDO VALOR A ENTERO:"), scanf("%d", &prueba.entero); visualizar(prueba); printf("\n\n ASIGNANDO VALOR A REAL :"), scanf("%f", &prueba.real); visualizar(prueba); printf("\n\n ASIGNANDO VALOR A CARACTER:"), scanf(" %c", &prueba.caracter); visualizar(prueba); printf("\n\n ASIGNANDO VALOR A UNA CADENA:"), scanf("%s", &prueba.arreglo);

union tiposdedatos { int entero; float real; char caracter; char arreglo[15]; };

visualizar(prueba);
printf("\n\n PARA CONTINUAR (S)+ <ENTER>"); scanf(" %c", &continuar); }

EJERCICIOS
Realice un programa en c con vectores de registros y mens

permita manejar el inventarios de una ferretera ( (descripcin, stock, stock max, stock min, precio ) Las opciones a desarrollar: Ingresos Egresos Consultas: por elemento stock mx. stock mn cero stock salir

ARCHIVOS
#include <stdio.h> #include <ctype.h> #include <string.h> #include <math.h> #include <conio.h> // Objetivo: MANEJAR NOTAS ARCHIVOS MATERIA struct notas { char nombre[20]; int nota1,nota2,nota3; };

ARCHIVOS: CREAR /LEER ARCHIVO


int cargarDatos(FILE *Fichero,struct notas vnotas[]) { int i= 0; if (!Fichero) Fichero = fopen("fichero", "w"); else Fichero = fopen("fichero", "r"); fread(&vnotas[i++], sizeof(struct notas), 1, Fichero); while(!feof(Fichero)) { fread(&vnotas[i], sizeof(struct notas), 1, Fichero); i++; } fclose(Fichero); return(i); }

ARCHIVOS: ALMACENAR DATOS


guardarDatos(FILE *Fichero,struct notas vnotas[], int n) { int i=0; Fichero = fopen("fichero", "w+"); while (n>=i) { fwrite(&vnotas[i], sizeof(struct notas), 1, Fichero); i++; } fclose(Fichero); return; }

ARCHIVOS: INGRESO DE DATOS


ingresarnombres(struct notas vnotas[],int *n) { int i=*n; clrscr(); printf("\n INGRESO DE DATOS\n\n"); printf("\n PARA TERMINAR PONGA X EN NOMBRE\n\n"); printf("\n No. N O M B R E\n"); printf("\n________________\n"); do { i++; printf("%3d ",i+1); scanf("%s",&vnotas[i].nombre); } while(!(strcmpi(vnotas[i].nombre,"X")==0)); *n=i-1; return 0; }

ARCHIVOS: INGRESO DATOS


ingresarnotas(struct notas vnotas[],int n, int dato) { int i,nota; clrscr(); printf(" No. ESTUDIANTE NOTA/10 No.%d \n",dato); printf("_______________________________________\n"); for (i=0; i<=n;i++) { do { printf("%3d %-20s ",i+1,vnotas[i].nombre ); scanf("%d", &nota); } while (nota>10 || nota <0); switch (dato) { case 1: { vnotas[i].nota1=nota; break; } case 2: { vnotas[i].nota2=nota; break; } case 3: { vnotas[i].nota3=nota; break; } } } return 0; }

ARCHIVOS: VISUALIZAR DATOS


consultar(struct notas vnotas[],int n) { int i; float promedio; char observacion[10]; clrscr(); printf("No. N O M B R E NOTA1 NOTA2 NOTA3 PROMEDIO OBSERVACIN\n"); printf("________________________________________________________________________ __\n"); for (i=0; i<=n; i++) { promedio= float(vnotas[i].nota1+vnotas[i].nota2+vnotas[i].nota3)/3.0; if(promedio>=7) strcpy(observacion,"APRUEBA"); if(promedio<5) strcpy(observacion,"REPRUEBA"); if(promedio>=5 && promedio <7) strcpy(observacion,"SUSPENSO"); printf("%3d %-20s %5d %5d %5d %5.2f %s\n",i+1,vnotas[i].nombre, vnotas[i].nota1, vnotas[i].nota2, vnotas[i].nota3,promedio, observacion); } printf("\n\n\UNA TECLA PARA CONTINUAR.."); getch(); return 0; }

ARCHIVOS: ORDENAR DATOS


ordenar(struct notas vector[],int n) { int i,j; struct notas aux; for (i=0; i<n;i++) for (j=i; j<n;j++) if (strcmpi(vector[i].nombre,vector[j].nombre)>=0) { aux=vector[i]; vector[i]=vector[j]; vector[j]=aux; } return 0; }

ARCHIVOS: FUNCIN PRINCIPAL


struct notas vnotas[40]; main() { int opcion, opcion1; int n=-1; FILE *fichero; n=cargarDatos(fichero,vnotas); do { clrscr(); do { printf(" REGISTRO DE NOTAS\n\n"); printf("1. INGRESAR ESTUDIANTE\n"); printf("2. INGRESAR NOTAS\n"); printf("3. CONSULTAR\n"); printf("\n0. SALIR\n"); printf("\n\n INGRESE LA OPCIN:"); scanf("%d",&opcion); } while (opcion<0 || opcion >3);

ARCHIVOS: FUNCIN PRINCIPAL


switch (opcion) { case 1: { ingresarnombres(vnotas,&n); ordenar(vnotas ,n); break; } case 2: { do { do { clrscr(); printf("2. INGRESAR NOTAS\n\n"); printf("1. INGRESAR NOTA 1\n"); printf("2. INGRESAR NOTA 2\n"); printf("3. INGRESAR NOTA 3\n"); printf("\n0. REGRESAR\n"); printf("\n\n INGRESE LA OPCIN:"); scanf("%d",&opcion1); }
while (opcion1<0 || opcion1 >3); if (opcion1 !=0) ingresarnotas(vnotas ,n, opcion1); } while (opcion1 !=0); break; } case 3: { consultar(vnotas ,n); break; } } } while(opcion!=0); guardarDatos(Fichero,vnotas[],n); }

You might also like