Curso de C para dummies, Resúmenes de Programación C. Universidad Nacional del Centro de la Provincia de Buenos Aires
FedeIS
FedeIS25 de julio de 2017

Curso de C para dummies, Resúmenes de Programación C. Universidad Nacional del Centro de la Provincia de Buenos Aires

PDF (3 MB)
198 pages
1Número de download
58Número de visitas
Descripción
Introducción al lenguaje de programación C.
20Puntos
Puntos download necesarios para descargar
este documento
descarga el documento
Pre-visualización3 pages / 198
Esta solo es una pre-visualización
3 shown on 198 pages
descarga el documento
Esta solo es una pre-visualización
3 shown on 198 pages
descarga el documento
Esta solo es una pre-visualización
3 shown on 198 pages
descarga el documento
Esta solo es una pre-visualización
3 shown on 198 pages
descarga el documento
Microsoft Word - Curso de C_version090c.doc

Revisión 0.90– Página 1

Fundamentos de programación en C

Este texto pretende ser una introducción a la programación de ordenadores en lenguaje C. Se ha revisado con la intención que su nivel sea el razonable para una asignatura de “Fundamentos de programación” o similar, aunque quizá algunos centros (especialmente universitarios) exijan un nivel más alto que el que se cubre. Está organizado de una forma ligeramente distinta a l procurando incluir ejercicios prácticos lo antes posible, para evitar que un exceso de teoría en los primeros temas haga el texto pesado de seguir. Aun así, este texto no pretende “sustituir a un profesor”, sino servir de apoyo para que los alumnos no pierdan tiempo en tomar apuntes. Pero es trabajo del profesor aclarar las dudas que surjan y proponer muchos más ejercicios que los que figuran aquí.

Este texto es de libre distribución

Este texto se distribuye "tal cual", sin garantía de ningún tipo, implícita ni explícita. Aun así, mi intención es que resulte útil, así que le rogaría que me comunique cualquier error que encuentre.

Revisión actual: 0.90

Se puede distribuir a otras personas libremente

os libros de texto "convencionales"

Revisión 0.90– Página 2

Contenido

0. Conceptos básicos sobre programación _______________________________________________ 6

0.1. Lenguajes de alto nivel y de bajo nivel.____________________________________________ 6

0.2. Ensambladores, compiladores e intérpretes ________________________________________ 7

0.3. Pseudocódigo_________________________________________________________________ 8

1. Toma de contacto con C ___________________________________________________________ 10

1.1 Escribir un texto en C _________________________________________________________ 11 1.1.1. Cómo probar este programa en Linux __________________________________________ 12 1.1.2. Cómo probar este programa en Windows _______________________________________ 14

1.2. Mostrar números enteros en pantalla ____________________________________________ 15

1.3. Operaciones aritméticas básicas ________________________________________________ 16 1.3.1. Orden de prioridad de los operadores __________________________________________ 16 1.3.2. Introducción a los problemas de desbordamiento _________________________________ 17

1.4. Introducción a las variables: int ________________________________________________ 17 1.4.1. Definición de variables: números enteros _______________________________________ 17 1.4.2. Asignación de valores ______________________________________________________ 17 1.4.3. Mostrar el valor de una variable en pantalla _____________________________________ 18

1.5. Identificadores_______________________________________________________________ 19

1.6. Comentarios ________________________________________________________________ 20

1.7. Datos por el usuario: scanf_____________________________________________________ 21

2. Tipos de datos básicos_____________________________________________________________ 22

2.1. Tipo de datos entero __________________________________________________________ 22 2.1.1. Tipos de enteros: signed/unsigned, short/long____________________________________ 22 2.1.2. Problemática: asignaciones y tamaño de los números; distintos espacios ocupados según el

sistema _______________________________________________________________________ 23 2.1.3. Unidades de medida empleadas en informática (1): bytes, kilobytes, megabytes...________ 24 2.1.4. Unidades de medida empleadas en informática (2): los bits _________________________ 25 2.1.5. Sistemas de numeración: 1- Sistema binario _____________________________________ 26 2.1.6. Sistemas de numeración: 2- Sistema octal _______________________________________ 28 2.1.7. Sistemas de numeración: 3- Sistema hexadecimal_________________________________ 29 2.1.8. Formato de constantes enteras: oct, hex_________________________________________ 31 2.1.9. Representación interna de los enteros __________________________________________ 32 2.1.10. Incremento y decremento___________________________________________________ 34 2.1.11. Operaciones abreviadas: +=_________________________________________________ 35 2.1.12. Modificadores de acceso: const, volatile _______________________________________ 35

2.2. Tipo de datos real ____________________________________________________________ 36 2.2.1. Simple y doble precisión ____________________________________________________ 36 2.2.2. Mostrar en pantalla números reales ____________________________________________ 36

2.3. Operador de tamaño: sizeof____________________________________________________ 38

2.4. Operador de molde: (tipo) operando_____________________________________________ 39

2.5. Tipo de datos carácter ________________________________________________________ 40 2.5.1. Secuencias de escape: \n y otras. ______________________________________________ 41 2.5.2. Introducción a las dificultades de las cadenas de texto _____________________________ 41

3. Estructuras de control_____________________________________________________________ 42

3.1. Estructuras alternativas _______________________________________________________ 42 3.1.1. if_______________________________________________________________________ 42 3.1.2. if y sentencias compuestas ___________________________________________________ 43 3.1.3. Operadores relacionales: <, <=, >, >=, ==, !=____________________________________ 43 3.1.4. if-else ___________________________________________________________________ 44

Revisión 0.90– Página 3

3.1.5. Operadores lógicos: &&, ||, ! _________________________________________________ 46 3.1.6. Cómo funciona realmente la condición en un “if”_________________________________ 46 3.1.7. El peligro de la asignación en un “if” __________________________________________ 47 3.1.8. Introducción a los diagramas de flujo __________________________________________ 50 3.1.9. Operador condicional: ?_____________________________________________________ 52 3.1.10. switch__________________________________________________________________ 53

3.2. Estructuras repetitivas ________________________________________________________ 54 3.2.1. while ___________________________________________________________________ 54 3.2.2. do ... while _______________________________________________________________ 55 3.2.3. for______________________________________________________________________ 56

3.3. Sentencia break: termina el bucle _______________________________________________ 59

3.4. Sentencia continue: fuerza la siguiente iteración ___________________________________ 60

3.5. Sentencia goto _______________________________________________________________ 62

3.6. Más sobre diagramas de flujo. Diagramas de Chapin. ______________________________ 63

