• No se han encontrado resultados

PRÁCTICA MANEJO INTERNO DE DATOS

N/A
N/A
Protected

Academic year: 2021

Share "PRÁCTICA MANEJO INTERNO DE DATOS"

Copied!
17
0
0

Texto completo

(1)

Objetivos

1. El alumno conocerá la representación de datos en el sistema binario y hexadecimal 2. El alumno conocerá como definir un programa en el entorno de desarrollo

del lenguaje C

Introducción

Los datos y la información para ser procesados por el ordenador deben ser representados mediante sistemas de numeración apropiados para manejar los datos y mediante sistemas de codificación para manejar la información.

El tamaño en las unidades de almacenamiento es vital. En computación las letras suelen ocupar un byte, estos a su vez están compuestos por 8 bits. Al ser el Byte una unidad muy pequeña se suelen usar sus múltiplos (kilobyte, megabyte, gigabyte, etc.). Algo que se debe tener en cuenta es que las computadoras utilizan la representación de sus datos en potencias de 2.

Un bit (Binary Digit) es la unidad mínima de información empleada en informática. Representa un uno o un cero; y ocho bits forman un byte u octeto.

Un Byte se describe como la unidad básica de almacenamiento de información, generalmente equivalente a ocho bits, pero el tamaño del byte depende del código de información en el que se defina. En la siguiente tabla se muestran los valores de las unidades de almacenamiento. Nombre Valor bit 0 ó 1 Byte 8 Bits kilobyte 210 = 1024 megabyte 220 = 1 048 576 gigabyte 230 = 1 073 741 824 terabyte 240 = 1 099 511 627 776

En electrónica digital, más concretamente en el sistema numérico binario, se dice que es un WORD de "N bitts". WORD significa "palabra" en inglés, pero en este caso se emplea como sinónimo de número, o combinación de varios símbolos para expresar una cierta cantidad. Aunque un WORD puede tener cualquier cantidad de bits, se ha popularizado el uso de words con ocho bits; estos son llamados sencillamente BYTES

(2)

PRIMERA PARTE. SISTEMAS DE REPRESENTACION

La información representada en un alfabeto de entrada debe ser transformada (codificada) a un alfabeto de salida que entienda la computadora. La codificación debe realizarse de manera que a cada elemento del primer alfabeto le corresponda un elemento distinto del segundo.

Algunas de las características de un código son el conjunto de caracteres y el número de bits que se utilizan para codificar un carácter (longitud del código).

El sistema decimal

El sistema decimal utiliza diez dígitos o símbolos (del 0 al 9) con un valor absoluto y una posición relativa. Cuando hemos utilizado todos los dígitos tenemos que usar varios dígitos para poder representar cantidades mayores. Cada cifra situada a la izquierda de otra se multiplica por 10.

Por ejemplo

7392 = 7 x 103 +3 x 102 + 9 x 101 + 2 x 100

235.63 = 2 x 102 + 3 x 101 + 5 x 100 + 6 x 10-1 + 3 x 10-2

Todos los sistemas de numeración posicionales toman como referencia el punto decimal y tienen una base de numeración que de forma implícita interviene en la cantidad que con una determinada representación se quiere referenciar. En cualquier sistema de numeración (B) con la misma cantidad expresada en el sistema decimal. El cálculo se realiza con el

polinomio equivalente.

En general, un número expresado en un sistema de base B tiene coeficientes multiplicados por potencias de B. Información (Alfabeto de entrada) Sistema de Codificación Información codificada (Alfabeto de Salida)

(3)

B: Base del sistema de numeración., es decir, el número máximo de símbolos que puede tener el sistema.

Ai: Coeficiente. Es un símbolo del sistema y cumple que 0=<Ai=<B-1 P: Número de dígitos fraccionarios.

El sistema binario

El sistema binario, o sistema de numeración en base dos, fue introducido por Leibniz en el siglo XVII, siendo el más cómodo para usar en las máquinas electrónicas, debido a que utiliza dos estados estables: encendido y apagado. En el sistema binario los datos se representan en un sistema que sólo admite dos estados: 0 y 1. Los dígitos 0 y 1 se llaman bits. Con P bits podemos representar 2P números (del 0 al 2P-1).

