Breve introducción a la C. por Akio Kita, 1999 Nota: El objetivo de

Anuncio
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;
}
Descargar