ࡱ > 9 ( bjbj % $ l < 1 $ ' G 6 j j j j 4 j j F j } N 0 1 } N } j

Temas:
*Introduccin
*Elementos generales de un programa
en C
INTRODUCCIN
EL lenguaje C es el resultado de un proceso de
desarrollo que inici con un lenguaje denominado BCPL. Este influenci a otro
llamado B (inventado por Ken Thompson). En los aos 70; ste lenguaje llev a
la aparicin del C.
Con la popularidad de las microcomputadoras
muchas compaias comenzarona implementar su propio C por lo cual surgieron
discrepancias entre s.
Por esta razn ANSI (American National Standars
Institute, por sus siglas en ingls), estableci un comit en 1983 para crear
una definicin no ambiga del lenguaje C e independiente de la mquina que
pudiera utilizarse en todos los tipos de C.
Algunos de las C existentes son:
-Quick C
-C++
-Turbo C
-Turbo C ++
-Borland C
-Borland C++
-Microsoft C
-etc.
Este manual se basa en el C estandar el cual
puede utilizarse en todos los tipos de C.
C es un lenguaje de programacin de nivel medio
ya que combina los elementos del lenguaje de alto nivel con la funcionalidad
del ensamblador.
Su caracterstica principal es ser portable,es
decir,es posible adaptar los programas escritos para un tipo de computadora en
otra.
Otra de sus caractersticas principales es el
ser esctructurado, es decir, el programa se divide en mdulos (funciones)
independientes entre s.
El lenguaje C inicialmente fu creado para la
programacin de
-Sistemas operativos
-Intrpretes
-Editores
-Ensambladores
-Compiladores
-Administradores de bases de datos.
Actualmente, debido a sus caratersticas, puede
ser utilizado paratodo tipo de programas.
ELEMENTOS GENERALES DE UN PROGRAMA EN C
Aunque cada uno de los programas son distintos,
todos tienen caractersticas comunes. Los elementos de un programa en C son los
siguientes:
Comentarios
Inclusin de archivos
main()
{
variables locales
flujo de sentencias
}
Definicin de funciones creadas por el programador utilizadas en main()
Veamos en que consiste cada uno:
Comentarios:Se identifican porque van entre diagonales y asterisco.Nos sirve para
escribir informacin que nos referencie al programa pero que no forme parte de
l. Por ejemplo especificar que hace elprograma, quien lo elabor, en que
fecha, que versin es, etc.
Inclusin
de archivos: Consiste en mandar llamar a la o las bibliotecas
donde se encuentran definidas las funciones de C (instrucciones) que estamos
utilizando en el programa.
En realidad, la inclusin de archivos no forma
parte de la estructura propia de un programa sino que pertenece al desarrollo
integrado de C. Se incluye aqu para que el alumno no olvide que debe mandar
llamar a los archivos donde se encuentran definidas las funciones estandar que
va a utilizar.
main():
En C, todo est constituido a base de funciones. El
programa principal no es la excepcin. main() indica el comienzo de la funcin
principal del programa la cual se delimita con llaves.
Variables
locales: Antes de realizar alguna operacin en el
programa, se deben declarar la(s) variable(s) que se utilizarn en el programa.
Flujo
de sentencias: Es la declaracin de todas las instrucciones
que conforman el programa.
Definicin
de funciones creadas por el programador utilizadas enmain(): Finalmente,se procede a definir el contenido de las funciones
utilizadas dentro de main(). Estas contienen los mismos elementos que la
funcin principal.
Para ejecutarlo, realice los siguientes pasos:
* Oprima la tecla F10 y
seleccione la opcin File.Posicionese
en Open y pulse enter.
* Escriba el nombre del archivo donde va a guardar su programa,que no
exceda de ocho letras. Automticamente se le agregar la terminacin .c .Digite<ENTER>.
*Transcriba el programa.
Importante:
Despus de cada asignacin o funcin es
imprecindible colocar un punto y coma (;) ya que ste es un terminador de
proposiciones. En caso de que no se escriba, se marcar un error a la hora de
compilar el programa.
En C, los comandos deben ser escritos con
letras minsculas, tal como se ha hecho en este programa ejemplo. En el caso de
las variables o la funciones definidas por el usuario la situacin es similar:
no es lo mismo
Apellido
que
apellido que
APELLIDO
Aunque para nosotros es lo mismo, el compilador
de C, los toma como tres nombres distintos. Por tanto, asegrese de mandar
llamar las variables o funciones exactamente de la misma forma en que las
declar.
Despus de que el programa se encuentra en la
ventana activa de edicin, procedamos a compilarlo:
*Presione la tecla F10, escoja
el submenCompile. Escoja la opcin Compile.
Si su programa presenta errores, puede
presionar la tecla F1
para saber las posibles causas del error.
Corrjalos y vuelvalo acompilar hasta que hasta que la compilacin sea exitosa.
Los warnings (advertencias) indican posibles
errores en la estructura del programa. Si usted est seguro de que su programa
est correcto, ignrelos. No le causarn problemas a la hora de correrlo aunque
lo ideal sera que no las hubiera.
Si no se encontraron errores, proceda a
ejecutarlo:
- Escoja el submen Run.
-Presione <ENTER>
en la opcin RUN
AUTOEVALUACIN
1. Qu es C?
2. Cmo creamos un archivo?
3. En un programa en C, qu significa main()?
4. Qu funcin desempea <conio.h>en el programa?
5. Para qu sirven la llave abierta y la llave cerrada{}
6. Cmo se compila el programa?
7. Cmo ejecutamos un programa?
8. Captura y ejecuta los programas que se muestran a continuacin:
a)/*Programa que despliega un mensaje de bienvenida en la pantalla*/
#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
gotoxy(20,10);
printf("BIENVENIDO AL CURSO DE C
ESTANDAR");
delay(2500);
}
b) /*Programa que calcula el nmero de dias vividos*/
#include<stdio.h>
#include<conio.h>
void main()
{
char nombre[50];
int edad;
clrscr();
printf("Cmo te llamas?\n ");
scanf("%s",nombre);
printf("Cuntos aos tienes?\n");
scanf("%i",&edad);
edad=edad*365;
gotoxy(5,10);
printf("%s, has vivido %i
dias",nombre,edad);
gotoxy(40,22);
printf("Pulsa cualquier tecla para
terminar...");
getch();
}
c) /*Programa que saca el promedio de 3 nmeros*/
#include<stdio.h>
#include<conio.h>
void main()
{
float numero;
float promedio=0;
clrscr();
printf("Dame el primer nmero: ");
scanf("%f",&numero);
promedio+=numero;
printf("Dame el segundo nmero: ");
scanf("%f",&numero);
promedio+=numero;
printf("Dame el tercer nmero: ");
scanf("%f",&numero);
promedio+=numero;
promedio=promedio/3;
printf("El promedio es %f",promedio);
gotoxy(40,22);
printf("Presione cualquier tecla para
terminar...");
getch();
}
d) /*Programa que convierte un nmero decimal entero a octal*/
#include<stdio.h>
#include<conio.h>
void main()
{
int numero;
clrscr();
printf("Numero entero en decimal: ");
scanf("%i", &numero);
printf("\n\nSu representacion en octal es
%o");
gotoxy(40,22);
printf("Presione cualquier tecla para
terminar...");
getch();
}
e) /*Programa que manda un mensaje de advertencia*/
#include <dos.h>
#include<conio.h>
int main(void)
{
clrscr();
gotoxy(28,11);
printf(" P E L I G R O ! ");
sound(250);
delay(600);
sound(80);
delay(600);
delay(600);
nosound();
return 0;
}
<ALIGN=CENTER
Temas:
*Tipos de datos
*Declaracin de variables
*Estructuras
*Inicializacin de variables
*Operadores
*Forma de elaboracin de un programa
El programa que hicimos en el mdulo anterior
slo nos sirve para deplegar un mensaje en pantalla. Lo verdaderamente
satisfactorio es hacer programas que procesen informacin. Para ello, tenemos
que utilizar variables. Veamos como se manejan.
TIPOS DE DATOS
Los tipos de datos son identificadores que usa
cada lenguaje para saber laclase de informacin que va a tomar una variable.
Por ejemplo: si quiero utilizar la variable "cantidad" para almacenar
un nmero entero, declarar "cantidad" como una variable de tipo int lo que significa slo aceptar
valores de tipo entero.
Los tipos de datos bsicos que maneja C son:
char identifica el contenido de la variable que se declare como caracter. Su
longitud es de 1 byte.
int se refiere a valores de tipo entero. Ocupa 2 bytes.
float
indica que la variable recibe datos de tipo real con
aproximadamente 6 digitos de precisin. Su longitud en bytes es de 4.
double define variables que aceptan datos de tipo real con 12dgitos de
precisin. Cada variable ocupa 8 bytes de memoria.
void Este tipo de dato sirve para declarar funciones que no devuelven
valores. Su cantidad de bytes es cero.
Adems de los anteriores, podemos crear otros
tipos de datos alcombinarlos con modificadores
de tipo como signed, unsigned,long
y short.
Tambin existen los modificadores de acceso que sirven para controlar las formas en que
se acceden o se modifican las variables. Estos modificadores son const y volatile
Una variable de tipo const trabaja como una constante ya que recibe sus valores por una
inicializacin explcita o bien por algn medio dependiente del hardware. Por
ejemplo:
const
int x;
crea la variable entera x que no puede ser
modificada por el programa pero si inicializada.
El modificador volatile se usa para indicar al compilador que el valor de una
variable se puede cambiar por medios externos (no especificados) al programa.
Por ejemplo la direccin de una variable global puede ser pasada a la rutina
del reloj del sistema operativo y usada para mantener el tiempo real del
sistema. En este caso, el contenido de la variable es cambiado sin que haya una
sentencia que as lo indique.
Es importante que respetemos estos tipos de
modificadores ya que ayudan a la optimizacin de las funciones del compilador.
Se pueden usar ambos modificadores juntos.
DECLARACION DE VARIABLES
Despus de conocer los tipos de datos
existentes en C, veamos comose declaran las variables:
Forma general:
Tipo_de_dato
Variable;
Donde tipo_de_dato
puede ser cualquiera que est permitido en C y Variable una palabra que designemos para recibir datos.
No hay cantidad mxima de carateres (letras o
palabras) que podamos utilizar para crear variables pero si hay dos que tengan
los primeros 6 caracteres significativos iguales, C las tomar como si fuesen
la misma.
Tampoco podemos utilizar como variables
aquellos trminos que ya han sido definidos previamente por el propio C o por
el usuario como variables de otro tipo.
Las variables de tipo cadena se declaran como
un conjunto de cracteres. Por ejemplo:
char
nombre[30];
Donde 30 es el nmero de caracteres mximo que
puede tener la cadena.
De acuerdo al lugar donde se declaran, las
variables pueden ser globales, formales o
locales.
Variables
locales:
Son aquellas que se declaran dentro de un
conjunto de cdigo relacionado lgicamente entre si (sentencias de control o
funciones) Por ejemplo:
funcion_A()
{
int
x;
.
.
.
}
funcion_b()
{
int
x;
.
.
.
}
En las funciones anteriores, declaramos dos
variables llamadas"x" con el mismo tipo. Si tratas de utilizar alguna
de las variables fuera de las funciones a las que pertenecen, se marcar un
error porque el tipo slo ha sido definido para utilizarse dentro de las llaves
donde fu declarada.
El que ambas variables se llamen "x"
no quiere decir que sean la misma o que ocupen el mismo lugar en la memoria
dado que las variables locales se crean y se destruyen cada vez que se sale del
bloque en el que son declaradas por tanto, tambin su contenido se pierde al
salir del l.
Parmetros
formales:
Muchas de las funciones necesitan argumentos.
Los argumentos son datos que recibe la funcin desde el exterior. A las
variables en que sirven para transmitir estos datos se les llama parmetros formales dela funcin. Su
comportamiento es el mismo al de cualquier otra variable local. Veamos el
siguiente ejemplo:
/*Devuelve
la suma de dos nmerosdados*/
suma(int
a,int b)
{
a+=b;
/*A a toma el valor de a+b*/
return(a);
}
Esta funcin realiza la suma de dos nmeros.
Utiliza dos parmetros formales: a y
b los cuales deben ser declarados en
la llamada a suma() para luego poder
utilizarlas dentro de la funcin como variables locales. Tambin se destruyen
al salir de la funcin.
Se debe tener mucho cuidado de que los
parmetros formales que se declaran sean del mismo tipo que los valores que se
introducen cuando se manda llamar la funcin porque podra obtener resultados
inesperados.
Variables globales:
Este tipo de variables se conocen atravs de
todo el programa por lo cual se pueden usar en cualquier parte de la ejecucin
de ste. Se declararan antes de utilizar la variable por primera vez. Se
recomienda que sea al principio del programa para mantener un orden.
Consideremos el ejemplo que se presenta a
continuacin, donde utilizamos los diferentes tipos de variables:
/* Programa que eleva al cuadrado un nmero real */
#include<math.h>
main()
{
float x;
printf("Dame el nmero que quieres elevar al cuadrado: ");
scanf("%f",&x);
x=cuadrado(x);
printf("El cuadrado es%f",x);
}
cuadrado(float n)
{
n=n*n;
return(n);
}
Si analizamos las sentencias, vemos que x es una variable global mientrasque n es un parmetro formal que nos sirve
como variable localpara efectuar la funcin.
ESTRUCTURAS
Las estructura es un tipo de datos compuesto
que permite el C. Se define como un conjunto de variables relacionadas
lgicamente entre s que se referencian bajo un mismo nombre.
Su forma general de definicin es
struct
nombre_de_la_estructura{
tipo
nombre_variable;
tipo
nombre_variable;
tipo
nombre_variable;
.
.
.
}variables_tipo_nombre_de_la_estructura;
donde nombre_de_la_estructura
o bien variables_tipo_nombre_de_la_variables_estructura
pueden omitirse pero no ambos.
Veamos un ejemplo:
struct
agenda{
char
nombre[30];
char
direccion[20];
char
ciudad[15];
int
edad;
}
actor;
agenda
es el nombre de la estructura; nombre, direccin,ciudad y edad
son los campos o elementos de la estructura y actor es la variable declarada de ese tipo.
Los elementos individuales de la estructura se
referencian utilizando el operador punto. Por ejemplo:
actor.nombre="Harrison
Ford";
Aqu se est asignando la cadena "Harrison
Ford" al campo nombre de la variable actor.
El nombre de la variable tipo estructura
seguido del punto y del nombre delcampo, referencia ese campo individual de la
estructura. a todos los elementos de la estructura se accede del mismo modo. La
forma general es:
variable_estructura.nombre_elemento
As, para imprimir en pantalla el campo edad de
la variable actor, escribimos:
printf("%d",actor.edad);
De la misma forma podemos utilizar gets
(funcin que le una cadena desde el teclado) para obtener un valor para actor,
domicilio como se muestra aqu.
gets(actor.domicilio);
Las variables tipo estructura son utiles para
crear unidades de informacinde diferentes tipos lgicamente relacionada entre
s. Tal esel ejemplo de los datos de una agenda( en una variable guardas su
nombre,direccin, nmero telefnico, etc) o de los datos de un elemento de la
tabla peridica (en cada variable guardas su nombre,simbolo, nmero atmico,
etc).
Sentencias de asignacin
La forma general de asignar valores a una
variable es:
nombre_variable=expresin
Expresin puede ser desde una constante hasta
una combinacin de variables, operadores y constantes.
Si se mezclaran variables de un tipo con las de
otro, se aplica la regla de conversin
de tipos que consiste en que el valor del lado derecho de la asignacin se
convierte al tipo de dato de la variable del lado izquierdo (que es la que
recibir el dato) siempre y cuando sta ltima tenga mayor longitud en bytes.
Por ejemplo, una variable int podemos
asignarla a otra variable de tipo float
pero no viceversa.
INICIALIZACIN DE VARIABLES
Inicializar una variable es el darle un valor
despus que se ha declarado pero antes de que se ejecuten las sentencias en las
que se emplea.
En C, se les puede dar un valor a la vez que se
declaran. Unicamente se coloca el signo igual y una constante despus del
nombre de la variable.La forma general de inicializacin es:
tipo
nombre_variable = constante;
int
uno=1;
float
pi=3.1416;
char
respuesta='s';
Regularmente, las variables locales se
inicializan cada vez que se entra en el bloque en el que estn definidas
mientras que las globales son inicializadas al principio del programa.
Constantes
Constantes son los valores que no pueden ser
modificados. En C, pueden serde cualquier tipo de datos.
Adems de los ejemplificados anteriormente,
Podemos crear constantesde caracteres con barra invertida. Estos corresponden a
los carateres queson imposibles introducir desde el teclado.
Se usan de la misma forma que los caracteres
normales por ejemplo:
printf('Esta
es una prueba\n");
ch='\0';
O P E R A D O R E S
Un operador es un smbolo que indica al
compilador que realice manipulaciones lgicas o matemticas especficas.
Operadores
Aritmticos
Cuando se aplica el smbolo / a un entero o a
un caracter, cualquier residuo se trunca. Por ejemplo 5/3 ser 1 en divisin
entera.
El menos monario hace el efecto de multiplicar
su nico operando por-1 es decir, cualquier nmero precedido por un signo menos
cambia de signo.
Incremento
y decremento
Dos operadores caractersticos de C son el
incremento y el decremento.++ aumenta en uno a su operando y -- le resta 1. Es
decir,
x=x+1
es esquivalente a ++x;
x=x-1
equivale a --x
Los operandos de incremento y decremento pueden
ir antes o despus del operador sin embargo existe una diferencia. Veamos el
siguiente ejemplo:
x=10;
y=x++;
Aqu y tomar elvalor de 10.
y=++x;
En este caso, y tomarel valor de 11.
Los operadores del mismo nivel de precedencia
son evaluados por el compilador de izquierda a derecha. Por supuesto, se puede
utilizar parntesis para ordenar la evaluacin.
Los parntesis en C son tratados igualmente que
en otro tipo de lenguajes de computadora; se forza a que una operacin o un
conjunto de operaciones tengan un nivel de precedencia mayor.
El lenguaje C admite abreviaturas que
simplifican la escritura de ciertos tipos de sentencias de asignacin. Por
ejemplo:
x=x+10;
es igual a x+=10;
Tambin, conviene utilizar parntesis para
hacer ms claro el orden en que se producen las evaluaciones, tanto para la
persona que lo elabora o para los que despus tengan que seguir el programa.
Operadores
relacionales y lgicos
Los operadores relacionales son los que
determinan la forma de vinculacin entre dos valores. A su vez, los lgicos
evaluan la forma de realcionars edos valores.
Ciclo de vida de un programa
Al igual que en la resolucin de problemas,
existen ciertos pasos que debemos seguir para la creacin de programas. Estos
son:
1.
Anlisis del programa:
Consiste en estudiar minuciosamente el programa que queremos elaborar, que
caractersticas debe de tener, con que elementos contamos para realizarlo, etc.
2.
Elaborar el pseudocdigo:
El pseudocdigo es cualquier lenguaje que nosotros entendamos y quenos sirva
para elaborar algoritmos.
Un algoritmo es el conjunto de manipulaciones
matemticas y de estructuras funcionales que nos permitan realizar un programa
que ejecute una o varias actividades especficas. Para elaborarlo, debe
pensarse detallada y ordenadamente todos los pasos que realizar el programa.
En caso de que el programa sea muy extenso,
podemos determinar un pseudocdigo donde se determinen las funciones
principales del programa y acto seguido elaborar el pseudocdigo de esas
funciones.
3.Codificar
el pseudocdigo:
Despus de tener el pseudocdigo del programa, el siguiente paso es codificarlo
en el lenguaje que escojamos.En este caso, C.
La ventaja de tener el pseudocdigo del
programa es que podemos codificarlo en l o los lenguajes que deseemos.
4.Depuracin:
Despus de codificar el programa, generalmente quedan pequeos detalles a
corregir por tanto, el siguiente paso es la depuracin del programa.
Depurar es pulir el programa para que todo
funcione como nosotros deseamos. Para esto, es necesario probar el programa
cuantas veces sea necesario para asegurarnos de que funcione correctamente.
5.Manteniniemto
del programa:
Este es el ltimo paso del ciclo de vida de un programa. Se realiza despus de
que el programa ya ha tenido vida til y, debido a las nuevas necesidades de
los usuarios, es necesario hacer modificacionesal programa.
Cuando estos cambios se hacen muy grandes, se
debe elaborar un nuevo programa.
Apartir de estos pasos, elaboremos un programa
que encuentre las racesde un polinomio de segundo grado.
1. Este programa encontrar las races de un polinomio de segundo grado.
Necesitamos:
-El polinomio al cual se le v a encontrar la
raz.Como todos los polinomios tendrn la misma forma, slo se pedirn los
coeficientes los cuales sern de tipo real. Por lo cual, necesitaremos dos
variables de este tipo.
-El resultado se almacenar en dos variables de
tipo real y se desplegar en pantalla.
-Especificar en pantalla lo que hace el
programa.
2.
comienza
variables:
a,b,c:real;
escribe('Este
programa encuentra las races reales de un polinomio de segundo grado de la
forma
ax+bx+c
donde
a,by c pueden ser cualquier valor real.
Acontinuacin,
escribe los coeficientes de la ecuacin: ');
escribe('a=
');
lee(a);
escribe('b=
');
lee(b);
escribe('c=
');
lee(c);
x1=(-b-(b-4ac))/2a;
x2=(-b+(b-4ac))/2a;
escribe('
Las races de la ecuacion : ');
primera=x1
segunda=x2
');
3.Ahora veamos como se codifica en C:
/*Programa
que encuentra las races de una ecuacin cuadrada,deacuerdo a las frmulas:
(-b(b-4ac))/2a */
#include<math.h>
main()
{
float
a,b,c,x1,x2;
printf("Este
programa encuentra las races reales\n");
printf("de
la ecuacin de la forma\n");
printf("
ax+bx+c=0 \n");
printf("A
continuacin, escriba los coeficientes\n");
printf("de
la ecuacin:\n");
printf("a=
");
scanf("%f",&a);
printf("b=
");
scanf("%f",&b);
printf("c=
");
scanf("%f",&c);
x1=pow(b,2);
x1=x1-(4*a*c);
x1=-b+sqrt(fabs(x1));
x1=x1/(2*a);
x2=pow(b,2);
x2=x2-(4*a*c);
x2=-b-sqrt(fabs(x2));
x2=x2/(2*a);
printf("x1=
%f\n");
printf("x2=
%f\n);
getch();
}
En el programa anterior, utilizamos \n para indicar que el cursorse
posicione en el siguiente rengln de la pantalla.
scanf()
nos permite leer informacin desde el teclado.
La frmula la ejecutamos por pasos, para que
pueda ser mslegible.
Si observas, aunque la frmula es la misma,
alteramos su orden.Qu pasara si lo hubieramos seguido?
AUTOEVALUACION
1. Qu son los tipos de datos?
2. Cules son los tipo de datos bsicos que soporta C ?
3. Cmo se declaran las variables?
4. Cul es la diferencia entre las variables locales y las variables
globales?
5. Enumera los operadores lgicos.
6. Enumera cinco palabras reservadas.
7. Elabora el pseudocdigo de un programa que determine si un nmero es
par o impar.
8. Implementa el pseudocdigo de un programa que resuelva una regla de
tres y codifquelo.
9. Elabora un programa que realice la divisin de dos nmerosque tengan
decimales.
10. Elabora un programa que devuelva el residuo de una divisin.
Temas:
* Sentencias decontrol
- Sentenciascondicionales
*if
* ifsanidados
*switch
- Bucles
*for
*while
* do-while
- Break
- Continue
SENTENCIAS
DE CONTROL
En este mdulo veremos lo relacionado a las
sentencias de controlque maneja C. Es importante que se comprendan bien porque
son herramientasbsicas en la implementacin de programas.
De acuerdo a la sintaxis utilizada en C, una sentencia puede ser unaproposicin o
ninguna proposicin (si hablamos de una sentenciavaca) o un conjunto de
proposiciones (cuando se encuentran agrupadasentre llaves). Dentro de este
captulo utilizaremos la palabra sentenciacon las tres acepciones.
SENTENCIAS
CONDICIONALES
Las
sentencias IF
La sentencia de control if nos sirve para verificar que se cumplauna condicin en el
programa. Su forma general es
if(expresin)
sentencia;
else
sentencia;
donde sentencia puede ser una sola proposicin
o un conjunto deproposiciones delimitadas por llaves. Ejemplo:
Queremos dividir dos nmeros cualesquiera donde
el divisor sea diferentedecero.
Necesitamos dos variables de tipo real (para
que tambin acepte valoresenteros) para recibir los datos y una para
alamacenarlo.
Creamos el pseudocdigo:
si
divisor<>0 entonces
divisin=dividendo/divisor;
de
otro modo
manda
mensaje de error;
Y al codificar en C
if (divisor!=0)
divisior=dividendo/divisor;
else
printf("Error en el divisor");
Si se cumple la condicin (que divisor sea
diferente de cero) entoncesse realizar la divisin; si no, se mandar un
mensajede error.
Ifs anidados
La expresin "ifs anidados" se
refiere a que podemos utilizar unasentenciaif
dentro de otra sentencia if. Esto se
emplea cuandose tienenque cumplir varias condiciones para poder ejecutar una
accin.
Ejemplo:
Hagamos un algoritmo que seleccione una
asignatura.
menu()
inicio
variable
opcion:caracter;
escribe('A)Espaol');
escribe('B)Matemticas');
escribe('C)Historia');
escribe('D)Biologia');
escribe('Opcion:
');
lee(opcion);
escribe('Escogi
');
si
opcion='A'entonces
escribe('Espaol')
de
otro modosiopcion='B'
entoncesescribe('Matemticas')
de
otro modosiopcion='C'
entonces
escribe('Historia')
de
otromodosi opcion='D' entonces escribe('Biologia')
de
otro modo escribe('una asignatura inexistente')
fin;
Codificndolo en C:
#include<stdio.h>
menu()
{
char
opcion;
printf("A)Espaol\n");
printf("B)Matemticas\n");
printf("C)Historia\n");
printf("D)Biologia\n");
printf("Opcin:
");
scan("%c",&opcion);
printf("Escogi
");
if
(opcion=='A')
printf("espaol");
else
if (opcion=='B')
printf("matamticas");x
else
if (opcion=='C')
printf("historia");
else
if (opcion=='D')
printf("biologia");
else
printf("una asignaturainexistente.");
}
En el programa anterior, despus de haber
mandado a pantalla las opciones, leemos la respuesta. Para determinar la opcin
que se escogi, se recurre a las sentencias
if. Cuando la evaluacin sea verdadera es decir, cuando encontremos el
valor que lemos enopcion,
ejecutaremos en este caso la funcin correspondiente.
Las condiciones se codifican en orden de
importancia es decir, la condicin ms importante se evala primero, enseguida
la que le sigue en importancia y as sucesivamente hasta llegar a la
menosimportante.En este caso,todas las condiciones eran igualmente
importantespor lo que no importa elorden en que se evaluen.
Switch
Cuando se anidan muchos ifs, el cdigo puede volverse difcilde entender an para el autor.
Para darle mayor transparencia, enC utilizamos la sentencia de decisin
mltiple switch.
Switch
es utilizada cuando una variable es sucesivamente comparadacinuna lista de
enteros o de caracteres. Cuando se encuentra la correspondencia,se ejecuta una
sentencia o el bloque de sentencias.
La forma general de una sentencia switch es
switch(expresin)
{
case constante1:
secuencia desentencias;
break;
case constante2:
secuencia desentencias;
break;
case constente3:
secuencia desentencias;
break;
.
.
.
default:
secuencia desentencias;
}
switch es el indicador del tipo de sentencia de control.
{ } delimitan lo que abarca la sentencia switch.
case especifica donde comienza la evaluacin de la variablecon la constante
que sucede al case
En caso de que encontremos el valor de la
variable en un case se ejecutarnla secuencia de sentencias relacionadas con
este hasta encontrarunbreak.
Las sentencias asociadas a Default seran ejecutadas si no se encuentraninguna correspondencia
con el valor de la variable que estamos evaluandoen alguno de los case.El final de estas sentencias las
determinala} del switch. Esta sentencia es opcional (se
puede o noincluir).Si no est presente, no se ejecutar ninguna sentenciaen
casode que ningn case corresponda
al valor que estamosbuscando.
La
diferencia entre switch e if es que la primera slo puedecomprobarla igualdad,
mientras que if puede evaluar expresiones relacionalesolgicas.
No puede haber dos constantes case que tengan los mismos valoresslo
en el caso de que la sentencia switch
este anidada (quehaya una dentro de otra).
Ejemplifiquemos el switch optimizando el ejemplo anterior.Ahora,codifiquemos el
algoritmo de men, pero utilizando unswitch
en vez de ifs.
menu()
{
char opcion;
printf("A)Espaol\n");
printf("B)Matemticas\n");
printf("C)Historia\n");
printf("D)Biologa\n");
printf("Opcin: ");
scan("%c",&opcion);
printf("Escogi ");
switch(opcion)
{
case'A':printf("espaol");
break;
case
'B':printf("matemticas");
break;
case 'C': printf("historia");
break;
case 'D': printf("biologia");
break;
default: printf("escogiste unaasignaturainexistente");
}
}
Bucles
Se denomina bucles a las proposiciones de
control que nos permiten ejecutaruna sentencia hasta que se cumpla cierta
condicin.
Entre sus ventajas se encuentra, el compactar
el codigo es decir, si tenemosque realizar una tarea varias veces, basta con
escribirla una sola vez dentrode un bucle, para que pueda efectuarse las veces
que deseamos. Tambien ayudaa que el cdigo sea ms entendible.
Los bucles soportados por C son el for, el while y eldo-while.
For
El formato general para implementar el bucle for es
for(inicializacin;condicin;incremento)
sentencia;
Inicializacin es una sentencia de asignacin que nossirve como variable de control
del bucle. Condicin es unaexpresin
que nos indica la condicin que debe cumplirse paraquecontinue el bucle e incremento define como va cambiando el
valor dela variable de control cada vez que se repite el bucle.
Sentencia
es el conjunto de proposiciones que se van a realizar
encadauno de los bucles.
Por ejemplo hagamos algoritmo para crear una
lnea en la pantallaun sencillo marco con cdigo ASCII.
inicio
desde (x=1;x<80;incrementa x)
inicio
posicionate(x,1);
escribe ("");
posicionate(x,24);
escribe("");
fin
escribe("");
escribe("");
escribe("");
escribe("");
desde(x=1;x<80;incrementa x)
inicio
posicionate(1,x);
escribe("")
posicionate(80,x);
escribe("");
fin
fin
Codificndolo
main()
{
for(x=1;x<80;x++)
{
gotoxy(x,1);
printf("");
gotoxy(x,24);
printf("");
}
gotoxy(1,1);
printf("");
gotoxy(80,1);
Printf("");
gotoxy(1,24);
printf("");
gotoxy(80,24);
printf("");
for(x=0;x<24;x++)
{
gotoxy(1,x);
printf("");
gotoxy(80,x);
printf("");
}
}
EL programa anterior, dibuja un marco en la
pantalla con cdigo ASCII.
x=1 nos indica que vamos a empezar a contar desde el 1. Despusse verifica
que x sea menor que 80 o 24(en el segundo for). Si es as,se ejecutan las
sentencias que se encuentran dentro del bucle para finalmente,incrementar el
valor de x y volver a evaluar. El ciclo se termina cuandox es igual o mayor a
80 o que 24 (en el segundo for).
Una de las principales caractersticas del for es que lacondicin (para determinar
si se ejecutan o no las sentencias quecontiene) se evala al principio del
ciclo. Por esto, el cdigodentro del bucle no ser ejecutado si la condicin esfalse al comienzo.
Debido a la flexibilidad del lenguaje C, se
puede utilizar el operador comapara permitir dos o ms variables de control Por
ejemplo:
for
(i=0,j=4;i*j<4;i++,j--)
{
.
.
.
}
En este caso, estamos inicializando a i y a j dentro del bucle.Al mismo tiempo, en la seccin de incremento,
aumentamos a iy disminuimos el valor
de j. Esto es completamente vlido.
Bucle
Infinito
Es aquel que no tiene fin. En este tipo de
ciclos, no necesitamos especificarninguna de las tres proposiciones que lo
constituyen
for
(;;) printf("Bucle infinito");
o basta dejar la de la condicin vaca como se
muestraacontinuacin:
for(x=0;;x++)
printf("Bucle infinito");
La forma de romper un bucle infinito es
mediante la sentenciabreak.Cuando se
encuentra esta proposicin dentro de un ciclo,trunca el bucle y se procede a
ejecutar el cdigo que se encuentrainmediatamente despus de l.
main()
}
for(;;)
{
printf("Nmero: ");
scanf("%d",&x);
if(x==9) break;
}
printf("Digitaste %d nmeros antes
de romperelciclo",x);
}
El bucle anterior se repite hasta que se teclea
el nmero 9 y depusse imprime en pantalla la cantidad de veces que puls un
nmeroantes de romper el ciclo.
Bucle
sin cuerpo
Segn la sintaxis de C, existen las sentencias
vacas por tanto,podemos tener un bucle for
o cualquier otro, que no tenga cuerpo.Este tipo de ciclos se usan regularmente
para retardar la ejecucindel programa. Veamos como crear uno:
main()
{
int num;
printf("Piensa un nmero del 1 al
10.");
lapso();
printf("Que nmero pensaste:
");
scanf("%d",&num);
.
.
.
}
lapso()
{
int tiempo
int valor=100;
for (tiempo=0;tiempo<valor;tiempo++);
}
En el programa anterior, se d cierto tiempo para que pienses unnmero y luego
lo escribas.
While
Este es otro de los bucles disponibles en C. Su
forma general es
while(condicin)sentencia;
donde sentencia es una sentencia vaca, una
nica o un bloquede sentencias. El bucle itera mientras se cumpla la condicin
(puedeser cualquier expresin). Cuando ya no se cumple, el control del
programapasa a la lnea siguiente al cdigo del bucle.
Ejemplo:
Hagamos un programa que nos devuelva el valor
absoluto de un nmeroy que se repita todas las veces que deseemos. Necesitaremos
una variabletipo float (para que
tenga mayor rango)que reciba el nmero.
Tambin ocuparemos una variable que nos sirva
para determinar si continuao no en el programa. Si la variable es igual a 'S'
continuar y sies igual a 'N', terminar. Slo aceptar esos dos valores.
Elabora el algoritmo y compralo con el
programa que se encuentraacontinuacin:
#include
<ctype.h>
#include<conio.h>
#include<stdio.h>
#include <math.h>
main()
{
char respuesta;
clrscr();
respuesta='\0';
while (respuesta!='N')
{
float x;
printf("Dame un nmero: ");
scanf("%f",&x);
x=fabs(x);
printf("Su valor absoluto es:
%f\n",x);
printf("Presione 'N' para
salir...\n");
respuesta=toupper(getch());
}
}
Inicializamos la variable respuesta con
caracter nulo ('\0')
para asegurarnos de que al menos se entre una
vez al ciclo.
Al final del bucle, preguntamos si quiere
continuar o no. Congetch()leemos el
caracter. toupper() nos sirve para
convertirel caracter recibido por getch()
a maysculas; de esta maneravalidamosque se acepte 'S' o 'N' minsculas.
En caso de que la respuesta sea afirmativa, se
repite el ciclo.
Como en el caso del for, podemos utilizar bucles while
sincuerpo. Por ejemplo:
while((letra=getch())!='M');
En letra se guardar el valor que se lea con getch() y estoserepetir hasta que
letra sea igual a 'M'.
DO-WHILE
La caracterstica principal del Do-while es que analizalacondicin del
bucle al final del ciclo, lo que garantiza que elbloque de sentencias se
ejecute al menos una vez. Su forma general es
do{
sentencia
}while(condicin);
Las llaves no son necesarias cuando sentencia corresponde a
unasolaproposicin, pero se recomienda que utilizarlas para
mejorarlalegibilidad del programa.
Como ejemplo, modifiquemos el programa anterior
utilizando do-while:
#include <ctype.h>
#include<conio.h>
#include<stdio.h>
#include <math.h>
main()
{
char respuesta;
clrscr();
do{
float x;
printf("Dame un nmero: ");
scanf("%f",&x);
x=fabs(x);
printf("Su valor absoluto es: %f\n",x);
printf("Continuar...\n");
respuesta=toupper(getch());
}while(respuesta!='N');
}
En esta ocasin, no necesitamos inicializar
respuesta ya que por las caractersticas de do-while de todos modos se ejecutarala primera vez. La nica
diferencia es que ahora la condicinse comprueba al final del bucle y no al
principio como lo hace for ywhile.
Break
La sentencia break tiene dos usos:
1)Para determinar el final de un case
en una sentenciaswitch analizado en
este mismo captulo, y
2)Terminar la ejecucin de un bucle y saltar a laevaluacin condicional
del ciclo.
Veamos en que consiste el segundo uso:
Cuando utilizamos una sentencia break dentro de un bucle, stese
termina inmediatamente y el control del programa pasa a la lneaque est
inmediatamente despus del ciclo. Por ejemplo:
#include<stdio.h>
main()
{
int x;
for(x=0;;)
{
if(x==250) break;
x++;
}
printf("%d",x);
}
El programa anterior hay un ciclo infinito que
es truncado cuando xesigual a 250.
Exit()
Esta sentencia d lugar a la terminacin del
programa.
Los programadores la utilizan cuando no se
satisface una condicinobligatoria en la ejecucin de un programa ya que
detiene suejecucin y fuerza la vuelta al sistema operativo.
La funcin exit()
requiere de un argumento entero ya que sesupone que un proceso de alto
nivel sera capaz de acceder al valorcontenido en el argumento . Normalmente se
utiliza un argumento 0 (exit(0))paraindicar que se trata de una terminacin
normal y otros argumentosparaindicar algn tipo de error.
Por ejemplo, imagine un programa al que se
tenga que dar una clave de accesopara iniciar. La funcin main() de este programa seracomo esta:
main()
{
char clave[]="clave";
char password[5];
printf("Proporcione clave de
acceso: ");
scanf("%s",password);
if(password!=clave)exit(1);
.
.
.
}
Al iniciar el programa, se pide la clave de
acceso. En caso de que no seala especificada, el programa termina sin esperar
nada ms.
Continue
Continue es una sentencia de significado opuesto al break.En vez de forzar la terminacin del bucle, continue obliga unanueva iteracin del
ciclo y salta cualquier cdigo que existaentre este. Por ejemplo:
do{
int years,tope=12;
gotoxy(5,5);
clreol();
printf("Aos: ");
scanf("%d",&years);
if (years<=0) continue;
if (years<=tope)
printf("Lo siento, este programa no
es paranios");
}while(tope!=18);
En el ciclo anterior, utilizamos el continue para verificar que laedad se
mayor que cero. En caso de que sta sea cero o menos vuelvea comenzarlo sin
llegar a ejecutar las instrucciones del bucle restantes.Al no comparar la
condicin que puede terminar el ciclo, stese repite.
No
se preocupe, si por ahora no sabe cuando utilizar un for, while odo-while.La
experiencia le ir indicando cuando es ms convenienteutilizaruno u otro. Lo
ms importante es entender el funcionamientode cadauno.
AUTOEVALUACION
1. Cul es la forma generaldela sentencia if?
2. Cuando se utiliza switch?
3. Qu es un bucle?
4. Forma general de la sentenciafor.
5. Diferencia entre whileydo-while.
6. Elabora un programa que resuelvaoperacionesaritmticas bsicas mientras
el usuario deseejecutarel programa.
7. Disee un programa que le pidealusuario encuentre un nmero que la
maquina proporcione.
8. Elabora un programa que presente latablade multiplicar que el usuario
dese.
SEGUNDO EXAMEN PARCIAL
1. Qu es una funcin?
2. Especifique la forma general deunafuncin.
3. Para qu se utiliza lasentenciareturn?
4. En qu consisten lasllamadaspor valor?
5. Cmo funcionan las llamadasafunciones por referencia?
6. Defina que es un array.
7. Especifique la forma generaldedeclaracin de un array.
8. Cul es el principal usodelos arrays?
9. Defina lo que es un puntero.
10. Especifique la forma general dedeclaracinde un puntero.
11. Cul es la diferencia entreeloperador & y el operador *
cuando se utiliza junto alasvariables de tipo puntero?
12. Mencione los cuatro operadoresaritmticosque pueden utilizarse con los
punteros.
13. Qu es un puntero a puntero?
Temas:
*Funciones
-Definicin
- Declaracin de funciones
- Return
- Reglas de las funciones
- Argumentos de las funciones
- Llamadas por valor
- Llamadas por referencia
- Creacin de bibliotecas propias
F U N C I O N E S
Definicin
En C, una funcin es un bloque de instrucciones
que realizan una tarea especfica la cual se maneja como una unidad lgica.
Esta unidad, regresa un valor de acuerdo al resultado del proceso que realice.
C es un programa de funciones, todo se hace a
partir de ellas. La principales main() la
cual, utiliza a otras que se encuentran definidas en las bibliotecas (todas las
instrucciones que maneja C).
Adems de stas, nosotros podemos definir
nuestras propias funciones.De esta manera dividimos tareas grandes de
computacin en varias ms pequeas lo que nos d como resultado que el programa
sea ms fcil de entender y se pueda manejar ms eficientemente.
Adems, al subdividir los programas en
funciones, stas pueden ser re-utilizadas en otros programas.
En esta unidad estudiaremos como crear nuestras
propias funciones.
La forma general para definir una funcin es:
especificador_tipo
nombre_de_la_funcin (declaracin deparmetros)
{
cuerpo de la funcin
}
El especificador_de_tipo de la
funcin define la clase de valor que regresa la funcin. El valor puede ser
cualquier que maneje el C. En caso de que no se especfique ninguno, la funcin
devuelve por omisin un entero.
Nombre_de_la_funcin es la palabra con la que vamos a identificara la funcin.
La declaracin
de parmetros es un conjunto de variables separados por comas y con un tipo
de dato especfico que reciben los valores de los argumentos cuando se llama a
la funcin.
Una funcin puede carecer de parmetros en cuyo
caso los parntesis estarn vacos tanto al declarar como almandar llamar a la
funcin.
Por ejemplo:
float
multiplicacin (float multiplicando,float multiplicador)
{
multiplicando=multiplicando*multiplicador;
return(multiplicando);
}
La funcin est declarada de tipo float porque es la clase de valor que
va a regresar.
Multiplicando
y multiplicador
es el nombre que le vamos a darlos valores que recibir la funcin para
trabajar con ellos los cuales, son declarados dentro de los parntesis.
Por ltimo se define el cuerpo de la funcin
(delimitndose con llaves) .
En este caso, asignamos el resultado de la
multiplicacin a multiplicando para ahorrar memoria (se declara una varible
menos) y regresamos el valor obtenido por medio de la sentencia return.
Return
Esta sentencia se utiliza para devolver valores
generados en una funcinal programa principal. Tambin sirven para salir de la
funcindon de se encuentra y continuar con la instruccin posterior a la
funcin que lo llam.
En la funcin anterior return(multiplicando); devuelve el contenido de multiplicando al programa principal. En
caso de que slo se quiera salir de la funcin, no es necesario indicarle
parmetros,basta con return();.
Todas la funciones, excepto las de tipo void( Es el tipo de datos que no tiene
valor) generan valores que se transmiten al programa principal. Estos valores
son de de tipo int (entero) por
omisin, pero puede regresarlos de todo tipo si as se declara; por ejemplo, en
la funcin de multiplicacin, la
funcin regresa un valor de tipo float (flotante).
Cuando queremos utilizar el valor que devuelve
la funcin en el programa principal, es necesario asignar la funcin a una
variable del tipo de dato que va a regresar la funcin.
Reglas
de las funciones
- No podemos declarar funciones dentro de
funciones ya que todas estn al mismo nivel,.
- Tampoco podemos ingresar al cdigo de una
funcin si estamos fuera de la misma.
- Las variables que se declaran en las
funciones, son locales y no pueden ser utilizadas fuera de esa funcin.
Adems, si utilizamos una funcin dos o ms
veces, lasegunda vez las variables locales no contendrn el valor que
obtuvieron al ejecutar la primera vez la funcin y as sucesivamente ya que se
crean al entrar a la funcin y se destruyen al salir.
Argumentos
de las funciones:...
Es muy comn que las funciones utilizen argumentos
es decir, que necesiten de algn valor o valores externos dentro de su propio
cdigo. Estos valores se pasan mediante variables llamadas parmetros formales
de la funcin las cuales se declaran dentro de los parntesis que suceden a el
nombre de la funcin o bien, despus de estos y antes de la llave de comienzo.
Asegrese de que de que los argumentos
utilizados al declarar la funcin sean del mismo tipo que los usados para
llamar la funcin. Si hay algn error en los tipos, el compilador no mandar
mensajede error pero se obtendrn resultados inesperados.
Puedes utilizar a las variables que son
parmetros formales como cualquier otra variable local es decir, se les puede
hacer asignaciones o usarlos en cualquier expresin permitida por C.
Existen dos formas de pasar argumentos a una
funcin:
La primera es por medio de las llamadas
por valor:
Llamadas
por valor
consiste en slo pasar el contenido de la
variable utilizada como argumento a la subrutina. De esta manera, los cambios
efectuados en los parmetros de la funcin no afectan a las variables
(globales) que se utilizaron para hacer la llamada a la funcin.
Llamadas
por referencia
La segunda forma es mediante las llamadas por referencia en la cual, lo
que se pasa a la subrutina es la direccin de la variable que se est mandando
como parmetro. De esta manera, los cambios que sufra el parmetro dentro de la
subrutina, se efectuarn tambin en la variable que se introdujo como
parmetro.
La forma de pasar una llamada por referencia es
pasando un puntero al argumento,de esta manera, lo que pasar es la direccin
de la variable en vez de su contenido. Para esto, los parmetros se declaran de
tipo puntero.
/*Ejemplo
de funciones por valor y por referencia*/
/*Calcula dos veces el procentaje de
gastos, la primera vez
utilizando una funcin por valor y la
segunda por referencia*/
#include<stdio.h>
porcentaje_xvalor(float ingreso, float
egreso)
{
egreso=((egreso/ingreso)*100)
printf("Usted gasta el %.2f por
ciento de lo quegana",egreso);
}
porcentaje_xref(float *ingreso,float
*egreso)
{
*egreso=(((*egreso)/(*ingreso))*100);
printf("Usted gasta el %.2f por
ciento de lo quegana",egreso);
}
main()
{
float entrada,salida;
clrscr();
printf("Entradas: ");
scanf("%f",&entrada);
printf("Salidad: ");
scanf("%f",&salida);
porcentaje_xvalor(entrada,salida);
/*Llamada a la funcinporcentaje utilizando paso de parmetros por valor*/
printf("\n\n");
porcentaje_xref(&entrada,&salida);
/*Utilizacinde la funcin porcentaje con paso de parmetrospor referencia*/
getch();
}
En el programa anterior, realizamos la misma
tarea dos veces pero de diferente manera.
En porcentaje_xvalor(entrada,salida)
mandamos el contenido de entraday salida a la funcin donde son recibidos
por ingreso y egreso respectivamente. De esta manera, el clculo del porcentaje
se hace internamente es decir, utilizando las variables definidas en la
funcin. Tanto entrada como salida, no se modifican.
La funcin porcentaje_xref(&entrada,&salida)
tambien obtiene el mismo resultado, pero en este caso, en vez de pasar los
valores existentes en las variables, pasamos su direccin; por lo que
trabajamos directamente con ellas dentro de la funcin an cuando las llamemos
de diferente manera( ingresos y egresos). En esta ocasin, las
variables globales si se modifican.
Para
comprobar esto, despus de compilar el programa (que no muestre errores), en
vez de ejecutarlo con Ctrl-F9, dale F8, esto te permitir correr el programa
paso a paso.
Para
ver los valores que van tomando las variables, teclea Ctrl-F7 y escribe el
nombre de la variable que desees observar tal cual aparezca en el programa
luego pulsa <ENTER>. Aparecer una ventana en la parte inferior de tu
programa en la cual se indicar el estado o valor de la o las variables que
hayas especificado.
Observars que despus de haber ejecutado, la
funcin porcentaje_xvalor, el
contenido de las variables no cambiar mientras que despus de haber ejecutado porcentaje_xref, salida se ver
modificada porque le asignamos un valor dentro de la funcin.
En realidad, tanto las funciones que utilizan
paso de parmetros por valor como las que utilizan el paso por referencia,
pueden hacer las mismas cosas. Lo nico que cambia es la manera en que trabajan
en la memoria de la computadora.
Lo que tenemos que tener en cuenta para saber
cul utilizar, es si queremos que las variables que utilizaremos en el
parmetro de la funcin se modifiquen o no.
No olvides que las variables que pases por lo
parmetros sean del mismo tipo de las que estan declaradas dentro de los
parntesis dela funcin.
Creacin
de Bibliotecas propias.
Si quieres utilizar funciones definidas por ti
mismo en varios programas, puedes hacerlo, creando tu propia biblioteca. Esto
se logra de la siguiente manera:
-Define tus funciones en un nuevo archivo.
Manda llamarlas librerias estndar de C, que necesites.
-No utilizes la funcin main().
-Compilalo
-Cuando la compilacin sea exitosa, se
generarun archivo con el mismo nombre que el tuyo pero con la terminacin Obj. Este archivo deber ser incluido
preferentemente en el mismo directorio que se encuentre la biblioteca . En caso
contrario, se debe dar la ruta en la seccin Directories del menOptions.
-En el programa donde quieras utilizar esta
unidad slo tendras que mandarla llamar al principio del programa de la
siguiente manera:
#include
"nombre_archivo"
Despus de esto, puedes llamar a las funciones
que tengas definidas en esta libreria normalmente sin tener que declararlas al
principio del programa.
Adems de funciones, en la biblioteca tambien
puedes definir constantes, macros, etc.
Intenta pasar a una biblioteca las funciones
que hemos visto en este mdulo para que puedas utilizarlas posteriormente.
Programa
ejemplo:
En el programa que se muestra a continuacin,
se convierte un nmero en hexadecimal a su representacin decimal. Es una
demostracin muy sencilla de lo que es una funcin ya que en este manual
existen otros programas que contienen funciones en los cuales podras reafirmar
este conocimiento.
Cmpilalo y ejectalo para que puedas
comprenderlo mejor.
/*Programa
que convierte un nmero en hexadecimal a decimal*/
#include<math.h>
#include<string.h>
#include<conio.h>
void main()
{
char hexa[10];
float numero;
clrscr();
printf("Numero hexadecimal
(maysculas): ");
gets(hexa);
numero=hex_dec(hexa);
printf("\nEn decimal es :
%.0f",numero);
}
float hex_dec(char cadena[])
{
int i,j;
char letra;
float decimal=0;
float temp=0;
i=strlen(cadena);
for (j=0;i>0;j++,i--)
{
letra=cadena[i-1];
switch(letra){
case 1:temp=(1*pow(16,j));
break;
case 2:temp=(2*pow(16,j));
break;
case 3:temp=(3*pow(16,j));
break;
case 4:temp=(4*pow(16,j));
break;
case 5:temp=(5*pow(16,j));
break;
case 6:temp=(6*pow(16,j));
break;
case 7:temp=(7*pow(16,j));
break;
case 8:temp=(8*pow(16,j));
break;
case 9:temp=(9*pow(16,j));
break;
case 0:temp=(0*pow(16,j));
break;
case 'A':temp=(10*pow(16,j));
break;
case 'B':temp=(11*pow(16,j));
break;
case 'C':temp=(12*pow(16,j));
break;
case 'D':temp=(13*pow(16,j));
break;
case 'E':temp=(14*pow(16,j));
break;
case 'F':temp=(15*pow(16,j));
break;
}
decimal+=temp;
}
return(decimal);
}
AUTOEVALUACION
1.Qu es una funcin?
2.Escriba la forma general de declarar una funcin.
3.En que consisten las llamadas por referencia?
4.Elabora una programa que realice la conversin de decimal a binario
utilizando funciones
5.Elabora una biblioteca con las funciones del programa anterior.
6. Haz un programa que,utilizando funciones, dibuje 5 ventanas consecutivas,
una dentro de la otra.
7. Implemente una funcin que encuentre un elemento determinado en una
array.
Temas:
*arreglos
- Definicin
- Arreglos unidimensionales
- Forma de acceso a un elemento especfico del
arreglo
- Paso de arregloss a funciones
- Utilizacin de arrays unidimensionales como
cadenas
- Arreglos bidimensionales
- Arreglos multidimensionales
- Inicializacin de arreglos contamao
- Inicializacin de arregloss sintamao
Arreglos
Definicin
Un arreglo es un conjunto de elementos del
mismo tipo agrupados en una sola variable. Tambin se les conoce con el nombre
de arreglos.
Para ingresar a un elemento en particular,
utilizamos un ndice. Existen arreglos unidimensionales, bidimensionales y
tridimensionales.
Su uso ms comn es en la implementacin de
cadenas de caracteres. Recuerda que en C no existen variables de tipo cadena
por lo cual se utiliza un arreglo de caracteres.
Fsicamente, un arreglo es un conjunto de
localidades de memoria contiguas donde la direccin ms baja corresponde al
primer elemento y la direccin ms alta al ltimo.
En un arreglo de n elementos, stos ocuparan desde la casilla 0 hasta la n-1.
Por si mismo, el nombre del arreglo apunta a la
direccin del primer elemento del arreglo.
arreglos
Unidimensionales
La forma general para definir un arreglo de
slo una dimensin es la siguiente:
tipo_de_dato
nombre_variable[tamao]
tipo_de_dato se refiere al tipo de dato de cada elemento del arreglo y tamao es la cantidad de elementos
agrupados en la misma variable.
Forma de acceso a un elemento especfico del arreglo
Para accesar a uno de los elementos del arreglo
en particular, basta con invocar el nombre del arreglo y especificar entre
corchetes el nmero de casilla que ocupa el elemento en el arreglo.
Por ejemplo, si queremos accesar al cuarto
elemento de un arreglo de 10, se invocara de la siguiente manera:
nombre_variable[3]
Recuerde que el arreglo almacena desde la
casilla 0. Por tanto, en un arreglo de 10 casillas, stas estan numeradas del 0
al 9.
Paso
de arreglos a funciones
La forma de pasar un arreglo a una funcin
consiste en llamar a la funcin y en el argumento, especificar el nombre del
arreglo sin ninguna indexacin. Esto hace que se pase a la funcin la direccin
del primer elemento del arreglo ya que en C no es posible pasar el arreglo
completo como argumento. Por ejemplo:
main()
int conjunto[20];
clrscr();
.
.
.
funcion(conjunto);
.
.
.
}
Aqu, al pasar el arreglo conjunto a funcin,
estamos pasando la direccin en memoria del primer elemento de conjunto. En caso de que dentro de la
funcin tuvisemos que accesar a algn elemento del arreglo, se pasa de la
misma manera slo que dentro de la funcin utilizaremos los corchetes para
accesar al elemento deseado.
Hay tres formas de declarar un arreglo como
parmetro formal: como un arreglo delimitado, como un arreglo no delimitado y
como un puntero. Por ejemplo:
#include<stdio.h>
funcion1(int conjunto[20]) /*Delimitando
el array*/
{
.
.
.
}
o como
funcion1(int
conjunto[]) /*arreglo no delimitado*/
{
.
.
.
}
o se puede declara como
funcion1(int
*conjunto) /*como un puntero*/
{
.
.
.
}
El resultado de los tres mtodos de declaracin
es idntico.
Utilizacin
de arreglos unidimensionales como cadenas
El uso ms comn de los arreglos
unidimensionales es laimplementacin de una cadena (conjunto) de caracteres
porque recuerde que en C no existe este tipo de datos. Por tanto, definimos una
cadena en C como un arreglo de caracteres que al final tiene un caracter nulo
('\0'). Por esta razn es necesario que al declarar los arreglos estos sean de
un caracter ms que la cadena ms larga que pueda contener.
Por ejemplo si deseamos crear un cadena que
contenga 5 caracteres la declaracin debe hacerse como sigue:
char
cadena[6];
Esto es con el fin de dejar el ltimo espacio
para el caracter nulo.
No es necesario aadir explcitamente el
caracter nulo de las constantes de cadena porque el compilador de C lo hace
automticamente.
Algunas de las principales funciones que
soporta C para el manejo de cadenas de caracteres son las siguientes:
Nombre
Definicin
strcpy(s1,s2) Copia s2 en s1
strcat(s1,s2) Concatena s2 al final de s1
strlen(s1) Devuelve la longitud de s1
strcmp(s1,s2) Compara la cantidad de elementos
de s1 y s2
Sison iguales, devuelve 0; menor que cero si s1 es
menorque s2 y mayor que 0 si s1>s2.
Para una referencia ms amplia sobre estas y
otras rdenes, busca estas funciones en el apndice B.
arreglos
bidimensionales
Un arreglo bidimensional es un arreglo de
arreglos unidimensionales. Constituyen la forma ms simple de los arreglos
multidimensionales.
Su forma general de declaracin es
tipo_dato
variable[primer ndice][segundo ndice];
El primer ndice corresponde a la filas y el
segundo a las columnas.
Cuando se utiliza un arreglo bidimensional como
argumento de una funcin, realmente se pasa slo la direccin del primer
elemento (el[0][0]). Sin embargo, la funcin que recibe un arreglo
bidimensional como parmetro tiene que definir al menos la longitud de la
segunda dimensin. Esto es necesario debido a que el compilador de C necesita
"conocer" la longitud de cada fila para ordenar el arreglo
correctamente. Por ejemplo, una funcin que recibe un arreglo bidimensional de
5,9 se declara as:
funcion(int
matriz[][9])
{
.
.
.
}
No es necesario especificar la primera
dimensin pero la segunda s ya que el compilador de C la necesita para saber
donde empieza la segunda fila.
Tambin podemos utilizar arreglos
bidimensionales para crear arreglos de cadenas. El primer ndice indicara el
nmero de cadenas y el segundo la longitud mxima de las cadenas.
char
mensajes[5][20];
En la declaracin anterior se especifica que
tenemos un arreglo llamado mensajes
el cual contiene 5 cadenas de 20 caracteres cada una.
Para acceder a una cadena en especial, slo
especificamos el nmero de cadena (de 0 al nmero de cadenas menos 1). Ejemplo:
printf("%s",mensajes[3]);
Aqu mandamos imprimir la cadena nmero 3 de la
variable mensajes. Esto sera equivalente a
printf("%s",mensajes[3][0]);
aunque es ms comn utilizar la primera forma.
arreglos
multidimensionales
En C, podemos crear arreglos de dos o ms
dimensiones el lmite de dimensiones, viene dado por el compilador. Su forma
general de declaracin es
tipo_dato
variable [long ind 1][longindice 2]...[long indice N]
donde tipo_dato
es el tipo de dato de los elementos del arreglo y longind 1, long ind 2...long ind N es la longitud de cada dimensin
del arreglo. Este tipo de arreglos no se utiliza muy frecuentemente debido a el
gran espacio en memoria que ocupan. Otra desventaja es que el acceso a un
arreglo multidimensional dura ms tiempo que el requerido por uno del tipo
unidimensional.
Cuando se pasan arreglos multidimensionales a
funciones, se tiene que declarar todo excepto la primera dimensin. Por
ejemplo:
#include<stdio.h>
funcion1(int
multiarreglo[][3][[4][5])
{
.
.
.
}
main()
{
int m[2][3][4][5];
funcion(m[][3][4][5]);
.
.
.
}
Claro que si se desea, se puede especificar
tambin la longitud dela primera dimensin.
Inicializacin
de arreglos con tamao
En C, podemos inicializar (dar un valor
determinado a la variable antes de usarla) arreglos globales y arreglos
estticos locales en el momento de declararlos. No es posible inicializar
arreglos globales no estticos.
Su forma general de inicializacin es
tipo_dato
variable [tamao 1][tamao2]...[tamao] = {lista de valores};
Lista
de valores es un conjunto de constantes, separadas comas,
cuyo tipo es compatible con tipo_dato.
La primera constante se coloca en la primera posicin del arreglo, la segunda
constante en la segunda posicin, y as sucesivamente. Fjese que un punto y
coma sigue a }.
A continuacin tenemos la inicializacin de un
arreglo unidimensional:
int
digitos[5]={'0','1','2','3','4','5','6','7','8','9'};
En el caso de los arreglos unidimensionales de
caracteres podemos inicializarlos abreviadamente con la forma:
char
variable [tamao]="cadena";
Por ejemplo:
char
nombre[6]="clase";
Lo anterior es lo mismo que si inicializaramos nombre caracter a caracter como en el
ejemplo de dgitos.
char
nombre[6]={'c','l','a','s','e'.'\0'};
Importante: Se debe estar seguro de que el arreglo que se declara es
suficientemente largo para incluirlo. Esto es por lo que nombre tiene16 caracteres de longitud en vez de 15 que es la
cantidad de letras ya quecuando se utiliza una cadena constante, el compilador
proporciona laterminacin nula automticamente.
Inicializacin
de arreglos sin tamao
En los arreglos con tamao, tenemos que
calcular que la longitud del arreglo fuera lo suficientemente grande para que
fueran almacenados todos los elementos que deseabamos.Si tuvieramos que
inicializar varios arreglos de cadena seria fastidioso contar cuantos caracteres
ocupa cada arreglo.
Es posible que C calcule automticamente la
longitud del arreglo utilizando la
inicializacin de arreglos indeterminados la cual permite que el compilador
de C cree automticamente un arreglosuficientemente grande para mantener todos
los inicializadores presentes si el tamao del arreglo no est especificado.
El uso de la inicializacin de los arreglos
indeterminados permite al programador cambiar el contenido de cualquiera de las
cadenas sin tener quere considerar el tamao del arreglo. Tambin puede
utilizarse tambin en arreglos multidimensionales (2 o ms). En este caso, se
debe especificar todo, sin considerar la dimensin que se encuentra ms a la
izquierda para permitir al compilador de C indexar el arreglo adecuadamente. El
mtodo es similar a la especificacin de parmetros de un arreglo. De este modo
se pueden construir tablas de longitudes variables, y el compilador asignar
automticamente el espacio suficientepara ellas.
La ventaja de este tipo de declaracin sobre la
versin del tamao determinado es que la tabla puede alargarse o acortarse sin
cambiar las dimensiones del arreglo.
Programa
ejemplo
El siguiente programa, contiene una funcin que
valida que nicamente se lean nmeros enteros y otra que slo reciba letras. El
fin es que se comprendan bien los conocimientos bsicos sobre arreglos y adems
puede utilizar estos procedimientos en sus programas posteriores.
#include
<stdio.h>
#include<string.h>
void
main()
{
int cifra;
char word[20];
clrscr();
switch(menu())
{
case 1: cifra=numeros();
printf("\n%d",cifra);
break;
case 2: captura(word);
printf("\n%s",word);
break;
default: exit(0);
}
getch();
}
captura(char palabra[])
{
char *letra;
char
alfabeto[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int i;
palabra[0]='\0';
clrscr();
do
{
*letra=getch();
for (i=0;i<=53;i++)
{
if (alfabeto[i]==*letra)
{
printf("%c",*letra);
strcat(palabra,letra);
break;
}
}
}while((*letra!=13) &&
(strlen(palabra)<20));
}
numeros()
{
char cadena[10];
char car='\0';
int i=0;
int cantidad;
do
{
car=getch();
switch(car)
{
case'0': cadena[i]=car;
printf("%c",car);
break;
case'1': cadena[i]=car;
printf("%c",car);
break;
case'2': cadena[i]=car;
printf("%c",car);
break;
case'3': cadena[i]=car;
printf("%c",car);
break;
case'4': cadena[i]=car;
printf("%c",car);
break;
case'5': cadena[i]=car;
printf("%c",car);
break;
case'6': cadena[i]=car;
printf("%c",car);
break;
case'7': cadena[i]=car;
printf("%c",car);
break;
case'8': cadena[i]=car;
printf("%c",car);
break;
case'9': cadena[i]=car;
printf("%c",car);
break;
default: i--;
break;
}
i++;
}while((car!=13) && (i<5));
cantidad=atoi(cadena);
return(cantidad);
}
menu()
{
int numero;
printf("Escoge una
opcin:\n");
printf("1.Escribir slo
nmeros\n");
printf("2.Escribir
nicamenteletras\n");
printf("Opcin: ");
scanf(" %d",&numero);
return(numero);
}
AUTOEVALUACION
1.Qu es un arreglo?
2.Cul es la forma de declararacin de un arreglo?
3.Elabore una funcin que muestre el nombre del usuario al revs.
4. D un ejemplo de inicializacin de arreglos sintamao.
5. Elabora un programa que guarde los datos de una agenda con capacidad
para 15 direcciones diferentes.
6. Implementa un programa que sume dos matrices.
Temas: *Punteros
- Definicin de
punteros
- Declaracin de punteros
- Operadores de los punteros
- Aritmtica de punteros
- Punteros y arrays
- Arrays de punteros
- Punteros a punteros
- Inicializacin de punteros
- Problemas con punteros
P U N T E R O S
Definicin
de punteros
Un puntero es una zona de la memoria
que contiene la direccin de otra zona de memoria.
En C, es muy importante el manejo de los
punteros para una fructfera programacin. Sus principales ventajas son:
-Los punteros proporcionan los medios por los
cuales las funciones pueden modificar sus argumentos de llamada.
-Los punteros se utilizan para soportar las rutinas de asignacin dinmica de
C.
-El uso de punteros puede mejorar la eficiencia de ciertas rutinas.
Aunque tambin cuenta con desventajas como
-Son un recurso peligroso ya que los no
inicializados o punteros descontrolados pueden provocar el fallo del sistema.
-Es fcil utilizar punteros de forma incorrecta y sto causa fallas muy difciles
de encontrar.
Este captulo se reserva para el uso de
punteros debido a su importancia dentro de la programacin.
Declaracion
de variables punteros
Los punteros pueden ser de cualquier tipo de
datos. Esto quiere decir que puede haber punteros que contengan la direccin de
variables de cualquier tipo.
La forma general de declarar una variable de
este tipo es:
tipo_dato
*nombre_variable;
tipo_dato
es cualquier tipo de dato que soporte el C y nombre_variable es el nombre de la
variable puntero. El * es el
indicador de que nos estamos refiriendo a un puntero.
Los
operadores de los punteros
Existen dos operadores monarios (slo necesitan
un operando) utilizados para la manipulacin de punteros. Ellos son el "&" y el asterisco "*".
Cuando una variable puntero va precedida del &, nos referimos a su direccin en
memoria.
Por ejemplo: Supongamos que la variable dato ocupa la celda de memoria nmero
1000 y contiene una 'A'.
s=&dato;
Despus de la asignacin anterior, s contiene ladireccin de dato que es 1000.
La direccin no tiene nada que ver con el valor
de dato. Recuerda que el operador "&" devuelve la direccin
de la variable que le sigue.
El otro operador es el "*". Cuando ste precede a una variable puntero indica el
valor de la variable puntero. Por ejemplo:
s=*dato;
Aqu ponemos en s el contenido de dato.
Por tantos tendr 'A' porque es el valor que se encuentra
almacenado en dato.
An
cuando "&" representa tambin al AND a nivel de bits y
"*" representa el signo de multiplicacin, cuando se utilizan como
operadores de puntero tienen mayor prioridad que todos los operadores
aritmticos.
Debes asegurarte de que las variables puntero
apunten siempre al tipo de dato correcto es decir, que una variable puntero
tipo int sea asignada a otra
variable puntero del mismo tipo y as respectivamente. De lo contrario, aunque
no se produzcan errores al compilarlo (slo advertencias) los resultados no
sern los deseados.
Aritmtica
de punteros
Existen cuatro operadores que pueden utilizarse
con punteros: + ,- , ++ y -- .
Estas operaciones no se realizan a nivel de
celdas sino al nivel de tipode elementos.
Veamos el siguiente ejemplo:
#include<stdio.h>
main()
{
char *letra;
int *entero;
letra++;
entero++;
.
.
.
letra--;
entero=entero+3;
.
.
.
}
En el ejemplo anterior tenemos dos variables
puntero: una de tipo caracter y otra de tipo entero. Supongamos que letra se encuentra en la direccin 600
y entero en la 900.
Al incrementar letra (letra++) en un elemento, su direccin ser la 601 mientras que al
incrementar entero (entero++), la
nueva direccin de entero ser 902.
Lo anterior es porque las operaciones (+, -
, ++ --) se realizan a nivel de elementos y no de celdas de memoria. Por
lo tanto, al incrementar letra en un
elemento letra en la direccin 601
porque el tipo de datos caracter tiene una longitud de un byte sin embargo,
como la longitud del tipo de dato int
es de 2 bytes, al incrementar entero
en un elemento, su nueva direccin es 902.
Algo similar pasa al final del programa cuando
decrementamos en uno a letra y a entero le sumamos 9. Sus direcciones
quedan en 600(601-1) y 908 (902+(2*3)) respectivamente.
Punteros
y arrays
Existe una estrecha relacin entre los punteros
y los arrays ya que un array por si mismo es un puntero a la direccin de su
primer elemento(Un nombre de array sin ndice devuelve la direccin de comienzo
del array que es el primer elemento). Por tanto, podemos intercambiar
informacin entre punteros y arrays del mismo tipo de dato. Veamos un ejemplo:
char
cad[30],punt;
char *punt;
punt=cad;
Arriba, tenemos un array de 30 caracteres y un
puntero a caracter asi que al asignar cad
a punt, almacenamos en punt la direccin del primer elemento
de cad.
Para acceder al quinto elemento de cad lo podemos hacer de dos formas:
cad[4]
*(punt+4)
Ambas formas nos dan el mismo resultado.
Recuerda que utilizamos el 4 para acceder al
quinto elemento porque los arrays comienzan en el elemento nmero 0.
En el caso del acceso por medio del puntero, lo
que hacemos es utilizar la aritmtica de punteros para posicionarnos en la
direccin de memoria del elemento deseado: como punt contiene la direccin del elemento 0, al sumarle cuatro
quedara en la direccin del elemento 4 (0+4=4).
En conclusin, C proporciona dos mtodos para
acceder a los elementos de un array: la aritmtica de punteros y la ordenacin
de arrays. La eleccin de cual utilizar es importante ya que la aritmtica de
punteros puede ser ms rpida que la indexacin de arrays. En la prctica es frecuente
el uso de punteros para acceder a elementos de un array en programas en C
debido aque la velocidad es un factor importante en la programacin.
Como ejemplo, veamos dos formas de implementar
la funcin puts la cual despliega una cadena en pantalla.
puts(char
*s) /*Con punteros */
{
while(*s) putchar(*s++);
}
puts(char *s) /*Con arrays*/
{
int t;
for(t=0;s[t];++t)
putchar(s[t]);
}
Para muchos programadores profesionales de C la
primera versin sera ms sencilla de leer y entender. De hecho, as se
implementan en C este tipo de rutinas.
Si v a acceder al array en un orden ascendente
o descendente estricto, sera ms rpido hacerlo mediante punteros. Pero si el
acceso va a ser aleatorio, es mejor utilizar la indexacin porque como el acceso
es directo, es ms rpida y ms fcil de entender.
Arrays
de punteros
Tambin podemos agrupar punteros en arrays. Su
formato de declaracin sera el siguiente:
tipo_dato
*nombre_variable[tamao];
Por ejemplo:
int
*[20];
declara un array de 20 elementos de tipo
puntero a entero.
Este tipo de arrays poseen las mismas
propiedades que los arrays comunes(en cuanto a la forma de acceder a sus
elementos) y se manejan de la misma forma que las variables puntero simples( en
cuanto a direccin y contenido). Por ejemplo, para asignar la direccin de una
variable entera llamada elem al
octavo elemento del array de punteros (quees una direccin), se indica
x[7]=&elem;
Recuerde que &elem significa "la direccin de elem".
Para encontrar el valor de elem
desde el array se escribe
*x[7]
Para pasar un array de punteros a una funcin
podemos llamarla conel nombre del array sin ndices. Por ejemplo, la siguiente
funcin utiliza un array de este tipo como parmetro:
despliega_elem(int
*a[])
{
int i;
for(i=0;i10;i++)
printf("%d",*a[i]);
}
despliega_elem imprime en pantalla el contenido de los elementos dea
Este tipo de arreglos se utiliza
principalmentre para mantener punteros amensajes de error. Por ejemplo, podemos
crear una funcin que muestre un mensaje de error determinado y su nmero
correspondiente.
error(int
numero)
{
static char*err[]={
"Errorde punto flotante\n",
"Errorde sintaxis\n",
"Nmero demasiado pequeo\n",
"Nmerodemasiado grande\n"
};
printf("Error %d: %s"
nmero,err[numero]);
}
La funcin anterior recibe un entero como
parmetro. Este indica el nmero de elemento del array que contiene el
apuntador al primer elemento de la cadena de caracteres que corresponde. Tanto
el nmero de error (nmero de elemento) como su mensaje de error
correspondiente se presentan en pantalla.
Punteros
a punteros
Un puntero a puntero es una forma de
indireccin mltiple, o un encadenamiento de punteros.Consiste en lo siguiente
Sabemos que un puntero es una variable que
contiene la direccin de un valor determinado.
Un puntero a puntero es una variable que
contiene la direccin del lugar que contiene la direccin de una variable.
Una variable que es un puntero a puntero tiene
que declararse como tal. Esto se hace colocando un * adicional del lado izquierdo del nombre dela variable. Por
ejemplo:
double
** tolerancia;
Esta declaracin le indica al compilador que la
variable tolerancia es un puntero a
un puntero que contiene la direccin de una variable de tipo double.
Veamos un ejemplo:
main()
{
int n,*p,**q;
n=5;
p=&n;
q=&p;
printf("%d",**q) /*imprimireel
valor de x*/
}
Aqu, n
est declarado como un entero, p
comoun puntero a entero y q como un
puntero a puntero a entero. Las asignaciones de la funcin nos dn una idea de
como se relacionan las tres variables entre si: El contenido de la variable n es 5; asu vez, asignamos al puntero p
la direccin de la variable que contiene ese nmero. Finalmente, como q es un
puntero a un puntero, slo puede contener direcciones por tanto, guarda la direccin
de la variable donde se encuentra el valor de la direccin donde se encuentra
el 5.
Mediante la llamada a printf() comprobamos lo dicho, ya que despliegael contenido de
nmero a pesar de que es llamado desde una variable puntero a puntero.
Inicializacin
de punteros
Despus de declarar una variable pero antes de
asignarle un valor, contiene un valor desconocido. Si se intenta utilizar el
puntero antes dedarle un valor, probablemente fallar no solo el programa, sino
tambin el sistema operativo de la computadora.
Es por esto que las variables puntero tambin
deben ser inicializadas.
Inicializar una variable es darle un valor
especfico; sto se realiza indirectamente, al asignar la direccin de una
variablea un puntero, o directamente, al declarar un puntero nulo es decir, que
no apunte a direccin alguna. Veamos el siguiente ejemplo:
main()
{
char car;
char*punt1,*punt2;
punt1=&car;
punt2=NULL;
.
.
.
}
Tenemos una variable llamada car que es de tipo caracter, adems punt1 y punt2 que son punteros a caracter.
Al asignar la direccin de car a punt1
(punt1=&car) estamos inicializando indirectamente a punt1 porque su nuevo contenido depende de la direccin que car ocupe en memoria mientras que punt2 esta inicializado directamente ya
que NULL es un valor constante que
le dimos. En este caso, NULL indica
que ese puntero no apunta a ninguna direccin (es como inicializar una variable
entera en 0).
Se puede utilizar el puntero nulo para hacer
muchas de las rutinas de punteros ms fciles de codificar y ms eficientes.
Por ejemplo,en la siguiente funcin, se leen los elementos de un array hasta
que se encuentre un puntero nulo.
lee(
char *lista)
{
int n;
n=0;
while (lista!=NULL)
printf("%s",*lista[n]);
}
En este caso, NULL nos sirve para determinar el fin de una lista de elementos.
Problemas
con punteros
Utilizar punteros dentro de la programacin es
necesario en la implementacin de algunos programas. Por ahora, no te preocupes
sino encuentras el uso prctico de esta herramienta. Conforme vayas dominando
tanto la programacin como el lenguaje C, te dars cuenta de las formas en que
puedas aplicarlo. Sin embargo, es muy fcil cometer errores al utilizarlos ya
que nada d ms problemas que un puntero descontrolado.
Un puntero errneo es difcil de encontrar
porque el problema es que cada vez que se realiza una operacin utilizando ese
puntero,se est leyendo o escribiendo en algn lugar desconocido dela memoria.
Si se le de l, lo peor que puede ocurrir es quese obtenga basura. Sin
embargo, si se escribe en l, se est escribiendo en otras partes de cdigo o
datos. El hecho de estar perdiendo datos, puede hacerse evidente hasta la
ejecucin del programa, y los datos perdidos pueden llegar a ver el fallo en un
lugar errneo. Puedehaber poca o ninguna evidencia de que el puntero sea el
problema. Este tipo de errores hace que los programadores pierdan el sueo y el
tiempo una y otra vez.
Lo mejor para evitar este tipo de errores, es
prevenirlos. En esta seccin te mostramos los errores ms frecuentes que se
cometen en la utilizacin de punteros:
Puntero
no inicializado
Se incurre en este error, cuando se utiliza un
puntero antes de haberlo inicializado. Veamos un ejemplo:
main()
/*Este programa estincorrecto*/
{
char l, *p;
l='m';
*p=l;
}
El problema en este programa es que se est
asignando 'm' a alguna posicin de
memoria desconocida ya que el puntero p nunca
fu inicializado. Como consecuencia, el programa se para . La solucin para
evitar este tipo de contratiempos es asegurar siempre que el puntero est
apuntando a alguna direccin vlida antes de usarlo.
Error
en la utilizacin de punteros
Este tipo de error se sucita cuando no se
utilizan correctamente los operadores*
o &.
main()
/*Este programa es errneo*/
{
int n, *p;
n=10;
p=n;
printf("%d",*p);
}
La llamada a printf() no imprime el valor de n en la pantalla sino un valor desconocido ya que la asignacin p=x; es incorrecta. Esta sentencia
asigna el valor 10 al puntero p,
aqu es donde se comete el error ya que un puntero slo puede recibir
direcciones. Para corregir el programa se escribir p=&x.>
El utilizar punteros, no quiere decir que vayas
a tener problemas con ellos en tu programa. De hecho, cualquier tipo de datos o
estructura puede producir errores si no est bien estructurada tanto sintactica
como lgicamente. Por tanto, slo hay que tener cuidado, y asegurarse de saber
a donde apunta cada puntero antes de usarlo.
Programa
ejemplo:
/*Programa que demuestra el procedimiento copia
el cual, copia una cadena en otra*/
#include<string.h>
#include<stdio.h>
main()
{
char palabra1[10];
char palabra2[10];
char palabra3[20];
printf("palabra1=
");
scanf("%s",palabra1);
printf("palabra2= ");
scanf("%s",palabra2);
copia(palabra1,palabra2);
printf("palabra1+palabra2=
%s",palabra2);
getch();
}
char *copia(char *cad1, char *cad2)
{
char *inicio;
int i;
inicio=cad2;
while(*cad2!='\0')
cad2++;
while(*cad1!='\0')
{
*cad2=*cad1;
cad2++;
cad1++;
}
*cad2='\0';
cad2=inicio;
}
AUTOEVALUACION
1.Qu es un puntero?
2.Cul es la forma de declarar una variable de tipo puntero?
3.Que relacin existe entre un array y un puntero?
4.Describa grficamente la definicin de punteros apunteros.
5.Escriba un ejemplo de inicializacin de punteros.
6.Elabore un programa, utilizando la aritmtica de punteros,despliegue en
pantalla el contenido de un arreglo bidimensional de nmeros.
7. Elabore un programa que, utilizando la aritmtica de punteros,
encuentre un elemento en un arreglo. Establezca las diferencias existentes
entre este algoritmo y el que realiz en el mdulo anterior.
SEGUNDO EXAMEN PARCIAL
1. Qu es una funcin?
2. Especifique la forma general de una funcin.
3. Para qu se utiliza la sentencia return?
4. En qu consisten las llamadas por valor?
5. Cmo funcionan las llamadas a funciones por referencia?
6. Defina que es un array.
7. Especifique la forma general de declaracin de un array.
8. Cul es el principal uso de los arrays?
9. Defina lo que es un puntero.
10. Especifique la forma general de declaracin de un puntero.
11. Cul es la diferencia entre el operador& y el operador *
cuando se utiliza junto a las variablesde tipo puntero?
12. Mencione los cuatro operadores aritmticos que puedenutilizarse con los
punteros.
13. Qu es un puntero a puntero?
Comandos de las unidades estandar de C
*FUNCIONES CON
CADENAS. <apena1.html>
*FUNCIONES
MATEMATICAS. <apena2.html>
*FUNCIONES DE HORA
Y FECHA Y OTRAS RELACIONADAS CON EL SISTEMA. <apena3.html>
*FUNCIONES DE
PANTALLA <apena4.html>
*FUNCIONES DE
ENTRADA Y DE SALIDA <apena5.html>
*OTRAS FUNCIONES
<apena6.html>
</B
ORDENES DEL ENTORNO DE C
Submen FILE Alt-F
Open...
Abre un archivo de texto.
New
Abre una nueva ventana de edicin.
Save
F2
Graba la ventana de edicin activa en el archivo correspondiente alnombre de la
ventana.
Save
as...
Graba la ventana de edicin activa con un nuevo nombre.
Save
all
Graba todas las ventanas de edicin que se encuentran en el entornode C.
Change
dir
Cambia el directorio raiz por defecto.
Print
Imprime el archivo que se encuentra en la ventana activa.
Get
info...
Presenta una ventana con el estatus de la informacin con que esttrabajando
(directorio, archivo, lineas compiladas, etc).
Dos
shell
Permite la salida temporal al sistema operativo.
Quit
Alt-X
Salida del entorno de C.
Submen EDIT Alt-E
Restore
line
Cancela la modificacin hecha a la ltima lnea.
Cut
Shift-Del
Elimina el texto seleccionado y lo pasa al clipboard.
Para seleccionar el texto, presiona la tecla shift y selecciona eltexto con las
flechas de direccin.
Copy
Ctrl-Ins
Copia el texto seleccionado a la ventana clipboard.Para seleccionar el
texto,presiona la tecla shift y selecciona el texto con las flechas
dedireccin.
Paste
Transfiere el contenido del clipboard a la ventana de edicin activaen el lugar
donde se encuentre el cursor.
Copy
example
Copia un programa ejemplo seleccionado (de los que se encuentran definidosen la
ayuda de C) al clipboard.
Para
seleccionar el texto, presiona la tecla shift y selecciona eltexto con las
flechas de direccin.
Show
Clipboard
Presenta en pantalla una ventana con el contenido del clipboard.
Clear
Ctr-del
Borra el texto seleccionado sin ponerlo en el clipboard.
Para
seleccionar el texto, presiona la tecla shift y selecciona eltexto con las
flechas de direccin.
Submen SEARCH Alt-S
Find...
Encuentra el lugar donde se encuentra una palabra o frase determinada dentrode
la ventana activa.
Replace...
Remplaza determinada palabra por otra dentro de la ventana activa.
Search
again
Busca una nueva existencia de la ltima palabra especificada enFind.
Go
to line number...
Posiciona el cursor en el nmero de linea determinado.
Previous
error Alt-F7
Posiciona el cursor en el lugar donde se cometi el error anterior.
Next
error Alt-F8
Posiciona el cursor en el siguiente error cometido.
Locate
function
Busca la declaracin de alguna funcin despus cuandose est corriendo el
programa paso a paso.
Submen RUN Alt-R
Run
Ctrl-F9
Ejecuta el programa que se encuentra en la ventana activa
(previamentecompilado).
Program
reset Ctrl-F2
Interrumpe la ejecucin paso a paso de un programa.
Go
to cursor F4
Ejecuta el programa desde el lugar donde se encuentra la barra espaciadora(el
cdigo que se est ejecutando paso a paso) hasta lainstruccin donde se
encuentra el cursor.
Trace
into F7
Ejecuta un programa instruccin por instruccin.
Step
over F8
Ejecuta un programa paso a paso.
Arguments...
Define los argumentos que se pasaran al programa desde la lnea decomandos.
Esta orden se utiliza para pasar parmetros al programaprincipal desde fuera de
l.
Submen COMPILE Alt-C
Compile
to OBJ
Compila el programa que se encuentra en la ventana activa y crea
elcorrespondiente programa objeto.
Make
EXE file
Crea un programa ejecutable del que se encuentra en la ventana activa
deleditor. Lo deposita en un nuevo archivo con el mismo nombre, pero con
laterminacin .EXE.
Link
EXE file
Liga los archivos objeto con las bibliotecas sin hacer el ejecutable
delprograma que se encuentra en la ventana activa.
Build
all
Recompila todos los archivos relacionados con el programa principal.
Remove
messages
Elimina el contenido de la ventana de mensajes.
Submen DEBUG Alt-D
Inspect...
Alt-F4
Abre una ventana de inspeccin para examinar valores de los elementosde datos.
Evaluate/modify
Ctrl-F4
Evala y/o modifica el contenido de una variable durante laejecucin paso a
paso del programa y muestra su contenido.
Call
stack... Ctrl-F3
Muestra las funciones que el programa llam para llegar a este punto.
Watches
Agrega, modifica y elimina elementos de la ventana de watches. Esta ordensirve
para observar el o los valores que toma cierta variable durante laejecucin
paso a paso del programa.
Toggle
breakpoint Ctrl-F8
Especifica una instruccin especfica donde interrumpir laejecucin del
programa.
Breakpoints
Ventana que contiene la cantidad de puntos de reuptura en el programa dela
ventana activa.
Submen PROJECT Alt-P
Open
project...
Carga un archivo proyecto y lo presenta en pantalla.
Close
project...
Cierra el archivo proyecto de la ventana activa y carga el archivo
proyectodefinido por defecto.
Add
item
Adiciona un programa utilizado en el programa project.(Recuerda que un
programapuede utilizar funciones de otros programas)
Delete
item
Elimina un programa utilizado en el programa proyecto
Include
files...
Permite ver los archivos que se mandan llamar en el programa project.
Submen OPTIONS Alt-P
Full
menus
Configura para usar o no los comandos completos del men.
Compiler
Configura el compilador.
Transfer...
Crea o cambia los programas de transferencia.
Make...
Configura las opciones del comando Make EXE.
Linker...
Configura el ligador.
Debugger...
Configura el depurador.
Directiories
Especifica los directorios donde busca o vacia archivos.
Environment
Configura el ambiente integrado de C.
Save...
Graba todos los cambios hechos en el submen de opciones.
Submen WINDOW Alt-W
Size/move
Ctrl-F5
Cambia el tamao o la posicin de la ventana activa.
Zoom
F5
Maximiza el tamao de la ventana activa o la devuelve a su tamaoanterior.
Tile
Acomoda en forma de mosaico todas las ventanas existentes en la pantalla.
Cascade
Acomoda todas las ventanas activas de C en forma de cascada.
Next
F6
Posiciona el cursor en la siguiente ventana activa.
Close
Alt-F3
Cierra la ventana de edicin activa del entorno de C.
Message
Abre la ventana de mensajes.
Output
Abre la ventana de salida.
Watch
Abre una ventana para mirar el comportamiento de las variables (watch).
User
screen Alt-F5
Presenta la pantalla donde el usuario presenta la ejecucin de suprograma.
Register
Abre la ventana de registros.
Project
Abre la ventana manejadora de proyectos.
Project
notes
Abre la ventana manejadora del cuaderno de notas del proyecto.
List...
Alt-0
Ventana
que presenta la lista de ventanas abiertas en el entorno de C.
Submen HELP Alt-H
Contents
Muestra la tabla de contenidos de la ayuda.
Index
Shift-F1
Ventana que presenta un ndice para acceder a las definiciones y ejemplosde
funciones estandar de C.
Topic
search Ctrl-F1
Presenta una ventana con ayuda acerca de la palabra donde se encuentra
elcursor.
Previous
topic Alt-F1
Vuelve a mostrar la ltima ventana de ayuda presentada.
Help
on help
Ventana de ayuda acerca de la ayuda.
Men
de programas.
Elaborador de marcos de diferentes
tamaos en modo texto
Programa mini-editor de texto
Programa de mensaje de Bienvenida
Programa que calcula el nmero de
dias vividos
Programa que saca el promedio de 3
nmeros
Programa covertidor de un nmero
decimal entero a octal
Programa que manda un mensaje de
advertencia
Programa que eleva al cuadrado un
nmero real
Programa que encuentra las races de
una ecuacin cuadrada,deacuerdo a las frmulas: (-b(b-4ac))/2a
Seleccion de materias con Ifs
anidados
Seleccion de materias con un Switch
Programa que utiliza la sentencia
For
Programa que calcula el valor
absoluto de un numero utilizando la sentencia WHILE
Programa que calcula el valor
absoluto de un numero utilizando la sentencia DO-WHILE
Ejemplo de funciones por valor y por
referencia
Programa que convierte un nmero en
hexadecimal a decimal
Programa ejemplo
Programa que demuestra el
procedimiento copia el cual, copia una cadena en otra
En esta seccin te presentamos 2 programas para
que puedas disfrutarde lo que has aprendido durante este curso y puedas
utilizarlos en tus propiosprogramas.
Busca la definicin de las funciones que
desconozcas en el Apndice A.
<apena.html>
El cdigo que se muestra a continuacin es un
conjunto de funciones para elaborar un marco de diferentes tamaos en modo
texto (figura(b-1)).En el main()
slo se incluye un ejemplo de como utilizarlos.Por eso fu puesto al final.
#include<string.h>
#include<conio.h>
int pos(char cad[],char c)
{ int i;
for (i=0;i<strlen(cad);i++) if
(cad[i]==c) break;
if (i==strlen(cad)) return(-1); else
return(i);
}
void ins(char cad[],char c,int pos)
{ int i;
char aux[80];
for(i=pos;i<strlen(cad);i++)aux[i-pos]=cad[i];
cad[pos]=c;aux[i-pos]=0;
cad[pos+1]=0;
strcat(cad,aux);
}
void del(char cad[],int pos)
{ int i;
char aux[80];
for(i=pos+1;i<strlen(cad);i++)
aux[i-pos]=cad[i];
aux[i-pos]=0;
cad[pos]=0;
strcat(cad,aux);
}
void lee_cadena(char cad[],int num,char
dat[])
{ int i,j,x,y;
char car;
i=0;
car=' ';
x=wherex();
y=wherey();
cprintf("%s",cad);
gotoxy(x,y);
car=getch();
if (car!=13)
{ for (i=0;i<strlen(cad);i++)
cprintf(" ");
cad[0]=0;
gotoxy(x,y);
}
while (car!=13)
{ if ((pos(dat,car)!=-1) &&
(i<num))ins(cad,car,i);
if ((car==8) && (i>0))
{
gotoxy(x,y);
for(j=0;j<strlen(cad);j++)
cprintf(" ");
cad[strlen(cad)-1]=0;
}
if (car==27)
{
for (j=0;j<strlen(cad); j++)cad[j]='
';
gotoxy(x,y);
cprintf("%s",cad);
cad[0]=0;
}
i=strlen(cad);
gotoxy(x,y);
cprintf("%s",cad);
car=getch();
}
gotoxy(x,y+1);
}
void copia_pagina(int p1,int p2)
{
movedata(0xB800,(unsigned)p1*4000,0xB800,(unsigned)p2*4000,80*25*2);
}
int inkey(char *car)
{ int a;
a=0;
*car=getch();
if (kbhit())
{ *car=getch();
a=1;};
return(a);
}
char caracter(int x,int y)
{ unsigned segm,despl;
char car;
segm=0xB800;
despl=((y-1)*160)+((x-1)*2);
car=peekb(segm,despl);
return(car);
}
char atributo(int x,int y)
{ unsigned segm,despl;
char car;
segm=0xB800;
despl=((y-1)*160)+((x-1)*2)+1;
car=peekb(segm,despl);
return(car);
}
void pcaracter(int x,int y,char car)
{ unsigned segm,despl;
segm=0xB800;
despl=((y-1)*160)+((x-1)*2);
pokeb(segm,despl,car);
}
void patributo(int x,int y,char car)
{ unsigned segm,despl;
segm=0xB800;
despl=((y-1)*160)+((x-1)*2)+1;
pokeb(segm,despl,car);
}
void str(char c,int n,char cad[])
{ int i;
for (i=0;i<n;i++)
cad[i]=c;
cad[i]=0;
}
void centra(int fila,const char cad[])
{ int i,x;
x=(80-strlen(cad))/2;
for (i=0;i<strlen(cad);i++)
pcaracter(i+x,fila,cad[i]);
}
void cent(int fila,int x1,int x2,const
char cad[])
{ int i,x,c;
c=x2-x1+1;
x=x1+(c-strlen(cad))/2;
for (i=0;i<strlen(cad);i++)
pcaracter(i+x,fila,cad[i]);
}
void color(int plano,int fondo)
{ textcolor(plano); /*color del texto*/
textbackground(fondo); /*color de
fondo*/
}
void caja(int x1,int y1,int x2,int
y2,char c)
{ char cad[90];
int i;
str(c,x2-x1+1,cad);
for (i=y1;i<=y2;i++)
{
gotoxy(x1,i);
cprintf("%s",cad);
}
}
void marco( int x1,int y1,int x2,int
y2,char tipo)
{ char tipe[6];
int i,j;
switch (tipo)
{
case 1:
{ tipe[0]='';
tipe[1]='';
tipe[2]='';
tipe[3]='';
tipe[4]='';
tipe[5]='';
break;}
case 2:
{ tipe[0]='';
tipe[1]='';
tipe[2]='';
tipe[3]='';
tipe[4]='';
tipe[5]='';
break;}
default:
for (i=0;i<6;i++) tipe[i]=tipo;
}
gotoxy(x1,y1);
cprintf("%c",tipe[0]);
for (i=x1+1;i<x2;i++)
cprintf("%c",tipe[1]);
cprintf("%c",tipe[2]);
for (j=y1+1;j<y2;j++)
{
gotoxy(x2,j);
cprintf("%c",tipe[3]);
}
gotoxy(x2,y2);
cprintf("%c",tipe[4]);
gotoxy(x1,y2);
cprintf("%c",tipe[5]);
for (i=x1+1;i<x2;i++)
cprintf("%c",tipe[1]);
for (j=y1+1;j<y2;j++)
{
gotoxy(x1,j);
cprintf("%c",tipe[3]);
}
}
int filer(int fila,int x1,int x2)
{ int i,j,k,l,n1,n2,sec,opc,x,y;
char a,cpp,cfn,otr,b,dx;
x=wherex();
y=wherey();
i=x1;
opc=0;
dx=1;
do
{
j=i;
while ((32==caracter(i,fila)) &&
(i<x2))i+=dx;
if (i>=x2)
{
opc=0;
i=x1;
dx=1;
while ((32==caracter(i,fila))
&&(i<x2)) i+=dx;
};
if (i<=x1)
{
opc=0;
i=x1;
dx=1;
while ((32==caracter(i,fila))
&&(i<x2)) i+=dx;
};
n1=i;
a=atributo(i,fila);
cpp=a % 16;
cfn=a / 16;
otr=cpp*16+cfn;
while ((caracter(i,fila)!=32)
&&(i<x2))
{ patributo(i,fila,otr);
i+=dx;};
n2=i-dx;
if (n1>n2) {k=n1;n1=n2;n2=k;};
sec=inkey(&b);
for (k=n1;k<=n2;k++)
patributo(k,fila,a);
if (sec)
{
switch (b)
{ case 77: {opc++;dx=1;i=n2+1;break;};
case 75: {opc--;dx=-1;i=n1-1;break;};
default : i=j;
}
} else i=j;
}while ((b!=13) && (b!=27));
if (b==27) return(0); else return
(opc+1);
}
int scrul (int x1,int x2,int y1,int
y2,int paso)
{ char b,c1,c2;
int sec,cont,cuantos,x,y;
cont=0;
cuantos=((int)(y2-y1)/paso)+1;
y=y1;
do
{
for (x=x1;x<=x2;x++)
{ c1=atributo(x,y);
c2=c1 % 16;
c2=(c2*16)+(c1 / 16);
patributo(x,y,c2);
}
sec=inkey(&b);
for (x=x1;x<=x2;x++)
{ c1=atributo(x,y);
c2=c1 % 16;
c2=(c2*16)+(c1 / 16);
patributo(x,y,c2);
}
if (sec)
{
switch (b)
{
case 72: { if((--cont)<0)
cont=0;y=y1+cont*paso;break;};
case 80: { cont=((++cont)% cuantos);y=y1+cont*paso;break;}
case 75: {return(-1);}
case 77: {return(-2);}
};
};
} while ((b!=27) && (b!=13));
if (b==13) return(cont+1); else
return(0);
}
void ventana(int x1,int y1,int x2,int
y2,const char titulo[],int marc,intsmb,int cp,int cf)
{
int a;
char cad[80];
color(0,0);
if (smb) caja(x1+1,y1+1,x2+1,y2+1,'');
color(cp,cf);
str(' ',x2-x1+1,cad);
gotoxy(x1,y1);
cprintf("%s",cad);
a=x1+((x2-x1+1)-strlen(titulo))/2;
gotoxy(a,y1);
cprintf("%s",titulo);
color(0,7);
for (a=y1+1;a<=y2;a++)
{
gotoxy(x1,a);
cprintf("%s",cad);
}
str('',x2-x1+1,cad);
gotoxy(x1,y1+1);
cprintf("%s",cad);
if (marc) marco(x1,y1+2,x2,y2,2);
}
main()
{
clrscr();
ventana ( 1,1,80,24,"Universidad de
Guadalajara",0,0,3,1);
ventana(30,5,50,19,"UCT
Ingeniera",0,0,3,1);
getch();
delay(600);
}
El siguiente programa tiene la finalidad de que emplees los
conocimientosadquiridos a lo largo del curso.
El siguiente programa es un mini-editor de texto (figura(b-2)). Hazlo compilary
te recomiendo que lo ejecutes paso a paso para que entiendas mejor lalgica del
programa. Luego puedes modificarlo a
tu antojo, agregarle o suprimirle funciones a tu criterio.
/* Programa para Modo Texto */
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <dos.h>
unsigned modo;
char bksp=8;
void main(void)
{
Inicia();
clrscr();
color(0,3);
caja(1,1,80,24,'');
ventana(1,1,80,3,"Programa
Procesador de Texto",0,0,14,4);
color(1,3);
caja(1,21,80,24,' ');
marco(1,21,80,24,1);
Procesa_Pagina();
}
void copia_pagina(int p1,int p2)
{
movedata(0xB800,(unsigned)p1*4000,0xB800,(unsigned)p2*4000,80*25*2);
}
int inkey(char *car)
{ int a;
a=0;
*car=getch();
if (kbhit())
{ *car=getch();
a=1;};
return(a);
}
char caracter(int x,int y)
{ unsigned segm,despl;
char car;
segm=0xB800;
despl=((y-1)*160)+((x-1)*2);
car=peekb(segm,despl);
return(car);
}
char atributo(int x,int y)
{ unsigned segm,despl;
char car;
segm=0xB800;
despl=((y-1)*160)+((x-1)*2)+1;
car=peekb(segm,despl);
return(car);
}
void pcaracter(int x,int y,char car)
{ unsigned segm,despl;
segm=0xB800;
despl=((y-1)*160)+((x-1)*2);
pokeb(segm,despl,car);
}
void patributo(int x,int y,char car)
{ unsigned segm,despl;
segm=0xB800;
despl=((y-1)*160)+((x-1)*2)+1;
pokeb(segm,despl,car);
}
void escribe(int x,int y,const char
cad[])
{ int cont;
for (cont=0;cont<strlen(cad);
cont++)pcaracter(x+cont,y,cad[cont]);
}
void str(char c,int n,char cad[])
{ int i;
for (i=0;i<n;i++)
cad[i]=c;
cad[i]=0;
}
void centra(int fila,const char cad[])
{ int i,x;
x=(80-strlen(cad))/2;
for (i=0;i<strlen(cad);i++)
pcaracter(i+x,fila,cad[i]);
}
void color(int plano,int fondo)
{ textcolor(plano);
textbackground(fondo);
}
void caja(int x1,int y1,int x2,int
y2,char c)
{ char cad[90];
int i;
str(c,x2-x1+1,cad);
for (i=y1;i<=y2;i++)
{
gotoxy(x1,i);
cprintf("%s",cad);
}
}
void marco( int x1,int y1,int x2,int
y2,char tipo)
{ char tipe[6];
int i,j;
switch (tipo)
{
case 1:
{ tipe[0]='';
tipe[1]='';
tipe[2]='';
tipe[3]='';
tipe[4]='';
tipe[5]='';
break;}
case 2:
{ tipe[0]='';
tipe[1]='';
tipe[2]='';
tipe[3]='';
tipe[4]='';
tipe[5]='';
break;}
default:
for (i=0;i<6;i++) tipe[i]=tipo;
}
gotoxy(x1,y1);
cprintf("%c",tipe[0]);
for (i=x1+1;i<x2;i++)
cprintf("%c",tipe[1]);
cprintf("%c",tipe[2]);
for (j=y1+1;j<y2;j++)
{
gotoxy(x2,j);
cprintf("%c",tipe[3]);
}
gotoxy(x2,y2);
cprintf("%c",tipe[4]);
gotoxy(x1,y2);
cprintf("%c",tipe[5]);
for (i=x1+1;i<x2;i++) cprintf("%c",tipe[1]);
for (j=y1+1;j<y2;j++)
{
cprintf("%c",tipe[3]);
}
}
void ventana(int x1,int y1,int x2,int
y2,const char titulo[],int marc,intsmb,int cp,int cf)
{
int a;
char cad[90];
color(0,0);
if (smb) caja(x1+1,y1+1,x2+1,y2+1,'');
color(cp,cf);
str(' ',x2-x1+1,cad);
gotoxy(x1,y1);
cprintf("%s",cad);
a=x1+((x2-x1+1)-strlen(titulo))/2;
gotoxy(a,y1);
cprintf("%s",titulo);
color(0,7);
for (a=y1+1;a<=y2;a++)
{
gotoxy(x1,a);
cprintf("%s",cad);
}
str('',x2-x1+1,cad);
gotoxy(x1,y1+1);
cprintf("%s",cad);
if (marc) marco(x1,y1+2,x2,y2,2);
}
void Cadena(int x1,int x2,int fila,char
cad[])
{ int xx1,xx2,i;
char car;
xx1=x1;
car=caracter(xx1,fila);
while ((xx1>(x1-1)) &&
(car<33) )
{ xx1++;
car=caracter(xx1,fila);}
xx2=x2;
car=caracter(xx2,fila);
while ((xx2<(x2+1)) &&
(car<33) )
{ xx2--;
car=caracter(xx2,fila);}
for (i=0;i<(xx2-xx1+1);i++)
cad[i]=caracter(xx1+i,fila);
cad[i]=0;
}
void Inicia(void)
{
modo=LASTMODE;
textmode (modo);
gotoxy(1,1);
color(WHITE,BLACK);
}
void Procesa_Pagina(void)
{ unsigned char
Ch,car,Colum[4],Reng[4],Mensaje[15],Aux[70];
int sec,si,otr1,otr2;
color(7,0);
window (4,5,77,19);
clrscr();
si=1;
escribe(11,22,"Columna:1");
escribe(11,23,"Rengln:1");
escribe(30,22,"Alt C - Centrar Alt
Del o Ctrl Y- Borrar Linea");
escribe(30,23,"Alt Ins - Insertar
Linea Home - Inicio deLinea") ;
do{
sec=inkey(&Ch);
if (sec)
{
switch (Ch)
{
case 45: si=0;break;
case 72:gotoxy(wherex(),wherey()-1);
break;
case 75:gotoxy(wherex()-1,wherey());
break;
case 77:
gotoxy(wherex()+1,wherey());break;
case 80:
gotoxy(wherex(),wherey()+1);break;
case 71: gotoxy(1,wherey());break;
case79:{otr2=77;car=caracter(otr2,wherey()+4);
while ((car>3) && (car <
33))
{ otr2--;
car=caracter(otr2,wherey()+4);
}
gotoxy(otr2+1-3,wherey());break;
}
case 46:{Cadena(4,77,wherey()+4,Aux);
gotoxy(1,wherey());
clreol();
centra(wherey()+4,Aux);
break;}
case 162: insline();break;
case 163: delline();break;
}
}
else
switch(Ch)
{
case 3: si=0; break;
case 13:
cprintf("\n\r");break;
case 8:
cprintf("%c%c",bksp,bksp);break;
case 27: si=0;break;
case 25: delline();break;
default: cprintf("%c",Ch);
}
Colum[0]=(wherex() / 10) +48;
if (Colum[0]=='0') { Colum[0]=(wherex()
%10)+48;Colum[1]=' ';}
else { Colum[1]=(wherex() % 10)+48;}
Colum[2]=0;
Reng[0]=(wherey() / 10) +48;
if (Reng[0]=='0') { Reng[0]=(wherey()
%10)+48;Reng[1]=' ';}
else { Reng[1]=(wherey() % 10)+48;}
Reng[2]=0;
strcpy(Mensaje,"Columna:");
strcat(Mensaje,Colum);
escribe(11,22,Mensaje);
strcpy(Mensaje,"Rengln:");
strcat(Mensaje,Reng);
escribe(11,23,Mensaje);
}while (si);
} 
/*Programa que
despliega un mensaje de bienvenida en la pantalla*/
#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
gotoxy(20,10);
printf("BIENVENIDO AL CURSO DE C
ESTANDAR");
delay(2500);
}

/*Programa que calcula el nmero de dias
vividos*/
#include<stdio.h>
#include<conio.h>
void main()
{
char nombre[50];
int edad;
clrscr();
printf("Cmo te llamas?\n
");
scanf("%s",nombre);
printf("Cuntos aos
tienes?\n");
scanf("%i",&edad);
edad=edad*365;
gotoxy(5,10);
printf("%s, has vivido %i
dias",nombre,edad);
gotoxy(40,22);
printf("Pulsa cualquier tecla para
terminar...");
getch();
}

/*Programa que
saca el promedio de 3 nmeros*/
#include<stdio.h>
#include<conio.h>
void main()
{
float numero;
float promedio=0;
clrscr();
printf("Dame el primer nmero:
");
scanf("%f",&numero);
promedio+=numero;
printf("Dame el segundo nmero:
");
scanf("%f",&numero);
promedio+=numero;
printf("Dame el tercer nmero:
");
scanf("%f",&numero);
promedio+=numero;
promedio=promedio/3;
printf("El promedio es
%f",promedio);
gotoxy(40,22);
printf("Presione cualquier tecla para
terminar...");
getch();
}

/*Programa que convierte un nmero decimal
entero a octal*/
#include<stdio.h>
#include<conio.h>
void main()
{
int numero;
clrscr();
printf("Numero entero en decimal:
");
scanf("%i", &numero);
printf("\n\nSu representacion en
octal es %o");
gotoxy(40,22);
printf("Presione cualquier tecla para
terminar...");
getch();
}

/*Programa que
manda un mensaje de advertencia*/
#include <dos.h>
#include<conio.h>
int main(void)
{
clrscr();
gotoxy(28,11);
printf(" P E L I G R O !
");
sound(250);
delay(600);
sound(80);
delay(600);
delay(600);
nosound();
return 0;
}

/* Programa que eleva al cuadrado un nmero real */
#include<math.h>
main()
{
float x;
printf("Dame el nmero que quieres elevar al cuadrado:
");
scanf("%f",&x);
x=cuadrado(x);
printf("El cuadrado es%f",x);
}
cuadrado(float n)
{
n=n*n;
return(n);
}

/*Programa que encuentra las races de una
ecuacin cuadrada,deacuerdo a las
frmulas: (-b(b-4ac))/2a */
#include<math.h>
main()
{
float a,b,c,x1,x2;
printf("Este programa encuentra las
races reales\n");
printf("de la ecuacin de la
forma\n");
printf(" ax+bx+c=0 \n");
printf("A continuacin, escriba
los coeficientes\n");
printf("de la
ecuacin:\n");
printf("a= ");
scanf("%f",&a);
printf("b= ");
scanf("%f",&b);
printf("c= ");
scanf("%f",&c);
x1=pow(b,2);
x1=x1-(4*a*c);
x1=-b+sqrt(fabs(x1));
x1=x1/(2*a);
x2=pow(b,2);
x2=x2-(4*a*c);
x2=-b-sqrt(fabs(x2));
x2=x2/(2*a);
printf("x1= %f\n");
printf("x2= %f\n);
getch();
}

#include<stdio.h>
menu()
{
char opcion;
printf("A)Espaol\n");
printf("B)Matemticas\n");
printf("C)Historia\n");
printf("D)Biologia\n");
printf("Opcin: ");
scan("%c",&opcion);
printf("Escogi ");
if (opcion=='A')
printf("espaol");
else if (opcion=='B')
printf("matamticas");x
else if (opcion=='C')
printf("historia");
else if (opcion=='D')
printf("biologia");
else printf("una
asignaturainexistente.");
}

menu()
{
char opcion;
printf("A)Espaol\n");
printf("B)Matemticas\n");
printf("C)Historia\n");
printf("D)Biologa\n");
printf("Opcin: ");
scan("%c",&opcion);
printf("Escogi ");
switch(opcion)
{
case'A':printf("espaol");
break;
case
'B':printf("matemticas");
break;
case 'C':
printf("historia");
break;
case 'D':
printf("biologia");
break;
default: printf("escogiste
una asignatura inexistente");
}
}

main()
{
for(x=1;x<80;x++)
{
gotoxy(x,1);
printf("");
gotoxy(x,24);
printf("");
}
gotoxy(1,1);
printf("");
gotoxy(80,1);
Printf("");
gotoxy(1,24);
printf("");
gotoxy(80,24);
printf("");
for(x=0;x<24;x++)
{
gotoxy(1,x);
printf("");
gotoxy(80,x);
printf("");
}
}

#include
<ctype.h>
#include<conio.h>
#include<stdio.h>
#include <math.h>
main()
{
char respuesta;
clrscr();
respuesta='\0';
while (respuesta!='N')
{
float x;
printf("Dame un nmero:
");
scanf("%f",&x);
x=fabs(x);
printf("Su valor absoluto
es: %f\n",x);
printf("Presione 'N' para
salir...\n");
respuesta=toupper(getch());
}
}

#include <ctype.h>
#include<conio.h>
#include<stdio.h>
#include <math.h>
main()
{
char respuesta;
clrscr();
do{
float x;
printf("Dame un nmero:
");
scanf("%f",&x);
x=fabs(x);
printf("Su valor absoluto
es: %f\n",x);
printf("Continuar...\n");
respuesta=toupper(getch());
}while(respuesta!='N');
}

/*Ejemplo de funciones por valor y por
referencia*/
/*Calcula dos veces el procentaje de
gastos, la primera vez
utilizando una funcin por valor y la
segunda por referencia*/
#include<stdio.h>
porcentaje_xvalor(float ingreso, float
egreso)
{
egreso=((egreso/ingreso)*100)
printf("Usted gasta el %.2f
por ciento de lo quegana",egreso);
}
porcentaje_xref(float *ingreso,float
*egreso)
{
*egreso=(((*egreso)/(*ingreso))*100);
printf("Usted gasta el %.2f
por ciento de lo quegana",egreso);
}
main()
{
float entrada,salida;
clrscr();
printf("Entradas: ");
scanf("%f",&entrada);
printf("Salidad: ");
scanf("%f",&salida);
porcentaje_xvalor(entrada,salida);
/*Llamada a la funcinporcentaje
utilizando paso de parmetros por valor*/
printf("\n\n");
porcentaje_xref(&entrada,&salida); /*Utilizacinde la funcin porcentaje con paso de parmetrospor
referencia*/
getch();
}

/*Programa que convierte un nmero en
hexadecimal a decimal*/
#include<math.h>
#include<string.h>
#include<conio.h>
void main()
{
char hexa[10];
float numero;
clrscr();
printf("Numero hexadecimal
(maysculas): ");
gets(hexa);
numero=hex_dec(hexa);
printf("\nEn decimal es :
%.0f",numero);
}
float hex_dec(char cadena[])
{
int i,j;
char letra;
float decimal=0;
float temp=0;
i=strlen(cadena);
for (j=0;i>0;j++,i--)
{
letra=cadena[i-1];
switch(letra){
case 1:temp=(1*pow(16,j));
break;
case
2:temp=(2*pow(16,j));
break;
case 3:temp=(3*pow(16,j));
break;
case 4:temp=(4*pow(16,j));
break;
case
5:temp=(5*pow(16,j));
break;
case 6:temp=(6*pow(16,j));
break;
case 7:temp=(7*pow(16,j));
break;
case 8:temp=(8*pow(16,j));
break;
case 9:temp=(9*pow(16,j));
break;
case 0:temp=(0*pow(16,j));
break;
case 'A':temp=(10*pow(16,j));
break;
case 'B':temp=(11*pow(16,j));
break;
case 'C':temp=(12*pow(16,j));
break;
case 'D':temp=(13*pow(16,j));
break;
case 'E':temp=(14*pow(16,j));
break;
case 'F':temp=(15*pow(16,j));
break;
}
decimal+=temp;
}
return(decimal);
}

#include <stdio.h>
#include<string.h>
void main()
{
int cifra;
char word[20];
clrscr();
switch(menu())
{
case 1: cifra=numeros();
printf("\n%d",cifra);
break;
case 2: captura(word);
printf("\n%s",word);
break;
default: exit(0);
}
getch();
}
captura(char palabra[])
{
char *letra;
char
alfabeto[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int i;
palabra[0]='\0';
clrscr();
do
{
*letra=getch();
for (i=0;i<=53;i++)
{
if (alfabeto[i]==*letra)
{
printf("%c",*letra);
strcat(palabra,letra);
break;
}
}
}while((*letra!=13) &&
(strlen(palabra)<20));
}
numeros()
{
char cadena[10];
char car='\0';
int i=0;
int cantidad;
do
{
car=getch();
switch(car)
{
case'0': cadena[i]=car;
printf("%c",car);
break;
case'1': cadena[i]=car;
printf("%c",car);
break;
case'2': cadena[i]=car;
printf("%c",car);
break;
case'3': cadena[i]=car;
printf("%c",car);
break;
case'4': cadena[i]=car;
printf("%c",car);
break;
case'5': cadena[i]=car;
printf("%c",car);
break;
case'6': cadena[i]=car;
printf("%c",car);
break;
case'7': cadena[i]=car;
printf("%c",car);
break;
case'8': cadena[i]=car;
printf("%c",car);
break;
case'9': cadena[i]=car;
printf("%c",car);
break;
default: i--;
break;
}
i++;
}while((car!=13) &&
(i<5));
cantidad=atoi(cadena);
return(cantidad);
}
menu()
{
int numero;
printf("Escoge una
opcin:\n");
printf("1.Escribir
slo nmeros\n");
printf("2.Escribir
nicamenteletras\n");
printf("Opcin: ");
scanf("
%d",&numero);
return(numero);
}

/*Programa que demuestra el procedimiento
copia el cual, copia una cadena en
otra*/
#include<string.h>
#include<stdio.h>
main()
{
char palabra1[10];
char palabra2[10];
char palabra3[20];
printf("palabra1= ");
scanf("%s",palabra1);
printf("palabra2= ");
scanf("%s",palabra2);
copia(palabra1,palabra2);
printf("palabra1+palabra2=
%s",palabra2);
getch();
}
char *copia(char *cad1, char *cad2)
{
char *inicio;
int i;
inicio=cad2;
while(*cad2!='\0')
cad2++;
while(*cad1!='\0')
{
*cad2=*cad1;
cad2++;
cad1++;
}
*cad2='\0';
cad2=inicio;
}