Esto nos permite saber el número de bits que necesitamos para representar el número decimal N.

Ejemplo

101101,11 = 1x25 + 0x24 + 1x23 + 1x22 + 0x21 + 1x20 + 1x2-1 + 1x2-2 En decimal se tiene: 32 + 8 + 4 + 1 + 0,5 + 0,25= 45,7510.

Ejercicio. Convertir los siguientes números en base binaria al correspondiente en base decimal:

1010111 = 1101101 =

Sistema Hexadecimal

El sistema hexadecimal es un sistema en base 16 y consta de 16 dígitos diferentes que son: del 0 al 9 y de la letra A a la F, es decir 10 dígitos numéricos y seis caracteres alfabéticos. El sistema hexadecimal se usa como forma simplificada de representación de números binarios y debido a que 16 es una potencia de 2(24=16), resulta muy sencilla la conversión de los números del sistema binario al hexadecimal y viceversa.

La siguiente tabla muestra los números decimales de 0 al 15 con su equivalencia en binario y hexadecimal.

(4)

Decimal Sistema binario Hexadecimal 0 0000 0 1 0001 1 2 0010 2 3 0011 3 4 0100 4 5 0101 5 6 0110 6 7 0111 7 8 1000 8 9 1001 9 10 1010 A 11 1011 B 12 1100 C 13 1101 D 14 1110 E 15 1111 F

Para convertir un número hexadecimal en un número binario se reemplaza cada símbolo hexadecimal por un grupo de cuatro bits.

Ejemplo

El número 4F5B16 en binario equivale a

Ejercicios. Convertir a Base 16 los siguientes números binarios

10101010101010 = 101000011011 = 1111111110100001 =

(5)

Conversiones entre diferentes bases de sistemas

Las conversiones entre números de bases diferentes se efectúan por medio de operaciones aritméticas simples. Dentro de las conversiones más utilizadas se encuentran:

Conversión de Decimal a Binario

Para la conversión de decimal a binario se emplean dos métodos. El primero es por divisiones sucesivas y el segundo es por medio de suma de potencias de 2.

Por divisiones sucesivas

Se va dividiendo la cantidad decimal por 2, anotando los residuos, hasta obtener un cociente cero. El último residuo obtenido es el bit más significativo (MSB) y el primero es el bit menos significativo (LSB).

Por ejemplo, el número 15310 a binario se obtiene:.

El resultado en binario de 15310 es 10011001

Por sumas de potencias de 2

Este método consiste en determinar el conjunto de pesos binarios cuya suma se equivalente al número decimal.

Ejemplo. Convertir el número 15310 a binario.

15310 = 1x27 + 0x26+ 0x25+1x24 +1x 23 + 0x22+ 0x21+ 1x20 = 128 + 16 +8 +1 15310= 100110012

(6)

Conversión de Decimal a Hexadecimal

En la conversión de una magnitud decimal a hexadecimal se realizan divisiones sucesivas por 16 hasta obtener un cociente de cero. Los residuos forman el número hexadecimal equivalente, siendo el último residuo el dígito más significativo y el primero el menos significativo.

Ejemplo. Convertir el número 186910 a hexadecimal.

El resultado en hexadecimal de 186910 es 74D16.

EJERCICIOS. Convertir a Base 16 los siguientes números decimales

145(10) = 1024 (10) = 666 (10) =

Conversión de Binario a Hexadecimal

El método consiste en conformar grupos de 4 bits hacia la izquierda y hacia la derecha del punto que indica las fracciones, hasta cubrir la totalidad del número binario. Después, se convierte cada grupo de número binario de 4 bits a su equivalente hexadecimal.

Ejemplo. Convertir el número 10011101010 a hexadecimal.

Ejemplo: Convertir el número 000110100011,101111101 (2) (binario) a base 16 (hexadecimal)

(7)

Conversión de Hexadecimal a Decimal

En el sistema hexadecimal, cada dígito tiene asociado un peso equivalente a una potencia de 16, entonces se multiplica el valor decimal del dígito correspondiente por el respectivo peso y realizar la suma de los productos.

Ejemplo. Convertir el número 31F16 a decimal.

31F16 = 3x162 + 1x16 + 15 x 160 = 3x256 + 16 + 15 = 768 + 31 = 79910

