Post on 03-Jul-2020
Organización de ComputadorasOrganización de ComputadorasDepto. Cs. e Ing. Depto. Cs. e Ing. dede la Comp. la Comp.Universidad NacionalUniversidad Nacional deldel SurSur
El Lenguaje de El Lenguaje de Programación CProgramación C
(Pt. 1)(Pt. 1)
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 22
CopyrightCopyrightCopyright © 2011-2018 A. G. Stankevicius
Copyright © 2019 F. Joaquín
Se asegura la libertad para copiar, distribuir y modificar este documento de acuerdo a los términos de la GNU Free Documentation License, Versión 1.2 o cualquiera posterior publicada por la Free Software Foundation, sin secciones invariantes ni textos de cubierta delantera o trasera
Una copia de esta licencia está siempre disponible enla página http://www.gnu.org/copyleft/fdl.html
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 33
ContenidosContenidosIntroducción al paradigma imperativo
Sentencias de control
Entrada y salida estándar
Gestión de archivos
Pasaje de parámetros
Tipos de datos estructurados
Gestión de la memoria dinámica
Estructuras de datos dinámicas
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 44
Paradigmas de programaciónParadigmas de programaciónEl paradigma al cual pertenece un lenguaje nos da indicios acerca de distintas cuestiones:
De qué manera resulta más conveniente encararel proceso de resolución de un problema
Qué abstracciones tenemos a disposición para implementar los distintos componentes dela solución propuesta
Finalmente, la elección del paradigma también determina la manera en que se lleva adelante la computación
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 55
Paradigmas de programaciónParadigmas de programaciónA partir de las características fundamentales,los lenguajes de programación se pueden clasificar en distintos paradigmas:
Paradigma imperativo
Paradigma funcional
Paradigma lógico
Paradigma orientado a objetos
El lenguaje de programación C perteneceal primero
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 66
Paradigma imperativoParadigma imperativoAnalicemos en particular el caso del paradigma imperativo:
Para resolver un problema debemos postular un algoritmo, esto es, una secuencia de instrucciones simples, que conduzca a la solución del mismo
Podemos hacer uso de variables, asignaciones y contamos con tres poderosos constructores:la secuencia, el condicional y la repetición
Este paradigma sanciona que la computación se lleva adelante a través de la ejecución de instrucciones relativamente simples
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 77
Paradigma imperativoParadigma imperativoEste paradigma recibe su nombre por el tipode instrucciones simples que emplea: verbos conjugados en modo imperativo
Por ejemplo:
printf(): imprima con el siguiente formato los datos consignados a continuación
exit(): finalice la ejecución inmediatamente e informe el siguiente nivel de error
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 88
Compiladores vs. intérpretesCompiladores vs. intérpretesLenguajes interpretados:
Las instrucciones se transforman en lenguaje máquina a medida que se ejecuta el programa
Los pequeños cambios pueden probarse rápidamente
Lenguajes compilados:
Los programas son traducidos en su totalidad a lenguaje máquina antes de ser ejecutados
Para probar un pequeño cambio se debe compilar todo nuevamente
Hay combinación de ambos métodos
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 99
Origen del lenguajeOrigen del lenguajeEl lenguaje C fue diseñado porDennis Ritchie en el año 1972
Deriva de un lenguaje anteriorllamado B
Se usó para implementar granparte del sistema operativo UNIX
Hoy en día se lo sigue utilizandopara implementar todo tipo de sistemas:
Por caso, el sistema operativo GNU/Linux
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1010
Filosofía de diseñoFilosofía de diseñoC es un lenguaje de programación minimalista
Intenta satisfacer múltiples objetivos:
Poder ser compilado usando un compilador sencilloy simple
Brindar acceso de bajo nivel al hardware de la computadora
Poder traducir cada instrucción de C en pocas instrucciones de lenguaje máquina
No requerir mucha ayuda adicional en tiempode ejecución
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1111
C hoy – Mitos de CC hoy – Mitos de C“C no se usa” ¿Por qué programar en C?
Sistemas Operativos (casi todos, GNU/Linux, OS X, Windows, Android, QNX, Solaris)
Java Virtual Machine (si, está escrita en C)
Sistemas Embebidos (Arduino, Galileo, Raspberry)
Controladores de dispositivos (drivers)
Motores de bases de datos (MySQL, PostgreSQL, etc.)
Cualquier sistema de alto desempeño
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1212
C hoy – Mitos de CC hoy – Mitos de C“No hay trabajo en C”- Según Spectrum IEEE:
https://spectrum.ieee.org/at-work/innovation/the-2018-top-programming-languages
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1313
Características de CCaracterísticas de CCuenta con excelentes compiladores optimizantes, por caso el gcc
El código escrito en este lenguaje es altamente portable
Ninguna característica del sistema operativose ve reflejada en el lenguaje
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1414
Características de CCaracterísticas de CElementos de un programa:
Palabras reservadas (muy pocas)
Variables y funciones definidas por el programador
Funciones de librería estándar
Los bloques de código se delimitan entre llaves
Al igual que UNIX, el lenguaje C es sensible amayúsculas y minúsculas (case sensitive)
Por ejemplo, fact() y Fact() denotan a dos funciones diferentes
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1515
Características de CCaracterísticas de CEl lenguaje C es un lenguaje compilado
Ejemplos: Pascal o Modula2
Otros lenguajes de programación son en cambio interpretados
Ejemplos: Prolog o Haskell
Por último, también existen lenguajes compilados e interpretados a la vez:
Ejemplo: Java
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1616
Características de CCaracterísticas de CTodas las sentencias terminan en punto y coma
Los espacios en blanco y los tabuladores son ignorados
Podemos (¡debemos!) indentar adecuadamenteel código
C cuenta con un preprocesador, que realiza alteraciones en el código (indicadas por el programador) antes de la compilación
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1717
Código fuente CCódigo fuente CEl código fuente en C tiene tres tiposde contenido:
Comentarios
Código de programa (escrito en C)
Directivas al preprocesador
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1818
Nuestro primer programaNuestro primer programa/* Clásico hola mundo escrito en C para comprensión de los alumnos de OC */
#include <stdio.h>
int main() {
// Una llamada a función
printf(“¡Hola mundo!\n”);
return 0;
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 1919
ComentariosComentarios/* Clásico hola mundo escrito en C para comprensión de los alumnos de OC */
#include <stdio.h>
int main() {
// Una llamada a función
printf(“¡Hola mundo!\n”);
return 0;
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2020
Código de programaCódigo de programa/* Clásico hola mundo escrito en C para comprensión de los alumnos de OC */
#include <stdio.h>
int main() {
// Una llamada a función
printf(“¡Hola mundo!\n”);
return 0;
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2121
Directivas al preprocesadorDirectivas al preprocesador/* Clásico hola mundo escrito en C para comprensión de los alumnos de OC */
#include <stdio.h>
int main() {
// Una llamada a función
printf(“¡Hola mundo!\n”);
return 0;
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2222
SentenciasSentenciasCada sentencia finaliza con ;
Las sentencias pueden encerrarse entre { }
Una sentencia es una expresión
/* La sentencia a continuación compila,
pero su resultado no tiene efectos */
2 + 2;
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2323
AsignaciónAsignaciónLa asignación es una expresión y puede ser parte de una expresión mas compleja
Su operador es el “=”El primer elemento a izquierda debe ser el nombrede una variable
Tiene asociatividad a derecha
El resultado de la evaluación de una asignación, además del cambio en la variable, es el valor asignado a la variable
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2424
AsignaciónAsignaciónLa asignación como operador da una gran flexibilidad, si bien es a su vez es fuente de problemas (para nosotros los programadores):
a = b = 2; // a y b terminan con el valor 2
a = (b = 2) + 2; /* b obtiene el valor 2 y
a el valor 4 */
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2525
Declaración de variablesDeclaración de variablesLas variables se declaran indicando su tipo seguido de su nombre:
char letra;
int contador;
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2626
Declaración de variablesDeclaración de variablesDeclaración múltiple es posible separando las distintas variables con “,”:
char letra, inicial;
int i, j, k;
Declaración e inicialización se pueden combinar usando el operador de asignación:
char letra = ’A’;
int i = 1, j = 10;
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2727
Tipos elementalesTipos elementalesLos tipos elementales son:
Enteros (int)
Reales en precisión simple (float)
Reales en precisión doble (double)
Caracteres y enteros de 1 byte (char)
Punteros (*)
Nótese que no existen los booleanos ni las cadenas de caracteres como tipos elementales
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2828
ModificadoresModificadoresLos tipos elementales admiten distintos modificadores:
unsigned: para representar sólo valores positivos
Ej: unsigned int contador;
signed: para representar valores positivos y negativos (este es el modificador activo por defecto)
Ej: signed char letra;
long: para representar enteros largos (sólo puede aplicarse al tipo int)
Ej: long int balance;
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 2929
Alcance de una declaraciónAlcance de una declaraciónEn el lenguaje C no es posible anidar funciones
En consecuencia, sólo hay dos alcances posibles para una declaración:
Alcance global: La declaración es visible desde todas las funciones del programa
Alcance local: La declaración sólo es visible dentro de la función en la que aparece y tiene precedencia por sobre las declaraciones globales
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 3030
Alcance de una declaraciónAlcance de una declaraciónint x, y;
int main() {
float x, z;
/* Aquí y sigue siendo entero, pero x y z
ahora son reales */
}
/* x e y vuelven a ser enteros, y además z
no existe por fuera de la función main() */
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 3131
Expresiones constantesExpresiones constantesFormulación de expresiones constantes:
Una constante real (float) se puede expresar tanto en notación decimal (2.56) como en notación científica (2.45E-4)
Una constante de tipo doble precisión (long) se denota agregando una L al final (200L)
Una constante de tipo carácter (char) se define directamente usando comillas simples (‘a’)
Una constante de tipo cadena de caracteres se define usando comillas dobles (“hola!”)
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 3232
Expresiones constantesExpresiones constantesUna constante entera puede expresarse en las bases:
Decimal, por ejemplo: 15
Hexadecimal, anteponiento 0x a la declaración:0xF o 0xf (esta declaración es case insensitive)
Octal, anteponiendo 0 a la declaración: 017
Binario, anteponiendo 0b a la declaración: 0b1111
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 3333
Expresiones constantesExpresiones constantesLas constantes de tipo carácter especial se definen usando secuencias de escape:
‘\n’: línea nueva
‘\r’: retorno de carro
‘\t’: tabulador
‘\\’: barra invertida
‘\0’: carácter nulo
‘\nnn’: carácter ASCII nnn (en octal)
‘\xnn’: carácter ASCII nn (en hexadecimal)
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 3434
Conversión explícita de tiposConversión explícita de tiposLa conversión explícita de tipos (type casting) de expresiones y variables se denota de la siguiente forma:
int a; float b; char c;
b = 65.0; /* probar qué pasa si acá
ponemos directamente 65 */
a = (int) b; // a ahora vale 65
c = (char) a; /* c ahora vale ‘A’
(esto es, el ASCII 65) */
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 3535
Operadores aritméticosOperadores aritméticosLos operadores aritméticos básicos disponibles son los usuales:
Suma (+)
Resta (–)
Multiplicación (*)
División (/)
Módulo o resto (%)
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 3636
División entera vs. realDivisión entera vs. realEl tipo del resultado de la operación de división depende enteramente del tipo de los operandos involucrados en la expresión
Por ejemplo:
4 / 3 da 1 (entero)
4.0 / 3 da 1.333 (real)
4 / 3.0 da 1.333 (real)
4.0 / 3.0 da 1.333 (real)
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 3737
Pre y post incrementoPre y post incrementoLos operadores unarios (++) y (--) representan las operaciones de incremento y decremento respectivamente
x++; y ++x; equivalen a la asignación x = x + 1;
y--; y --y; equivalen a la asignación y = y – 1;
Por caso, las notaciones sufijas y prefijas:
a=3; b=a++; // a vale 4, b vale 3
a=3; b=++a; // a vale 4, b vale 4
No cualquier cosa es válida: --b=a++;
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 3838
Variantes de asignaciónVariantes de asignaciónExisten diversas variantes del operador de asignación:
x += y; es equivalente a x = x + y;
x –= y; es equivalente a x = x – y;
x *= y; es equivalente a x = x * y;
x /= y; es equivalente a x = x / y;
El lado izquierdo de una asignación debe necesariamente ser del tipo adecuado
Caso contrario, usar una conversión explícita de tipo
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 3939
Operaciones a nivel de bitOperaciones a nivel de bitEl lenguaje C brinda un conjunto de operadores numéricos a nivel de bit:
Negación: ~x;
Conjunción: x & y;
Disyunción: x | y;
Disyunción exclusiva: x ^ y;
Desplazamiento a izquierda: x << n;
Desplazamiento a derecha: x >> n;
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 4040
Operaciones a nivel de bitOperaciones a nivel de bitint x = 26;
int y = 61;
x & y;
x | y;
~x;
x >> 2;
00011010 = 26
00111101 = 61
00011000 = 24
00111111 = 63
11100101 = -27
00000110 = 6
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 4141
Operaciones a nivel de bitOperaciones a nivel de bitExisten diversas variantes del operador de asignación a nivel de bits:
x &= y; es equivalente a x = x & y;
x |= y; es equivalente a x = x | y;
x <<= y; es equivalente a x = x << y;
x >>= y; es equivalente a x = x >> y;
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 4242
Operadores relacionalesOperadores relacionalesLos operadores relacionales disponibles son:
Igual (==)
Distinto (!=)
Mayor (>) y mayor o igual (>=)
Menor (<) y menor o igual (<=)
El resultado de una comparación es un entero, el cual se interpreta de la siguiente manera:
El cero denotará el valor falso
Cualquier otro valor denotará el valor verdadero
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 4343
Operadores lógicosOperadores lógicosSobre los datos de tipo booleano (es decir, los enteros), se definen los siguientes operadores:
La conjunción lógica (&&)
La disyunción lógica (||)
La negación lógica (!)
Por caso:
/* ¿a cuánto evalúa la siguiente expresión?*/
rsta = (3 > 2 || 5 == 4) && !1;
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 4444
Expresiones en corto-circuitoExpresiones en corto-circuitoEl lenguaje C implementa un modelo de evaluación perezosa para las expresiones booleanas
Por caso:
a = (3 > 2 || w == 4);
/* la subexpresión w == 4
nunca llega a evaluarse */
// ¿por qué razón?
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 4545
Sentencia condicionalSentencia condicionalLa sentencia condicional tiene la siguiente sintaxis:
if (condición) {
// código a ejecutarse si
// la condición se satisface
} else {
// código a ejecutarse en
// caso contrario.
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 4646
Sentencia condicionalSentencia condicional#include <stdio.h>
main() {
int a = 2;
if (a % 2) {
printf(“dos es impar\n”);
} else {
printf(“dos es par\n”);
}
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 4747
Sentencia condicionalSentencia condicional#include <stdio.h>
main() {
int a = 2;
if (a % 2)
printf(“dos es impar\n”);
else
printf(“dos es par\n”);
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 4848
Expresiones condicionalesExpresiones condicionalesLas construcciones del siguiente tipo
if (condición)
rsta = exp-1;
else
rsta = exp-2;
se pueden abreviar en el lenguaje C empleando expresiones condicionales.
Sintaxis:
rsta = condición ? exp-1 : exp-2;
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 4949
Expresiones condicionalesExpresiones condicionales#include <stdio.h>
main() {
int a = 2;
printf(“dos es %s\n”,
a % 2 ? “impar” : “par”);
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 5050
Sentencias de repeticiónSentencias de repeticiónLa sentencia de repetición for es muy flexible:
for (cont = 0; cont < tope; cont++) {
/* bloque de sentencias que se
repiten mientras se cumpla la
condición de permanencia */
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 5151
Sentencias de repeticiónSentencias de repetición#include <stdio.h>
main() {
int cont;
for (cont = 0; cont < 10; cont++) {
printf("%i al cuadrado es %i\n",
cont, cont * cont);
} // ¿llegará hasta 10 * 10?
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 5252
Sentencias de repeticiónSentencias de repeticiónTambién es posible repetir un fragmentode código mientras se cumpla una cierta condición:
while (condición) {
/* bloque de sentencias que se repiten
cero o más veces mientras se cumpla la
condición de permanencia */
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 5353
Sentencias de repeticiónSentencias de repetición#include <stdio.h>
main() {
int cont = 0;
while (cont < 10) {
printf("%i al cuadrado es %i\n",
cont, cont * cont);
cont++;
} // ahora ¿llegará hasta 10 * 10?
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 5454
Sentencias de repeticiónSentencias de repeticiónPor último, existe una segunda variante parala sentencia de repetición basada en la satisfacción de una condición:
do {
/* bloque de sentencias que se repinte
al menos una vez mientras se cumpla la
condición de permanencia */
} while (condición);
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 5555
Sentencias de repeticiónSentencias de repetición#include <stdio.h>
main() {
int cont = 0;
do {
printf("%i al cuadrado es %i\n",
cont, cont * cont);
cont++;
} while (cont < 10); // ¿y ahora?
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 5656
Sentencias break y continueSentencias break y continueAl estar dentro del ámbito de una sentenciade repetición, se puede hacer uso de dos sentencias de control especiales:
break: esta sentencia permite romper una repetición, retomando la ejecución en la instrucción inmediata siguiente
continue: esta sentencia permite indicar que la iteración actual ya fue completada y que se desea considerar la siguiente iteración
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 5757
Sentencias break y continueSentencias break y continue#include <stdio.h>
main() {
int cont = 0;
do {
printf("%i visitado\n", cont);
cont++;
if (cont > 10)
break;
} while (1); // ¿cuándo corta?
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 5858
Sentencias break y continueSentencias break y continue#include <stdio.h>
main() {
int cont = 0;
do {
cont++;
if ((cont % 2) == 0)
continue;
printf("%i visitado\n", cont);
} while (cont < 10); // ¿qué imprime?
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 5959
Alternativas múltiplesAlternativas múltiples switch (alternativa) {
case caso-1: { // bloque-1 }
case caso-2: { // bloque-2 }
...
case caso-n: { // bloque-n }
default: { // bloque por defecto }
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 6060
Alternativas múltiplesAlternativas múltiples#include <stdio.h>
main() {
char letra = '\x42';
switch (letra) {
case 'A': { printf("A\n"); }
case 'B': { printf("A o B\n");
break; }
case 'C': { printf("C\n"); }
}
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 6161
Alternativas múltiplesAlternativas múltiplesSólo acepta tipos simples
switch (alternativa) {
case “caso 1”: // No compila!
...
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 6262
Continuamos la próxima claseContinuamos la próxima clase
¿¿Preguntas?Preguntas?
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 6363
Llamada a funcionesLlamada a funcionesUna función es llamada dentro de una expresión, con sus parámetros definidos de forma posicional, separados por “,”:
c = suma(a, b);
Como las sentencias son expresiones sin limitaciones, las funciones pueden ser llamadas descartando el resultado. En esencia esto equivale a contar con un procedimiento
suma(a, b);
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 6464
Pasaje de parámetrosPasaje de parámetrosPasaje por valor o por copia:
Al pasar un parámetro por valor estamos pasando una copia del contenido, por lo que las modificaciones que haga la rutina en esa copia no se verán reflejadas en el original
Pasaje por referencia:
Al pasar un parámetro por referencia estamos mostrando como acceder a ese argumento pues estamos pasando la dirección en memoria del mismo. Naturalmente, las modificaciones que haga la rutina se ven inmediatamente reflejadas en el original
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 6565
Pasaje de parámetrosPasaje de parámetrosSi bien C no cuenta con pasaje de parámetros por referencia, cuenta con un operador que permite simular ese pasaje de parámetros
El operador & determina la dirección en memoriade la expresión a su derecha
Por caso:
int a = 5;
printf("a vale %i\n", a); // ¿por qué %i se
printf("&a vale %p\n", &a); // cambia por %p?
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 6666
Definición de funcionesDefinición de funcionesLa definición de una función guarda la siguiente estructura:
tipo nombre (parámetros) {
// cuerpo de la función
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 6767
Definición de funcionesDefinición de funcionesUna función se invoca al suministrar valores actuales a sus parámetros formales
Recordemos, los parámetros formales son los que figuran en la definición de una función y los actuales son los usados en una invocación en concreto
Los parámetros siempre se pasan por valor
El resultado de la invocación a una función se especifica por medio de la sentencia return
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 6868
Definición de funcionesDefinición de funcionesLos procedimientos, si bien no contemplados en el lenguaje, se pueden definir indicando que una cierta función no retorna resultado
Para esto se debe hacer uso del tipo especial void
El control del número y tipo de los parámetros es mínimo
Se puede definir una cosa y luego hacer otra a la hora de la invocación
Las funciones admiten llamadas recursivas
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 6969
Definición de funcionesDefinición de funcionesint fact(int n) {
int rsta = 1;
while (n > 1)
rsta *= n--;
return(rsta);
}
int main() {
printf(“%d! = %d\n”, 5, fact(5));
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 7070
Definición de funcionesDefinición de funcionesvoid f(int* a, int b) { *a = b;}int main() { int x = 5; int y = 1; printf("x = %d\n", x); f(&x, y); printf("x = %d", x); return 0;}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 7171
Definición vs. declaraciónDefinición vs. declaraciónC sólo permite invocar a funciones previamente definidas
¿cómo hacer para definir programas que hagan uso de una recursión cruzada?
Es posible separar espacialmente la declaración de una función de su definición:
La definición explicita el código asociado a la función
La declaración sólo explicita la cabecera o prototipo de la misma
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 7272
Definición vs. declaraciónDefinición vs. declaraciónint impar(int n); // prototipo de impar()
int par(int n) { // definición de par()
return !n ? 1 : impar(--n);
}
int impar(int n) { // definición de impar()
return !n ? 0 : par(--n);
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 7373
Entrada y salida estándarEntrada y salida estándarLas funciones de entrada/salida estándar en C no pertenecen al lenguaje en sí, sino que son provistas por diversas funciones de librería
Recordemos que uno de los objetivo diseño es lograr una alta portabilidad, por lo que el lenguaje debe ser absolutamente independiente del sistema operativo
Por caso,
Funciones de entrada: getchar(), scanf(), etc.
Funciones de salida: putchar(), printf(), etc.
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 7474
La función printf()La función printf()La invocación a la función printf() guardala siguiente sintaxis:
printf(
formato-a-utilizar,
exp-1, exp-2, ..., exp-n);
donde:
El formato a utilizar es una cadena que describe cómo mostrar la información
Las expresiones son los datos que se desean mostrar
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 7575
La función printf()La función printf()int x = 3; float y = 23.0; char z = ‘A’;
printf(“Hola mundo!!\n”);
printf(“x vale %d\n”, x);
printf(
“y vale %f,\n...y z vale %c.\n”,
y, z);
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 7676
Expresiones de formatoExpresiones de formatoEn la E/S estándar, se puede hacer uso de las siguientes expresiones de formato (entre otras):
%c: carácter
%i: entero
%d: entero decimal
%x: entero hexadecimal
%f: real
%p: puntero
%s: cadena de caracteres
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 7777
Expresiones de formatoExpresiones de formatoExisten muchas otras expresiones que controlan otros aspectos del formato:
La precisión (número de decimales)
La justificación (a izquierda o a derecha)
Poder escribir ciertos caracteres especiales (por ejemplo, el carácter %)
Consultar la referencia de esta función enla bibliografía recomendada:
“The C Programming Language”, escrito porB. Kernighan y D. Ritchie
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 7878
La función scanf()La función scanf()La invocación a la función scanf() guarda la siguiente sintaxis:
scanf(
formato-a-utilizar,
dest-1, dest-2, ..., dest-n);
donde:
El formato a utilizar es una cadena que describe cómo recibir la información
Los destinos son las variables donde se almacenan los datos ingresados
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 7979
La función scanf()La función scanf()int x; float y; char z;
printf(“Ingrese un número entero: ”);
scanf(“%d”, &x); // ¡x se modifica!
printf(“\nOtro entero y un real: ”);
scanf(“%u %f”, &x, &y);
printf(“\nAhora un caracter: ”);
scanf(“%c”, &z);
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 8080
Gestión de archivosGestión de archivosC comparte la filosofía UNIX en el sentidode considerar prácticamente todo comosi fuera un archivo:
La lectura de información desde un archivo convencional no difiere del ingreso de datosa través del teclado
La escritura de información hacia un archivo convencional no difiere de la salida de datospor pantalla
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 8181
Funciones de libreríaFunciones de libreríaC cuenta con diversas funciones de librería sobre archivos:
FILE* fopen(char*, char*): apertura de un archivo para lectura o escritura
int fclose(FILE*): cierre de un archivo
int fprintf(FILE*, ...): escritura con formato
int fscanf(FILE*, ...): lectura con formato
int feof(FILE*): determina si se ha alcanzadoel final de un archivo
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 8282
Archivos especialesArchivos especialesTodo programa asocia tres constantes de tipo FILE* por defecto a los siguientes archivos:
stdin: entrada estándar (descriptor 0)
stdout: salida estándar (descriptor 1)
stderr: error estándar (descriptor 2)
Por caso:
fprintf(1, “Usuario: ”);
fscanf(0, “%s”, usuario);
fprintf(stderr, “Error: No válido”);
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 8383
Conversión de tiposConversión de tiposC cuenta con diversas funciones de libreríapara asistir al programador en la conversión entre tipos de datos:
int atoi(char*): traduce de strings a enteros
long atol(char*): traduce de strings a enteros largos
double atof(char*): traduce de strings a reales
char* itoa(char*, int): traduce de enterosa strings
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 8484
Finalización de un programaFinalización de un programaUn programa finaliza:
Al llegar al final de la función main()
Cuando la función main() invoca un return
Al ejecutar la función exit()(la cual reside en la librería estándar stdlib)
#include <stdlib.h>
int main() {
exit(0);
return 1; // Esto no se ejecutará
}
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 8585
Inconvenientes de CInconvenientes de CError en las condiciones
if (a = 1)
printf(“a es verdadero\n”);
else
printf(“a es falso\n”);
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 8686
Inconvenientes de CInconvenientes de CEs posible escribir código un tanto críptico:
int **********x; // Puntero a puntero a...
// Copia un arreglo terminado en null a otro
while (*n++=*i++) ;
// Invierte dígitos hexadecimales
i=((n&0x0F)<<4 | (n&0xF0)>>4);
Competencia de quién puede escribir el código más ilegible en C:
http://www.ioccc.org
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 8787
Buenas prácticasBuenas prácticasDefinir las constantes como macros
Macros en mayúsculas separados por guiones
#define PI 3.1416
Variables y funciones en minúsculas separadas por guiones
void funcion_de_nombre_largo();
int variable_entera;
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 8888
Buenas prácticasBuenas prácticasLargo de las líneas de código: un máximode entre 79 y 100 caracteres
¡¡Que compile sin warnings!!
No realizar asignaciones dentro de expresiones:
a = (b = 2) + 2;
Elegir una convención y respetarla a lo largode todo el código
Organización de Computadoras - Mg. A. G. StankeviciusOrganización de Computadoras - Mg. A. G. Stankevicius 8989
¿¿Preguntas?Preguntas?