Vistas de página en total

miércoles, 11 de septiembre de 2013

Programación Android con CCTools y C - pc01

Lenguaje C
 El lenguaje humano se usa para comunicar a los hombres que forman una sociedad. Desde que el hombre apareció en la tierra, invento un lenguaje primitivo de señas y palabras guturales, para comunicarse y evoluciono hasta llegar a crear la diversidad de lenguas actuales que existen en el mundo. También utilizo su inteligencia para crear herramientas como las armas primitivas para protegerse de los depredadores y creo herramientas que le ayudaron en sus actividades diarias, hasta llegar a la época actual y crear máquinas manuales como la tejedora o para realizar cálculos aritméticos como el ábaco y finalmente máquinas automáticas que pueden ser mecánicas, electromecánicas, eléctricas y electrónicas aplicadas a diferentes ramas industriales.
A partir de 1948 que se inventa la computadora electrónica como una máquina automática que debe programarse para que pueda automatizar alguna actividad del hombre. Para programar una computadora se necesita un lenguaje que conozca el programador y dar instrucciones para manipular datos y se obtenga la solución de un problema científico o técnico de las diversas áreas del conocimiento humano. Todas las computadoras electrónicas solo entienden el lenguaje binario de bits 1 y 0, físicamente el bit 1 se representa por un voltaje de 5 volts o menos y el bit 0 se representa por 0 volts. Un programa es una secuencia de instrucciones que manipulan datos. Las instrucciones de una computadora en general están organizadas en una secuencia de varios bits, una parte corresponde a la propia instrucción y otra parte a los datos. Las instrucciones pueden ser aritméticas, lógicas, transferencia, desplazamiento,  condicionales, entrada y salida. Los datos pueden ser enteros, decimales o punto flotante, cadenas de caracteres y arreglos. Programar una computadora a nivel de bits o lenguaje de máquina es muy difícil y laborioso pero no imposible.
Para facilitar la programación de la computadora se crearon los lenguajes de programación de nivel bajo, medio y alto. El lenguaje ensamblador es de nivel bajo y más cercano al lenguaje de máquina. El lenguaje C es de nivel medio. Hay varios lenguajes de nivel superior como los lenguajes Fortran, Cobol, Visual Basic, C++ y Java. Cuando se programa en uno de estos lenguajes es necesario un programa interprete o un  traductor a lenguaje de máquina o mejor dicho al lenguaje de máquina del procesador que solo entiende bits de 1 y 0.
Existen varios intérpretes como el Basic y el Pyton. Para realizar un programa con un intérprete se utiliza su editor para escribir las instrucciones del lenguaje, cuando se termina se ejecuta y va procesando instrucción por instrucción hasta encontrar el fin del programa, si no hay errores se guarda el programa con un nombre en un archivo y queda listo para volver a interpretar cada instrucción y ejecutarse hasta finalizar.
Existen varios compiladores para los diferentes niveles de lenguajes y  un programa realizado con un lenguaje de nivel bajo como un ensamblador, utiliza un editor para escribir las instrucciones en ensamblador, cuando se termina se guarda con un nombre el programa, ahora se llama al programa compilador o ensamblador y el programa se ensambla, si existen errores se corrigen con el editor y se vuelve a ensamblar, si ya no hay errores se crea un archivo ejecutable con todas las instrucciones y datos del programa, listo para ejecutarse sin volver a ensamblarse.
Un programa realizado con un lenguaje C de nivel medio y alto como Fortran, Cobol o C++, utiliza un editor para escribir las instrucciones en el lenguaje correspondiente, cuando se termina se guarda con el nombre del programa, ahora se llama al programa compilador por ejemplo de C y se compila el programa, si  hay errores se corrigen con el editor, se vuelve a compilar, si no da errores deja el programa en lenguaje ensamblador y se realiza un segundo paso para llamar al ensamblador y ensamblar el programa, si existen errores se corrigen con el editor y se vuelve a compilar y ensamblar, si ya no hay errores se crea un archivo ejecutable con todas las instrucciones y datos del programa, listo para ejecutarse sin volver a compilarse y ensamblarse.
Un programa realizado con un lenguaje de nivel alto como Java, utiliza, como hemos tratado en la serie de blogs de Programación Android con AIDE y Java su editor para escribir las instrucciones en el lenguaje de Java, cuando se termina se guarda con el nombre del programa, ahora se llama al programa compilador de Java y compila el programa, si  hay errores se corrigen con el editor, se vuelve a compilar, si no da errores deja el programa en lenguaje intermedio de una Máquina Virtual de Java se realiza un segundo paso para llamar al intérprete de la Máquina Virtual  de Java y ejecutar el programa, si ya no hay errores se crea un archivo ejecutable jar con todas las instrucciones y datos del programa, listo para ejecutarse sin volver a compilarse.  El programa en el archivo jar se puede ejecutar en cualquier sistema operativo que tenga el interprete de la Máquina Virtual Java. Para el caso del sistema operativo Android además de tener el intérprete de la Máquina Virtual Java tiene la Máquina Virtual Dalvik para optimizar los programas de los teléfonos inteligentes que utilizan el sistema operativo Android. Es importante decir que un programa ejecutado por un intérprete es más lento que un programa compilado.
Recordemos que una computadora está hecha de una parte física o hardware y otra de programas o software. La parte física tiene varios dispositivos y equipos periféricos con componentes mecánicos, eléctricos y electrónicos tanto internos y externos. La parte de software o de programas contiene programas del sistema como el sistema operativo, ensambladores, compiladores, interpretes, editores, base de datos, etc. y los programas de aplicaciones que desarrolla el usuario. 
Un teléfono inteligente es una computadora de mano pequeña y tiene una parte física o hardware y otra parte de programas o software. La parte física externa visible, muestra una carcasa o paquete rectangular metálico y de plástico con una pantalla táctil y algunos pueden tener un pequeño teclado, pero la mayoría solo tiene la pantalla táctil. Internamente se encuentra el chip o SIM del servicio telefónico, la pila o batería y la tarjeta madre o del sistema que contiene varios chips y componentes electrónicos, alrededor de la tarjea que sale externamente, contiene el botón de encendido, el usb para cargar el teléfono o para  conectarse a una PC, el boton de volumen, una abertura para introducir la tarjeta microSD de almacenamiento externo, algunos teléfonos tienen en la parte baja de la pantalla táctil botones de menú, home y regreso. Cuando se enciende el teléfono se activa e inicia la parte software o programas, primero se carga el sistema operativo como Android que contiene todos los programas del sistema que controlan la interacción del usuario con todas las aplicaciones, como las llamadas por teléfono, envió y recepción de mensajes, con la cámara sacar fotos y videos, oír radio, ver y oír videos y películas, encontrar personas o lugares con GPS, conectarse a internet, etc.       
El sistema operativo Android es el más utilizado en los teléfonos inteligentes, desciende de Linux y este de Unix, los tres sistemas  /Unix/Linux/Android, fueron desarrollados en un mayor porcentaje utilizando el lenguaje C y C++. Pero también se utilizan en crear los compiladores, interpretes, base de datos, así como para desarrollar aplicaciones. Por lo tanto primero estudiaremos en detalle el leguaje C  y posteriormente el lenguaje C++ y usaremos como herramienta de programación a CCTools instalado en el teléfono inteligente.  

