• No se han encontrado resultados

Fundamento de programacion en C

N/A
N/A
Protected

Academic year: 2018

Share "Fundamento de programacion en C"

Copied!
18
0
0

Texto completo

(1)

Ing. Carlos Ávila M. Jr.

http://www.elrincondelc.com/cursoc/cursoc.html

(2)

Un Puntero es una variable que contiene la dirección de

otra variable

Cuando una variable puntero es definida, el nombre de la

variable debe ir precedido de un asterisco (*). Este

identifica que la variable es un puntero. Las variables

cuando la definimos reservan un espacio de memoria, la

zona de memoria en dónde se guarda esa variable es la

que llamamos un puntero.

Tipo *identificador

Por ejemplo:

int *p

; es una variable puntero de tipo

entero. La variable p es la dirección de memoria en dónde

se guarda un entero.

Operadores

El * tiene dos usos en C

o

Para declarar variable de tipo puntero

o

Para acceder al contenido de lo que está

dentro de esa dirección

o

El operador & delante de una variable

devuelve la dirección de memoria en

dónde se guarda esa variable.

(3)

Ejemplo

#include <stdio.h>

#include <iostream>

#include “funciones.h”

using namespace std;

void main (void){

int a=7, b=8;

printf(“a=%d b=%d\n”,a,b);

intercambia (a, b);

printf(“a=%d b=%d\n”,a,b);

}

void intercambia (int x, int y){

int z;

z=x;

x=y;

y=z;

}

--- Solución

No ocurre

el cambio

*x e *y son

variables de tipo

puntero.

(4)

Hay que modificar la función

intercambia (&a, &b);

void intercambia (int *x, int *y){

int z;

z=*x;

*x=*y;

*y=z;

}

Resumen

El símbolo * se usa para DEFINIR un tipo de puntero

*: acceso al contenido

&: acceso al contenido

Otro significado del *

Guarda en Z el contenido de X

Otro significado del *

Guarda en Z el contenido de X

(5)

El símbolo & se usa para indicar la dirección de una

variable

El símbolo *se usa para ACCEDER al valor que guarda un

puntero

El símbolo & se usa para la invocación de funciones, de

forma que se pone delante de los parámetros de E/S

Cuando un parámetro es el prototipo y cabecera se indica

con un tipo de puntero, esto es, poniendo un * delante del

nombre

En el cuerpo de la función los argumentos que son

funciones se usan con un * delante.

Los & sólo se usan en el programa principal

(6)

Capitulo 1

Funciones

Introducción

La solución de un problema se expresa por medio de un programa; la

solución de un subproblema, por medio de una función.

La comunicación entre las funciones y el programa principal, al igual que

entre las mismas funciones, se lleva a cabo por medio de

parámetros por

valor, parámetros por referencia y variables globales.

Variables locales, globales y estáticas

Las variables

son objetos que pueden cambiar su valor durante la

ejecución de un programa.

En C podemos distinguir tres tipos de variables:

Locales

,

Globales

y

Estáticas

.

Las variables locales

son objetos definidos tanto en el programa

principal como en las funciones y su alcance esta limitado

solamente al

programa principal

o a la

función

en la cual están

definidas. Por ejemplo,

cada variable local definida en una función

comienza a existir solo cuando se llama a esa función

y

desaparece cuando el control regresa al programa principal

.

Puesto que no retienen su valor, deben ser inicializada cada vez que

se ejecuta la función, de otra manera contendrán basura.

(7)

Las variables globales

son objetos definidos

antes del programa

principal y su alcance es muy amplio ya que tiene influencia tanto

en el programa principal como en todas las funciones

.

Las variables estáticas

son

similares a las locales

pero conservan

su valor durante la ejecución del programa. Es decir, comienzan a

existir cuando se llama a la función y conservan su valor aun

cuando el control regresa al programa principal

.

En lenguaje en C una función se escribe de la siguiente forma:

Tipo-de-resultado

Nombre de la función

(Parámetros)

{

Instrucciones

;

}

Donde:

Tipo-de-resultado

representa el tipo de resultado que

devuelve la función

(entero,

real, carácter, cadena de

caracteres, etc); si no regresa ningún resultado, entonces se

escribe la palabra reservada

void

.

Parámetro

se utiliza para indicar la lista de parámetros que

recibe la función.

Instrucciones

representan el conjunto de instrucciones que

pertenecen a la función.

Ejemplos

(8)

#include <stdio.h>

int cubo (void); /*prototipo de la función*/

int I; /*variable global*/

void main (void)

{

int CUB;

for ( I=1; I <=10; I++)

{

CUB = cubo(); /* llamada a la función cubo */

printf (*\n el cubo de %d es: %d , I, CUB);

}

}

int cubo (void) /*declaración de la función*/

/*la función calcula el cubo de la variable global I.*/

{

return (I*I*I);

}

OBS:

La segunda instruccion del programa:

int cubo (void);

es un prototipo de la función. Puesto que

esta función se declara posteriormente, pero se utiliza en el

programa principal, el compilador del lenguaje C requiere

estar enterado de la existencia de la misma.