3.7. Recomendación de uso de los distintos tipos de bucle _______________________________ 65

4. Entrada/salida básica_____________________________________________________________ 67

4.1. printf ______________________________________________________________________ 67

4.2. scanf _______________________________________________________________________ 69

4.3. putchar_____________________________________________________________________ 70

4.4. getchar _____________________________________________________________________ 71

5. Arrays y estructuras _____________________________________________________________ 73

5.1. Conceptos básicos sobre tablas _________________________________________________ 73 5.1.1. Definición de una tabla y acceso a los datos _____________________________________ 73 5.1.2. Valor inicial de una tabla ____________________________________________________ 74 5.1.3. Recorriendo los elementos de una tabla_________________________________________ 74

5.2. Cadenas de caracteres ________________________________________________________ 75 5.2.1. Definición. Lectura desde teclado _____________________________________________ 75 5.2.2. Cómo acceder a las letras que forman una cadena_________________________________ 76 5.2.3. Longitud de la cadena. ______________________________________________________ 77 5.2.4. Entrada/salida para cadenas: gets, puts _________________________________________ 78 5.2.5. Asignando a una cadena el valor de otra: strcpy, strncpy; strcat ______________________ 78 5.2.6. Comparando cadenas: strcmp ________________________________________________ 80 5.2.7. Otras funciones de cadenas: sprintf, sscanf, strstr, … ______________________________ 82 5.2.8. Valor inicial de una cadena de texto ___________________________________________ 83

5.3. Tablas bidimensionales________________________________________________________ 84

5.4. Arrays indeterminados. _______________________________________________________ 85

5.5. Estructuras _________________________________________________________________ 85 5.5.1. Definición y acceso a los datos _______________________________________________ 85 5.5.2. Arrays de estructuras _______________________________________________________ 87 5.5.3. Estructuras anidadas________________________________________________________ 87

5.6 Ejemplo completo ____________________________________________________________ 88

5.7 Ordenaciones simples _________________________________________________________ 92

6. Manejo de ficheros _______________________________________________________________ 94

6.1. Escritura en un fichero de texto_________________________________________________ 94

6.2. Lectura de un fichero de texto __________________________________________________ 95

6.3. Lectura hasta el final del fichero ________________________________________________ 96

6.4. Ficheros con tipo _____________________________________________________________ 97

Revisión 0.90– Página 4

6.5 Leer y escribir letra a letra _____________________________________________________ 98

6.6 Modos de apertura____________________________________________________________ 98

6.7 Ficheros binarios _____________________________________________________________ 98

6.8 Ejemplo: copiador de ficheros __________________________________________________ 99

6.9 Acceder a cualquier posición de un fichero _______________________________________ 101

6.10 Ejemplo: leer información de un fichero BMP ___________________________________ 102

6.11. Ficheros especiales 1: la impresora ____________________________________________ 105

6.12. Ficheros especiales 2: salida de errores_________________________________________ 106

6.13. Un ejemplo de lectura y escritura: TAG de un MP3 ______________________________ 106

7. Introducción a las funciones ______________________________________________________ 109

7.1. Diseño modular de programas: Descomposición modular __________________________ 109

7.2. Conceptos básicos sobre funciones _____________________________________________ 109

7.3. Parámetros de una función ___________________________________________________ 110

7.4. Valor devuelto por una función ________________________________________________ 110

7.5. El valor de retorno “void”. El valor de retorno de “main”__________________________ 111

7.6. Variables locales y variables globales ___________________________________________ 112

7.7. Los conflictos de nombres en las variables _______________________________________ 114

7.8. El orden importa____________________________________________________________ 116

7.9. Algunas funciones útiles ______________________________________________________ 117 7.9.1. Números aleatorios _______________________________________________________ 117 7.9.2. Funciones matemáticas ____________________________________________________ 119 7.9.3. Pero casi todo son funciones… ______________________________________________ 120

7.10. Recursividad ______________________________________________________________ 121

7.11. Cómo interrumpir el programa. ______________________________________________ 123

8. Cómo depurar los programas ______________________________________________________ 124

8.1. Conceptos básicos sobre depuración____________________________________________ 124

8.2. Ejemplos de algunos entornos _________________________________________________ 124

9. Punteros y gestión dinámica de memoria ____________________________________________ 127

9.1. ¿Por qué usar estructuras dinámicas? __________________________________________ 127

9.2. ¿Qué son los punteros?_______________________________________________________ 128

9.3. Repasemos con un ejemplo sencillo_____________________________________________ 131

9.4. Aritmética de punteros_______________________________________________________ 132

9.5. Punteros y funciones: parámetros por referencia _________________________________ 133

9.6. Punteros y arrays___________________________________________________________ 135

9.7. Arrays de punteros __________________________________________________________ 136

9.8. Punteros y estructuras _______________________________________________________ 137

9.9. Opciones de la línea de comandos: parámetros de “main”__________________________ 138

9.10. Estructuras dinámicas habituales 1: las listas enlazadas___________________________ 139

9.11. Estructuras dinámicas habituales 2: los árboles binarios __________________________ 145

9.12. Indirección múltiple ________________________________________________________ 149

9.13. Un ejemplo: copiador de ficheros en una pasada_________________________________ 149

Revisión 0.90– Página 5

10. Bibliotecas de uso frecuente ______________________________________________________ 151

10.1. Llamadas al sistema: system _________________________________________________ 151

10.2. Temporización_____________________________________________________________ 151

10.3. Pantalla y teclado con Turbo C _______________________________________________ 154

10.4. Acceso a pantalla en Linux: curses.h___________________________________________ 156

10.5. Juegos multiplataforma: SDL ________________________________________________ 159 10.5.1. Dibujando una imagen de fondo y un personaje ________________________________ 159 10.5.2. Un personaje móvil ______________________________________________________ 162 10.5.3. Imágenes transparentes, escribir texto y otras mejoras ___________________________ 163 10.5.4. El doble buffer __________________________________________________________ 164 10.5.5. El bucle de juego (game loop) ______________________________________________ 165

11. Otras características avanzadas de C _______________________________________________ 167

11.1 Operaciones con bits ________________________________________________________ 167

11.2 Directivas del preprocesador _________________________________________________ 168 11.2.1. Constantes simbólicas: #define _____________________________________________ 169 11.2.2 Inclusión de ficheros: #include ______________________________________________ 171 11.2.3. Compilación condicional: #ifdef, #endif ______________________________________ 172 11.2.4. Otras directivas _________________________________________________________ 174