Fundamentos del Lenguaje C
Para programar android con el lenguaje C, es necesario estudiar los fundamentos de C y a continuación explicaremos brevemente la sintaxis del lenguaje, entendiendo que todo programa de una computadora tiene instrucciones que manipulan datos.
Datos
Los datos representan al mundo real de los números que son cantidades de diferentes hechos físicos y son enteros, decimales, booleanos de falso o verdadero y caracteres, arreglos de datos y cadenas de caracteres. Todos los datos pueden ser constantes o variables que son manipulados por las instrucciones de un programa.
Variables
Las variables en un programa se declaran, primero se pone el tipo y luego la variable o lista de variables y a veces sus valores. Cada variable deberá tener un tipo. Los tipos de datos pueden ser como enteros, reales, booleano y como carácter o literal, cadenas de caracteres, arreglos.
Los nombres de las variables deben de seguir las siguientes reglas.
1 El primer carácter del nombre debe ser una letra de a hasta z, de A hasta Z, el carácter _ y $
2 No puede usar el nombre de palabras reservadas del lenguaje C.
3 El nombre debe ser continuo, sin espacios intermedios.
4 Los nombres son sensibles o diferentes con minúsculas y mayúsculas.
Tipos de Datos
Los tipos de datos son los números enteros y reales, booleanos y de caracteres. Los enteros siempre tienen signo. Hay varios tipos de enteros, char, short, int y long. La diferencia está en el tamaño que ocupan y el rango que pueden guardar.
Enteros
Los enteros permiten contar cosas es decir asignar una secuencia numérica. Los enteros se representan por un bit de 1 y 0, dos bits representan 4 combinaciones, en general n bits representan 2 a la n combinaciones. Por ejemplo en 8 bits o un byte se pueden representar 2 a la 8 combinaciones o sea 256 combinaciones, pero la última posición de la izquierda representa el signo, por lo tanto se tiene 2 a la 7 para números positivos y negativos, es decir un rango de  -128 a 127. También así se tiene para los enteros de 2, 3 y 4 bytes.
Reales
Los números reales pueden almacenar números con parte decimal. Hay dos tipos de números reales. La diferencia es la cantidad de decimales que pueden representar. Para representar los reales o decimales de simple precisión  float se utilizan 4 bytes, una parte para el exponente de valores + o -  y la otra parte para la mantisa con valores  + o -. Para doble precisión doublé se usan 8 bytes una parte para el exponente con valores + o – y la otra parte para la mantisa con valores + o -.
Booleanos
El tipo boolean representa variables que pueden tener uno de dos valores: true(1) o false(0).
Character
El tipo char ocupa 1 byte para el código ascii y de 2 bytes para el codigo Unicode.

