introduccion
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
introduccion [2013/03/14 17:00] – [Ejemplo de pograma en C] lmateu | introduccion [2020/03/08 21:05] (actual) – lmateu | ||
---|---|---|---|
Línea 13: | Línea 13: | ||
* A fines de los 70's aparece el primer lenguaje orientado a objetos: Smalltalk. | * A fines de los 70's aparece el primer lenguaje orientado a objetos: Smalltalk. | ||
* En los 80's Bjarne Stroustrup enriquece C con clases para facilitar la programación orientada a objetos en un lenguaje eficiente, dando así origen al lenguaje C++. Tampoco es robusto y es complejo. | * En los 80's Bjarne Stroustrup enriquece C con clases para facilitar la programación orientada a objetos en un lenguaje eficiente, dando así origen al lenguaje C++. Tampoco es robusto y es complejo. | ||
+ | * A fines de los 80 Guido Van Rossum concibe Python como en lenguaje de programación fácil de usar. Favorece la escritura rápida de programas pero sacrificando la eficiencia en tiempo de ejecución: Un programa en Python puede requerir de 10 a 100 veces más tiempo de ejecución que el mismo reescrito en C. | ||
* En los 90's James Gosling concibe Java como una forma de darle robustez a C++. Es menos complejo que C++. | * En los 90's James Gosling concibe Java como una forma de darle robustez a C++. Es menos complejo que C++. | ||
+ | |||
===== Ejemplo de programa en C ===== | ===== Ejemplo de programa en C ===== | ||
Línea 43: | Línea 45: | ||
* Entrega una constante caracterizada como EOF cuando llega al final del archivo. | * Entrega una constante caracterizada como EOF cuando llega al final del archivo. | ||
* putchar es otra función estándar de C que escribe un caracter en la salida estándar. | * putchar es otra función estándar de C que escribe un caracter en la salida estándar. | ||
- | * El include al inicio del archivo es una directiva para el procesador. Indica que se debe agregar en ese punto textualmente el archivo stdio.h. | + | * El include al inicio del archivo es una directiva para el preprocesador. Indica que se debe agregar en ese punto textualmente el archivo stdio.h. |
* Observe que una asignación puede aparecer en cualquier lugar en donde es válido colocar una expresión porque = es un operador como +, *, etc. No es usual que en Java un argumento de una expresión sea una asignación, | * Observe que una asignación puede aparecer en cualquier lugar en donde es válido colocar una expresión porque = es un operador como +, *, etc. No es usual que en Java un argumento de una expresión sea una asignación, | ||
Línea 67: | Línea 69: | ||
</ | </ | ||
- | * Todo programa en Unix tiene una entrada estándar y una salida estandar. | + | * Todo programa en Unix tiene una entrada estándar y una salida estandar. Usualmente son el teclado y la pantalla respectivamente. |
* Además existe una salida estándar de errores. | * Además existe una salida estándar de errores. | ||
- | * La entrada estándar se especifica con '<' | + | * La entrada estándar se puede redirigir usando el símbolo |
- | * La salida estándar se especifica con '>' | + | * La salida estándar se pude redirigir usando el símbolo |
- | * Si no se especifica entrada o salida estándar se usa la del shell que corresponde usualmente a teclado y consola respectivamente. | + | * El símbolo ' |
* Entonces los archivos out, out2 y out3 todos son iguales. | * Entonces los archivos out, out2 y out3 todos son iguales. | ||
Línea 78: | Línea 80: | ||
< | < | ||
% ./copy < out > out4 | % ./copy < out > out4 | ||
- | % echo $status | + | % echo $? |
1 | 1 | ||
% | % | ||
Línea 84: | Línea 86: | ||
* El 1 es el código de retorno y es el valor retornado por main. Cambie ' | * El 1 es el código de retorno y es el valor retornado por main. Cambie ' | ||
- | * El shell almacena en la variable $status | + | * El shell almacena en la variable $? el código de retorno del último programa ejecutado. |
===== Comparación entre C y Java ===== | ===== Comparación entre C y Java ===== | ||
Línea 120: | Línea 122: | ||
^ ^ Java ^ C ^ | ^ ^ Java ^ C ^ | ||
| declaración | < | | declaración | < | ||
- | | asignación de memoria | < | + | | asignación de memoria | < |
| acceso | < | | acceso | < | ||
| destrucción | | < | | destrucción | | < | ||
Línea 156: | Línea 158: | ||
* ciclo for: **for** ( //ini// ; //cond//; //incr//) //inst// | * ciclo for: **for** ( //ini// ; //cond//; //incr//) //inst// | ||
* agrupar instrucciones: | * agrupar instrucciones: | ||
- | * **switch** (//exp//) { //const// : //inst// **break**; ... **default**: | + | * **switch** (//exp//) { //const// : // |
- | Pero se deben considerar las siguientes diferencias entre C y Java. | + | Pero se debe tener cuidado si el compilador implementa una versión de C anterior al estándar C99, como por ejemplo ansi-C. |
- | En C el ciclo for no admite declarar la variable de control en la misma expresión de inicialización. | + | Antes de C99 el ciclo for no admite declarar la variable de control en la misma expresión de inicialización. |
- | el siguiente código es ilegal: | + | |
< | < | ||
Línea 177: | Línea 178: | ||
</ | </ | ||
- | Además las declaraciones de variables | + | Además las declaraciones de variables |
< | < | ||
Línea 194: | Línea 195: | ||
</ | </ | ||
- | GCC sí admite | + | A partir de C99 sí se admiten |
+ | |||
+ | ==== Funciones ==== | ||
+ | |||
+ | La sintaxis para declarar un función es la misma de los métodos de Java, solo que una función | ||
+ | |||
+ | < | ||
+ | /* Archivo fact.c */ | ||
+ | double fact(int n) { | ||
+ | if (n<=1) | ||
+ | return 1; | ||
+ | else | ||
+ | return n*fact(n-1); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Para usar esta función en otro archivo se debe declarar un prototipo o encabezado de la función previamente: | ||
+ | |||
+ | < | ||
+ | /* Archivo main.c */ | ||
+ | double fact(int n); /* prototipo o encabezado de la función fact */ | ||
+ | |||
+ | int main(int argc, char **argv) { | ||
+ | double res= fact(atoi(argv[1])); | ||
+ | printf(" | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | * una función solo es conocida a partir del momento en donde se declara la función o se declara su encabezado. | ||
+ | * no existen | ||
+ | * normalmente | ||
+ | * si se antepone el atributo static, la función es solo conocida en el archivo en donde está declarada. | ||
+ | |||
+ | ==== Archivos de encabezado ==== | ||
+ | |||
+ | Declarar los encabezados de la funciones en cada archivo en donde se usa es peligroso porque si uno se equivoca en el tipo de los parámetros o el valor de retorno, el compilador no avisa y el resultado es imprevisible. | ||
+ | es crear archivos que contengan solo los encabezados de un grupo de funciones. | ||
+ | tienen la extensión " | ||
+ | |||
+ | Para el ejemplo anterior, el archivo de encabezado sería: | ||
+ | |||
+ | < | ||
+ | /* archivo fact.h */ | ||
+ | double fact(int n); | ||
+ | </ | ||
+ | |||
+ | Y el archivo en donde se usa: | ||
+ | |||
+ | < | ||
+ | /* Archivo main.c */ | ||
+ | #include " | ||
+ | |||
+ | /* no declarar un encabezado para fact */ | ||
+ | |||
+ | int main(int argc, char **argv) { | ||
+ | double res= fact(atoi(argv[1])); | ||
+ | printf(" | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | Previo a la verdadera compilación de un archivo, el compilador invoca el preprocesador de C (llamado cpp) | ||
+ | que se encarga de expandir literalmente los #include reemplazándolos por el contenido del archivo con los | ||
+ | encabezados. | ||
+ | De esta forma, uno se debe preocupar solamente de la consistencia de los parámetros de la función declarada | ||
+ | con los parámetros que aparecen en el archivo de encabezados " | ||
introduccion.1363280445.txt.gz · Última modificación: 2013/03/14 17:00 por lmateu