11.3. Programas a partir de varios fuentes __________________________________________ 175 11.3.1. Creación desde la línea de comandos_________________________________________ 175 11.3.2. Introducción al uso de la herramienta Make ___________________________________ 179 11.3.3. Introducción a los “proyectos”______________________________________________ 183

11.4 Uniones y campos de bits_____________________________________________________ 184

11.5. El operador coma __________________________________________________________ 185

11.6. Enumeraciones ____________________________________________________________ 186

11.7. Definición de tipos _________________________________________________________ 187

Apéndice 1. Revisiones de este texto________________________________________________ 189

Apéndice 2. Soluciones a algunos de los ejercicios propuestos___________________________ 191

Revisión 0.90– Página 6

0. Conceptos básicos sobre programación Un programa es un conjunto de órdenes para un ordenador. Estas órdenes se le deben dar en un cierto lenguaje, que el ordenador sea capaz de comprender.

El problema es que los lenguajes que realmente entienden los ordenadores resultan difíciles para nosotros, porque son muy distintos de los que nosotros empleamos habitualmente para hablar. Escribir programas en el lenguaje que utiliza internamente el ordenador (llamado “lenguaje máquina” o “código máquina”) es un trabajo duro, tanto a la hora de crear el programa como (especialmente) en el momento de corregir algún fallo o mejorar lo que se hizo. Por eso, en la práctica se emplean lenguajes más parecidos al lenguaje humano, llamados “lenguajes de alto nivel”. Normalmente, estos son muy parecidos al idioma inglés, aunque siguen unas reglas mucho más estrictas.

0.1. Lenguajes de alto nivel y de bajo nivel.

Vamos a ver en primer lugar algún ejemplo de lenguaje de alto nivel, para después comparar con lenguajes de bajo nivel, que son los más cercanos al ordenador. Uno de los lenguajes de alto nivel más sencillos es el lenguaje BASIC. En este lenguaje, escribir el texto Hola en pantalla, sería tan sencillo como usar la orden PRINT "Hola"

Otros lenguajes, como Pascal, nos obligan a ser algo más estrictos, pero a cambio hacen más fácil descubrir errores: program Saludo; begin write('Hola'); end.

El equivalente en lenguaje C resulta algo más difícil de leer, por motivos que iremos comentando un poco más adelante: #include <stdio.h> int main() { printf("Hola"); }

Los lenguajes de bajo nivel son más cercanos al ordenador que a los lenguajes humanos. Eso hace que sean más difíciles de aprender y también que los fallos sean más difíciles de descubrir y corregir, a cambio de que podemos optimizar al máximo la velocidad (si sabemos cómo), e

Revisión 0.90– Página 7

incluso llegar a un nivel de control del ordenador que a veces no se puede alcanzar con otros lenguajes. Por ejemplo, escribir Hola en lenguaje ensamblador de un ordenador equipado con el sistema operativo MsDos y con un procesador de la familia Intel x86 sería algo como dosseg .model small .stack 100h .data hello_message db 'Hola',0dh,0ah,'$' .code main proc mov ax,@data mov ds,ax mov ah,9 mov dx,offset hello_message int 21h mov ax,4C00h int 21h main endp end main

Resulta bastante más difícil de seguir. Pero eso todavía no es lo que el ordenador entiende, aunque tiene una equivalencia casi directa. Lo que el ordenador realmente es capaz de comprender son secuencias de ceros y unos. Por ejemplo, las órdenes “mov ds, ax” y “mov ah, 9” (en cuyo significado no vamos a entrar) se convertirían a lo siguiente: 1000 0011 1101 1000 1011 0100 0000 1001 (Nota: los colores de los ejemplos anteriores son una ayuda que nos dan algunos entornos de programación, para que nos sea más fácil descubrir errores).

0.2. Ensambladores, compiladores e intérpretes

Está claro entonces que las órdenes que nosotros hemos escrito (lo que se conoce como “programa fuente”) deben convertirse a lo que el ordenador comprende (obteniendo el “programa ejecutable”). Si elegimos un lenguaje de bajo nivel, como el ensamblador (en inglés Assembly, abreviado como Asm), la traducción es sencilla, y de hacer esa traducción se encargan unas herramientas llamadas ensambladores (en inglés Assembler). Cuando el lenguaje que hemos empleado es de alto nivel, la traducción es más complicada, y a veces implicará también recopilar varios fuentes distintos o incluir posibilidades que se encuentran en bibliotecas que no hemos preparado nosotros. Las herramientas encargadas de todo esto son los compiladores.

Revisión 0.90– Página 8

El programa ejecutable obtenido con el compilador o el ensamblador se podría hacer funcionar en otro ordenador similar al que habíamos utilizado para crearlo, sin necesidad de que ese otro ordenador tenga instalado el compilador o el ensamblador. Por ejemplo, en el caso de Windows (y de MsDos), y del programa que nos saluda en lenguaje Pascal, tendríamos un fichero fuente llamado SALUDO.PAS. Este fichero no serviría de nada en un ordenador que no tuviera un compilador de Pascal. En cambio, después de compilarlo obtendríamos un fichero SALUDO.EXE, capaz de funcionar en cualquier otro ordenador que tuviera el mismo sistema operativo, aunque no tenga un compilador de Pascal instalado. Un intérprete es una herramienta parecida a un compilador, con la diferencia de que en los intérpretes no se crea ningún “programa ejecutable” capaz de funcionar “por sí solo”, de modo que si queremos distribuir nuestro programa a alguien, deberemos entregarle el programa fuente y también el intérprete que es capaz de entenderlo, o no le servirá de nada. Cuando ponemos el programa en funcionamiento, el intérprete de encarga de convertir el programa en lenguaje de alto nivel a código máquina, orden por orden, justo en el momento en que hay que procesar cada una de las órdenes. Para algunos lenguajes, es frecuente encontrar compiladores pero no suele existir intérpretes. Es el caso del lenguaje C, de Pascal y de C++, por ejemplo. En cambio, para otros lenguajes, lo habitual es trabajar con intérpretes y no con compiladores, como ocurre con Python, Ruby y PHP. Además, hoy en día existe algo que parece intermedio entre un compilador y un intérprete: Existen lenguajes que no se compilan para obtener un ejecutable para un ordenador concreto, sino un ejecutable “genérico”, que es capaz de funcionar en distintos tipos de ordenadores, a condición de que en ese ordenador exista una “máquina virtual” capaz de entender esos ejecutables genéricos. Esta es la idea que se aplica en Java: los fuentes son ficheros de texto, con extensión “.java”, que se compilan a ficheros “.class=”. Estos ficheros “.class=” se podrían llevar a cualquier ordenador que tenga instalada una “máquina virtual Java” (las hay para la mayoría de sistemas operativos). Esta misma idea se sigue en el lenguaje C#, que se apoya en una máquina virtual llamada “Dot Net Framework” (algo así como “armazón punto net”).

