\chapter{Introducción al Lenguaje C} 

\section {Introducción a los Lenguajes de Programación}

Algunas estructuras básicas que podemos ver en la mayoría de los lenguajes son: condicionales, sentencias de repetición y funciones. A continuación haremos una definición de las mismas que nos ayudaran a entender como realizar un programa

Una sentencia condicional la podemos escribir como

\noindent \textbf{Si} (condición se cumple) \textbf{entonces}\\
\{\\
\hspace{1cm}    realizar tarea1\\
\}\\
\textbf{Si no} \\
\{\\
\hspace{1cm}   realizar tarea2\\
 \}

Una sentencia de repetición, la cual esta sujeta al cumplimiento de una condición especifica es

\noindent
\textbf{Mientras} (condición se cumple) \\
\{\\
realizar tarea2 \\
\}

Esta repetición también podría llevarse de la siguiente manera.

\noindent
\textbf{Repetir}  \\
\{\\
realizar tarea2 \\
\} \textbf{Mientras} (condición se cumple)

A diferencia de la anterior este bloque se ejecutar· al menos una sola vez, ya que primero se realiza la tarea y después se pregunta por la condición.


Otra manera de implementar una sentencia de repetición es haciendo una estructura que repita, un número de veces fijo, una tarea especifica así

\noindent
\textbf{Para} (x = 1, 2, 3, ... 10) \\
\{ \\
realizar tarea\\
\}\\

Finalmente podemos hacer conjuntos de estas funciones de tal forma que realicen una tarea especifica. Este tipo de sentencias es una función la cual podemos definir como

\noindent nombre (variables necesarias)\\
\{\\
grupo de sentencias 1\\
grupo de sentencias 2\\
... \\
\}\\

\subsection{Ejemplo}

Hacer una función que sumar los números del 1 al 10. El algoritmo resultante se presenta en (algoritmo \ref{alg:sumador}).

%\begin{algorithm}
%\caption{Calculate $y = x^n$}
%\begin{algorithmic}
%\REQUIRE $n \geq 0 \vee x \neq 0$
%\ENSURE $y = x^n$
%\STATE $y \leftarrow 1$
%\IF{$n < 0$}
%\STATE $X \leftarrow 1 / x$
%\STATE $N \leftarrow -n$
%\ELSE
%\STATE $X \leftarrow x$
%\STATE $N \leftarrow n$
%\ENDIF
%\WHILE{$N \neq 0$}
%\IF{$N$ is even}
%\STATE $X \leftarrow X \times X$
%\STATE $N \leftarrow N / 2$
%\ELSE[$N$ is odd]
%\STATE $y \leftarrow y \times X$
%\STATE $N \leftarrow N - 1$
%\ENDIF
%\ENDWHILE
%\end{algorithmic}
%\end{algorithm}

\begin{algorithm}
\caption{Sumador}\label{alg:sumador}
\begin{algorithmic}
	\REQUIRE 
	\ENSURE $suma$
	\STATE  $x = 1 $
	\STATE $ suma = 0 $
	\WHILE{$(x < 11)$}
		\STATE $suma\leftarrow suma + x $
		\STATE $x \leftarrow x+1$
	\ENDWHILE
\end{algorithmic}
\end{algorithm}


\subsection{Ejemplo}

Hacer una función que sume los números pares de $a$ a $b$.

\begin{algorithm}
\caption{Sumador Par}\label{alg:sumador_par}
\begin{algorithmic}
	\REQUIRE $a, b$
	\ENSURE $suma$
	\STATE $x \leftarrow a$
 	\WHILE {$(x<=b)$}
		\IF{ Es\_par $(x)$}
			\STATE $suma \leftarrow suma + x$
			\STATE $x  \leftarrow  x +1$ 
		\ENDIF
	\ENDWHILE
\end{algorithmic}
\end{algorithm}

%\begin{algoritmo}
%  \begin{algorithm}{Sumador\_Par}{a, b}
%   x \= a \\
%   suma \= 0 \\
%   \begin{WHILE} {(x <= b)}
%   \{ \\
%      \begin{IF} {Es_Par(x)}
%       suma\=suma + x \\
%       \end{IF}\\
%       x \=x+1 \\
%   \}\\
%    \end{WHILE}
%    \RETURN {suma}
%  \end{algorithm}
%  \caption{Algoritmo para sumar los números pares del 1 al 10}
%  \label{alg:sumador_par}
%\end{algoritmo}



\section {Características del lenguaje C}