Conversión de Hexadecimal a Binario

La conversión de hexadecimal a binario se facilita porque cada dígito hexadecimal se convierte directamente en 4 dígitos binarios equivalentes.

Ejemplo. Convertir el número 1F0C16 a binario. 1F0C16 = 00011111000011002

EJERCICIOS. Convertir a Base binaria los siguientes números hexadecimales

AF0C16 = 23AB16 = 980A16 = 4BBA16 =

(8)

SEGUNDA PARTE. PROGRAMACIÓN

En esta segunda parte de la práctica, trabajaremos con la representación interna de datos con el lenguaje C.

Capturar los siguientes programas en un editor de texto, por ejemplo en NotePad,

NotePad++ o GEdit.

Una vez escrito el programa debe guardarse en disco con un nombre apropiado que contenga la extensión “c”, por ejemplo mipograma.c

Posteriormente, se debe compilar el programa para que la computadora “entienda” las instrucciones programadas, esto se hace con el compilador gcc. Una vez compilado se debe ejecutar el programa para ver los resultados.

En el entorno Windows, si se instala CodeBlocks (http://www.codeblocks.org) también se instala el compilador gcc, con el cual podemos compilar nuestros programas.

En el entorno de Ubuntu, ya se encuentra instalado el compilador gcc.

COMPILACIÓN con GCC

Una vez capturado el programa y guardado en disco se debe compilar el programa para poder ejecutarlo.

Para compilar el programa capturado, se debe abrir una terminal o consola de línea de comandos. En la terminal, ejecutar el comando gcc con la siguiente sintaxis:

gcc “archivo fuente” –o “archivo compilado” Ejemplo de compilación:

gcc miprogama.c –o miprograma.exe

donde –o indica el nombre de salida de la compilación

EJECUCIÓN

Para ejecutar el programa compilado:

En Windows, basta con teclear el nombre del programa sin la extensión .exe, lo cual ejecutará el contenido.

miprograma (enter)

En Ubuntu, teclear el nombre del programa completo, lo cual ejecutará el contenido. Si no ejecuta verificar los privilegios de ejecución

Ejecución

(9)

Si ocurre un error debido a la falta de privilegios de ejecución, usar el comando chmod

chmod +x miprograma.exe

volver a intentar la ejecución

Ejemplo de programa en C

/* Programa que muestra un saludo en pantalla */ #include <stdio.h> int main() { printf("Hola Mundo"); getchar(); return 0; }

En el código anterior La primera línea del programa es un comentario que no toma en cuenta el compilador. El comentario inicia después de símbolos /* y termina con los símbolos */ debe colocarse el comentario entre dichos símbolos y puede ser de más de una línea. También se pueden indicar comentarios en una sola línea utilizando los símbolos // y posteriormente el comentario, este comentario es sólo para sólo una línea.

Declaración de variables

Los datos en el lenguaje C deben tener un tipo de datos. Las variables contienen datos, y se debe declarar el tipo adecuado para los valores que van a contener.

El lenguaje C dispone de estos tipos básicos:

int

enteros (números enteros positivos y negativos)

char

caracteres (letras)

float

números en coma flotante (números reales)

double

números en coma flotante de doble precisión

short entero corto long entero largo

(10)

Rango de los enteros

Una variable entera acepta valores positivos y negativos dentro de un rango determinado, que depende de la plataforma y del compilador (en pc’s bajo MSDOS suele estar entre -32768 y 32767; en Linux son enteros de 32 bits).

Existen modificaciones para el tipo int, para alterar el rango de valores sobre el que trabaja:

Modificador Significado

short entero corto (rango más pequeño)

long entero largo (rango más amplio)

unsigned entero sin signo (0..N) o carácter

signed entero con signo (-N-1 .. +N) o carácter con signo

Los modificadores de tamaño ( short, long) y de signo ( signed, unsigned) se pueden combinar.

Por omisión, un entero es signed (en la práctica, esta palabra reservada casi nunca se emplea).

Tipo char

El tipo char permite manejar caracteres (letras), aunque se trata como un tipo numérico. Normalmente el rango de valores va de –128 a +127 (signed char), o bien de 0 a 255 (unsigned char).

Los literales de tipo carácter se pueden utilizar como números. #include <stdio.h>

int main() {

char caracter; int entero;

caracter = 65; // representa a una A. entero = 'A'; // representa también al 65

printf("valor del caracter en decimal: %d \n",caracter); printf("valor del caracter: %c \n",caracter);

printf("valor de entero en decimal: %d \n",entero); printf("valor de entero como caracter: %c\n",entero); getchar();

return 0; }

Números de coma flotante

Los números de coma flotante son necesarios para trabajar con fracciones o con números de un rango mayor que los enteros.

(11)

#include <stdio.h> int main() { float x = 123.456; float y = 10000000.0; printf("valor de x flotante: %f \n",x); printf("valor de y flotante: %f \n",y); getchar();

return 0; }