0.3. Pseudocódigo

A pesar de que los lenguajes de alto nivel se acercan al lenguaje natural, que nosotros empleamos, es habitual no usar ningún lenguaje de programación concreto cuando queremos plantear los pasos necesarios para resolver un problema, sino emplear un lenguaje de programación ficticio, no tan estricto, muchas veces escrito incluso en español. Este lenguaje recibe el nombre de pseudocódigo. Esa secuencia de pasos para resolver un problema es lo que se conoce como algoritmo (realmente hay alguna condición más, por ejemplo, debe ser un número finito de pasos). Por tanto, un programa de ordenador es un algoritmo expresado en un lenguaje de programación. Por ejemplo, un algoritmo que controlase los pagos que se realizan en una tienda con tarjeta de crédito, escrito en pseudocódigo, podría ser:

Revisión 0.90– Página 9

Leer banda magnética de la tarjeta Conectar con central de cobros Si hay conexión y la tarjeta es correcta: Pedir código PIN Si el PIN es correcto Comprobar saldo_existente Si saldo_existente > importe_compra Aceptar la venta Descontar importe del saldo. Fin Si Fin Si Fin Si Ejercicios propuestos

1. Localizar en Internet el intérprete de Basic llamado Bywater Basic, en su versión para el sistema operativo que se esté utilizando y probar el primer programa de ejemplo que se ha visto en el apartado 0.1.

2. Localizar en Internet el compilador de Pascal llamado Free Pascal, en su versión para el sistema operativo que se esté utilizando, instalarlo y probar el segundo programa de ejemplo que se ha visto en el apartado 0.1.

3. Localizar un compilador de C para el sistema operativo que se esté utilizando (si es Linux o alguna otra versión de Unix, es fácil que se encuentre ya instalado) y probar el tercer programa de ejemplo que se ha visto en el apartado 0.1.

Revisión 0.90– Página 10

1. Toma de contacto con C Dentro de los lenguajes de programación, C es un lenguaje que tiene un cierto “prestigio”. Esto se debe fundamentalmente a dos razones:

 Es bastante “portable”: un programa bien hecho en C se podrá llevar a un ordenador distinto o incluso a un sistema operativo distinto (de MsDos a Windows o a Linux, por ejemplo) con muy pocos cambios o quizás incluso sin ningún cambio. El motivo es que existe un estándar: el ANSI C, que soportan casi todos los compiladores. Por eso, si nos ceñimos al estándar, es seguro que nuestros programas funcionarán en distintos sistemas; cuanto más nos separemos del estándar (en ocasiones podremos hacerlo), más difícil será que funcionen en otro sistema distinto.

 Permite hacer “casi de todo”: podemos usar órdenes de alto nivel (muy cercanas al

lenguaje humano), pero también de bajo nivel (más cercanas a lo que realmente entiende el ordenador). De hecho, podremos incluso incorporar órdenes en lenguaje ensamblador en medio de un programa escrito en C, aunque eso supone que ganemos en control de la máquina que estamos manejando, a costa de perder en portabilidad (el programa ya no se podrá llevar a otros ordenadores que no usen el mismo lenguaje ensamblador).

En su contra, el lenguaje C tiene que es más difícil de aprender que otros y que puede resultar difícil de leer (por lo que ciertos errores pueden tardar más en encontrarse). Los pasos que seguiremos para crear un programa en C serán: 1. Escribir el programa en lenguaje C (fichero fuente), con cualquier editor de textos. 2. Compilarlo con nuestro compilador. Esto creará un “fichero objeto”, ya convertido a un

lenguaje que el ordenador es capaz de entender. 3. Enlazarlo con otros ficheros del compilador, unas bibliotecas auxiliares que incluirán en

nuestro programa aquellas posibilidades que hayamos empleado nosotros pero que realmente no sean parte del lenguaje C básico, sino ampliaciones de algún tipo. Esto dará lugar al fichero ejecutable, que ya podremos usar desde MsDos o el sistema operativo que estemos manejando, en nuestro ordenador o en cualquier otro, aunque ese otro ordenador no tenga el compilador que nosotros hemos utilizado.

La mayoría de los compiladores actuales permiten dar todos estos pasos desde un único entorno, en el que escribimos nuestros programas, los compilamos, y los depuramos en caso de que exista algún fallo. En el siguiente apartado veremos un ejemplo de uno de estos entornos, dónde localizarlo y cómo instalarlo.

Revisión 0.90– Página 11

1.1 Escribir un texto en C

Vamos con un primer ejemplo de programa en C, posiblemente el más sencillo de los que “hacen algo útil”. Se trata de escribir un texto en pantalla. La apariencia de este programa la vimos en el tema anterior. Vamos a verlo ahora con más detalle: #include <stdio.h> main() { printf("Hola"); }

Esto escribe “Hola” en la pantalla. Pero hay mucho que comentar:

 Eso de “#include” nos permite incluir ciertas características para ampliar el lenguaje base. En este caso, el motivo es que en el lenguaje C base no hay predefinida ninguna orden para escribir en pantalla1 (!), sino que este tipo de órdenes son una extensión, que se define en un fichero llamado “stdio.h”. Esto no es un problema, vamos a encontrar ese “stdio.h” en cualquier compilador que usemos. ¿Y por qué se pone entre < y >? ¿Y por qué eso de # al principio? Esos detalles los iremos viendo un poco más adelante.

 Ya que hemos hablado de ella, "printf" es la orden que se encarga de mostrar un texto en pantalla, la responsable de que hayamos escrito ese “include” al principio del programa.

 Aun quedan cosas: ¿qué hacen esas llaves { y } ? C es un lenguaje estructurado, en el que un programa está formado por diversos “bloques”. Todos los elementos que componen este bloque deben estar relacionados entre sí, lo que se indica encerrándolos entre llaves: { y }.

 Finalmente, ¿qué es eso de “main”? Es algo que debe existir siempre, e indica el punto en el que realmente comenzará a funcionar el programa. Después de "main" van dos llaves { y }, que delimitan el bloque más importante: el cuerpo del programa. ¿Y por qué tiene un paréntesis vacío a continuación? Eso lo veremos más adelante...