El tipo de la función es entero (int) y no tiene parámetros. Las

funciones pueden regresar resultados de diferentes tipos de

Return regresa el

resultado obtenido al prog principal. siempre que la función es de un tipo de dato determinado. También regresa el control al prog. Principal.

Return regresa el

(9)

datos o bien no regresar ninguno, en cuyo caso al inicio se

debe incluir la palabra

void

.

La instrucción

CUB = cubo();

Expresa que el resultado de la función cubo () se asigna a la

variable local CUB. Observa la forma de invocar o llamar a

una función. Cabe destacar que es posible evitar el uso de la

variable local CUB escribiendo el resultado del llamado a la

función cubo como se muestra a continuación.

printf

(*\n El cubo de %d es: %d , I, cubo());

Finalmente, ya en la función cubo, la instrucción:

return (I * I * I);

return regresa el resultado obtenido al programa principal.

Siempre que la función sea de un tipo de datos determinado

es necesario utilizar

return

para regresar tanto el resultado

como el control al programa principal

.

Ver el resultado de la función en el libro.

Programa 4.2:

El programa calcula el cubo de los 10 primeros números

naturales con la ayuda de una función.

#include <stdio.h>

int cubo (void); /*prototipo de la función*/

int I; /*variable global*/

void main (void)

{

int CUB;

(10)

{

CUB = cubo(); /* llamada a la función cubo */

printf (*\n el cubo de %d es: %d , I, CUB);

}

}

int cubo (void) /*declaración de la función*/

/*la función calcula el cubo de la variable local I.*/

{

int I = 2;

/*la variable local entera I con el mismo nombre que la variable

global.*/

return (I*I*I);

}

OBS:

la

variable local I tiene prioridad sobre la variable global que

tiene el mismo nombre y por esa razón siempre calcula el cubo del

número entero 2.

Conflicto entre los nombre de las variables

Las variables locales, tienen prioridad sobre las globales

que

cuentan con el mismo nombre. En caso que necesitemos hacer

referencia a la variable global debemos incorporarle previamente a

la variable global el símbolo

::,

de tal forma que si queremos hacer

referencia a la variable global I, debemos escribir :

::I.

Programa 4.3:

El programa calcula el cubo de los 10 primeros números

naturales con la ayuda de una función.

#include <stdio.h>

#include <windows.h>

(11)

void f1 (void); /*prototipo de la función*/

int k=5; /*variable global*/

void main (void)

{

int I;

for ( I=1; I <=10; I++)

f1(); /*llamada a la función f1*/

}

void f1 (void)

/*la función utiliza tanto la variable local I como la variable

global.*/

{

int k = 2; /* variable local */

k +=k;

printf (“\n\n El valor de la variable local es: %d”,k);

::k = ::k + k; /* uso de ambas variable */

printf (“\n El valor de la variable global es: %d”,::k);

fflush(stdout);

system("pause");

}

Los resultados que arroja el programa son los siguientes:

(12)

El valor de la variable local es: 4

El valor de la variable global es: 17

Ejemplo 4.4

Observa el uso de las variables locales, globales y estáticas. Incluso en la función f4 se hace referencia tanto a la variable local como a la variable global que tiene el mismo nombre.

#include <windows.h>

#include <stdio.h>

/* Prueba de variables globales, locales y estáticas.

El programa utiliza funciones en las que se usan diferentes tipos de variables */

int f1 (void);

int f2 (void);

int f3 (void);

int f4 (void); /*prototipo de la función*/

int k =3; /*variable global*/

void main (void)

{

int I;

for ( I=1; I <=3; I++)

{

printf (“\n\n El resultado de la función f1 es: %d”,f1());

printf (“\n\n El resultado de la función f2 es: %d”,f2());

printf (“\n\n El resultado de la función f3 es: %d”,f3());

printf (“\n\n El resultado de la función f4 es: %d”,f4());

system(“pause”);

} }

int f1(void) /*la función f1 utiliza la variable global.*/

(13)

k+=k;

return (k);

}

int f2(void) /*la función f2 utiliza la variable local.*/

{

k=1;

k++;

return (k);

}

int f3(void) /*la función f3 utiliza la variable estática.*/

{

static int k=8;

k+=2;

return (k);

}

int f4(void) /*la función f4 utiliza dos variables con el mismo nombre: local y global.*/

{

k=5;

k=k+::k;

return (k); /*uso de la variable local (k) y global (::k).*/

}

Los resultados que arroja el programa son los siguientes:

El resultado de la función f1 es : 6 global El resultado de la función f2 es : 2 local El resultado de la función f3 es : 10 estática El resultado de la función f4 es : 11 local y global

(14)

El resultado de la función f4 es : 17 local y global

El resultado de la función f1 es : 24 global El resultado de la función f2 es : 2 local El resultado de la función f3 es : 14 estática El resultado de la función f4 es : 29 local y global

Parámetros por valor y por referencia

La comunicación entre las funciones y el programa principal, o bien entre las mismas funciones, se lleva a cabo mediante variables globales y parámetros por valor y por referencia.

Los parámetros por valor permiten pasar datos entre el programa principal y las

funciones, e incluso entre las mismas funciones. En el parámetro se escribe una copia de la variable original. Si el parámetro sufre una alteración en la función que lo recibe, la variable original no se ve afectada.

Los parámetros por referencia diferente de la anterior en lugar de escribir una copia de la variable en el parámetro se escribe la dirección de la misma. Si el parámetro sufre una alteración en la función que lo recibe, la variable original también se ve afectada. En C, las llamadas por referencia se realizan por medio de apuntadores. Un apuntador es una variable que contiene la dirección de otra variable y se representa por medio de operadores de dirección (&) e indirección (*).

Ejemplo 4.5

Escriba un programa que calcule el cubo de los 10 primeros números naturales, utilizando una función y realizando la comunicación mediante parámetros por valor.

#include <windows.h>

#include <stdio.h>

/*Cubo-3. el programa calcula el cubo de los 10 primeros números naturales con la ayuda de una función y utilizando parámetros por valor*/

int cubo (int); /*prototipo de la función. El parámetro es por valor y de tipo entero*/

void main (void)

{

(15)

for ( I=1; I <=10; I++)

printf (“\n el cubo de %I es: %d”, cubo(I)); /* llamada de la función cubo. El paso del parámetro es por valor*/

system(“pause”);

}

int cubo (int K) /*K es un parámetro por valor de tipo entero*/

/*la función calcula el cubo del parámetro K.*/

{

return (K*K*K); /*regresa el resultado obtenido al programa principal*/

}

Los resultados que arroja el programa son los siguientes:

El cubo de I es: 1

El cubo de I es: 8

El cubo de I es: 27

El cubo de I es: 64

El cubo de I es: 125

El cubo de I es: 216

El cubo de I es: 343

El cubo de I es: 512

El cubo de I es: 729

El cubo de I es: 1000

Ejemplo 4.6

(16)

#include <windows.h>

#include <stdio.h>

/*Prueba de parámetros por referenciar*/

int f1 (int *); /*prototipo de la función. El parámetro es de tipo entero y por referencia – observa el uso del operador de indirección*/

void main (void)

{

int I, K=4;

for ( I=1; I <=3; I++)

{

printf (“\n\n valor de K antes de llamar a la función: %d”,++K);

printf (“\n\n valor de K después de llamar a la función: %d”,f1(&K)); /* llamada a la función f1. se pasa la dirección de la variable K, por medio del operador de dirección: &.*/

}

}

int f1 (int *R) /* la función f1 recibe un parámetro por referencia. Cada vez que el parámetro se utiliza en la función debe ir precedido por el operador de indirección.*/

{

Return(*R + = *R);

}

El resultado que arroja el programa es el siguiente:

(17)

Ejemplo 4.7

Analicemos a continuación el mismo programa del ejemplo anterior, pero utilizando ahora parámetros por valor en lugar de parámetros por referencia.

#include <windows.h>

#include <stdio.h>

/*Prueba de parámetros por valor*/

int f1 (int ); /*prototipo de la función. El parámetro es de tipo entero y por valor*/

void main (void)

{

int I, K=4;

for ( I=1; I <=3; I++)

{

printf (“\n\n valor de K antes de llamar a la función: %d”,++K);

printf (“\n\n valor de K después de llamar a la función: %d”,f1(K)); /* llamada a la función f1. Se pasa una copia de la variable K.*/

system(“pause”);

}

}

int f1 (int R)

{

R + = R;

return (R);

}

El resultado que arroja el programa es el siguiente:

(18)

Referencias

Documento similar

Se han publicado obviamente tratados sobre la historia de las ideas en América Latina (9), pero aún falta una sociología política diferenciada de los intelectuales, que examine

Ejemplo de variables aleatorias: Una variable aleatoria perfectamente puede ser la función de los resultados del lanzamiento de un dado.. Un par

Por otra parte, se dice que una variable local definida en una función tiene alcance (ámbito) de bloque, porque está disponible solamente dentro del bloque de la función en la

Cualquier variable usada dentro de una función está, por omisión, limitada al ámbito local de la función.. Puede que usted note que hay una pequeña diferencia con el lenguaje C, en

L ’ ENSEMBLE S ’ EST FAIT CONNAÎTRE À TRAVERS LA REDÉCOUVERTE D ’ OEUVRES INÉDITES ISSUES , POUR LA PLUPART , DE LA MUSIQUE SICILIENNE TELLES QUE IL DILUVIO UNIVERSALE ET

Parece inevitable reconocer que la nueva forma de lectura constituye un acto fuera de los límites del texto, al menos del texto tradicional concebido como una entidad con unos

Por PEDRO A. EUROPEIZACIÓN DEL DERECHO PRIVADO. Re- laciones entre el Derecho privado y el ordenamiento comunitario. Ca- racterización del Derecho privado comunitario. A) Mecanismos

En el capítulo de desventajas o posibles inconvenientes que ofrece la forma del Organismo autónomo figura la rigidez de su régimen jurídico, absorbentemente de Derecho público por