Ejemplos de declaraciones de variables.

Nota cada instrucción en C debe finalizar con el símbolo de punto y coma ( ; ) #include <stdio.h>

int main() {

int a,b,c; // Tres variables enteras. float raiz1, raiz2; // Dos variables de tipo real. short int a1; // Entero corto.

long int b1; // Entero largo.

unsigned short int d; // Entero corto sin signo. unsigned char a2; // Caracter sin signo. signed char b2; // Caracter con signo.

char a3 = '\n'; // Inicialización con Return. printf("valor de a3:%d", a3);

getchar(); return 0; }

Conversión de tipo

Se puede cambiar el tipo de una expresión de esta forma: (nuevo_tipo) expresión

Por ejemplo, para forzar a que una división de enteros se realice en coma flotante, podemos escribir: #include <stdio.h> int main() { int x=5,y=3,c; float flt; flt = (float)x/y; c = x/y; printf("division flotante: %f\n",flt); printf("division entera: %d\n",c);

(12)

return 0; }

En este ejemplo, el valor de x, que es entero, se transforma a float. Así la división se realizará en coma flotante.

Formato de la función printf

La función printf nos permite imprimer mensaje o valores en la pantalla- La función printf se utiliza según este formato:

printf ( “cadena de formato”, arg1, arg2, ... argN );

En la cadena de formato aparecen:  el texto que se desea imprimir

 caracteres especiales => secuencias de escape  indicaciones del formato de los argumentos Los argumentos son expresiones cualesquiera.

Para usar printf, hay que escribir al principio del programa la directiva #include <stdio.h>

Una lista resumida de los caracteres de conversión para la función printf se presenta a continuación.

Caracter Tipo de argumento: Impreso como

%d Entero decimal

%u Entero decimal con signo

%x Entero hexadecimal

%c Carácter sencillo

%f Coma flotante ( float) %lf Coma flotante ( double)

%s Imprime una cadena de caracteres hasta \0

Ejemplo: #include <stdio.h> int main() { int valor1 = 1234; char valor2 = 'h';

(13)

getchar(); return 0; } Secuencias de escape \n Salto de línea \t Tabulación

Se puede modificar el formato de salida, indicando cuantos decimales llevará el número, si se rellena de ceros por la izquierda, etc.

Por ejemplo,

Formato Significado

%5d Entero decimal alineado a la izquierda, ocupando cinco espacios %04u Entero sin signo ocupando cuatro espacios, y rellenando de ceros a

la izquierda si hace falta

%.2lf Número real (doble precisión) con dos y sólo dos decimales %5.3d Entero ocupando cinco espacios; aparecen tres cifras como mínimo

(se rellena de ceros)

Ejemplos: #include <stdio.h> int main() { float f1 = 1234.4956; char otra = 'h';

printf( "flotante contiene: %3.2f\n",f1 ); getchar();

return 0; }

(14)

Rangos de representación.

EJERCICIOS

La función sizeof (tipo_de_dato) nos devuelve un entero que representa el número de bytes que se utilizan para representar el tipo de dato que se indica como parámetro en el sistema operativo actual.

#include <stdio.h> int main()

{

printf("Número de bytes por tipo de dato\n"); printf("num byte char: %d\n",sizeof(char)); printf("num bytes int : %d\n",sizeof(int)); printf("num bytes float: %d\n",sizeof(float)); printf("num bytes double: %d\n",sizeof(double)); getchar(); return 0; } Ejercicio 2 #include <stdio.h> int main() { int x=3; int y=5; int w; printf("x: %d\n",x); printf("y: %d\n",y);

