Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Guerreras de la Ciencia
Excepto donde se indique lo contrario, el contenido de este libro está distribuido bajo una Licencia
Creative Commons Atribución 4.0 Internacional (CC BY 4.0). Se permite la reproducción total
o parcial de esta obra, su incorporación a un sistema informático, su transmisión en cualquier forma o
por cualquier medio (electrónico, mecánico, fotocopia, grabación u otros) sin necesidad de autorización
previa de los titulares de los derechos de autor.
Licencia completa: https://creativecommons.org/licenses/by/4.0/legalcode.es
El diseño gráfico de esta obra se encuentra restringido a una licencia CC BY-NC-ND 4.0
(Algunos derechos reservados). Puede distribuirse, copiarse, y almacenarse con cualquier fin, excepto
fines comerciales y no puede utilizarse para realizar obras derivadas. La licencia libre aplica al contenido
de los artículos, pero no al diseño y maquetación.
Licencia completa para el diseño gráfico: https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode
ISBN 978-987-86-3950-5
| 23
INFORMÁTICA
APLICADA
Parte III: 8. Programación
Eugenia Bahit
Acerca de C
C es un lenguaje de programación de propósitos generales que abarcan desde
Estructura de un programa C
Un programa C, contiene un orden específico de secciones, que son descritas a
continuación.
Sección 1: preprocesadores
fuente, antes de que este sea compilado. Uno de los preprocesadores más
| 309
comunes, es la directiva #include, que trae al código fuente, todos los
sean compilados.
#include <archivo.h>
y definición de macros».
int number = 5;
int main()
{
...
}
void main()
{
...
}
función.
Requerimientos sintácticos
Toda función se inicia con una llave de apertura y finaliza con una llave de
cierre.
void function()
{
}
if(condicion) {
instrucción 1
instrucción 2
}
| 311
if(condicion)
instrucción única
int variable = 5;
con un asterisco y una barra diagonal. Pueden escribirse en una sola línea o
/*
Comentario en bloque
*/
Para instalar GCC, correr uno de los siguientes comandos según corresponda:
Algunos ejemplos:
./salida
Archivo Descripción
| 313
arrojadas por un programa.
Tipos de datos
ENTEROS
X 0 255
char 1 byte
X -128 127
X -32,768 32,767
short 2 bytes
X 0 65,535
X -2,147,483,648 2,147,483,647
long 4 bytes
X 0 4,294,967,295
X -9,223,372,036,854,775,808 9,223,372,036,854,775,807
| 315
El tipo char y las cadenas de texto
Una variable de tipo char, admite como valor un carácter con entrecomillado
acentuada), excede la cantidad de bytes que pueden ser almacenados por una
int array[10];
int matriz[3][5];
int matriz[3][5] = {
{1, 2, 3, 4, 5},
{10, 20, 30, 40, 50},
{100, 200, 300, 400, 500}
};
variable[posicion];
| 317
Valores booleanos
Se puede utilizar el tipo bool con valores true y false, incluyendo el archivo de
#include <stdbool.h>
...
bool activo = true;
void main()
{
...
}
numero_entero.
definida.
tiene como alcance cualquier parte del fichero (esto incluye, dentro de
Ejemplo:
| 319
Una variable puede ser asignada al momento de ser definida o posteriormente:
int numero;
numero = 5; // asignada luego de haber sido definida
typedef
extern
Genera que una variable definida en un archivo externo pase al ámbito actual.
static
Genera que una variable temporal (definida dentro de una función), conserve
void funcion()
{
static int numero = 0;
funcion(); // numero = 0
funcion(); // numero = 1
funcion(); // numero = 2
funcion(); // numero = 3
auto
Es el valor por defecto de una variable. Genera que una variable tenga un
register
Constantes
Una constante se define con la siguiente sintaxis:
| 321
Enumeración
forma explícita:
función:
enum puntaje {CERO, UNO, DOS, TRES, CUATRO, CINCO, MIN=0, MAX=5};
Punteros
Los punteros son enlaces a un registro concreto de la memoria.
contiene esos datos, por lo tanto, los datos son leídos desde un único registro,
el cuál los datos originales son almacenados. Es decir, que cuando una
variable se pasa a una función como puntero, y la función modifica los datos
mismo).
int variable;
int *puntero = &variable;
puntero + n
puntero – n
| 323
Por ejemplo:
printf(puntero2); // Salida: ef
Estructuras
Una estructura es un conjunto de variables de diversos tipos pertenecientes a
un mismo grupo. Una estructura puede ser vista como una forma de crear
Definición de estructuras
struct nombre {
// variables separadas por punto y coma
};
struct {
// variables separadas por punto y coma
} variable1, variable2, variable2;
1) Como punteros
char *variable;
char variable[longitud];
variables como punteros, dado que será menos costoso modificar la variable de
En la instrucción:
El valor:
"nuevo valor"
| 325
Es almacenado en memoria y luego copiado de forma exacta en
<identificador-estructura> <nombre-variable>;
siguiente sintaxis:
variable.variable_interna
Ejemplo:
persona.identificador = 1005;
persona.apellido = "Bahit";
persona.nombre = "Eugenia";
persona.edad = 40;
es opcional):
struct Persona {
int identificador;
char *apellido;
char *nombre;
unsigned shor edad;
} persona;
persona.identificador = 1005;
persona.apellido = "Bahit";
persona.nombre = "Eugenia";
persona.edad = 40;
también es opcional):
| 327
Persona persona;
persona.identificador = 1005;
persona.apellido = "Bahit";
persona.nombre = "Eugenia";
persona.edad = 40;
apuntador->variable_interna = valor;
struct Persona {
int identificador;
char *apellido;
char *nombre;
unsigned short edad;
p->identificador = 1005;
// persona.identificador es 1005
persona.apellido = "Bahit";
persona.nombre = "Eugenia";
persona.edad = 40; // p->edad es 40
Uniones
En una estructura, cada variable interna se aloja en un registro de memoria
memoria. Esto permite utilizar una única variable interna de una misma
unión, a la vez (es decir, cada vez que se invoca a una variable interna de una
union Data {
int entero;
float real;
};
| 329
Operadores básicos
++ INCREMENTO EN 1 ~ COMPLEMENTO
-- DECREMENTO EN 1
Operadores de comparación
sizeof objeto;
o para nombres:
if/else
Las llaves son requeridas cuando engloban más de una instrucción. Sino, son
opcionales.
if(condición) instrucción;
else if(condición) instrucción;
else instrucción;
if(condición) {
instrucción 1;
instrucción 2;
} else if(condición) {
instrucción 1;
instrucción 2;
} else {
instrucción 1;
instrucción 2;
}
switch
switch(variable) {
case VALOR1:
instrucción;
break;
case VALOR2:
instrucción;
break;
case VALOR3:
instrucción;
break;
default:
instrucción;
}
| 331
Estructuras de control iterativas
Al igual que en el if/else, las llaves solo son necesarias si la estructura engloba
while
while(condición) {
instrucción;
}
for
for(expresión_inicial; condición; expresión_final) {
instrucción;
}
Lo anterior es equivalente a:
expresión_inicial;
while(condición) {
instrucción;
expresión_final;
}
do
A diferencia de while, aquí la instrucción se ejecuta al menos una vez al inicio,
do {
instrucción;
} while(condición);
break y continue
La instrucción break, permite finalizar el bucle antes de tiempo, cuando una
condición se cumple.
condición se cumple.
Declaración de retorno
goto
En palabras de los propios creadores del lenguaje C, Denis Ritchie y Brian
Kernighan:
Por recomendación de los autores del lenguaje, la expresión goto solo debería
sintaxis:
if(desastre) {
goto etiqueta;
}
etiqueta:
// instrucciones para limpiar el desastre
Dado que existen formas más simples, fáciles de entender, mantener y que no
| 333
return
La instrucción return finaliza la ejecución de una función, retornando un
valor determinado y permitiendo regresar al lugar mismo desde el cuál la
función fuera invocada.
return valor;
comunes:
estará ya sustituido.
#include <archivo-de-encabezado.h>
cualquier parte del código. Sin embargo, es esperable que los archivos de
preprocesadores.
conversión de tipo (entre los más comunes: i, d para enteros; o para octal;
| 335
Se espera una variable por cada modificador de formato especificado.
Ejemplo de uso:
«Manejo de salida».
Ejemplo de uso:
char nombre[32];
scanf("%32[^\n]s", nombre);
| 337
Modo Significado Descripción
r+ read / write Abre un archivo existente para ser leído y luego escrito.
int fclose(*<puntero>);
fallos, retorna 0.
Ejemplo de uso:
haber sido abierto en modo escritura, podrá escribirse en dicho fichero pero no
La función fread lee por lo menos n objetos de los primeros N bytes del
empleado, debe reservar la cantidad de memoria precisa para que fread realice
su trabajo.
mover el punto de acceso al final del archivo con fseek y obtener dicha
| 339
fwrite – escritura de archivos
longitud total del búfer de datos, puede utilizarse el operador unario sizeof.
de tres valores:
long ftell(*<puntero>);
char buffer[longitud];
fread(buffer, longitud, 1, archivo);
fclose(archivo);
Estos dos argumentos, deben ser definidos en la función main, con cualquier
| 341
void main(int argc, char *argv[])
Entendiendo el montón
los jugadores. A medida que cada jugador necesite cartas, las irá tomando del
mismo mazo. Por la tanto, no puede saberse con exactitud qué cartas le
tocarán a qué jugador, ni qué cartas estarán en qué lugar preciso del mazo.
Esto mismo sucede con el montón. De la misma forma que cuando un jugador
necesita tres cartas no las elige sino que toma las tres primeras del maso,
cuando se reservan 100 bytes del montón, se asignarán 100 bytes de forma
De esta forma, cada una de las reservas del montón es otra pila de memoria a
que se haría con un mazo de cartas más pequeño, como el que cada jugador
tendrá consigo.
Utilizar el montón
En C es preciso definir de antemano todas las variables que serán necesarias.
Si se sabe que una matriz tendrá 1000 enteros, se pide a C reservar el espacio
| 343
short int enteros[1000];
El tipo short int reserva 2 bytes por cada elemento. Es decir: 1000 x 2 = 2000
resulte ser insuficiente. En ese caso, sería necesario modificar dicho valor en el
Por otra parte, la memoria reservada para la matriz, no puede ser liberada a
lo largo de la ejecución del programa, por lo que si solo fuese necesario hacer
uso de dicha matriz al comienzo del programa, esa memoria no podría ser
Liberar memoria
Todo puntero cuya memoria haya sido reservada mediante malloc() requiere
free(puntero);
(typecast):
puntero, no un valor.
if(cadena == NULL) {
printf("No hay memoria disponible\n");
exit(1); // sale del programa
}
Referencias
[1] D. M. Ritchie, B. W. Kernighan. The C Programming Language, 2nd. ed.
[3] E. Huss. The C Library Reference Guide. Illinois: Eric Huss, 1997.
| 345