Constantes o Literales
 Las literales son caracteres especiales que controlan características en las declaraciones de datos y son de string, carácter, enteras, reales y booleanas.
String
Las literales de string se delimitan entre comillas dobles: "hola mundo". Si se desea que el string tenga comillas dobles es necesario poner el carácter de escape (\). "Alguien dijo: \"hola mundo\"".
Character
 Las literales de carácter se delimitan entre comillas sencillas: 'h', '$', '7'. C maneja las literales para caracteres no imprimibles como  '\n' para el retorno de carro y '\t' para el tabulador.
Enteras
 Las literales enteras se pueden especificar en base 10, por ejemplo 259, pero se pueden especificar en base 8 colocando un cero antes, por ejemplo 064 o en base 16 poniendo 0x, por ejemplo 0xA9.
Reales
Las literales reales se pueden escribir en formato normal, por ejemplo 5.953 o en formato científico, por ejemplo 856.51E10 o 6.988E-2.
Booleanas
 Las literales booleanas son las palabras TRUE = 1 y FALSE =0.

Arreglos de Datos
Un arreglo define una estructura de almacenamiento de un número determinado de variables todas del mismo tipo, cada elemento está identificado por un índice de 0 hasta n.
Un arreglo se declarara como:
Tipo de Dato nombre-arreglo[tamaño-arreglo];
Por ejemplo: int num[5] tiene num asignado en memoria 5 posiciones de 0 a 4. También puede declararse sin un tamaño del arreglo como int num[]. En el principio o transcurso del programa se puede asignar valores como:  int num[5] = {4, 2, 3, 10, 2};
Los elementos de un arreglo se obtienen mediante un índice que puede valer entre 0 y t – 1, donde t es el tamaño del arreglo. Las siguientes instrucciones son válidas.
Asignar un nuevo valor al elemento de arreglo con índice 1:
num[1] = 10;
Sumar el elemento 0 con otro valor constante de 10 al elemento del arreglo con índice 2:
num[2] = num[0] + 10;
Incrementar el elemento 5 de arreglo:
num[5]++;

Arreglo de Caracteres o Strings
 Vamos a ver en detalle el String o cadena de caracteres, que es muy importante para manipular datos alfanuméricos de cadenas de caracteres. Para definir una variable de strings se usa el tipo de datos Char:
Char  nombre-arreglo[longuitud-arreglo];
Ejemplo: Vamos a declarar un cadena de caracteres con nombres Char nombre[5] reservando en memoria 5 posiciones de 0 a 4 para nombres. También se puede declarar sin especificar el tamaño como: Char nombre[] y en después  se puede asignar valores al arreglo nombres:
Char nombres[5] = {“María”};
Concatenación de strings
Consiste en unir dos cadenas de caracteres cadena1 y cadena2  en una sola, con el operador +.
Char cadena1 = “Cadena1”;
Char cadena2 = “Cadena2”;
Char cadena3 = cadena1 + cadena2 = Cadena1Cadena
También se puede unir datos a una cadena como:
int dato1 = 30;
Char cadena3 = cadena1 + cadena2 +dato1;

Operadores
Un operador es un símbolo especial que representa una operación y que se usa en una expresión aritmética. Una expresión es una instrucción que obtiene un valor. Los operadores son aritméticos, de asignación, relación o comparación, lógicos.
Operadores aritméticos
 Utiliza diferentes operadores. El + para la suma, el – para la resta, el * para la multiplicación, el '/' para la división y el '%' para el resto. Si todos los operandos en una expresión son enteros, la expresión regresa un entero. Con uno de los operandos que sea real, el resultado es real. Así la división 2/3 se obtiene 0 y 2/3.0 regresa 0.6666.
Operadores de asignación
 El lenguaje C tiene diferentes operadores El símbolo = representa la asignación sencilla: a = 2;
