Breve introducción a la C. por Akio Kita, 1999 Nota: El objetivo de esta guía es presentar a los alumnos una versión simplificada de la Información C. de esta guía permitirá a los estudiantes a "hackear" un programa en conjunto sin tener en cuenta a la elegancia, el estilo y la optimización. Este "hack" mentalidad es exigido por el corto período de tiempo disponible para introducir este tema. Punteros, la memoria dinámica asignación, la sobrecarga de operadores, la sobrecarga de funciones, estructuras, uniones, y otros temas en C no se discutido. Para un tratamiento riguroso de este tema por favor lea lo siguiente: El lenguaje de programación C de Brian W. Kernighan, Dennis M. Ritchie Este libro está escrito por los desarrolladores de C y se explica la estructura del lenguaje C. Prácticas de programación de C (Manual de pocas palabras) por Steve Oualline, Andy Oram Este es un libro de referencia muy bueno tener a su disposición en la programación. Zen de la programación de gráficos por Michael Abrash Este libro se centra en la programación de gráficos, pero tiene muchas optimizaciones matemáticas. Historia: En los primeros días de las computadoras, los lenguajes de programación sólo está disponible para los programadores dos de "bajo nivel" lenguas: la máquina y lenguaje ensamblador. La programación en idiomas fue largo y tedioso, porque el programador había administrar el hardware en sí (Memoria, pila, interrupciones, etc ...) .. Cuando las computadoras se volvieron cada vez más disponibles, muchos de "alto nivel de "lenguajes como FORTRAN, Pascal y Basic desarrollados a fin de que el subyacente hardware invisible para el programador y para hacer más fácil la sintaxis, por lo tanto hacer que las computadoras más fácil y rápido de programar. En 1972, el sistema operativo Unix estaba siendo desarrollado. Durante este tiempo, el concepto de sistema de lenguaje de programación con atributos de ambos "bajo nivel" y los lenguajes de "alto nivel" también ha desarrollado. Lenguajes de programación del sistema tienen la ventaja de un lenguaje de alto nivel, pero permiten al programador a tomar el control del hardware subyacente, si lo desea. Brian W. Kernigahn y Dennis M. Ritchie desarrollaron C en los Laboratorios Bell como un sistema de lenguaje de programación. Su objetivo fundamental era desarrollar un lenguaje que era simple y lo suficientemente flexible para ser utilizado en una variedad de procesadores diferentes. (Dos primeras versiones fueron nombrados A y B.) En 1983, el American National Standards Institute creó un comité para producir un C de programación estándar del lenguaje. Este "ANSI C" se completó en 1988. A lo largo de su historia, C se ha asociado estrechamente con el sistema operativo UNIX, con la programación del sistema de general, y con el reto de escribir "portátil" de código que se pueden transferir fácilmente a cualquier uno de los muchos equipos de destino. En los últimos años, diversas variantes de C se han desarrollado. C + + (C con objetos) es el más popular lenguaje de programación en el mundo y es el dominante en la aplicación de Microsoft Windows el desarrollo. Pequeña C es ampliamente utilizado para micro-controladores. Java se utiliza para la distribución entornos informáticos como Internet. Esta discusión se organizará en dos partes. Parte 1 se describen los "bloques de construcción" de la Lenguaje C: operadores, separadores, variables, funciones, sentencias if / else, y los bucles. Parte 2 Página 2 mostrar al alumno cómo crear un programa de C real. Los temas cubiertos en la parte 2 archivo de inclusión estructura, el pre-procesador, alcance variable, y las funciones de la biblioteca. Nota: C es sensible a mayúsculas Parte 1 1. Los operadores Los operadores se utilizan para manipular los datos. Los operadores realizan los cálculos, para comprobar la igualdad, hacer asignaciones, y manipular variables. De los 40 operadores de uso común, sólo 18 son esenciales para la discusión. Operadores de asignación = Asignación x = y; Operadores matemáticos + Adición x = x + y; Sustracción x = x - y; * Multiplicación x = x * y; / División x = x / y; % Módulo x = x% y Operadores lógicos && Y lógico x = true & & false; || OR lógico x = true | | false; Y AND bit a bit x = x & 0xFF; | OR bit a bit x = x | 0xFF; NOT bit a bit x = x 0xFF; ! NO lógico = sí!; >> Bits desplazamiento a la derecha x = x>> 1; << Bits desplazamiento a la izquierda x = x <<2; Operadores de igualdad == Igual a if (x == 10) {...} != No es igual a if (x! = 10) {...} < Menos que if (x <10) {...} > Mayor que if (x> 10) {...} <= Menor o igual a if (x <= 10) {...} >= Mayor o igual a if (x> = 10) {...} Nota: Los operadores matemáticos estándar de seguir prioridad. Multiplicación y división se ejecutado antes de cualquier suma o resta. Página 3 Separadores Hay cinco tipos de separadores necesarios para esta discusión. { } Estos separadores se utilizan para agrupar líneas de código e inicializar matrices. ; Este separador se utiliza para separar las líneas de código. ( ) Estos separadores se utilizan para especificar los parámetros y el cambio de prioridad de los operadores matemáticos. Ejemplo: El cambio de prioridad de los operadores matemáticos: 5 + 7 * 2 = 19 (5 + 7) * 2 = 24 [ ] Estos separadores se utilizan para arrays de índice. " " Estos separadores indican una cadena. /* */ Estos separadores indicar un comentario 2. Tipos de datos En C un tipo de datos define la forma en que el programa almacena la información en la memoria. El tamaño de bytes de un tipo de datos utiliza varía entre cada sistema de desarrollo así que ten cuidado. Tipo de datos Descripción Tamaño en Bytes (más común) vacío nada 0 carbón carácter 1 int entero 2 largo entero 4 flotador de punto flotante 4 doble de punto flotante 8 Todos estos tipos de datos están firmados. El bit más significativo se utiliza para indicar positivo o negativo. Un modificador de tipo "sin firmar" se puede utilizar para usar el bit más significativo. Ejemplo: int posible rango de valores -32.768 Y 32.767 sin firmar rango posible de valores int 0 a 65.535 Todas las variables utilizadas en un programa debe ser declarada. Ejemplo: int myvariable; Se puede asignar un valor inicial a una matriz mediante el operador de asignación. Página 4 Ejemplo: int myvariable = 5; Un arreglo es una colección de valores. Una matriz se asigna utilizando el separador []. Ejemplo: Declarar una matriz de enteros que contiene cinco valores. int myArray [5]; Si desea asignar un valor inicial a una matriz, deberá utilizar el {} separadores. Ejemplo: Llenado de una matriz con un valor inicial. int myArray [5] = {-300, -400, -2, 4, 5}; Si los valores iniciales de la matriz se dan, el compilador es suficientemente inteligente como para saber cuántos posiciones sean necesarias para mantener los valores iniciales. Ejemplo: Una forma alternativa para declarar una matriz con los valores iniciales. int myArray [] = {-300, -400, -2, 4, 5}; Una cadena es una matriz de valores de caracteres. Ejemplo: declaración de una cadena. caracteres micadena [10]; Para inicializar una cadena, el operador de asignación y "" los separadores se utilizan. El compilador también lugar un carácter nulo (NULL = 0) en la final de la cadena para indicar el final de una cadena. Ejemplo: Inicialización de una cadena. micadena caracteres [] = "Hola"; Para utilizar un valor particular o un personaje en una serie que puede indexar el valor utilizando los botones [] separadores. Nota: Índice de la matriz empieza en 0 Ejemplo: Indexación myarray [2] de arriba es igual a -2 MiCadena [1] de arriba es igual a 'e' Página 5 3. Funciones Las funciones son los componentes básicos de un programa de C. Las funciones son secciones de código que realizar un único y bien definido de servicios. Todo el código ejecutable en C está dentro de una función. Funciones tomar cualquier número de parámetros y devolver un valor máximo de 1. Un parámetro es un valor pasado a una función que se utiliza para alterar su funcionamiento o indicar el alcance de sus operaciones. Una de las funciones en C se ve así: En la sección tipo de datos, podría haberse preguntado cuál es el "vacío" tipo fue utilizado para. Si un función no devuelve un valor o no hay parámetros, el tipo void se utiliza. Ejemplo: imprimirHola vacío (void) { printf ("Hola Mundo"); / * Printf imprime una cadena en la pantalla * / return; } Otra pregunta que puede hacerse es que la función se ejecuta por primera vez en un programa. En C, el función llamada "main" se ejecuta en primer lugar. Como las variables, todas las funciones, excepto la "principal" función debe ser declarada antes de ser definido. Ejemplo: Declarar una función imprimirHola vacío (void); Nota: Una matriz como un parámetro tiene esta forma en la declaración: ArrayFunction vacío (int someArray []); Luego, cuando llama a la función, la función de dar el nombre de la matriz: int MyArray [10]; ArrayFunction (MiMatriz); int multiplica (int x, int y) { int z; z = x * y; volver z; } Tipo devuelto Nombre de la función Lista de parámetros La función del cuerpo Volver Declaración Página 6 4. Si las declaraciones y demás La sentencia if es una sentencia condicional. Si la condición dada en la sentencia if es cierto, entonces una sección de código que se ejecuta. Sintaxis: if (condición) { ejecutar este código si la condición es verdadera } Ejemplo: int absoluta (int x) { if (x <0) { x = -1 * x; } return x; } A veces, desea realizar una acción cuando la condición es realizar una temperatura y diferentes acción cuando la condición es falsa. Entonces usted puede utilizar la sentencia else. Sintaxis: if (condición) { ejecutar este código si la condición es verdadera } más { ejecutar este código si la condición es falsa } Es muy fácil a la cadena de un montón de si / else. Sintaxis: if (condición 1) { ejecutar este código si la condición 1 es verdadera } else if (condición 2) { ejecutar este código si la condición 1 es falsa y la condición 2 es verdad } más { ejecutar este código si la condición 1 y condición 2 son falsas Página 7 } 5. Loops Se ha comprobado que el circuito sólo es necesario para la programación es el bucle while. Mientras que la condición dada al bucle, mientras que es verdad una sección de código que se ejecuta. Sintaxis: while (condición) { ejecutar este código, mientras que la condición es verdadera } Ejemplo: unsigned int factorial (unsigned int x) { unsigned int resultado; while (x> 0) { resultado = resultado * x; x = x 1; } return resultado; } Puede salir de un bucle while antes de tiempo mediante el uso de la sentencia break. Ejemplo: int x = 0; while (true) { if (x == 10000) { break; } x=x+1 } En este ejemplo la condición dada al bucle, mientras que siempre es cierto. Una vez que x es igual a 10.000 el el programa saldrá del bucle while. Página 8 El lazo importante es el de bucle. Se toma tres parámetros: el número de partida de la prueba condición que determina si el bucle se detiene y la expresión de incremento. Sintaxis: for (inicial, condición, ajustar) { código que se ejecuta mientras la condición es verdadera } El bucle for ejecuta repetidamente una sección de código mientras la condición es verdadera. La declaración inicial inicializa el estado del circuito. Después de la sección de código que se ejecuta, el estado se ha modificado con la instrucción ajustar. Ejemplo: unsigned int factorial (unsigned x) { int contador; unsigned int resultado = 1; for (contador = 1; contador <= x; contador = contador + 1) { resultado = resultado * x; } return resultado; } Final Parte 1 Página 9 Parte 2 1. Tipos de archivo Cada compilador de C se adhiere a ciertas "reglas" con respecto a las extensiones de archivo. Extensión .C Estos son los archivos fuente en C. Por lo general contienen sólo las funciones y el procesador de precomandos con una excepción. Cualquier archivo de código fuente en C que contiene la función "principal" también incluye las declaraciones de variables globales para las variables usadas en el archivo y la función declaraciones para las funciones definidas en el archivo. .H Cada archivo de código fuente C sin el "principal" función tiene un archivo de cabecera con el mismo nombre. El archivo de cabecera incluye pre-procesador de comandos, las declaraciones de variables globales para las variables utilizadas en el archivo fuente asociado C, y las declaraciones de función para las funciones definidos en el archivo fuente asociado C. .O Después de que el compilador "compila" el archivo de origen C, un archivo objeto con el mismo nombre creado. Esto se hace principalmente para ahorrar tiempo de compilación. El compilador sólo compilará los archivos que han sido recientemente cambiado. . Lib Si el archivo fuente nunca va a cambiar entonces el programador puede crear un archivo de biblioteca. La programador puede utilizar las funciones en el archivo de la biblioteca. El "principal" función no está permitidos en un archivo de biblioteca. . Exe Esta es la extensión de archivo único que varía de sistema a sistema. Cuando un usuario compila una programa, el compilador crea archivos objeto a partir de los archivos de origen luego un enlazador enlaces cualquier funciones que se utilizan en el objeto de archivos para crear un archivo ejecutable. 2. Funciones de la biblioteca C paquetes de desarrollo siempre contienen las bibliotecas estándar. En esencia, las funciones estándar se proporcionan al programador. Las bibliotecas estándar que va a utilizar son: Entrada y salida estándar stdio.lib int printf (const char * formato [, argumento, ...]); • Acepta una serie de argumentos • Se aplica a cada argumento de un especificador de formato contenidos en el formato de formato de cadena * • Salidas de los datos con formato en la pantalla. Página 10 Para utilizar esta función, tenemos que dar el nombre de una matriz de caracteres o una cadena en sí misma. Ejemplo: Impresión de una matriz de cadenas. miCadena caracteres [] = "Hola Mundo"; printf (MyString); Ejemplo: La utilización de una cadena real. printf ("Hola Mundo"); Con argumentos y especificadores de formato, podemos imprimir el valor de una variable a la pantalla. Formato especificadores pueden variar entre los sistemas de desarrollo. Especificadores de formato %D Entero entero con signo decimal %I Entero entero con signo decimal %S Entero entero octal sin signo %U Entero entero decimal sin signo X% Entero int sin signo en hexadecimal (con a, b, c, d, e, f) X% Entero int sin signo en hexadecimal (con A, B, C, D, E, F) %F De punto flotante valor con signo %C Carácter Solo carácter %S Cadena de puntero Imprime caracteres hasta un terminador nulo %% Ninguno Imprime el carácter% Ejemplo: el valor de impresión de una variable int x = 5; int y = x * x; printf ("% d al cuadrado es igual a% d", x, y); El resultado del ejemplo de impresión "al cuadrado es igual a 5 25" en la pantalla. Para mostrar los caracteres no gráficos (como un carácter de nueva línea) y los separadores, una vía de escape secuencia que se necesita. Secuencias de escape \N LF Nueva línea (LF) \R CR Retorno de carro \T HT Tab (horizontal) \\ \ Barra invertida \' " Comilla simple (apóstrofo) \" " Comillas dobles \? ? Signo de interrogación Página 11 int scanf (const char * formato [, dirección, ...]); • explora una serie de campos de entrada un carácter a la vez • Formatos de cada campo de acuerdo con una especificación de formato correspondiente aprobado en el formato cadena. Scanf es similar a printf. Se utiliza para obtener información del usuario. Debe haber una por lo menos un abordar el argumento. Para obtener una discusión frente al consumo de la 'y' operador frente a los nombres de variables pero no delante de las matrices de caracteres. (El '&' operador es una "dirección de" operador.) Ejemplo: Introducción de un número int x; printf ("Por favor, introduzca un número entero:"); scanf ("% d", & x); Ejemplo: Introducción de una cadena char buffer int [80]; printf ("Por favor, introduzca una cadena"); scanf ("% s", buffer); math.lib Las bibliotecas de matemáticas Hay muchas funciones en la biblioteca matemática estándar para hacer operaciones matemáticas como: seno, coseno, tangente, exponencial, registro, etc ... Usted puede ver el archivo asociado de cabecera "math.h" para conocer la lista de parámetros y el tipo de cambio de cada función. También hay funciones matemáticas no en la biblioteca de matemáticas. Estas funciones se utilizan para convertir una cadena en un valor en puntos enteros o flotantes. Estos no son necesarios para esta discusión. 3. Pre-Processor Procesador de pre-directivas son instrucciones para el compilador. Preprocesador directivas precedidos por el carácter '#'. Para esta discusión sólo dos diferentes pre-procesador de comandos es necesario. # Include <filename.h> La directiva include se utiliza para vincular los archivos fuente en C, archivos de objetos, y archivos de la biblioteca juntos. Para esta discusión vamos a usar esto para vincular el archivos de la biblioteca. Esta directiva debe comparecer ante variable global las declaraciones y las declaraciones de funciones. # Define NOMBRE DE VALOR La directiva define se utiliza para establecer definiciones. Ejemplo: # Define PI 3,14 Página 12 4. Volver a variables y funciones (Ámbito) Debemos decir un poco más sobre el mecanismo por el cual se pasa un argumento a un función. Formalmente, la C es llamada por valor, lo que significa que una función recibe copias de los valores de sus parámetros. Supongamos que se crea una función que multiplica un número por 2. int multwo (int x) { x = x * 2; return x; } Nos podemos preguntar, si lo escribimos así, ¿qué pasaría con el valor de la variable z si escribir este código. z=5 j = multtwo (z); Cuando nuestra aplicación de multtwo cambia el valor de x, hace que cambie el valor de z cuando lo usamos como parámetro? La respuesta es no. x recibe una copia del valor de z, por lo que cuando x el cambio no cambiamos z. Hay una excepción a esta regla. Cuando el argumento que se pasa a una función es una matriz, la la función no recibe una copia de la matriz, por lo que puede modificar la forma en que hacemos array.So cambio de valores con una sola función? Podemos poner todas nuestras variables en forma de matriz, pero que no es una solución muy elegante. La forma elegante de resolver este problema es el uso de punteros, pero ya que no va a utilizar punteros en nuestra discusión, nos dirigimos a los contextos de variables. Antes de hablar de alcance variable, permite dibujar un esquema para ayudar a explicar que: Niveles: Nivel Base { Nivel 1 a: dentro de una función { Nivel 2 bis } { Nivel 2b } } { Nivel 1 b: dentro de una función } Página 13 Es claro que los niveles están separados por el separador de {}. Todas las variables declaradas en un nivel sólo es a disposición de los más altos niveles numerados. Si se declara una variable en el nivel 1a, 2a solo nivel, y Nivel 2b tendrán acceso a la variable. Si se declara una variable en nivel 2A, 2B nivel no tener acceso a esa variable, ya que no es un nivel más alto número. Si se declara una variable en el nivel básico se convierte en una variable global. Cualquiera de las funciones se define en el mismo archivo será capaz de usar esa variable. Así es como tenemos que cambiar las funciones múltiples variables. Nota: Los buenos programadores fruncir el ceño a las variables globales, pero ya no podemos usar punteros, tenemos otra opción. Si utiliza una variable global y lo utilizan en una función, la función que pierde su portabilidad. 5. Poniendo todo junto Con toda la información que obtuvo anteriormente y leyendo algunos archivos de cabecera de la biblioteca, que debe ser capaz de elaborar un programa de C funcional. Para ilustrar, aquí es un programa para la salida de un entero a binario. Ejemplo: Lee los comentarios de explicaciones. /* Ejemplo: entero a la conversión de binario */ / * Procesador de comandos pre-venir primero * / # Include / * Variables globales y declaraciones de funciones vienen * siguiente / int IntToBinary (int x, int bin []); void main (void) { int x; / * Declarar una variable de tipo entero * / int límite; / * Declarar una variable de tipo entero * / int binaryarray [20]; / * Declara un array de enteros */ / * Permita que el usuario de entrada de una variable y asegúrese de que es positivo * / while (true) { printf ("\ n de entrada un entero positivo:"); scanf ("% d", & x); if (x <0) { printf ("\ n No es un entero positivo."); } más { break; } Página 14 } / * Llamamos a la función Int a binario para almacenar los bits en binaryarray * / = límite IntToBinary (x, binaryarray); / * Ahora imprimir el contenido de la matriz binaria. Tenga en cuenta que declarar contra en la lista de parámetros para la. Esto significa que esta variable sólo accesible en el bucle * / for (int contador = 0; contador de límite <; contador = contador + 1) { printf ("\ n bits% d es% d", contador, binaryarray [contador]); } / * Fin del programa * / return; } / * Ahora, defina el IntToBinary función * / int IntToBinary (int x, int bin []) { int contador = 0; while (x> 0) { if ((x% 2)! = 0) { bin [contador] = 1; } más { bin [contador] = 0; } x = x / 2; contador = contador + 1; } volver contra; }