Introducción a C
Taller de creación de juegos retro
Make Classic Games
Contenido
- ¿Qué es C?
- Hola Mundo
- Variables y Operadores
- Condicionales
- Bucles
- Introducciones de PreProcesador
- Funciones
- Arrays
- Punteros
- Structs y enums
- Make y gcc
¿Que es C?
C es un lenguaje de programación de proposito general que fue desarrollado entre los años 1969 y 1972.
Es un lenguaje estructurado, compilado, debilmente tipado y que puede usarse tanto como alto nivel como bajo nivel (Se considera nivel medio).
C NO es un lenguaje orientado a Objetos.
Instalación Compilador C
Windows:
Instalar el IDE Visual Studio
Instalar MinGW32/64
Instalación Compilador C
Linux:
Instalar las Herramientas de Desarrollo "build-essentials" (o equivalente en la distribución):
sudo apt install build-essentials
Este paquete incluye entre otros el compilador gcc
Instalación Compilador C
MacOs:
En Macos Existen diferentes opciones para utiliar un compilador de C como puede ser la utilización de Clang o incluso gcc.
user@~% clang --version
Instalación Compilador C
Docker
Otra opción es utilizar un contenedor docker para realizar la compilación:
FROM gcc:4.9
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN gcc -o myapp main.c
CMD ["./myapp"]
docker build -t compiler .
gcc main.c -o a.out
docker run compiler
hello world
Hola Mundo
#include <stdio.h>
int main(){
printf("Hello World");
return 0;
}
Variables y Operadores
Una variable en C, es un elemento donde se puede almacenar un valor.
La sintaxis para crear una es:
<tipo> <nombre>;
int num;
char letra;
Variables y Operadores
Tipos Básicos de C
Tipo | Descripción | rango |
---|---|---|
int | Entero simple | -32 768 a 32 767 |
float | Decimal simple | 3.4E-38 a 3.4E+38 |
double | Decimal doble | 1.7E-308 a 1.7E+308 |
long | Entero largo | -2 147 483 648 a 2147 483 647 |
char | caracter | 0 a 255 |
bool | booleano | true o false |
Variables y Operadores
Operadores Matemáticos
Operadores Lógicos
Tipo | Descripción |
---|---|
+ | Suma |
- | Resta |
* | Producto |
/ | División |
% | Resto |
>> | Desplazamiento bits derecha |
<< | Desplazamiento bits izquierda |
Tipo | Descripción |
---|---|
== | Igual que |
>= | Mayor o igual que |
<= | Menor o igual Que |
!= | Distinto De |
! | NO |
Variables y Operadores
Operadores Asignación
Operadores Lógicos II
Tipo | Descripción |
---|---|
= | Asignación |
+= | Asignación con suma |
-= | Asignación con resta |
++ | Suma 1 valor |
-- | Resta 1 valor |
Tipo | Descripción |
---|---|
> | Menor que |
< | Mayor que |
&& | and |
|| | Or |
& | And Lógico |
| | Or Lógico |
Variables y Operadores
Comentarios
Tipo | Descripción |
---|---|
// | Comentario de línea. |
/* */ | Comentario de Bloque |
Estructuras de control
- Condicionales
- Bucles
Estructuras de control
Condicionales
if(edad<18){
printf("Es menor de edad");
}
Estructuras de control
Condicionales
if(edad<18){
printf("Es menor de edad");
}else{
printf("Es mayor de edad");
}
Estructuras de control
Condicionales
switch(a){
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
printf("Es una vocal");
break;
default:
printf("Consonante");
}
Estructuras de control
Repetitivas
while (a==1){
a++;
}
Estructuras de control
Repetitivas
do{
a++;
}while(a==1);
Estructuras de control
Repetitivas
for(int i=0;i<10;i++){
a=i+1;
}
Instrucciones de Preprocesado
- #include
- #define
- #ifndef
- #endif
- #if
- ...
En C, existe una serie de instrucciones especiales llamadas de preprocesado que nos van a ayudar a mantener nuestro código más ordenado.
Instrucciones de Preprocesado
#include
Permite añadir un fichero externo para tener acceso a sus contenido desde nuestro código
#include <stdio.h>
Nota: si el fichero va entre <> se considera de sistema y si va entre "" es local.
#define
Permite crear una constante.
#define CONSTANTE 1
Si la constante a definir es una función, esta se llama MACRO.
Instrucciones de Preprocesado
#define
Definir una macro
#define DOUBLE(n) (2*n)
DOUBLE(2); //4
Instrucciones de Preprocesado
#ifndef
Permite que se pueda acceder a bloques de código en función de si esta definida una variable o no.
#ifndef _H_MIFICHERO_
#define _H_MIFICHERO_
//codigo a incluir una sola vez.
//de esta forma aunque se incluya el fichero varias veces,
//solo se referenciará una.
#endif
Funciones
En C, podemos dividir nuestros programas en pequeños subprogramas para organizarlo y poder reutilizarlo. Esto se realiza a través de las funciones.
Una función, se compone de su cabecera y de su implementación.
La cabecera de la función se compone de la siguiente información:
<tipodevuelto> <nombre>(<lista de parametros>);
int calcularDoble(int);
Funciones
El cuerpo de la función, es donde estará definido su contenido. Normalmente esta en un fichero a parte.
Normalmente, los ficheros que contienen las cabaceras de las funciones son los que tienen extensión .h.
Mientras que los ficheros que contienen las implementaciones, tienen extensión .c.
int calcularDoble(int n){
return 2*n;
}
Funciones
misfunciones.c
int calcularDoble(int n);
//otras funciones y variables necesarias
misfunciones.h
#include "misfunciones.h"
int calcularDoble(int n){
return 2*n;
}
Arrays
Hasta ahora, hemos estado trabajando en usar variables simples; pero ¿Qué ocurre cuando queremos usar muchas variables del mismo tipo?
Arrays
int datos[4]; //array de 1 dimension
int datos2[4][4] //array de 2 dimensiones
Los Arrays, permitem almacenar de forma contigua información homogénea.
Se definen:
<tipo> <nombre>[<longitud>];
Arrays
Para utilizar un Array, se utiliza uno o más índices; suele ser muy útil, el uso de bucles for para recorrer o escribir las distintas posiciones de un Array.
int datos[4]; //array de 1 dimension
//inicializar un array
for(int i=0;i<4;i++){
datos[i]=i;
}
//leer un array
for(int j=0;j<4;j++){
printf("posicion %d: %d", j, datos[j]);
}
Arrays
En C, no existe el tipo de dato "String" como en otros lenguajes. en C, las cadenas de caracteres, son arrays de tipo char.
char micadena[10]="Hola Mundo";
Las cadenas son arrays de char que siempre acaban con el carácter '\0'.
Punteros
Un puntero, es una variable que almacena una posición de memoria.
Punteros
Para manejar punteros, existen dos operadores especiales.
Operador *
Operador &
Define un puntero y su contenido.
int* mipuntero;
Establece la dirección de memoria de una variable o puntero.
int variable=1;
int* mipuntero= &variable;
int valor2 = *mipuntero;
Punteros
El nombre de un array, es un puntero; y por lo tanto cada puntero, puede ser usado como un array.
int miarray[5];
int* mipuntero = miarray;
for(int i=0;i<5;i++){
printf("%d",mipuntero[i]);
}
Punteros
Hasta ahora, las funciones las hemos utilizado pasando parametros básicos o como se conoce "por valor". Esto quiere decir, que en cada llamada se hace una copia de los parámetros.
int calculaDoble(int n);//Paso por valor
void calculaDoble(int* n);//Paso por referencia o por puntero.
En el paso por referencia, si se modifica el parámetro se modifica el original.
Punteros
También podemos utilizar punteros a "funciones", es decir, utilizar una función como parámetro que se pueda ejecutar cuando llegue el momento.
int foo (int,int, int); //prototipo
int (*foo)(int,int,int);//puntero a función
Un puntero a función puede ser llamado en cualquier momento.
pointer(1,2,3);
Structs
En ocasiones, se necesitan tipos de datos complejos que nos permitirán definir objetos del mundo.
Para definir un struct, se utiliza la palabra reservada "struct"; seguida de la siguiente definición:
struct <nombre>{
<definicion de elementos>
}<variables>;
struct ejemplo{
int edad;
char nombre[50];
}a1;
Structs
Inicializar Structs
Acceder a Elementos
ejemplo e1={34, "victor"}
printf("%d",e1.edad);//Como variable
ejemplo* e2=&e1;//creación de un puntero.
printf("%d",e2->edad);//Como puntero
NOTA: las definiciones de structs, normalmente se definen en los ficheros .h.
Structs
typedef
Typedef, es una palabra reservada que se utiliza para crear sinonimos de tipos o structs.
typedef struct{
int edad;
char* nombre[50];
}Persona;
...
Persona mipersona;
Enums
Un enum, o tipo enumerado, permite guardar un tipo que tiene una serie de valores fijos.
typedef enum COLOR{
ROJO, VERDE, AZUL
}Color;
...
Color color= ROJO;
Makefiles
En proyectos ya complejos, es necesaria una herramienta que nos ayude con la configuración y compilación de todos los ficheros de nuestro proyecto.
Por ello, se utiliza la herramienta "make"; que gracias a los conocidos Makefiles, nos va a permitir configurar y construir nuestro proyecto.
main: hello.c
gcc -o hello hello.c
Makefiles
Para crear un Makefile se utiliza el siguiente esquema:
<objetivo>: <dependencias>
<acciones>
Donde:
- objetivo: Orden a realizar
- dependencias:Ordenes a ejecutar antes para cumplir el objetivo separadas por espacios.
- acciones: acciones a realizar.
Gcc
Gcc (gnu C compiler), es un compilador o grupo de compiladores que nos permitirá generar un ejecutables o los diferentes ficheros necesarios para crear nuestra aplicación.
gcc [opciones] fichero.c
Las opciones pueden ser:
- -I: añadir un directorio de include (.h).
- -o: indica el fichero de salida.
- -Ox: Optimización de código.
- --target: objetivo de la arquitectura a utilizar (m68k, amd64).
- -lxx: opciones de enlazado.
- -L: Indica el directorio para las bibliotecas (lib).
Ejercicio
Crear una aplicación de consola usando el lenguaje C que permita a un usuario realizar operaciones matemáticas a través de un menú de texto; las operaciones son:
- Sumar
- Restar
- Producto (Multiplicación)
- Cociente (División)
En cada operación se debe pedir los diferentes operando y mostrar por pantalla el resultado.
Utilizar un fichero MakeFile para realizar la compilación y generación del ejecutable.
Referencias
Introducción a C
By zerasul
Introducción a C
- 976