Los símbolos ++ y -- incrementan y decrementan en 1 el valor de la variable: a = 2; a++ y a vale ahora 3
También existen los operadores aritméticos con asignación como muestra a continuación:
Expresión Significado
1) x += y es equivalente a x = x + y 
2) x -= y es equivalente a x = x – y 
3) x *= y es equivalente a x = x * y 
4) x /= y es equivalente a x = x / y
Operadores de relación o comparación
El lenguaje C tiene los operadores de comparación: menor que (<), menor o igual que (<=), mayor que (>), mayor o igual que (>=), igual que (==) y distinto que (!=).
Operadores lógicosAND(Y)
El lenguaje C utiliza el símbolo && para la operación AND (Y), dos condiciones c1 && c2 son verdaderas TRUE(1) si ambas son verdaderas, si alguna de las condiciones es FALSE(0) el resultado es falso.
Ejemplo:
int c1 = 2, c2 = 10;
if ((c1> 0) && (c2++ > 0)){
instrucciones;
}
OR(O)
Para la operación OR (O) utiliza el símbolo ||, dos condiciones c1 || c2 son verdaderas TRUE(1) si cualquiera de ellas es verdadera o las dos, si ambas son falsas las condiciones son falsas.
NOT(No)
Para la operación NOT (no) el operador es el !. si una condición c1 es verdadera, su NOT de la condición c1 resulta falsa.

Expresiones
Una expresión es una instrucción matemática que calcula un valor y se asigna a una variable. Se construyen al combinar operandos como constantes y variables con los operadores que actúan sobre ellas. En expresiones complejas se utilizan paréntesis para indicar el orden de evaluación. El paréntesis agrupa operaciones, primero se realizan los paréntesis, después multiplicaciones y divisiones, y por último sumas y restas. Ver tabla de precedencia.
Ejemplo: A la variable var1 se asigna el resultado de calcular la expresión de la derecha
Var1 = ((x+22)*(789*y))/(123+z)
Todos los operadores binarios que tienen la misma prioridad (excepto los operadores de asignación) son evaluados de izquierda a derecha. Los operadores de asignación son evaluados de derecha a izquierda.
Ejemplo. La siguiente formula da la media aritmética de cinco términos:
Algebra: m  = a + b + c + d + e / 5
C: m = ( a + b + c + d + e ) / 5;
Los paréntesis son requeridos, la división tiene mayor precedencia que la suma. Todos los cinco términos entre paréntesis son primero sumados y al final se realiza la división.
Ejemplo. La siguiente formula representa una línea recta.
Algebra: y = mx + b
C: y = m * x + b;
Los paréntesis no son requeridos, la multiplicación se realiza primero y después la suma y el asignamiento el resultado al final.
Ejemplo. Considere la siguiente ecuación de segundo grado.
Algebra  (y = ax2 + bx + c):
C  y = a * x * x + b * x + c;
           6    1    2    4   3    5
Los números indican la secuencia de evaluación.
Para más claridad se pueden colocar paréntesis, pero resulta redundante.
y = ( a * x * x ) + ( b * x ) + c;

Instrucciones
Todo programa de una computadora se ejecuta como una secuencia de instrucciones, como la instrucción que evalúa expresiones que manipulan datos con operaciones matemáticas o lógicas, o de instrucciones de entrada o salida, pero las instrucciones de control y decisión pueden alterar la secuencia de ejecución. Las instrucciones del lenguaje C van separadas por punto y coma. Los bloques de instrucciones se agrupan con llaves que contienen instrucciones {instrucciones}. Aquí un breve repaso de la sintaxis de cada una de las instrucciones principales.
Comentarios
 Cuando un comentario ocupa varias líneas se puede delimitar usando los símbolos /* instrucciones comentadas*/. Para una línea se usa el símbolo // para indicar al compilador que ignore lo que sigue hasta el fin de línea.