Y la cosa no acaba aquí. Aún queda más miga de la que parece en este programa, pero cuando ya vayamos practicando un poco, iremos concretando más alguna que otra cosa de las que aquí han quedado poco detalladas. Ejercicio propuesto: Crea un programa en C que te salude por tu nombre (ej: “Hola, Nacho”). Sólo un par de cosas más antes de seguir adelante:

 Cada orden de C debe terminar con un punto y coma (;)

1 Hay que recordar que un ordenador no es sólo lo que acostumbramos a tener sobre nuestra mesa, con pantalla y teclado. Existen otros muchos tipos de ordenadores que realizan tareas complejas y no necesitan una pantalla durante su funcionamiento normal, como el ordenador que controla el ABS de un coche.

Revisión 0.90– Página 12

 El C es un lenguaje de formato libre, de modo que puede haber varias órdenes en una misma línea, u órdenes separadas por varias líneas o espacios entre medias. Lo que realmente indica dónde termina una orden y donde empieza la siguiente son los puntos y coma. Por ese motivo, el programa anterior se podría haber escrito también así (aunque no es aconsejable, porque puede resultar menos legible):

#include <stdio.h> main() { printf("Hola"); }

 De hecho, hay dos formas especialmente frecuentes de colocar la llave de comienzo, y yo usaré ambas indistintamente. Una es como hemos hecho en el primer ejemplo: situar la llave de apertura en una línea, sola, y justo encima de la llave de cierre correspondiente. La segunda forma habitual es situándola a continuación del nombre del bloque que comienza (en nuestro caso, a continuación de la palabra “main”), así:

#include <stdio.h> main() { printf("Hola"); }

(esta es la forma que yo emplearé en este texto cuando estemos trabajando con fuentes de mayor tamaño, para que ocupe un poco menos de espacio).

 La gran mayoría de las órdenes que encontraremos en el lenguaje C son palabras en

inglés o abreviaturas de éstas. Pero hay que tener en cuenta que C distingue entre mayúsculas y minúsculas, por lo que "printf" es una palabra reconocida, pero "Printf", "PRINTF" o "PrintF" no lo son.

1.1.1. Cómo probar este programa en Linux

Los sistemas operativos de la familia Unix, como Linux, suelen incluir un compilador de C, de modo que será fácil probar nuestros programas. Supondremos que se trata de una versión de Linux de los últimos años, que tenga entorno gráfico. Podríamos usar el editor del texto del entorno gráfico, teclear el fuente y guardarlo en nuestra carpeta personal, por ejemplo con el nombre ejemplo001.c (lo que sí es importante es que termine en “.c”):

Revisión 0.90– Página 13

(en esta imagen se trata de Mandrake Linux 9.1, con el entorno Gnome y el editor básico que incorpora, GEdit). Después abriríamos una ventana de terminal y teclearíamos la siguiente orden para compilar nuestro fuente:

cc ejemplo001.c –o miprograma

Donde:

 “cc” es la orden que se usa para poner el compilador en marcha.  “ejemplo001.c” es el nombre del fuente que queremos compilar.  La opción “-o” se usa para indicar el nombre que queremos que tenga el fichero

ejecutable resultante (la “o” viene de “output”, salida).  “miprograma” es el nombre que tendrá el programa ejecutable.

Y para probar el programa teclearíamos ./miprograma Con lo que debería aparecer escrito “Hola” en la pantalla.

Revisión 0.90– Página 14

(Nota: Las versiones más recientes de Linux tienen entornos integrados, desde los que podemos teclear y probar nuestro programa, con más comodidad, como en el caso de la herramienta que vamos a comentar para Windows. Dos de los entornos más extendidos son KDevelop y Anjuta).

1.1.2. Cómo probar este programa en Windows

La familia de sistemas Windows no incluye ningún compilador de C, de modo que tendremos que localizar uno e instalarlo. Existen muchos gratuitos que se pueden descargar de Internet, y que incluyen un editor y otras herramientas auxiliares. Es el caso de Dev-C++, por ejemplo, que tiene su página oficial en www.bloodshed.net. La instalación es poco más que hacer doble clic en el fichero descargado, y hacer clic varias veces en el botón “Siguiente”:

En el caso de Dev-C++, podemos incluso trabajar con el entorno en español:

Para crear nuestro programa, en el menú "Archivo" escogemos "Nuevo / Código fuente", y nos aparece un editor vacío en el que ya podemos empezar a teclear. Si queremos nuestro programa en funcionamiento, entraríamos al menú “Ejecutar” y usaríamos la opción “Compilar y ejecutar”:

Revisión 0.90– Página 15

(si todavía no hemos guardado los cambios en nuestro fuente, nos pediría antes que lo hiciéramos). Puede ocurrir que se muestre el texto en pantalla, pero la ventana desaparezca tan rápido que no tengamos tiempo de leerlo. Si es nuestro caso, tenemos dos opciones:

 Algunos entornos (como los de la familia Turbo C y Borland C) tienen una opción “User Screen” (pantalla de usuario) en el menú “Run” (ejecutar), que nos mostraría lo que ha aparecido en esa pantalla que no pudimos leer.

 Otros entornos, como Dev-C++, no tienen esa posibilidad, por lo que deberíamos hacer un pequeño cambio a nuestro fuente, para que espere a que pulsemos la tecla Intro antes de terminar. Una orden que nos permitiría hacer eso (y que veremos con más detalle más adelante) es “getchar()”, así que nuestro fuente quedaría

#include <stdio.h> main() { printf("Hola"); getchar(); }

1.2. Mostrar números enteros en pantalla

Cuando queremos escribir un texto “tal cual”, como en el ejemplo anterior, lo encerramos entre comillas. Pero no siempre querremos escribir textos prefijados. En muchos casos, se tratará de algo que habrá que calcular. El caso más sencillo es el de una operación matemática. En principio, podríamos pensar en intentar algo así (que está mal): printf(3+4);

Revisión 0.90– Página 16

En muchos lenguajes de programación esto es perfectamente válido, pero no en C. La función “printf” nos obliga a que lo que escribamos en primer lugar sea un texto, indicado entre comillas. Eso que le indicamos entre comillas es realmente un código de formato. Dentro de ese código de formato podemos tener caracteres especiales, con los que le indicamos dónde y cómo queremos que aparezca un número (u otras cosas). Esto lo veremos con detalle un poco más adelante, pero de momento podemos anticipar que “%d” sirve para decir “quiero que aquí aparezca un número entero”. ¿Qué número? El que le indicamos a continuación, separado por una coma: printf("%d", 3+4); Este ejemplo mostraría en pantalla un número entero (%d) que sea el resultado de suma 3 y 4. Podemos escribir entre las comillas más detalles sobre lo que estamos haciendo: printf("El resultado de sumar 3 y 4 es %d", 3+4); Ejercicio propuesto: crea un programa que diga el resultado de sumar 118 y 56.