C es un lenguaje estructurado de nivel medio, ni de bajo nivel como ensamblador, ni de alto nivel. Esto permite una mayor flexibilidad y potencia, a cambio de menor abstracción.

No se trata de un lenguaje fuertemente tipado, lo que significa que se permite casi cualquier conversión de tipos. No es necesario que los tipos sean exactamente iguales para poder hacer conversiones, basta con que sean parecidos.

No lleva a cabo comprobación de errores en tiempo de ejecución, por ejemplo no se comprueba que no se sobrepasen los límites de los arreglos. El programador es el único responsable de llevar a cabo esas comprobaciones.

Tiene un reducido numero de palabras clave, unas 40.


\[
\begin{array}{ccccccc}
	auto	& break &  case & char & const	 & continue & default\\
	do & double & else & enum & extern &  float & for \\	
	goto & if & int & long & register & return & short \\
	signed & sizeof & static & struct & typedef & union & unsigned \\
	void & volatile & while &  &  &  
\end{array}
\]


\noindent
El lenguaje C dispone de una biblioteca estándar que contiene numerosas funciones y que siempre está disponible, además de las extensiones que proporcione cada compilador o entorno de desarrollo. En resumen, es un lenguaje muy flexible, muy potente, muy popular, pero que no protege al programador de sus errores.


\section {Compilación de archivos fuente}

\subsection{Compilación}
Para ejecutar un código desarrollado en cualquier lenguaje de programación ser· necesario realizarlo en dos pasos. Primeramente deber· ser traducido el código original, al que llamaremos fuente, a un código binario, que finalmente es el único lenguaje que entiende la computadora. después de realizado esto, el código podrá ser ejecutado y presentar los resultados.

La manera de realizar este procedimiento cambia de lenguaje a Lenguaje. En seguida se presenta el proceso en C

El proceso de compilación crear· un código, que llamaremos objeto, el cual toma el mismo nombre que la clase principal puesta en el programa fuente y crea un archivo nombre.class.

\subsubsection{compilación y ejecución de un programa en C}
Dado un código fuente, que generalmente tendrá extensión .c (nombre.c), el proceso de compilación se realiza como

\begin{center}
\textbf{gcc -o nombre nombre.c}\end{center} y la ejecución es
\begin{center}
\textbf{./nombre}
\end{center}

Donde -o indica al compilador el nombre del archivo ejecutable, si este es omitido, en su lugar se generar· un archivo a.out.

En el caso de tener mas de un archivo, en común que se creen proyectos los cuales se compilan con la instrucción make y una archivo Makefile debe ser creado. Dentro del archivo Makefile se especifican los archivos fuente y el nombre del archivo de salida.


\subsection{Ejemplo del programa Hola Mundo}
A continuación se da un ejemplo sencillo para desplegar un letrero utilizando el lenguaje C.


\begin{verbatim}
//ejemplo ec001.cpp
/
 * Title: Hola Mundo
 * Description: Programa para desplegar el letrero de Hola Mundo
 * Copyright: Copyright (c) 2005
 * Company: UMSNH
 * author Dr. Felix Calderon Solorio
 * version 1.0
 */
#include <stdio.h>

void main () {
  printf("Hola Mundo \n");
  return;
}
\end{verbatim}

\noindent 
Ver Hola\_Mundo.c

Podemos notar lo siguiente:
\begin{itemize}
    \item Que se requiere de una función principal la cual se denomina main
    \item Que en C es siempre necesario incluir librerías utilizando la palabra clave \begin{verbatim} #include <stdio.h> \end{verbatim}
    \item Que la función main son  opcionales los argumentos.
\end{itemize}

\subsection{Iniciales}

El siguiente programa escribe las iniciales FCS utilizando solamente la función printf que permite imprimir un texto en pantalla. Estas iniciales estas realizadas utilizando asteriscos para que las iniciales luzcan en un tamaño mayor.

\begin{verbatim}
/**
 * El metodo imprime las iniciales FCS en orden vertical
 */

#include <stdio.h>

int main ()
{
    printf("********\n");
    printf("    *  *\n");
    printf("    *  *\n");
    printf("    *  *\n");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("********\n");
    printf("*      *\n");
    printf("*      *\n");
    printf("*      *\n");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("*   ****\n");
    printf("*   *  *\n");
    printf("*   *  *\n");
    printf("*****  *\n");
    printf("\n");
    printf("\n");
    
    return 0;
}
\end{verbatim}

\noindent
Ver Iniciales.c
