
% Inicio

\documentclass[xcolor=dvipsnames]{beamer}
\usetheme[left,width=1.8cm, hideothersubsections,numbers,totalnumber,compress,sidebarshades]{PaloAlto}
\setbeamertemplate{footline}[frame number]
\setbeamertemplate{navigation symbols}{}
\setbeamertemplate{items}[ball]
\setbeamertemplate{blocks}[rounded][shadow=true]

\usefonttheme{professionalfonts}% font de LaTeX
\useinnertheme{rounded}

% Colores
\definecolor{micolor}{rgb}{0.25,0.1,0.25}
\usecolortheme[named=micolor]{structure} % violet
\setbeamercolor{normal text}{bg=violet!5,fg=black}

\setbeamercolor*{palette primary}{use=structure,fg=micolor,bg=micolor!5}
\setbeamercolor*{sidebar}{use=structure,fg=micolor,bg=,bg=micolor!5}

\setbeamercolor*{palette sidebar primary}{use=structure,fg=micolor} 
\setbeamercolor*{palette sidebar secondary}{use=structure,fg=micolor} 
\setbeamercolor*{palette sidebar tertiary}{use=structure,fg=micolor} 
\setbeamercolor*{palette sidebar quaternary}{use=structure,fg=micolor} 
\setbeamercolor*{page number in sidebar}{fg=micolor}

\setbeamercolor*{titlelike}{use=structure,fg=white, bg=micolor}

\setbeamercolor{block title}{use=structure,fg=white,bg=structure.fg!75!black} 

\logo{\incsvg{1.8cm}{svg/EHU}}
\setbeamercolor{logo}{fg=black,bg=micolor!5}

% Paquetes

\usepackage[spanish]{babel}     % Paquete de lenguaje espaï¿½ol
%\usepackage[utf8]{inputenc}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{color,graphicx}
\usepackage{eurosym}

%  Hace saltar una lï¿½nea entre pï¿½rrafos
% \addtolength{\parskip}{\baselineskip}
%  Hace saltar unos puntos entre pï¿½rrafos
% \addtolength{\parskip}{5pt}
\addtolength{\parskip}{5pt}


\usepackage{latexsym} % Simbolos
\usepackage{colortbl}%soporte para color en tablas
\usepackage{euro}
\usepackage{natbib}
\bibliographystyle{plainnat}

%\usepackage{garamond}          % Usar tipo
%\usepackage[urw-garamond]{mathdesign}
%\usepackage{libertine} 
%usepackage[libertine]{newtxmath}
\usepackage{bera}
% para tt
\usepackage{courier}

\def\newblock{}

\usepackage{url}
\def\R2Lurl#1#2{\mbox{\href{#1}{\color{blue}\ttfamily #2}}}

%\usepackage{minted}