printf("suma x+y: %d\n",x+y); printf("x: %d\n",x); printf("y: %d\n",y); w = x+y; printf("w: %d\n",w); getchar(); return 0;

Tipo Longitud Rango

unsigned char 8 bits 0 a 255

char 8 bits -128 a 127

unsigned int 16 bits 0 a 65,535

short 16 bits -32,768 a 32,767

int 32 bits -2,147,483,648 a 2,147,483,647

unsigned long ¤ 32 bits 0 a 4,294,967,295

long 32 bits -2,147,483,648 a 2,147,483,647

float 32 bits 3.4E-38 a 3.4E+38

(15)

} Ejercicio 3 #include <stdio.h> int main() { int x=10; int y = 4; int c; c = x/y;

float f1 = (float) x/y;

printf( "División uno:%d\n",c ); printf( "División dos:%f\n",f1 ); getchar(); return 0; } Ejercicio 4 #include <stdio.h> int main() { float f1 = 1234.4956; char carac = 'A';

printf( "flotante vale %3.2f\n",f1 ); printf( "carácter %d\n", carac);

printf( "carácter %c\n", carac); getchar();

return 0; }

Nota. Recuerde que la representación de números negativos en las computadoras se realiza en complemento a 2.

(16)

Ejercicios Propuestos

1. Capture y ejecute el siguiente programa. Indique qué valores se obtienen y justifique su respuesta. #include <stdio.h> int main() { char carac = -128; printf("caracter: %d\n",carac); carac=carac - 5; printf("caracter: %d\n",carac); getchar(); return 0; }

2. Capture y ejecute el siguiente programa. Indique qué valores se obtienen y justifique su respuesta. #include <stdio.h> int main() { char carac = 127; printf("caracter : %d\n",carac); carac=carac + 5; printf("caracter : %d\n",carac); getchar(); return 0; }

3. Capture y ejecute el siguiente programa. Indique qué valores se obtienen y justifique su respuesta.

#include <stdio.h> int main()

{

unsigned char carac = 127;

printf("caracter : %d\n",carac); carac=carac + 5; printf("caracter : %d\n",carac); getchar(); return 0; }

4. Capture y ejecute el siguiente programa. Indique qué valores se obtienen y justifique su respuesta. #include <stdio.h> int main() { int x = 4/3; float f = 4.0/3.0; printf("x: %d\n",x); printf("f: %f\n",f); getchar(); return 0; }

(17)

5. Capture y ejecute el siguiente programa. Indique qué valores se obtienen y justifique su respuesta. #include <stdio.h> int main() { int x,y; char c; float f = 4.567; x=f; printf("f: %f\n",f); printf("x: %d\n",x); x=200; c=x; printf("x: %d\n",x); printf("c: %d\n",c); getchar(); return 0; }

Referencias

Documento similar

La función dato-tree devuelve un dato de árbol, del tipo que guardemos en el árbol Por ejemplo, para obtener el número 2 en el árbol anterior habría que evaluar la

tipo Es el tipo de dato de la variable que puede ser: E NTERO (si la variable almacenará un número entero) , REAL (si la variable almacenará un número

Por ejemplo, el tipo de la función sucesor, (function x -&gt;x+1) , que tiene como parámetro forman un entero y regresa un entero es int -&gt;int.. El caso de la función “mayor

(**) Una variable tipo Variant ocupa 16 bytes si se trata de un número y 22 bytes + longitud de la cadena si se trata de un dato tipo cadena de caracteres.. Existen también

El uso de esta función es muy sencilla, toma solo un parámetro el cual es una cadena que indica donde encontrar el archivo y devuelve un puntero a un superficie.. Devuelve NULL

Devuelve un número según el tipo de dato contenido en una celda: 1: número 2: texto 4: valor lógico 8: fórmula 16:

Tiene además un atributo obligatorio de tipo texto unidad que representa la unidad de medida en la que se da el dato correspondiente y un atributo opcional de tipo entero

Tiene además un atributo obligatorio de tipo texto unidad que representa la unidad de medida en la que se da el dato correspondiente y un atributo opcional de tipo entero