1.3. Operaciones aritméticas básicas

Está claro que el símbolo de la suma será un +, y podemos esperar cual será el de la resta, pero alguna de las operaciones matemáticas habituales tiene símbolos menos intuitivos. Veamos cuales son los más importantes:

Operador Operación + Suma - Resta, negación * Multiplicación / División % Resto de la división (“módulo”)

Ejercicio propuesto: Hacer un programa que calcule el producto de los números 12 y 13.

1.3.1. Orden de prioridad de los operadores

Sencillo:  En primer lugar se realizarán las operaciones indicadas entre paréntesis.  Luego la negación.  Después las multiplicaciones, divisiones y el resto de la división.  Finalmente, las sumas y las restas.  En caso de tener igual prioridad, se analizan de izquierda a derecha.

Ejercicio propuesto: Calcular (a mano y después comprobar desde C) el resultado de estas operaciones:

 -2 + 3 * 5  (20+5) % 6

Revisión 0.90– Página 17

 15 + -5*6 / 10  2 + 10 / 5 * 2 - 7 % 1

1.3.2. Introducción a los problemas de desbordamiento

El espacio del que disponemos para almacenar los números es limitado. Si el resultado de una operación es un número “demasiado grande”, obtendremos un resultado erróneo. Por eso en los primeros ejemplos usaremos números pequeños. Más adelante veremos a qué se debe realmente este problema y cómo evitarlo.

1.4. Introducción a las variables: int

Las variables son algo que no contiene un valor predeterminado, un espacio de memoria al que nosotros asignamos un nombre y en el que podremos almacenar datos. El primer ejemplo nos permitía escribir “Hola”. El segundo nos permitía sumar dos números que habíamos prefijado en nuestro programa. Pero esto tampoco es “lo habitual”, sino que esos números dependerán de valores que haya tecleado el usuario o de cálculos anteriores. Por eso necesitaremos usar variables, en las que guardemos los datos con los que vamos a trabajar y también los resultados temporales. Vamos a ver como ejemplo lo que haríamos para sumar dos números enteros que fijásemos en el programa.

1.4.1. Definición de variables: números enteros

Para usar una cierta variable primero hay que declararla: indicar su nombre y el tipo de datos que querremos guardar. El primer tipo de datos que usaremos serán números enteros (sin decimales), que se indican con “int” (abreviatura del inglés “integer”). Después de esta palabra se indica el nombre que tendrá la variable: int primerNumero;

Esa orden reserva espacio para almacenar un número entero, que podrá tomar distintos valores, y al que nos referiremos con el nombre “primerNumero”.

1.4.2. Asignación de valores

Podemos darle un valor a esa variable durante el programa haciendo primerNumero=234; O también podemos darles un valor inicial (“inicializarlas=”) antes de que empiece el programa, en el mismo momento en que las definimos: int primerNumero=234; O incluso podemos definir e inicializar más de una variable a la vez int primerNumero=234, segundoNumero=567;

Revisión 0.90– Página 18

(esta línea reserva espacio para dos variables, que usaremos para almacenar números enteros; una de ellas se llama primerNumero y tiene como valor inicial 234 y la otra se llama segundoNumero y tiene como valor inicial 567). Después ya podemos hacer operaciones con las variables, igual que las hacíamos con los números: suma = primerNumero + segundoNumero;

1.4.3. Mostrar el valor de una variable en pantalla

Una vez que sabemos cómo mostrar un número en pantalla, es sencillo mostrar el valor de una variable. Para un número hacíamos cosas como printf("El resultado es %d", 3+4); pero si se trata de una variable es idéntico: printf("El resultado es %d", suma); Ya sabemos todo lo suficiente para crear nuestro programa que sume dos números usando variables: #include <stdio.h> main() { int primerNumero; int segundoNumero; int suma; primerNumero = 234; segundoNumero = 567; suma = primerNumero + segundoNumero; printf("Su suma es %d", suma); } Repasemos lo que hace:

 #include <stdio.h> dice que queremos usar funciones de entrada/salida estándar.  main() indica donde comienza en sí el cuerpo del programa.  { señala el principio del cuerpo (de “main”)  int primerNumero; reserva espacio para guardar un número entero, al que llamaremos

primerNumero.  int segundoNumero; reserva espacio para guardar otro número entero, al que

llamaremos segundoNumero.  int suma; reserva espacio para guardar un tercer número entero, al que llamaremos

suma.  primerNumero = 234; da el valor del primer número que queremos sumar  segundoNumero = 567; da el valor del segundo número que queremos sumar

Revisión 0.90– Página 19

 suma = primerNumero + segundoNumero; halla la suma de esos dos números y la guarda en otra variable, en vez de mostrarla directamente en pantalla.

 printf("Su suma es %d", suma); muestra en pantalla el resultado de esa suma.  } señala el final del cuerpo (de “main”)

Nota: las variables las podemos declarar dentro del cuerpo del programa (main) o fuera de él. En programas tan sencillos no habrá diferencia. Más adelante veremos que en ciertos casos sí se comportarán de forma distinta según donde las hayamos declarado. Podemos resumir un poco este fuente, si damos los valores a las variables al inicializarlas: #include <stdio.h> main() { int primerNumero = 234; int segundoNumero = 567; int suma; suma = primerNumero + segundoNumero; printf("Su suma es %d", suma); } Ejercicio propuesto: Hacer un programa que calcule el producto de los números 121 y 132, usando variables.

1.5. Identificadores

Estos nombres de variable (lo que se conoce como “identificadores”) pueden estar formados por letras, números o el símbolo de subrayado (_) y deben comenzar por letra o subrayado. No deben tener espacios entre medias, y hay que recordar que las vocales acentuadas y la eñe son problemáticas, porque no son letras "estándar" en todos los idiomas. Algunos compiladores permiten otros símbolos, como el $, pero es aconsejable no usarlos, de modo que el programa sea más portable (funcione con facilidad en distintos sistemas). Por eso, no son nombres de variable válidos: 1numero (empieza por número) un numero (contiene un espacio) Año1 (tiene una eñe) MásDatos (tiene una vocal acentuada)

