Práctica Nº 9: Rango y precisión de representación de números en

Anuncio
[
]
Informática
PRÀCTICA 9
Curs 2002-2003
Departament
d’Informàtica
Departamento de Informática
FACULTAT DE MATEMATIQUES
UNIVERSITAT DE VALENCIA
Práctica Nº 9: Rango y precisión de representación de números en el ordenador.
Uso de punteros
Objetivos de la práctica:
- Entender la representación de números (enteros y reales) en el ordenador.
- Comprobar los rangos de representación y la precisión en las operaciones con números.
- Introducir el concepto básico de punteros.
- Conocer la entrada y salida en C (printf y scanf).
- Entender el funcionamiento y el uso de punteros para simular el paso por referencia en C.
Rangos y precisión de la representación numérica en el ordenador.
• Tipo entero: Almacenan números enteros.
•
Ø
Sintaxis: short
2 bytes (-32768..0..32767)
Ø
Sintaxis: long
4 bytes (-2147483648..0..2147483647)
Ø
Sintaxis: int
4 bytes (-2147483648..0..2147483647)
Tipo real: Almacenan números reales en coma flotante.
Ø
Sintaxis: float (simple precisión)
4 bytes
(3.4E-38...3.4E+38)
Ø
Sintaxis: double (doble precisión)
8 bytes
(1.7E-308..1.7E+308)
Punteros
Un puntero es un tipo de dato que es capaz de guardar una dirección de memoria. Las direcciones de
memoria sirven al ordenador para saber en qué lugar de la memoria se sitúa exactamente una
determinada información, y en general cualquier variable lleva asociada una dirección de memoria. Se
llama puntero porque podemos pensar que la dirección “apunta” a la variable.
Definición de una variable de tipo puntero:
char *p_caracter;
int *p_entero;
// Variable puntero que apunta a una variable de tipo carácter
// Variable puntero que apunta a una variable de tipo entero
Los operadores básicos con punteros son:
&
Obtiene la dirección de memoria en donde se encuentra una variable, a partir del nombre
de la variable.
*
Obtiene el contenido (valor) que se guarda en una determinada posición de memoria.
new
Crea una variable dinámica del tipo especificado y devuelve un puntero que apunta a
esta nueva variable.
Ej: int *n;
n = new int(17); // Inicializa la variable n a 17
delete
Libera el espacio reservado para una información (le dice al ordenador que ese espacio
puede ser utilizado por otros usuarios.)
Ej: delete p;
// Elimina la variable a la que apunta p
Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Uso de punteros
1/5
[
]
Informática
PRÀCTICA 9
Curs 2002-2003
Departament
d’Informàtica
Departamento de Informática
FACULTAT DE MATEMATIQUES
UNIVERSITAT DE VALENCIA
Operaciones con punteros:
1.- Obtener la dirección de una variable y asignar esta dirección a una variable de tipo puntero (trabaja
con direcciones de memoria).
char x, *puntero_x;
puntero_x = &x;
/* Variable puntero_x tenemos guardada la dirección de la variable x */
2.- Podemos asignar el valor de una variable puntero a otra variable de tipo puntero:
char *p1, *p2;
p1 = p2;
/* El puntero p1 y el puntero p2 almacenan la misma dirección de memoria */
*p1 = *p2;
/* Los contenidos
contenidos */
de
las
variables
p1
y
p2
son
los
mismos,
asignación
de
Funciones de Entrada y Salida Estándar en C
Incluir el fichero de cabecera #include<stdio.h>, dentro de él se encuentran declaradas las funciones de
E/S. (Nota: en las prácticas anteriores usabais la cabecera #include <iostream.h> para utilizar las
funciones de entrada y salida de C++).
Funciones de Salida Estándar
printf ( <cadena de caracteres>, [<dato>, <dato>,...] )
Esta es una función que permite escribir en pantalla varios datos de cualquier tipo insertados dentro de
una cadena de texto.
La cadena de caracteres incluye especificaciones de formato sobre la manera en que han de ser
representados los datos.
Tabla de especificadores de formato para el printf:
Código
%c
%d
%i
%x
%X
%o
%u
%ld
%lx
%lo
%lu
%f
%e
%E
%g
Argumento
Salida resultante
char
short, int
short, int
short, int
short, int
short, int
unsigned short,unsigned int
long
long
long
unsigned long
float, double
float, double
float, double
float, double
muestra un carácter
muestra un entero como número decimal con signo.
muestra un entero como número decimal con signo.
muestra un entero en forma hexadecimal.
muestra un entero en forma hexadecimal (letras may.).
muestra un entero en forma octal.
muestra un entero sin signo como número decimal.
muestra un entero largo como número decimal.
muestra un entero largo en forma hexadecimal.
muestra un entero largo en forma octal.
muestra un entero largo sin signo como num. decimal.
muestra un número real en formato punto flotante.
muestra un número real en formato exponencial.
muestra un número real en formato exponencial.
seleciona automáticamente entre los formatos %f y
Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Uso de punteros
2/5
[
Departament
d’Informàtica
Departamento de Informática
]
Código
Argumento
Informática
PRÀCTICA 9
Curs 2002-2003
FACULTAT DE MATEMATIQUES
UNIVERSITAT DE VALENCIA
Salida resultante
%e.
%G
float, double
seleciona automáticamente entre los formatos %f y
%E.
%s
cadena
puntero
%p
muestra una cadena de caracteres.
muestra el valor de un puntero.
muestra el carácter %.
%%
Modificadores del especificador de formato :
%<ancho>.<digitos>F
Secuencias de escape
El carácter \ es el llamado carácter de escape, y se le llama secuencia de escape al conjunto formado
por la \ y el(los) siguiente(s) carácter(es) que lo siguen.
Tabla de secuencias de escape:
Secuencia Significado
Secuencia Significado
\n
\’
Salto de línea y retorno de carro
escribe el carácter de comillas simples (‘)
\r
\”
Sólo retorno de carro
escribe el carácter de comillas dobles (“)
\f
\xdd
escribe el carácter cuyo código ASCII en
Solo salto de línea
hexadecimal es dd
\b
\ddd
Retrocede un carácter
escribe el carácter cuyo código ASCII en
octal es ddd
\t
\\
Escribe un tabulador
escribe el carácter \
\a
Hace sonar una campanilla
Ejemplo:
#include <stdio.h>
void main ( void )
{
int num;
double pi = 3.145926;
char cr = ‘!’;
num = -1997;
printf(“El numero
printf(“Usando el
printf(“Usando el
printf(“Usando el
printf(“Usando el
printf(“Usando el
es %d y PI es %f\n”, num, pi );
modificador 15d sale : %15d!\n”, num );
modificador -10d sale : %-10d%c\n”,num,’!’ );
modificador 012d sale : %012d%c\n”,num,cr);
modificador .2f sale : %.2f!\n”, pi );
modificador 6.13f sale : %6.13f%c\n”,pi,cr );
}
Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Uso de punteros
3/5
[
]
Departament
d’Informàtica
Departamento de Informática
Informática
PRÀCTICA 9
Curs 2002-2003
FACULTAT DE MATEMATIQUES
UNIVERSITAT DE VALENCIA
Funciones de Entrada Estándar
Se utilizan para leer datos a través de la entrada estándar (normalmente el teclado del ordenador).
En estas tres funciones, la entrada se hace usando un buffer. Esto quiere decir que, cada vez que
utilizamos una de estas funciones, los caracteres que representan las teclas que pulsamos se introducen
dentro del buffer y sólo están disponibles para nuestro programa después de pulsar el INTRO (el
carácter de INTRO también queda almacenado dentro del buffer).
scanf( <cadena de formato>, <dirección>, <dirección>,...)
Lee caracteres del buffer de entrada y los interpreta según la cadena de formato, guardándolos en las
direcciones de las variables indicadas en los siguientes parámetros.
Recordemos que una variable tiene asignada una dirección de memoria donde guarda sus valores,
dirección que asigna el compilador automáticamente durante la declaración. Para las variables, que no
sean cadenas de caracteres, la dirección se obtiene precediendo el nombre de la variable con el
operador &.
Tabla de especificadores de formato para el scanf:
Código Significado
%c
Lee un carácter
Código
%d
%o
Lee un entero decimal
Lee un entero decimal
%i
%x
%f
Significado
Código Significado
Lee
un
entero
en %lf
lee un número real doble
hexadecimal
%p
Lee un entero en octal
lee un puntero
%s
lee un número real simple
lee una palabra
#include <stdio.h>
void main ( void )
{
char letra1, letra2;
char tira[100];
int a, b, cuantos;
b = 5;
printf ( "Pulsa dos tecla para getchar " );
letra1 = getchar ( );
letra2 = getchar ( );
printf ( "Pulsaste %c y %c\n", letra1, letra2 );
getchar();
printf ( "\nEscribe tu nombre y apellidos: " );
gets ( tira );
printf ( "Te llamas %s\n", tira );
printf("\nEscribe dos números: " );
cuantos = scanf ( "%d %d", &a, &b );
printf ( "Número de datos leídos %d. Ahora a = %d y b = %d\n",
cuantos, a, b );
}
Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Uso de punteros
4/5
[
]
Departament
d’Informàtica
Departamento de Informática
Informática
PRÀCTICA 9
Curs 2002-2003
FACULTAT DE MATEMATIQUES
UNIVERSITAT DE VALENCIA
Paso por referencia en C
En realidad, en el C no existe el paso por referencia como hemos visto en C++; todos los argumentos se
pasan por valor. Sin embargo, existe una forma de simular el paso por referencia: utilizando punteros.
¿ Cómo se realiza este paso de parámetros por referencia en C?:
1.- Cuando pasamos argumentos por referencia, en la llamada utilizamos la referencia (dirección) de la
variable y no su valor. Para ello precedemos el nombre de la variable con el operador dirección “&“.
2.- Cuando definimos el parámetro por referencia, tenemos que marcarlo con un “*” delante del
nombre, para que el compilador sepa que este parámetro esta preparado para recibir referencias
(direcciones) a variables y compartir así su valor.
Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Uso de punteros
5/5
Descargar