\usepackage{listings}
\lstset{
    language=C, % Octave -> choose the language of the code
    basicstyle=\scriptsize \ttfamily\bfseries, %  -> the size of the fonts used for the code
    %     basicstyle=\small\ttfamily, %  -> the size of the fonts used for the code
    numbers=left, %  -> where to put the line-numbers
    numberstyle=\tiny, %  -> size of the fonts used for the line-numbers
    stepnumber=3, %  -> the step between two line-numbers.
    numbersep=5pt, %  -> how far the line-numbers are from the code
    backgroundcolor=\color{white}, %  -> sets background color (needs package)
    showspaces=false, %  -> show spaces adding particular underscores
    showstringspaces=false, %  -> underline spaces within strings
    showtabs=false, %  -> show tabs within strings through particular underscores
    %     frame=single, %  -> adds a frame around the code
    frame=ltrb,framesep=2pt, % Left,Top,Right,Bottom
    tabsize=4, %  -> sets default tab-size to 2 spaces
    captionpos=b, %  -> sets the caption-position to bottom
    breaklines=true, %  -> sets automatic line breaking
    breakatwhitespace=false, %  -> automatic breaks happen at whitespace
    %     morecomment=[l]{//}, %  -> displays comments in italics (language dependent)
    %     frame=shadowbox, % draw a frame around your source code with a blue shadow
    %     rulesepcolor=\color{blue}, % draw a frame around your source code with a blue shadow
    % frame=ltrb,framesep=5pt,
    keywordstyle=\ttfamily\bfseries\color{blue},
    identifierstyle=\ttfamily\color{black},
    commentstyle=\itshape\color{OliveGreen},
    stringstyle=\ttfamily\color{red},
}


% % % % % % Para imprimir 2 pantallas en una directamente
% \usepackage{pgfpages}
% \pgfpagesuselayout{2 on 1}[a4paper,border shrink=5mm]
% \pgfpagesuselayout{4 on 1}[a4paper,border shrink=5mm, landscape]
% \mode<handout>{\setbeamercolor{background canvas}{bg=black!5}}
% Para imprimir varias en una
% \usepackage{pgfpages}
% \pgfpagesuselayout{8 on 1}[a4paper,border shrink=5mm]
% \pgfpagesuselayout{4 on 1}[a4paper,border shrink=5mm, landscape]
% \pgfpagesuselayout{2 on 1}[a4paper,border shrink=5mm]
% % % % % % Para imprimir 2 pantallas en una directamente

% \usepackage{pgfpages}
% \mode<presentation>
% {
% %  % \usetheme{default}
% %   \usetheme{progressbar}
%   \pgfpagesuselayout{4 on 1}[a4paper, landscape, border shrink=3mm]
% }


\newcommand{\Rojo}{ {\color{red} TODO: } }
\newcommand{\titulo}{Actividad 1\\C para SO}
\title{\titulo}

\newcommand{\tab}{\hspace{5mm}}

\definecolor{purple}        {cmyk}{0.45, 0.86, 0   , 0   }

\hypersetup{
    linkcolor=blue,citecolor=purple,pagecolor=red,urlcolor=blue, anchorcolor = red
}
\hypersetup{
    pdfborder={0 0 0}
}

% % rellenamos la info del fichero PDF
\hypersetup{
	pdftitle =
	\titulo,
	pdfauthor =
	Pablo González Nalda (https://lsi.vc.ehu.eus/pablogn/),
	pdfsubject=
	\titulo,
	pdfkeywords =
	\titulo
	%     pdfpagemode={FullScreen},
	pdfborder={0 0 0}
}

%%%%%%%%%%%%%% SVG
%\include{svg}

%\newcommand{\executeiffilenewer}[3]{%
%    \ifnum\pdfstrcmp{\pdffilemoddate{#1}}%
%    {\pdffilemoddate{#2}}>0%
%    {\immediate\write18{#3}}\fi%
%}


% basado en 
%How to include an SVG image in \LATEX de Johan B. C. Engelen
% Insertar en bash y hacer svgtex cada vez que se aï¿½ada un svg a la carpeta
%svgtex(){
%    for i in *.svg
%    do
%    inkscape -z -D --file=$i --export-pdf=${i%.*}.pdf --export-latex
%        done
%}

\newcommand{\includesvg}[1]{%
%    \executeiffilenewer{#1.svg}{#1.pdf}%
%    {
%        inkscape -z -D --file=#1.svg --export-pdf=#1.pdf --export-latex
%        }%
    \input{#1.pdf_tex}%
}

\newcommand{\incsvg}[2]{
	\def\svgwidth{#1}
	\input{#2.pdf_tex}
}

% juntar las líneas de la tabla de contenidos
\usepackage{etoolbox}
\makeatletter
    \patchcmd{\beamer@sectionintoc}{\vskip1.5em}{\vskip0.5em}{}{}
\makeatother


\begin{document}
	\title[]{\titulo}
	\subtitle{	Introducción a los Sistemas Operativos, 2021-2022}
	
	\author{\R2Lurl{https://lsi.vc.ehu.eus/pablogn/}{Pablo González Nalda}}
	% \logo{\includegraphics[scale=0.13]{logoEHU}}
	\institute[LSI-EUI]{
		\R2Lurl{https://lsi.vc.ehu.eus/}{Depto. de Lenguajes y Sistemas Informáticos}\\
		\R2Lurl{http://www.ehu.es/eui}{EU de Ingeniería de Vitoria-Gasteiz},
		\R2Lurl{https://www.ehu.eus/}{UPV/EHU}
	}
	
	\date{26 de enero de 2022}
	
	% \begin{frame}[plain]
	% \href{run:kk.avi}{videolink}
	% % 	\begin{center}
	% % 		\begin{figure}[ht]
	% % 			\includemovie[ poster, % shows initial frame before play begins controls
	% % 			, % controls are only available on a Mac (they will not appear on windows.)
	% % 			% (if no controls are used, then you can double click the movie to start it.)
	% % 			repeat, % repeat the movie over and over.
	% % 			text=(Loading movie...) % text shown while loading movie
	% % 			]{6cm}{6cm}{kk.avi}
	% % 		\end{figure}
	% % 	\end{center}
	% \end{frame}
	
\begin{frame}[plain]
	\begin{columns}[c]
		\begin{column}[t]{7.7cm}
			\begin{figure}
				\begin{center}
%					\incsvg{3.5cm}{svg/EHU}\hfill
					\incsvg{6cm}{svg/EUI}
				\end{center}
			\end{figure}
			\titlepage
			\begin{center}
				%					\textit{\tiny Modificado el \today}
			\end{center}
		\end{column}
		\begin{column}[t]{1.8cm} % para centrar la pï¿½g de tï¿½tulo es como la anchura del usetheme
			\begin{figure}[lb]
				\vskip 6cm
				\begin{center}
					\R2Lurl{http://creativecommons.org/licenses/by-sa/2.5/es/}{\incsvg{1.8cm}{svg/CC-logo}}
					\\ \vskip 0.5cm
					\R2Lurl{http://creativecommons.org/licenses/by-sa/2.5/es/}{\incsvg{1.8cm}{svg/ccbysa}}
				\end{center}
			\end{figure}
		\end{column}
	\end{columns}
\end{frame}
\author{\scshape Contenidos}

\begin{frame}
    \frametitle{Contenidos de la presentación}
                         \tableofcontents[
                                % ...showing the active section in the context of other sections...
                                sectionstyle=show/show,
                                % ... while hiding subsections
                                subsectionstyle=hide/hide/hide
                        ]
\end{frame}

\AtBeginSection[] {
%                 \begin{frame}[plain]
%                 Secciï¿½n \thesection{}
%                 \end{frame}
                \begin{frame}
%                         \frametitle{
%                                 % Put in the section number
%                                         \sectionname{} \thesection{}%:
%                                 % Now also put in the section description
%                          %            [description]
%                                 }
                                % Generate the table of contents...
                        \tableofcontents[
                                % ...showing the active section in the context of other sections...
                                sectionstyle=show/shaded,
                                % ... while hiding subsections
                                subsectionstyle=hide/hide/hide
                        ]
                \end{frame}
        }

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %

\section{Parte básica de la sintaxis de C}
\begin{frame}[fragile]
\frametitle{Programa ``Hola, muy buenas...''}
\begin{lstlisting}
/* Programa simple */
/* Comentario. No pueden anidarse */
#include <stdio.h>
main( ) {
	printf("\nHola, muy buenas...\n");
}
\end{lstlisting}

\begin{lstlisting}
gcc -o hola hola.c
\end{lstlisting}


\end{frame}

\begin{frame}[fragile]
\frametitle{Variables}
\begin{lstlisting}
#include <stdio.h>
main( ) {
	int entero;    /* entero con signo */
	char caracter;     /* carácter ASCII */
	float real;    /* real simple precisión */
	entero = 2+2;
	caracter = 'a'; 
	real=6.023E23;
	printf("\nResultado: %d\t'%c' ",entero, caracter);
	printf("\treal %f", real);
}
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Constantes}
\begin{lstlisting}
#include <stdio.h>
#define MAX 50
main( ) {
	const int entero=3;    
	const float PI=3.1415926;
	printf("\nResultado: %d, otros %d %d",entero, 66, MAX);
	printf("\treal %f", real);
}
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Control de compilación}
\begin{lstlisting}
#include <stdio.h>
#define PRUEBA
main( ) {    
#ifdef PRUEBA
	printf("Prueba");
#else
	printf("No hay prueba");
#endif
}
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Control de compilación}
\begin{lstlisting}
#include <stdio.h>
main( ) {
#ifdef PRUEBA
	printf("Prueba");
#else
	printf("No hay prueba");
#endif
}
\end{lstlisting}

\begin{lstlisting}
gcc -o prueba prueba.c -DPRUEBA
\end{lstlisting}

\end{frame}

\begin{frame}[fragile]
\frametitle{Dualidad carácter/valor ASCII}
\begin{lstlisting}
#include <stdio.h>
main( ) {
	char a='C',b='f', c='3';
	int x;
	x=a-'A';
	printf("\nDistancia: %d",x);
	printf("\nValor numérico: %d", c-'0'); /* 51-48 */
	a=a+('a'-'A');     /* +32 pasa a minúsculas*/
	b=b-32;        /* Pasa a mayúsculas */
	printf("\n%c \t%c", a,b); /* resultado */
}
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Operadores matemáticos}
\begin{lstlisting}
a=-b;
a=a+b;    
a=c-b;        
a=c*b;
a=c/b;    Si son enteros, sólo da el cociente de la división. Si uno de ellos (por lo menos) es real, da la división con todos los decimales posibles
a=c%b;    Sólo se puede usar con enteros, y da el resto de la división entera 
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{\textit{Abreviaturas}}
\begin{lstlisting}
a=a+1; -> a++; o también ++a; (Hay diferencia)
b=b-1; -> b--; o también --b; (Hay diferencia)
b = b + c; -> b += c;
b = b - c; -> b -= c;
b = b * c; -> b *= c;
b = b / c; -> b /= c;
¡¡Cuidado!!
c=3;
b=c+1; -> b tiene 4 y c tiene 3 (d=c+1;        b=d;)
b=c++; -> b tiene 3 y c tiene 4 (d=c; c=c+1;    b=d;)
b=++c; -> b tiene 4 y c tiene 4 (c=c+1; d=c;    b=d;)
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Entrada/Salida}
\begin{lstlisting}
#include <stdio.h>
void main(){
	int num; 
	char car, nombre[10]; /* Cadena de caracteres */
	printf("Introduce un numero entero");
	scanf("%d", &num);
	printf(" la variable \"car\": ");
	fflush(stdin); /* Vacía el búfer del teclado */
	scanf("%c", &car);
	fflush(stdin); 
	printf("\nIntroduce un nombre");
	scanf("%s", nombre);
	printf("\n\nEl número es %d, \t y el ", num);
	printf("carácter %c.\n", car);
	printf("La cadena es %s", nombre);
} 
\end{lstlisting}
\end{frame}


\begin{frame}[fragile]
\frametitle{Operaciones lógicas con bits}
\begin{lstlisting}
#include <stdio.h>
main() {
	char dato, mascara=0x01; /* mascara=1 */
	int i, cont=0;
	scanf("%c", &dato);
	for (i=0; i<8; i++) {
		printf("%d",((dato&mascara)!=0));
		if((dato & mascara)!=0) cont++; /* and de bits */
		mascara = mascara << 1; /* Desplazamiento de */
	}                                  /* bits a la izq */
	printf("\nEn '%c' hay %d unos\n", dato,cont);
}

& and        >> Desplazamiento a la derecha
| or        << Desplazamiento a la izquierda
~ not        Lo mismo con iguales     &=     |=     ^=
^ xor                    <<=    >>=
\end{lstlisting}
\end{frame}


\section{Control de flujo}
\begin{frame}[fragile]
\frametitle{Condicionales}
\begin{lstlisting}
if (b == 0) {
	a=1;
}
else {
	a=2;
}
a = (b==0 ? 1 : 2 );
\end{lstlisting}
\end{frame}


\begin{frame}[fragile]
\frametitle{Operaciones condicionales}
\begin{lstlisting}
<         menor que    
<=     menor o igual que    
==    igual (dos iguales)
!=     distinto de
>        mayor que    
>=     mayor o igual que
||        uno u otro, o los dos    (or lógico)
&&    uno y otro    (and lógico)
!( expresión)  no es cierto, no ocurre ese algo (not lógico)
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Ejemplo de condicionales: \texttt{if}}
\begin{lstlisting}
/*    if anidados adecuados para switch.C */
#include <stdio.h>
int nota;
void main() {
	printf("Dame tu nota ");
	scanf("%d", &nota);
	if(nota==0||nota==1||nota==2|| nota==3 ||nota==4) {
		printf("\nLo siento, has suspendido \n");
		printf("Si intentas otra, apruebas\n\n");
	}
	else if (nota==5 || nota==6) 
		printf("\nUn aprobado \n");    
	else if (nota==7 || nota==8) 
		printf("\nUn notable, muy bien \n");
	else if (nota==9) 
		printf("\nSobresaliente \n");
	else if (nota==10) printf("\nFelicidades, un 10 \n");
	else if (nota==11) {
		printf("\n Menos lobos... \n");
		printf("\n¿Qué nota es ésa? \n");
	} else printf("\n¿Qué nota es ésa? \n");
	getch(); /* para el programa hasta pulsar una tecla*/
}
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Ejemplo de condicionales: \texttt{switch}}
\begin{lstlisting}
#include <stdio.h>
int nota;
void main(){
		printf("Dame tu nota "); scanf("%d", &nota);
	switch(nota){
	case 0: case 1: case 2: case 3:case 4:
		printf("\nLo siento, has suspendido \n");
		printf("Si intentas otra vez, apruebas\n\n");
	break;
	case 5:case 6: printf("\nUn aprobado \n"); break;
	case 7:
	case 8:
		printf("\nUn notable, muy bien \n");
	break;
	case 10:
		printf("\nFelicidades, un 10 \n");
	case 9: printf("\nSobresaliente \n"); break;
	case 11:
		printf("\n Menos lobos... \n");
	default:
		printf("\n¿Qué nota es ésa? \n");
	} /* fin switch */
	getch(); /* para el programa hasta pulsar tecla*/
}
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Ejemplo de iterativas}
\begin{lstlisting}
#include <stdio.h>
void main() {
	char sn;
	int n=10;
	do {
		printf("\n¿seguimos?(S/N)");
		fflush(stdin); 
		scanf("%c", &sn);
	} while (sn=='s' || sn=='S');
	
	while (n>0) {
		printf("\t%d,",n);
	n--; 
	}
	printf("\t%d.",n);
}
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Ejemplo de iterativas: \texttt{for}}
\begin{lstlisting}
for (cont=1; cont<=10; cont=cont+1)
	printf("\n¡Hola!");
// Para imprimir los múltiplos de 7 menores de 500:
for (cont=7; cont<500; cont=cont+7)
	printf("\n%d",cont);
// Y si queremos una cuenta atrás:
for (cont=10; cont>0; cont=cont-1)
	printf("\n%d",cont);
// O también:
for (cont=10; cont>0; cont--)
	printf("\n%d",cont);
// O también:
cont=10;
while (cont>0)
	printf("\n%d",cont--);
// El factorial en una línea (digamos que es ilegible):
for(i=1,f=1; i<=x; f*=i, i++);
for(i=f=1; i<=x; f*=i++);
\end{lstlisting}
\end{frame}

\section{Matrices}
\begin{frame}[fragile]
\frametitle{Tablas, arrays, vectores, matrices, arreglos}
\begin{lstlisting}
#include <stdio.h>
#define N 10
main( ) {
	int i, v[N], aux;
	for (i=0; i<N; i++) {
		printf("\nDame el %dº valor: ",i+1);
		scanf("%d", &v[i]);
	}
	aux=v[0];
	for (i=0; i<N-1; i++) v[i]=v[i+1];
	v[N-1]=aux;
	printf("\nDesplazada a la izquierda: \n");
	for (i=0; i<N; i++) printf("\t%d ", v[i]);
}
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Matrices multidimensionales}
\begin{lstlisting}
float t[2][5]= {{1,2,3,4,5},{6,7,8,9,0}};
...
printf ("%d",t[1][3]); // imprimirá 9
printf ("%d",t[3][1]); // no es correcto    
\end{lstlisting}
\end{frame}

\section{Cadenas}

\subsection{Cadenas}
\begin{frame}[fragile]
\frametitle{Cadenas o \textit{strings}}
En C, una cadena es una tabla de caracteres 
terminada con un cero binario (\verb#ASCII 0 o '0\0'#)
\begin{lstlisting}
char cad[40];
cad[0] = 'h';
cad[1] = 'o';
cad[2] = 'l';
cad[3] = 'a';
cad[4] = '\0';

char cad[40]= {'H','o','l','a','\0'};
char cad[40]= "Hola";
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Cadenas de Caracteres}
\begin{lstlisting}
#include <stdio.h>
#include <string.h>
#define N 255
void main() {
	char cad[N],cad2[N],cop[]="Cadena copiada"; /* 15 pos.*/
	int i=0, longitud;
	printf("\n\nDame una cadena que la copio en otra: \n");
	gets(cad); /* Pido una cadena con espacios */
	longitud=strlen(cad);
	while (cad[i]!='\0'){
		cad2[i]=cad[i]; /* Copiamos si cad[i]!='\0' */
		printf("\ncad[%d]=%c",i,cad2[i]);
		i=i+1;
	} /* Equivalente a strcpy(cad,cad2); */
	cad2[i]='\0'; /* Añadimos el fin de cadena*/
	printf("\n\n%s: \n%s", cop, cad2);
}
\end{lstlisting}
{\tiny En la condición del \texttt{while} podríamos poner (i<longitud) y el programa sería equivalente. Si ponemos (i<=longitud) también copiaría el carácter de fin de cadena, lo mismo que si usáramos \texttt{do while}.}
\end{frame}

\section{Subprogramas}

\begin{frame}[fragile]
\frametitle{Subprogramas}
\begin{lstlisting}
#include <stdio.h>
long fact(int n);
main( ) {
	printf("\nEl factorial de 14 es %ld", fact(14));
}
long fact(int n) { /* iterativo */
long r=1l; 
int i;
for (i=1; i<=n; i++)
	r*= (long) i;
return r;
}
\end{lstlisting}
La función devuelve un long a partir del dato de entrada int    
\end{frame}

\begin{frame}[fragile]
\frametitle{Funciones y Booleanos}
\begin{lstlisting}
#include <stdio.h>
#define VERD 1
#define FALSO 0
int es_negativo(int x) {
if (x<0) 
	return VERD;
else
	return FALSO;
}
main( ) {
	if (es_negativo(5))
		printf("5 es negativo");
	}

\end{lstlisting}
\end{frame}

%\begin{frame}[fragile]
%    \frametitle{Ejemplo de función: \texttt{es\_primo()}}
%    \begin{lstlisting}
%int es_primo (int n) {  
%    /* devolvemos 0 (falso) o 1 (verdadero es cualquier n ? 0) */
%    int i;
%    if (n<=0) return 0; 
%    /* Definimos como posibles primos sólo los mayores que 0 */
%    if (n==1) 
%        return 1; 
%    /* Caso especial: el 1 es primo porque es su único divisor */
%    for(i=1; i<=n; i=i+1)
%        if(n%i==0)         /* i es divisor de n */
%            cont=cont+1;     /* tenemos otro divisor de n */
%    if (cont==2) 
%        return 1;     /*tiene dos divisores: el 1, y él mismo*/
%    else 
%        /* else opcional, el return rompe la ejecución, sale de la función */
%        return 0; 
%    /* tiene más de dos divisores, aparte del 1 y de él mismo */
%}    
%    \end{lstlisting}
%\end{frame}

\begin{frame}[fragile]
\frametitle{Funciones sobre matrices}
\begin{lstlisting}
#include <stdio.h>
#define N 100
int media(int t[], int nelem) {
	int i, s=0;
	for (i=0; i<nelem; i++) s+=t[i];
		return s;
}
main( ) {
	int tabla[N],i;
	for (i=0; i<N; i++) {
		printf("\nDame el %dº valor: ",i+1);
		scanf("%d", &v[i]);
	}
	printf("\nLa media de la mitad de la tabla es ");
	printf("%d", media(tabla,N/2));
}    
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Procedimientos}
\begin{lstlisting}
#include <stdio.h>
#define N 10
void pedir_tabla(int t[]) {
	int i;
	for (i=0; i<N; i++)
	scanf("%d", &t[i]);
}
void izq(int v[]) {
	int i, aux;
	aux=v[0]; for (i=0; i<N-1; i++) v[i]=v[i+1]; v[N-1]=aux;
}
void mostrar_tabla(int t[]) {
	int i;
	for (i=0; i<N; i++) printf("\t%d ", t[i]);
}
main( ) {
	int v[N];
	pedir_tabla(v);
	izq(v);
	printf("\nDesplazada a la iquierda: \n");
	mostrar_tabla(v);
}    
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Procedimientos con cadenas}
\begin{lstlisting}
#include <stdio.h>
#include <string.h>
#define N 255
void copiar_cadena(char cad[], char cad2[]) {
	int i=0, longitud;
	longitud=strlen(cad);
	while (i<longitud){
		cad2[i]=cad[i]; /* Copiamos si cad[i]!='\0' */
		i=i+1;
	} 
	cad2[i]='\0'; /* Añadimos el fin de cadena*/
}
void main() {
	char cad[N],cad2[N],cop[]="Cadena copiada"; /*cop 15 pos.*/
	printf("\n\nDame una cadena que la copio en otra: \n");
	gets(cad); /* Pido una cadena con espacios */
	copiar_cadena(cad,cad2);
	printf("\n\n%s: \n%s", cop, cad2);
}    
\end{lstlisting}
\end{frame}

\subsection{Manejo de ficheros}
\begin{frame}[fragile]
\frametitle{Manejo de ficheros}
\small
\begin{lstlisting}
# E/S estándar
printf("formato", lista de expresiones);
scanf ("formato", lista de expresiones);

# E/S no estándar
fprintf(fich, "formato", lista de expresiones);
fscanf (fich, "formato", lista de expresiones);

# Conversión en memoria
sprintf(cadena, "formato", lista de expresiones);
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Manejo de ficheros}
\small
\begin{lstlisting}
#include <stdio.h>
#define EOF (-1)
void main() {
	FILE *entrada, *salida;
	int i;
	char ce, cs;
	entrada= fopen("fich.en","r");
	salida = fopen("fich.sa","w");
	while((ce=getc(entrada))!=EOF) {
		cs = (ce>='A' && ce<='Z' ? ce+32: ce);
		putc(cs,salida);
	}
}
\end{lstlisting}
\end{frame}

\subsection{Argumentos del programa}
\begin{frame}[fragile]
\frametitle{Argumentos del programa}
\small
\begin{lstlisting}

#include <stdio.h>
void main(int argc, char *argv[]) {
	int i;
	printf("\nPrograma: %s\n",argv[0]);
	for(i=1;i<argc;i++) 
		printf("argumento %d: %s\n",i,argv[i]);
}
\end{lstlisting}
\end{frame}


\section{Qué es un puntero}
\begin{frame}[fragile]
\frametitle{Basado en...}
Basado en:
\small{A TUTORIAL ON POINTERS AND ARRAYS IN C

by Ted Jensen

\url{http://pweb.netcom.com/~tjensen/ptr/cpoint.htm}
}

\end{frame}
\subsection{Qué es un puntero}
\begin{frame}[fragile]
\frametitle{Punteros}
Punteros o apuntadores (\textit{pointers}):
\begin{lstlisting}
int k,j;
k=2; j=7;

int *ptr;         /* p es un puntero a enteros */
// Es decir, contiene una dirección de memoria, y el lenguaje sólo permite que apunte a enteros
ptr=NULL;
ptr=&k; /* ptr contiene la dirección de memoria de k */ 
j=*ptr; /* j recibe lo apuntado por ptr, un entero con el valor 2 */
*ptr=7; /* en ese entero se introduce el 7 */

printf("j %d @ %p\n", j, (void *)&j);
printf("k %d @ %p\n", k, (void *)&k);
printf("ptr %p @ %p\n", ptr, (void*)&ptr);
printf(" Apuntado por ptr es %d\n", *ptr);
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Bytes de un entero con punteros}
Orden de los bytes de un entero:
\begin{lstlisting}
#include <stdio.h>
int main() {
	int n=0x05060708; // en hexadecimal, 4 bytes
	char *p;
	p = (char *) &n;
	for (int b=0;b<4;b++) {
		printf("\nbyte %d \t%p\n", *p, p);
		p++;
	}
	/* lo mismo en dos líneas */
	for (int b=0;b<4;b++)
		printf("\nbyte %d \t%p\n", *p, p++);
	return 0;
}            
\end{lstlisting}

\begin{lstlisting}
1942  vi p.c
1943  gcc -o p p.c
1944  ./p
\end{lstlisting}

\end{frame}


\begin{frame}[fragile]
\frametitle{Bytes de un entero con punteros}
Orden de los bytes de un entero:
\begin{lstlisting}
#include <stdio.h>
#include <stdlib.h>
int main() {
	int *p, *q;
	p=malloc(10*sizeof(int));
	q=p;
	for (int x=0;x<10;x++) {
		p[x]= (x+10);
		printf("#%d: %d  \t%d  \n", x, p[x], *q);
		*q  = (x+20);
		printf("#%d: %d  \t%d  \n", x, p[x], *q);
		printf("%p %p\n", &p[x], q++);
	}
	return 0;
}
      
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Variables por valor y por referencia}
\begin{lstlisting}
// Las variables simples, si no se usan punteros, se pasan por valor:
int suma (int a, int b) return a+b;
s= suma(c,d);
// Las variables compuestas, siempre se pasan por referencia, por ser su nombre un puntero al primer elemento:
void desplaza (int a[]);
int t1[10];
desplaza(t1);
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Variables por valor y por referencia (2)}
\begin{lstlisting}
// Las variables simples, al usar punteros, se pasan por referencia:
void  intercambia (int* a, int* b) {
	int x; x=*a; *a=*b; *b=x;
}
int c,d;
intercambia(&c, &d);
// Una función puede devolver un puntero, que es un dato simple:
#include <stdio.h>
char * pidecadena (char * cad) {
	scanf("%s",cad);
	return cad;
}
void main(){
	char c[10];
	printf("\nDime una cadena: ");
	printf("Me has dado: \"%s\"\n", pidecadena(c));
}
\end{lstlisting}
\end{frame}



\section{Tipos de punteros y tablas}
\subsection{El tamaño de los punteros}
\begin{frame}[fragile]
\frametitle{El tamaño de los punteros}

El tipo apuntado por los punteros determina el comportamiento en la aritmética de punteros:
\begin{lstlisting}
#include <stdio.h>
int main() {
	int *ptr, k=7;
	printf("Tamaño: %ld\n", sizeof(int));
	*ptr=k; // No está inicializada ptr
	ptr++; // ¿adónde apuntará? // Da core
}
\end{lstlisting}
\textit{Core} es un volcado de memoria o \textit{dump} cuando un programa por ejemplo accede a memoria que no es suya.
\end{frame}
\begin{frame}[fragile]
\frametitle{El tamaño de los punteros}
\begin{lstlisting}
#include <stdio.h>
int main(int argc, char * argv[]) {
	int *ptr, k=7, m=5;
	ptr=&m;
	printf("Tamaño: %ld\n", sizeof(int));
	if (argc>1)
		ptr++; // ¿adónde apuntará? 
	printf("\n *ptr es %d\n", *ptr);
}
\end{lstlisting}
\begin{lstlisting}
1985  vi kk.c
1986  gcc -o kk kk.c
1987  ./kk
1988  ./kk hola
\end{lstlisting}

\end{frame}
\begin{frame}[fragile]
\frametitle{Punteros \texttt{void}}
\begin{lstlisting}
void *p;
\end{lstlisting}
Hay problemas muy variados con los punteros genéricos:

\tiny
\R2Lurl{https://stackoverflow.com/questions/692564/concept-of-void-pointer-in-c-programming}{https://stackoverflow.com/questions/692564/concept-of-void-pointer-in-c-programming}

\end{frame}
\subsection{Punteros y tablas}
\begin{frame}[fragile]
\frametitle{Punteros y tablas (\texttt{arrays})}
Puntero para recorrer una tabla
\begin{lstlisting}
int tabla[] = {1,23,17,4,-5,100};
int *ptr;
int i;
ptr = &tabla[0];  /*1*/
ptr = tabla;      /*2*/
printf("\n\n");
for (i = 0; i < 6; i++) {
	/*A*/    printf("tabla[%d] = %d",i,tabla[i]);  
	/*B*/    printf("ptr + %d = %d\n",i, *(ptr + i)); // tabla+i
}
\end{lstlisting}
\end{frame}


\section{Punteros y cadenas}

\begin{frame}[fragile]
\frametitle{Copia de cadenas con índices}
\begin{lstlisting}
char *my_strcpy(char d[], char f[]) {
	int i=0;
	while (f[i]!= '\0') {
		d[i] = f[i];  
		i++;
	}
	d[i] = '\0';
	return d;
} 

// *(dest + i) = *(source + i);
\end{lstlisting}
\end{frame}


\begin{frame}[fragile]
\frametitle{Copia de cadenas con punteros}
\begin{lstlisting}
char *my_strcpy(char *d, char *f) {
	char *p = d;
	while (*f != '\0') 
	*p++ = *f++;
	*p = '\0';
	return d;
}

// while (*f) cuando lo apuntado sea 0 es falso
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Cadenas con punteros}
\begin{lstlisting}
#include <stdio.h>
#include <string.h>
char * nombremes(int n);
main() {
	char *s = "hola"; /* char s[]="hola"; y s[5] */
	strcpy(s, "adios"); /* ? s="adios"; que copia el puntero */
	printf("%s",s);
	s=nombremes(4);    printf("%s",s);
}
char * nombremes(int n){
	static char * nmes[]={"error","en","feb","mar","abr",
	"mayo","jun","jul","ago","sep","oct","nov","dic"};
	
	return ( (n<1||n>12) ? nmes[0] : nmes[n]); /* if */
}
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Cadenas con punteros (2)}
\begin{lstlisting}
int cont_car(char car, char s[]) {
	int cont=0,i;
	for (i=0;s[i]!='\0';i++)
		if (s[i]==car) cont++; /* s es un ptr no explícito */
	return cont;
}
cont_car(char car, char *s) { /* devuelve int */
	int cont=0;            /* implícitamente */
	char *p;
	for (p=s;*p!='\0';p++)
	if (*p==car)
		cont++;
	return cont;
}
\end{lstlisting}
\end{frame}






\section{Punteros y estructuras}
\subsection{Estructuras}
\begin{frame}[fragile]
\frametitle{Estructuras}
\begin{lstlisting}
struct ficha {
	char ap[20];
	char nom[20];
	int edad;
	float altura;
};
struct ficha yo;

int main(void) {
	strcpy(yo.ap,"G.N.");
	strcpy(yo.nom,"P.");
	printf("\n%s, ",yo.ap);
	printf("%s\n",yo.nom);
	return 0;
}
\end{lstlisting}
\end{frame}


\subsection{Estructuras y punteros}
\begin{frame}[fragile]
\frametitle{Estructuras y punteros}
\begin{lstlisting}
struct ficha *p;
p = &yo;
(*p).altura = 1.85;
p->altura = 1.85;

void imprime(struct ficha *p)
{
	printf("\n%s, ", p->ap);
	printf("%s ", p->nom);
	printf("%d\n", p->altura);
}
\end{lstlisting}
\end{frame}

\subsection{Estructuras y \texttt{malloc}}
\begin{frame}[fragile]
\frametitle{Estructuras y \texttt{malloc}}
\begin{lstlisting}
struct ficha *p;
p = (struct ficha *) malloc(sizeof(struct ficha));
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Usando \texttt{typedef} con estructuras y \texttt{malloc}}
\begin{lstlisting}
typedef struct {
	char ap[20];
	char nom[20];
	int edad;
	float altura;
} Ficha;
Ficha *p;
p = (Ficha *) malloc(sizeof(Ficha));
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{Uso alternativo de \texttt{typedef} con estructuras y \texttt{malloc}}
\begin{lstlisting}
struct {
	char ap[20];
	char nom[20];
	int edad;
	float altura;
} ficha;
typedef struct ficha *FICHA;
FICHA p;
p = malloc(sizeof(*FICHA));
\end{lstlisting}
\end{frame}


\subsection{Tablas de estructuras}
\begin{frame}[fragile]
\frametitle{Tablas de estructuras}
\begin{lstlisting}
#define TAMTABLA 10
FICHA *t; // struct ficha **t;
t = malloc(sizeof(FICHA)*TAMTABLA);
for (i=0; i<TAMTABLA; i++) {
	t[i]=malloc(sizeof(*FICHA));
	llenaficha(t[i]);
}
\end{lstlisting}
\end{frame}

\subsection{Ejemplo de árbol binario}
\begin{frame}[fragile]
\frametitle{Ejemplo de árbol binario}
\small
\begin{lstlisting}
typedef struct node {
	int value;
	struct node *leftChild;
	struct node *rightChild;
} node;
typedef struct tree {
	int numNodes;
	struct node** nodes;
} tree;
tree *initTree() {
	/* in C (not C++), don't have to cast malloc's return
	pointer, it's implicitly converted from void* */
	tree* atree = malloc(sizeof(tree));
	node* anode = malloc(sizeof(node));
	atree->nodes[0] = anode;
	return atree;
}
\end{lstlisting}	
\end{frame}


\subsection{Punteros a funciones}
\begin{frame}[fragile]
\frametitle{Punteros a funciones}
\R2Lurl{http://www.barrgroup.com/Embedded-Systems/How-To/C-Function-Pointers}{Punteros a funciones}
\small
\begin{lstlisting}
#include <stdio.h>

void f1() {
	printf("a\n");
}
void f2() {
	printf("b\n");
}
void f3() {
	printf("c\n");
}
void f4() {
	printf("d\n");
}

\end{lstlisting}
\end{frame}


\begin{frame}[fragile]
\frametitle{Punteros a funciones}
\R2Lurl{http://www.barrgroup.com/Embedded-Systems/How-To/C-Function-Pointers}{Punteros a funciones}
\small
\begin{lstlisting}
// def alternativa de la tabla
// void (*t[])(void) = {f1, f2, f3, f4};

int main() {
	// tabla de punteros a 4 funciones
	void ( *t[4] ) (void);
	int i;
	t[0]=f1;
	t[1]=f2;
	t[2]=f3;
	t[3]=f4;
	
	for (i=0; i<=3; i++)
		( *t[i] ) ();
}
\end{lstlisting}
\end{frame}


\subsection{Varios}
\begin{frame}[fragile]
\frametitle{Varios}
\small
\begin{lstlisting}
#define TRUE 1
while(1) ? while(TRUE) ? for(;;) Ciclo infinito
Las variables globales, si en algún caso son necesarias, se ponen fuera de cualquier par de llaves.

exit(expresión); es como hacer return de todo el programa, es decir, termina el programa y se devuelve el control al SO.

int *x[];      array de punteros a enteros
char *x()[]; función que devuelve un array de punteros a caracteres (cadenas)
char * (*x()) [];         función que da punteros a  array de cadenas
char (* (*x()) [])();    función que da punteros a  array de punteros
a funciones que devuelven caracteres
(*dir)(); Ejecutar el código almacenado en la posición "dir" de memoria
\end{lstlisting}
\end{frame}









\section{¿Más preguntas?}
\subsection{¿Más preguntas?}
\begin{frame}
\frametitle{¿Más preguntas?}
¿Más preguntas?
\end{frame}
%
%
%\begin{frame}[fragile]
%    \frametitle{\texttt{struct} y \texttt{union}}
%    \begin{lstlisting}
%    struct tipo_uno {int a; int b; int uno;} var_uno;
%    struct {int b; int uno;} var_dos; /* tipo sin nombre */
%    union tres {int a; int b;};
%    union tres var3;
%    
%    var3.b=5;
%    var_uno.a = var3.a;
%    printf ("&d",var_uno.a); imprimirï¿½ 5
%    
%    struct st{
%    struct {int a1, a2, a3;}a;
%    struct {int a1, a2, a3;}b;
%    } *puntero, estructura;
%    
%    puntero = &estructura;
%    estructura.a.a1=1;
%    puntero->b.a1=2; ? ((struct st)(*puntero)).b.a1=2;
%    \end{lstlisting}
%\end{frame}
%
%













	



% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %

% SE REPITE EL TÍTULO Y EL ÍNDICE

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %

\author{Pablo González Nalda}


\begin{frame}[plain]
\begin{columns}[c]
	\begin{column}[t]{7.7cm}
		\begin{figure}
			\begin{center}
				%					\incsvg{3.5cm}{svg/EHU}\hfill
				\incsvg{6cm}{svg/EUI}
			\end{center}
		\end{figure}
		\titlepage
		\begin{center}
			%					\textit{\tiny Modificado el \today}
		\end{center}
	\end{column}
	\begin{column}[t]{1.8cm} % para centrar la pï¿½g de tï¿½tulo es como la anchura del usetheme
		\begin{figure}[lb]
			\vskip 6cm
			\begin{center}
				\R2Lurl{http://creativecommons.org/licenses/by-sa/2.5/es/}{\incsvg{1.8cm}{svg/CC-logo}}
				\\ \vskip 0.5cm
				\R2Lurl{http://creativecommons.org/licenses/by-sa/2.5/es/}{\incsvg{1.8cm}{svg/ccbysa}}
			\end{center}
		\end{figure}
	\end{column}
\end{columns}
\end{frame}



\end{document}