Tampoco podremos usar como identificadores las palabras reservadas de C. Por ejemplo, la palabra "int" se refiere a que cierta variable guardará un número entero, así que esa palabra "int" no la podremos usar tampoco como nombre de variable (pero no vamos a incluir ahora una lista de palabras reservadas de C, ya nos iremos encontrando con ellas). De momento, intentaremos usar nombres de variables que a nosotros nos resulten claros, y que no parezca que puedan ser alguna orden de C.

Revisión 0.90– Página 20

Hay que recordar que en C las mayúsculas y minúsculas se consideran diferentes, de modo que si intentamos hacer PrimerNumero = 0; primernumero = 0;

o cualquier variación similar, el compilador protestará y nos dirá que no conoce esa variable, porque la habíamos declarado como int primerNumero;

El número de letras que puede tener un "identificador" (el nombre de una variable, por ejemplo) depende del compilador que usemos. Es frecuente que permitan cualquier longitud, pero que realmente sólo se fijen en unas cuantas letras (por ejemplo, en las primeras 8 o en las primeras 32). Eso quiere decir que puede que algún compilador considerase como iguales las variables NumeroParaAnalizar1 y NumeroParaAnalizar2, porque tienen las primeras 18 letras iguales. El C estándar (ANSI C) permite cualquier longitud, pero sólo considera las primeras 31.

1.6. Comentarios

Podemos escribir comentarios, que el compilador ignora, pero que pueden servir para aclararnos cosas a nosotros. Se escriben entre /* y */: int suma; /* Porque guardaré el valor para usarlo más tarde */ Es conveniente escribir comentarios que aclaren la misión de las partes de nuestros programas que puedan resultar menos claras a simple vista. Incluso suele ser aconsejable que el programa comience con un comentario, que nos recuerde qué hace el programa sin que necesitemos mirarlo de arriba a abajo. Un ejemplo casi exagerado: /* ---- Ejemplo en C: sumar dos números prefijados ---- */ #include <stdio.h> main() { int primerNumero = 234; int segundoNumero = 567; int suma; /* Porque guardaré el valor para usarlo más tarde */ /* Primero calculo la suma */ suma = primerNumero + segundoNumero; /* Y después muestro su valor */ printf("Su suma es %d", suma); } Un comentario puede empezar en una línea y terminar en otra distinta, así: /* Esto es un comentario que ocupa más de una línea */

Revisión 0.90– Página 21

1.7. Datos por el usuario: scanf

Si queremos que sea el usuario de nuestro programa quien teclee los valores, necesitamos una nueva orden, llamada “scanf”. Su manejo recuerda al de “printf”, con una pequeña diferencia: scanf("%d", &primerNumero);

Con ese “%d” indicamos que esperamos leer un número entero (igual que para “printf”) y con &primerNumero decimos que queremos que ese valor leído se guarde en la variable llamada “primerNumero”. La diferencia está en ese símbolo & que nos obliga scanf a poner antes del nombre de la variable. Más adelante veremos qué quiere decir ese símbolo y en qué otros casos se usa. Un ejemplo de programa que sume dos números tecleados por el usuario sería: /*-------------------------*/ /* Ejemplo en C nº 5: */ /* c005.C */ /* */ /* Leer valores para */ /* variables */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() /* Cuerpo del programa */ { int primerNumero, segundoNumero, suma; /* Nuestras variables */ printf("Introduce el primer número "); scanf("%d", &primerNumero); printf("Introduce el segundo número "); scanf("%d", &segundoNumero); suma = primerNumero + segundoNumero; printf("Su suma es %d", suma); } Ejercicios propuestos:

1. Multiplicar dos números tecleados por usuario 2. El usuario tecleará dos números (x e y), y el programa deberá calcular cual es el

resultado de su división y el resto de esa división. 3. El usuario tecleará dos números (a y b), y el programa mostrar el resultado de la

operación (a+b)*(a-b) y el resultado de la operación a2-b2.

Revisión 0.90– Página 22

2. Tipos de datos básicos

2.1. Tipo de datos entero

2.1.1. Tipos de enteros: signed/unsigned, short/long

Hemos hablado de números enteros, de cómo realizar operaciones sencillas y de cómo usar variables para reservar espacio y poder trabajar con datos cuyo valor no sabemos de antemano. Empieza a ser el momento de refinar, de dar más detalles. El primer “matiz” importante es el signo de los números: hemos hablado de números enteros (sin decimales), pero no hemos detallado si esos números son positivos, negativos o si podemos elegirlo nosotros. Pues es sencillo: si no decimos nada, se da por sentado que el número puede ser negativo o positivo. Si queremos dejarlo más claro, podemos añadir la palabra “signed” (con signo) antes de “int”. Este es uno de los “modificadores” que podemos emplear. Otro modificador es “unsigned” (sin signo), que nos sirve para indicar al compilador que no vamos a querer guardar números negativos, sólo positivos. Vamos a verlo con un ejemplo: /*-------------------------*/ /* Ejemplo en C nº 6: */ /* c006.C */ /* */ /* Numeros enteros con y */ /* sin signo */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() /* Cuerpo del programa */ { int primerNumero; signed int segundoNumero; unsigned int tercerNumero; primerNumero = -1; segundoNumero = -2; tercerNumero = 3; printf("El primer numero es %d, ", primerNumero); printf("el segundo es %d, ", segundoNumero); printf("el tercer numero es %d.", tercerNumero); } El resultado de este programa es el que podíamos esperar: El primer numero es -1, el segundo es -2, el tercer numero es 3

¿Y sí hubiéramos escrito “tercerNumero=-3” después de decir que va a ser un entero sin signo, pasaría algo? No, el programa mostraría un –3 en la pantalla. El lenguaje C nos deja ser tan

Revisión 0.90– Página 23

descuidados como queramos ser, así que generalmente deberemos trabajar con un cierto cuidado. La pregunta que puede surgir ahora es: ¿resulta útil eso de no usar números negativos? Sí, porque entonces podremos usar números positivos de mayor tamaño (dentro de poco veremos por qué ocurre esto). De igual modo que detallamos si queremos que un número pueda ser negativo o no, tenemos disponible otro modificador que nos permite decir que queremos más espacio, para poder almacenar números más grandes. Un “int” normalmente nos permite guardar números inferiores al 2.147.483.647, pero si usamos el modificador “long”, ciertos sistemas nos permitirán usar números mucho mayores, o bien con el modificador “short” podremos usar números menores (sólo hasta 32.767, en caso de que necesitemos optimizar la cantidad de memoria que utilizamos). Ejercicio propuesto: Multiplicar dos números de 4 cifras que teclee el usuario, usando el modificador “long”.