Instrucción if
Cambia la secuencia de ejecución de las instrucciones del programa cuando se cumpla una o varias condiciones.
Sintaxis:
if (condición){
 instrucciónes;
}
La condición se evalúa, si es verdadera se ejecuta la instrucción, si es falsa continúa con la siguiente instrucción. La palabra reservada else sirve para ejecutar una instrucción alterna si la condición es falsa.
Sintaxis:
if (condición){instrucciónes1;
}else{
instrucciónes2;
}
La condición se evalúa, si es verdadera se ejecuta las instrucciónes1, si es falsa se ejecuta la
instrucciónes2.
Ejemplo: El código siguiente muestra el uso de un if para decidir si un número entero es
par o impar.
int n=20;
if ((n % 2) == 0){
printf(" es par %d",n);
}else{
printf (" es impar %d",n);
}
Instrucción for
Repite una secuencia de instrucciones hasta que se cumpla una o varias condiciones.
Sintaxis:
for (inicio; condición; postcondición){
instrucciones;
}
El flujo de control es el siguiente:
1) Se evalúa la expresión de inicio
2) Se evalúa la condición
3) Si la condición es falsa el ciclo termina.
4) Si es verdadera ejecuta la instrucción (puede ser un bloque de instrucciones encerrado entre llaves), evalúa la postcondición y regresa al paso 2.
Ejemplo: El código imprime 10 veces el letrero Hola mundo… en la pantalla:
for (i = 0; i < 20; i++){
printf ("Hola mundo…");
}
Instrucción while
 Repite una secuencia de instrucciones mientras que se cumpla una o varias condiciones.
Sintaxis:
while (condición){
instrucciónes;
}
La instrucción o instrucciones se ejecutan mientras la condición sea verdadera.
Ejemplo: El código muestra el uso de un while para escribir el índice del primer elemento negativo de un arreglo o un mensaje de error si no existe ninguno.
int arrayx[] = {...};
int i = 0;
int ok = 0;
while (!ok && (i < arrayx.length)){
    if (arrayx[i] < 0){
        ok = 1;
    }else{
        i++;
            if (ok){
                printf ("El primer número negativo esta en %d", + i);
            }else{
                printf ("No existe ningún numero negativo");
            }
      }
}
Instrucción do while
 Repite una secuencia de instrucciones hasta que se cumpla una o varias condiciones.
Sintaxis:
do {
instrucciónes;
} while (condición);
La instrucción se ejecuta mientras la condición o condiciones sean verdaderas. La diferencia con el ciclo while es que el do while primero ejecuta la instrucción y luego revisa la condición. Por lo tanto el do while siempre se hace por lo menos una vez.
Ejemplo: El código también imprime 5 veces el mensaje en la pantalla:
i = 0;
do {
printf ("Hola mundo…");
i++;
} while (i < 5);
Instrucción switch
Sustituye a varios ifs y repite una secuencia de instrucciones cuando se cumpla una o varias condiciones.
Sintaxis
switch (expresión) {
case valor 1 : instrucciónes1;
case valor 2 : instrucciónes2;
...
[default : instrucción n;] // El corchete cuadrado indica que es opcional
}
La expresión se evalúa y se compara con cada uno de los valores de la parte case. Si encuentra una coincidencia ejecuta las instrucciones a partir de ese caso. Si no encuentra ninguna coincidencia ejecuta la instrucción correspondiente a la parte default si es que está presente o continua con la siguiente instrucción al switch si no hay default. Se puede indicar que solo ejecute un caso usando la instrucción break.
Ejemplo: Dado de un número entero que representa el mes (1 es enero, 2 es febrero, ..., 12 es diciembre) asigna en la variable día el número de días del mes o –1 si el número de mes está fuera de rango.
switch (mes) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: dia = 31;
break;
case 4:
case 6:
case 9:
case 11: dia = 30;
break;
case 2: dia = 28;
break;
default: dia = -1;
}
Instrucción return
La instrucción return sirve para salir de una función, de una instrucción de control o de decisión. Si el método regresa un valor el return que va seguido de una expresión que se convertirá en el valor del método.
Instrucción break
 La instrucción break sirve para salir de un switch. El break también se puede utilizar para terminar un ciclo for, while o do while como en el ejemplo siguiente que escribe 5 veces el letrero "Hola mundo" en la pantalla:
int i = 0;
while (true) {
    printf ("Hola mundo…");
    i++;
    if (i == 5){
        break;
    }
}
Si el ciclo está anidado dentro de otro ciclo, la ejecución continúa con el ciclo externo.
Instrucción continue
La instrucción continue suspende la ejecución de un ciclo y continúa con la siguiente iteración.
Ejemplo: El código muestra el uso de continue dentro de un ciclo para contar los elementos positivos de un arreglo.
int cuenta = 0;
for (int i = 0; i < arreglo1.length; i++) {
    if (arreglo1[i] < 0){
        continue;
    }
cuenta++;
}
printf ("Los elementos positivos del arreglo son %d",cuenta);

Todo lo estudiado forma parte del  lenguaje C básico, donde un programa en C define datos y son manipulados por las instrucciones. Posteriormente estudiaremos punteros, archivos, estructuras de datos, base de datos y redes de comunicación. En los próximos blogs veremos ejemplos aplicando lo estudiado aquí. 

No hay comentarios: