Capitulo 6. Programación Básica C++

July 22, 2017 | Autor: Jp Rojas Hernández | Categoría: Programming
Share Embed


Descripción








ALGORITMOS Y PROGRAMACIÓN

LENGUAJE DE PROGRAMACIÓN C



Juan Pablo Rojas Hernández

Quito, 20 de diciembre del 2010





Contenido


Antecedentes: 3
Utilización de punteros: 4
Comprensión de los fundamentos de los punteros: 4
Aprendizaje de las restricciones a las expresiones de punteros: 5
Utilización de punteros con arrays: 6
Utilización de punteros a constantes de cadena: 7
Creación de arrays de punteros: 8
Familiarización con la Indirección Múltiple: 9
Utilización de punteros como parámetros: 10
Conclusiones: 11
Recomendación: 11
Referencias: 12

















Antecedentes:

Los estudiantes de la carrera de Ingeniería Informática y Ciencias de la Computación necesitan basarse en un texto guía, el cual les muestre de manera detallada todos los temas referentes al Lenguaje de Programación C. Con cada preparatorio los alumnos nos podremos dar cuenta cuan necesario es cada detalle que nos brinda el lenguaje de programación C.













Utilización de punteros:

Comprensión de los fundamentos de los punteros:

Un puntero es una variable que guarda la dirección memoria de otro objeto. Para declarar un puntero se utiliza el siguiente formato:

tipo *nombre_de_variable;

donde tipo es el tipo de base del objeto al que el puntero apuntará, y el nombre que decida darse a la variable deberá estar precedido de un * para identificarlo como puntero.

C contiene dos tipos de operadores de punteros especiales:
*: devuelve el valor almacenado en la dirección a la que precede.
&: devuelve la dirección de la variable a la que precede.

Cuando el valor de una variable se referencia a través de un puntero, al proceso se lo llama indirección. Tomemos en cuenta el siguiente ejemplo:

#include

void main()
{
int *p, q;
p=&q;
*p=199;

printf("el valor de q es "%d", q);
}



En el programa anterior se le asigna un valor a 'q' mediante el puntero '*p'.

El tipo de dato en un puntero es muy importante ya que determina cómo se tratará al objeto apuntado. Por ejemplo si se pretende dar un valor float a un puntero int, ocasionará un fallo en el programa. Lo más recomendable es no asignar valores de diferente tipo al del puntero.

Aprendizaje de las restricciones a las expresiones de punteros:

Además de los operadores &, * también existen los operadores aritméticos, +, ++, -, --; en los punteros únicamente se puede sumar o restar, no se puede multiplicar, dividir o obtener el módulo. La aritmética de punteros difiere de la aritmética normal en un punto muy importante: se hace en relación al tipo de base del puntero.
Por ejemplo, suponiendo que los datos int tienen una longitud de 2 bytes y está apuntando a 100; al momento de realizar la operación: *p++; tendrá el valor de 102. Lo mismo sucedería con el resto de tipos de base.
Se puede sumar o restar cualquier cantidad entera a un puntero, por ejemplo:
int *p;
.
.
p=p+200;

Lo que hace este fragmento es que el punter *p apunte al entero numero 200 a partor del que estaba apuntando anteriormente. Si se desea incrementar a lo que el puntero apunta se debe utilizar la sentencia:
*(p++);
Si se lo hiciera sin el paréntesis lo que estaría aumentando es p. Observemos el siguiente ejemplo:
#include

void main()
{
char *cp, ch;
int *ip, i;
float *fp, f;
double *dp, d;

printf("%p %p %p %p", cp, ip, fp, dp);

//incrementar en uno

cp++; ip++; fp++; dp++;

printf("%p %p %p %p", cp, ip, fp, dp);
}//fin del main


Utilización de punteros con arrays:

Cuando se utiliza un nombre de array sin índice, se está generando un puntero al principio del array. Es por ello que al utilizar la función gets(), no se utiliza índices.
Puesto que un nombre de array sin índices es un puntero, es razonable que se pueda asignar un valor a otro puntero y que se acceda al array usando aritmética de punteros. Por ejemplo, suponiendo que tenemos un vector:

int vector[10] = {5,10,15,20,25,30};

Se podría acceder a cualquier elemento del vector de estas dos formas:

*(p+2); //por aritmética de punteros
a[2];

En ambos casos nos estamos refiriendo al tercer elemento del array. Si el array fuera bidimensional Matriz [10][10] y se desea referir al elemento Matriz[5][3] se lo haría de la siguiente manera:

*(p+(5*10)+3);

Nótese que el asterisco tiene que anteceder al paréntesis, ya que tiene una prioridad más alta que la suma o la multiplicación. Para acceder al elemento antes mencionado se multiplica el número de fila del elemento por el número de columnas que tiene la matriz y se suma el número de columna del elemento.

Utilizar la aritmética de punteros es mucho más eficiente que la indexación del array ya que un compilador de C creará un código ejecutable más rápido para el puntero.

#include
#include
char str1[]="Es divertido utilizar punteros";

void main()
{
char str2[80], *p1, *p2;

p1=str1+strlen(str1)-1;
p2=str2;

while(p1>=str1)
*p2++=*p1-;

*p2='\0';
printf("%s %s", str1, str2);
}//fin del main



El programa anterior asigna a p1 el último valor de la cadena str1, posteriormente p1 irá desde el final al principio de str1 copiando los valores en p2 que ha sido asignada anteriormente a str2. Finalmente se imprime las cadenas str1 y str2, ordenada y al revés respectivamente.

Utilización de punteros a constantes de cadena:

Cuando un compilador encuentra una cadena inicializada, la almacena en una tabla de cadenas del programa y genera un puntero a la cadena. A un puntero de caracteres se lo puede inicializar de igual manera que un array de mismo tipo, es decir, con constantes de cadena encerradas entre comillas.
#include
#include
char *p="stop";

void main()
{
char str[80];
do
{
printf("Introduzca una cadena: ");
gets(str);
}while(strcmp(p,str));
}//fin dl main



El programa anterior inicializa el puntero con la palabra 'stop' y pide al usuario que ingrese una cadena, realiza la misma acción hasta que la cadena ingresada por el usuario y la cadena inicializada sean iguales.

Creación de arrays de punteros:

Los punteros pueden estructurarse como arrays igual que cualquier otro tipo de datos. Por ejemplo:
int *pa[20];
Si se desea asignar un valor a algún elemento del array de puntero se lo puede hacer tal y como se lo hace con los arrays de variables.
#include
#include
#include

char *p [][2]= {
"Red Delicious","rojo",
"Golden Delicious","amarillo",
"Winesap","rojo",
"Gala","naranja rojizo",
"Lodi","verde",
"Mutsu","amarillo",
"Cortland","rojo",
"Jonathan","rojo",
"",""};

void main()
{
char apple[80];
int i;
printf("Introduzca el nombre de la manzana: ");
gets(apple);

for(i=0; *p[i][0]; i++)
{
if(!strcmp(apple,p[i][0]))
{
printf("%s es %s", apple,p[i][1]);
}
}

}//fin del main



La condición esta contolada por: *p[i][0], es decir que, como la cadena termina con cadenas nulas, cuando sea 0, el bucle for terminará.

Familiarización con la Indirección Múltiple:

Indirección múltiple significa que un puntero apunta a otro puntero. Para declarar un puntero al puntero se utiliza el siguiente formato:
char **mp;
Es importante saber que: mp no es un puntero a carácter, sino es un puntero a unpuntero a carácter. Observemos el siguiente programa.
#include

void main()
{
float *fp, **mfp, val;

fp=&val; mfp=&fp; **mfp=123.9;

printf("%f %f", val, **mfp);
}//fin del main



El programa anterior primero asigna al punetro 'p', la dirección de 'val', y luego al puntero al puntero 'mpf' la dirección de 'p'. Por último asigna mediante Indirección múltiple el valor de 123.9 a la variable val.

Utilización de punteros como parámetros:

Cuando se pasa un puntero a una función, el código dentro de esa función tiene acceso a la variable a la que apunta el parámetro. Esto significa q ue la función puede cambiar la varible utilizada para llamar a la función.
Observemos el siguiente programa:
#include
#include

mistrcpy(char*to,char*from)
{
while(*from) *to++=*from++;
*to='\0';
}

void main()
{
char str[80];
mistrcpy(str,"esto es una prueba");
gotoxy(5,5);
printf(str);
getch();
}//fin del main



El programa anterior crea una función llamada 'mistrcpy()' que copia 'esto es una prueba en la cadena 'str'. Utiliza punteros para realizar la función y la función termina cuando encuentra '\0' que significa fin de la cadena.

Conclusiones:

El texto guía es de mucha ayuda para el estudiante debido a que llena los posibles vacíos que han quedado durante la clase.
Los preparatorios realizados constituyen un refuerzo importante dentro de la Materia de Algoritmos y Programación ya que representa un gran porcentaje de práctica de los temas a ver dentro del semestre

Recomendación:

El estudiante debe realizar cada ejercicio del texto guía y recibir la correspondiente explicación para un mejor aprendizaje.
El profesor debería explicarlos temas del preparatorio para entenderlos de mejor manera para la posterior evaluación.

Referencias:

Fuente primaria: Unidad Educativa Salesiana Don Bosco, "Programación, introducción y ejercicios de lenguaje C", 2007-2008.
Fuente primaria: Schildt, Herbert (1994). "C: Guía de auto enseñanza". Mcgraw Hill.
Recuperado el 16 de diciembre del 2010
http://www.mygnet.net/manuales/c/uso_de_punteros_en_c.1604


Lihat lebih banyak...

Comentarios

Copyright © 2017 DATOSPDF Inc.