2.1.2. Problemática: asignaciones y tamaño de los números; distintos espacios ocupados según el sistema

El primer problema a tener en cuenta es que si asignamos a una variable “demasiado pequeña” un valor más grande del que podría almacenar, podemos obtener valores incorrectos. Un caso típico es intentar asignar un valor “long” a una variable “short”: /*-------------------------*/ /* Ejemplo en C nº 7: */ /* c007.C */ /* */ /* Numeros enteros */ /* demasiado grandes */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() /* Cuerpo del programa */ { int primerNumero; signed int segundoNumero; unsigned int tercerNumero; primerNumero = -1; segundoNumero = 33000; tercerNumero = 123456; printf("El primer numero es %d, ", primerNumero); printf("el segundo es %d, ", segundoNumero); printf("el tercer numero es %d.", tercerNumero); } El resultado en pantalla de este programa, si usamos el compilador Turbo C 2.01 no sería lo que esperamos:

Revisión 0.90– Página 24

El primer numero es -1, el segundo es -32536, el tercer numero es -7616 Y un problema similar lo podríamos tener si asignamos valores de un número sin signo a uno con signo (o viceversa). Pero el problema llega más allá: el espacio ocupado por un “int” depende del sistema operativo que usemos, a veces incluso del compilador. Por ejemplo, hemos comentado que con un “int” podemos almacenar números cuyo valor sea inferior a 2.147.483.647, pero el ejemplo anterior usaba números pequeños y aun así daba problemas. ¿Por qué? Por que este último ejemplo lo hemos probado con un compilador para MsDos. Se trata de un sistema operativo más antiguo, de 16 bits, capaz de manejar números de menor tamaño. En estos sistemas, los “int” llegaban hasta 32.767 (lo que equivale a un short en los sistemas modernos de 32 bits) y los “short” llegaban sólo hasta 127. En los sistemas de 64 bits (poco frecuentes todavía) existen “int” de mayor tamaño. Para entender por qué ocurre esto, vamos a hablar un poco sobre unidades de medida utilizadas en informática y sobre sistemas de numeración.

2.1.3. Unidades de medida empleadas en informática (1): bytes, kilobytes, megabytes...

En informática, la unidad básica de información es el byte. En la práctica, podemos pensar que un byte es el equivalente a una letra. Si un cierto texto está formado por 2000 letras, podemos esperar que ocupe unos 2000 bytes de espacio en nuestro disco. Eso sí, suele ocurrir que realmente un texto de 2000 letras que se guarde en el ordenador ocupe más de 2000 bytes, porque se suele incluir información adicional sobre los tipos de letra que se han utilizado, cursivas, negritas, márgenes y formato de página, etc. Un byte se queda corto a la hora de manejar textos o datos algo más largos, con lo que se recurre a un múltiplo suyo, el kilobyte, que se suele abreviar Kb o K. En teoría, el prefijo kilo querría decir “mil”, luego un kilobyte debería ser 1000 bytes, pero en los ordenadores conviene buscar por comodidad una potencia de 2 (pronto veremos por qué), por lo que se usa 210 =1024. Así, la equivalencia exacta es 1 K = 1024 bytes. Los K eran unidades típicas para medir la memoria de ordenadores: 640 K ha sido mucho tiempo la memoria habitual en los IBM PC y similares. Por otra parte, una página mecanografiada suele ocupar entre 2 K (cerca de 2000 letras) y 4 K. Cuando se manejan datos realmente extensos, se pasa a otro múltiplo, el megabyte o Mb, que es 1000 K (en realidad 1024 K) o algo más de un millón de bytes. Por ejemplo, en un diskette “normal” caben 1.44 Mb, y en un Compact Disc para ordenador (Cd-Rom) se pueden almacenar

Revisión 0.90– Página 25

hasta 700 Mb. La memoria principal (RAM) de un ordenador actual suele andar por encima de los 512 Mb, y un disco duro actual puede tener una capacidad superior a los 80.000 Mb. Para estas unidades de gran capacidad, su tamaño no se suele medir en megabytes, sino en el múltiplo siguiente: en gigabytes, con la correspondencia 1 Gb = 1024 Mb. Así, son cada vez más frecuentes los discos duros con una capacidad de 120, 200 o más gigabytes. Y todavía hay unidades mayores, pero que aún se utilizan muy poco. Por ejemplo, un terabyte son 1024 gigabytes. Todo esto se puede resumir así:

Unidad Equivalencia Valores posibles Byte - 0 a 255 (para guardar 1 letra) Kilobyte (K o Kb) 1024 bytes Aprox. media página mecanografiada Megabyte (Mb) 1024 Kb - Gigabyte (Gb) 1024 Mb - Terabyte (Tb) 1024 Gb -

Pero por debajo de los bytes también hay unidades más pequeñas... Ejercicios propuestos:

• ¿Cuántas letras se podrían almacenar en una agenda electrónica que tenga 32 Kb de capacidad?

• Si suponemos que una canción típica en formato MP3 ocupa cerca de 3.500 Kb, ¿cuántas se podrían guardar en un reproductor MP3 que tenga 256 Mb de capacidad?

• ¿Cuántos diskettes de 1,44 Mb harían falta para hacer una copia de seguridad de un ordenador que tiene un disco duro de 6,4 Gb? ¿Y si usamos compact disc de 700 Mb, cuántos necesitaríamos?

• ¿A cuantos CD de 700 Mb equivale la capacidad de almacenamiento de un DVD de 4,7 Gb? ¿Y la de uno de 8,5 Gb?

2.1.4. Unidades de medida empleadas en informática (2): los bits

Dentro del ordenador, la información se debe almacenar realmente de alguna forma que a él le resulte "cómoda" de manejar. Como la memoria del ordenador se basa en componentes electrónicos, la unidad básica de información será que una posición de memoria esté usada o no (totalmente llena o totalmente vacía), lo que se representa como un 1 o un 0. Esta unidad recibe el nombre de bit. Un bit es demasiado pequeño para un uso normal (recordemos: sólo puede tener dos valores: 0 ó 1), por lo que se usa un conjunto de ellos, 8 bits, que forman un byte. Las matemáticas elementales (combinatoria) nos dicen que si agrupamos los bits de 8 en 8, tenemos 256 posibilidades distintas (variaciones con repetición de 2 elementos tomados de 8 en 8: VR2,8): 00000000 00000001 00000010 00000011 00000100 ...

comentarios (0)
No hay comentarios
¡Escribe tu el primero!
Esta solo es una pre-visualización
3 shown on 198 pages
descarga el documento