viernes, 25 de enero de 2019

Ejercicios resueltos en C. Funciones. Paso por valor y por referencia

En lenguaje C, es muy importante conocer cómo se trabaja con funciones, por ejemplo. Antes de entrar en materia con ejercicios que he resuelto, permitirme presentar la siguiente imagen, que bajo mi punto de vista es más que ilustrativa sobre en qué consiste un paso por valor o un paso por referencia y la importancia de utilizar un método u otro en función de nuestro objetivo.


Ejercicio 1: Escribir una función que sume dos números. Implemente un programa que la utilice.


#include <stdio.h>



int main () {

    int a, b;

    printf ("Numero 1: \n");

    scanf ("%d",&a);

    printf ("Numero 2: \n");

    scanf ("%d",&b);

 

    printf ("Resultado : %d",suma(a,b));

 

 

    return 0;

}



int suma (int a, int b) {

    return a+b;

}

</pre>




Ejercicio 2: Escribir un programa que reciba como argumento un conjunto de números. Calcular la media mediante una función.



#include <stdio.h>

float media (int *l,int n);
int main (int argc, char ** argv) {
    int i;
    int *lista;
    
    lista=(int *)malloc(sizeof(int *)*(argc-1)); // -1 al ser INT; +1 al ser CHAR
    if (lista == NULL) {
        printf ("ERROR");
        return 1;
    }
    
    for (i=0;i<argc;i++) {
        lista=atoi(argv[i]);
    }
    printf ("Media: %f",media(lista,(argc-1)));
    
    
    return 0;
}


float media (int *l,int n) {
    int i, suma =0;
    for (i=0;i<n;i++) {
        suma+=l[i];
    }
    return ((float)suma/(float)n);
}


Ejercicio 3: Escribir un programa que reciba una serie de cadenas de caracteres como argumentos. El programa deberá concatenarlas y dar la vuelta a la cadena resultante. La cadena que almacene la concatenación de los argumentos debe utilizar la memoria justa y necesaria.



  



#include <stdio.h>

int main (int argc, char **argv) {
    char *cadena;
    int i,largo,temp;
    
    // ¿Cuanto ocupa?
    for (i=0;i<argc;i++) {
        largo+=strlen(argv[i]);
    }
    
    // Realizo la reserva de memoria para almacenar, +1 fin de cadena
    cadena=(char *)malloc(sizeof(char)*(largo+1));
    strcpy (cadena,""); // Quito los espacios en blanco
    if (cadena == NULL) {
        printf ("Se produjo un error al reservar la memoria\n");
        return 1;
    }
    
    // Almacenamos argv en cadena
    for (i=0;i<argc;i++) {
        cadena=strcat(cadena,argv[i]);
    }
    
    printf ("\nLa cadena original es: %s\n",cadena);
    // Por último, damos la vuelta a la cadena resultante.
    for (i=0;i<strlen(cadena)/2;i++) {
        temp = cadena [i];
        cadena[i]=cadena[strlen(cadena)-1-i];
        cadena[strlen(cadena)-1-i]=temp;
    }
    
    printf ("\n-------\n");
    printf ("La cadena alterada es: %s",cadena);
    
    
    return 0;
}

Ejercicios resueltos Matrices en C

He recopilado una serie de ejercicios sobre trabajo de matrices en C que espero sean de utilizar, no tenéis más que contactar en caso de dudas.

Ejercicio 1: Escribe un programa que pida cinco enteros al usuario y los almacene en una matriz. Calcula si la suma de los números almacenados es par o impar.



#include <stdio.h>


int main () {
    int m[5];
    int i, suma=0;
    
    for (i=0;i<5;i++) {
        printf ("Introduce numero [%i]: ",i+1);
        scanf ("%i",&m[i]);
    }
    
    for (i=0;i<5;i++) {
        suma+=m[i];
    }
    
    if (suma%2==0) {
        printf ("\nLa suma es PAR: %i",suma);
    } else {
        printf ("\nLa suma es IMPAR: %i",suma);
    }
    return 0;
}


Ejercicio 2: Escribe un programa que pida nueve números enteros y los almacene en una matriz 3x3. Calcula la suma de los números de cada fila y mostrar por pantalla el número de fila con mayor suma.



#include <stdio.h>

int main () {
    int m[3][3];
    int f,c, sumafila=0, nfila=0, mayorfila=0;
    
    for (f=0;f<3;f++) {
        for (c=0;c<3;c++) {
            printf ("Introduce el valor de [%i][%i]",f,c);
            scanf ("%i",&m[f][c]);
        } printf ("\n## Fila [%i] completada\n",f+1);
    }
    
    for (f=0;f<3;f++) {
        sumafila=0;
        nfila=f+1;
        for (c=0;c<3;c++) {
            sumafila+=m[f][c];
            if (sumafila > mayorfila) {
                mayorfila=sumafila;
            }
        }
    }
    
    printf ("\n-----------\n");
    printf ("La fila con suma mayor es: %i con resultado %i",nfila,mayorfila);
    
    return 0;
}


Ejercicio 3: Escribe un programa, que trabajando mediante funciones, presente un menú al usuario, rote la columnas a la derecha y suma filas.




  


#include <stdio.h>  
#define DIMENSION 3  
  
int m[3][3]={10,20,30,40,50,60,70,80,90};  
int n[3][3];  
int a,b,f,c, opcion, suma, resultado;  
  
int IntroduceMatriz (int m[3][3], int f, int c);  
int VisualizaMatriz (int m[3][3], int f, int c);  
int RotarMatrizDrcha (int m[3][3], int f, int c);  
int CambiarFilasColumnas (int m[3][3], int f, int c);  
int SumarFilasColumnas (int m[3][3], int f, int c);  
  
  
//struct ciudadano * CargarBBDDCiudadanos (struct *ciudadano, char *, char *, char *);  
  
  
int main () {  
      
  
    do {  
        printf ("--- MENU ---\n");  
        printf ("1. Introducir Matriz\n");  
        printf ("2. Visualizar Matriz\n");  
        printf ("3. Rotar Matriz Derecha\n");  
        printf ("4. Cambiar Filas/Columnas Matriz\n");  
        printf ("5. Sumar Filas\n");  
        printf ("6. Incremento dinero paso por referencia\n");  
        printf ("7. Incremento dinero paso por valor\n");  
        printf ("9. Salir\n\n");  
        printf ("Seleccione: ");  
        scanf ("%i",&opcion);  
        switch (opcion) {  
            case 1:  
                printf ("\nOpcion 1\n\n");  
                IntroduceMatriz (m, f,c);  
            break;  
            case 2:  
                printf ("\nOpcion 2\n\n");  
                VisualizaMatriz (m,f,c);  
            break;  
            case 3:  
                printf ("\nOpcion 3\n\n");  
                RotarMatrizDrcha (m,f,c);  
            break;  
            case 4:  
                printf ("\nOpcion 4\n\n");  
                CambiarFilasColumnas (m,f,c);  
            break;  
            case 5:  
                printf ("\nOpcion 5\n\n");  
                SumarFilasColumnas (m,f,c);  
            break;  
            case 6:  
                printf ("\nOpcion 6\n\n");  
  
            break;  
            case 7:  
                printf ("\nOpcion 7\n\n");  
  
            default:  
                printf ("\nSeleccione una opcion correcta\n");  
            break;  
                      
        }  
    } while (opcion != 9);  
    return 0;  
}  
  
  
int IntroduceMatriz (int m[3][3], int f, int c) {  
    for (f=0; f<DIMENSION; f++) {  
        for (c=0; c<DIMENSION; c++) {  
            printf ("Introduce coordenada [%i][%i]: ",f,c);  
            scanf ("%i",&m[f][c]);  
        }   
    }  
      
    printf ("\nDone!\n");  
}  
  
int VisualizaMatriz (int m[3][3], int f, int c) {  
    for (f=0; f<DIMENSION; f++) {  
        for (c=0; c<DIMENSION; c++) {  
            printf ("%i  ",m[f][c]);  
        } printf ("\n");  
    }  
      
    printf ("\nDone!\n");  
}  
  
int RotarMatrizDrcha (int m[3][3], int f, int c) {  
    for (f=0; f<DIMENSION; f++) {  
        for (c=0; c<DIMENSION; c++) {  
            if (c == 2) {  
                n[f][0] = m[f][c];  
            } else {  
                n[f][c+1] = m [f][c];  
            }  
        }  
    }  
      
    for (f=0; f<DIMENSION; f++) {  
        for (c=0; c<DIMENSION; c++) {  
            m[f][c] = n[f][c];  
        }  
    }  
    printf ("\nDone!\n");         
}  
  
  
int CambiarFilasColumnas (int m[3][3], int f, int c) {  
    for (f=0; f<DIMENSION; f++) {  
        for (c=0; c<DIMENSION; c++) {  
            n[c][f] = m[f][c];  
        }  
    }  
      
    for (f=0; f<DIMENSION; f++) {  
        for (c=0; c<DIMENSION; c++) {  
            m[f][c] = n[f][c];  
        }  
    }  
    printf ("\nDone!\n");         
}  
  
  
int SumarFilasColumnas (int m[3][3], int f, int c) {  
      
    for (f=0; f<DIMENSION; f++) {  
        suma=0;  
        for (c=0; c<DIMENSION; c++) {  
            suma+=m[f][c];  
            //printf ("Debug: %i\n",suma);  
            if (c == 2) {  
                printf ("\nLa Fila [%i] suma: %i\n",f,suma);  
            }  
        }  
    }  
      
    printf ("\nDone!\n");         
}

miércoles, 23 de enero de 2019

Nuestro pequeño gran proyecto: Todo-Linux.com

¡ Casi 20 años online !


Muchas veces no nos damos ni cuenta de cómo pasa el tiempo, cuando miras el calendario, y echas la mirada hacia atrás, te das cuenta que ha pasado mucho tiempo, demasiadas aventuras que contar, muchos amigos entorno a Todo-Linux, unos que vinieron y se marcharon de nuestras vidas, otros que se incorporaron más tarde pero con mucha fuerza, otros que pasaron inadvertidos y algunos que empezamos y terminamos la aventura.


http://web.archive.org/web/*/http://www.todo-linux.com

Aún recuerdo sin mucho esfuerzo como empezó todo esto. Por aquel entonces yo era un joven administrador de sistemas de un periódico Español. Una mañana, aburrido de la rutina, llamé a un viejo amigo que años atrás conocí en el chat de MSN (no había muchos más chats por aquel entonces), su nick era CyberAlex. CyberAlex, ThrasherMaster y yo, también hace unos años formábamos un grupo y redactábamos una "Ezine" , ¡qué tiempos !, en fin, volvamos a http://www.todo-linux.com/ que me lio.
Esa mañana, llamé a CyberAlex, le pregunté que si a él le gustaría que montásemos una web temática donde poder contar nuestras experiencias con el mundo Linux y el Software Libre, Alex reaccionó inmediatamente diciéndome que le parecía una muy buena idea y nos pusimos manos a la obra. Después de unas horas luchando con el whois a la caza de un dominio que mostrase nuestra identidad correctamente, encontramos el dominio que tenemos hoy en dia, lo compramos y empezamos a trabajar.
En aquella época, no había mucho donde elegir y ya vislumbraba un CMS que tenía buen pinta llamado PhpNuke. Aprovechando un hosting gratuito, montamos la web sin muchos recursos y más o menos tenía este aspecto.




Fue pasando por deferentes L&F hasta finalmente llegar a tener éste:

http://web.archive.org/web/20080715092147/http://www.todo-linux.com/ 


Al poco de tener la web en funcionamiento, y una vez que nos hicimos un pequeño hueco en el panorama de noticias de Linux a nivel Nacional, organizamos la primera Zona Linux de Campus Party, la web que teníamos como estandarte era esta: http://seguridad.todo-linux.com/.


En esa Campus conocimos a muchísimos buenos amigos que no logro recordar todos sus nombre, daros todos por saludados.

En esa Campus Party invitamos a figuras del Mundo Linux de lo más interesante, a destacar a Miguel de Icaza, al presidente de hispalinux por aquella época y muchos más.



También conocimos a Jaime, founder de Bluetechnology y Cableazul, que más delante contaremos cosillas de él. Jaime tambien fue parte importantísima de TL.





Una vez finalizada nuestra aventura en la Campus Party 2002, nuestra andadura con web continuo, la web cambió ligeramente de aspecto.




Continuara.....
Pero todo eso lo contaré otro día......

FindTime o Assistant.to Mi último gran descubrimiento

FindTime es una de las últimas novedades de Microsoft en torno a la gestión de reuniones. Aquellos que participamos y convocamos reuniones con un grupo amplio de participantes, sabemos de primera mano lo complicado que muchas veces resulta.


Gracias a la herramienta, podemos lanzar "algo similar" a una encuesta a un grupo de participantes, los cuales si tienen el calendario disponible (misma organización por ejemplo), inclusive podemos saber cuando tienen huecos libres, y proponerles un número determinado de opciones.

 

 Una vez que los participantes marcados como "requeridos" voten, la herramienta lanzará una convocatoria de Skype for business automáticamente.



No dejeis de probarlo, muy recomendable.

En el caso de que seais usuarios de Gmail, tambien teneis una aplicación muy similar que cubrirá vuestras necesidades, se llama Assistant.to



martes, 22 de enero de 2019

Mi caminar junto a mi raspberry

Utilizo raspberry, como muchos otros, desde hace varios años, diría que desde que salió la versión 1 al mercado. Con este pequeño dispositivo he hecho diferentes experimentos:
  • Implementé no hace demasiado tiempo un Windows 10 iot en una raspberry pi 3 con éxito. 
  • Utilizo habitualmente una raspberry pi 2 como Home Center en el salón de mi casa utilizando KODI como motor principal.
  • Tengo una raspberry con Noobs para realizar labs con aplicaciones gráficas, como no tengo monitor en este dispositov, utilizo la nueva versión SaaS de VNC para acceder, y he de decir que funciona realmente bien.
  • Estoy utilizando una versión de desarrollo donde estoy haciendo una conexión con Apple Homekit mediante el JSON de desarrollo.

Programación: Pascal

¿Os acordáis de Pascal?. Pascal fue el primer lenguaje de programación denominado como estructurado, hoy en día diría que únicamente se utiliza para fines académicos. En mi caso, como en el muchos otros, tuve que estudiarlo.

Un proyecto que me tocó hacer fue el famosísimo "Hundir la Flota". He revisado en Google "Hundir la Flota en Pascal" y observado que hay más de 14000 registros.



Os dejo un fragmento del código que usé el cual corresponde a la función más grande en cuanto a número de líneas. Si necesitáis más, decírmelo y os echo un cable.


{ Mediante este procedimiento insertaré los barcos de ambos players en los tableros }
procedure InsertBoxBoat (var tb:sBoardBoat); 
    var
        row,column:integer;
        way:string;
    begin
        write('&& BARCO (Longitud 4) && - Selecciona la direccion para ubicarlo: [U]arriba/[D]abajo/[L]izquierda/[R]derecha?: ');
        readln(way);
        writeln();
        repeat
            write('Por favor, del 1 al 8, indica la coordenada de la fila: ');
            readln(row);
            writeln();
            write('Por favor, del 1 al 8, indica la coordenada de la columna: ');
            readln(column);
            sound(220);        { Beep }
            delay(200);        { Durante 200 ms }
            nosound;           { Y... silencio! }
            writeln();
            if (row>8) and (column>8) then
                begin
                textcolor(red);
                writeln('&& ERROR: Esta fuera de rango!');
                textcolor(white);
                writeln();
                readln();
                end;
        until row<=8;
        if (way = 'L') or (way = 'l') or (way = 'izquierda') then
            for column := column  downto 4 do
                begin
                    tb[row,column].bstate := BARCO;
                    tb[row,column].bsize:=4;
                end
        else
            if (way = 'R') or (way = 'r') or (way='derecha') then
                for column := column to 4 do
                    begin
                        tb[row,column].bstate := BARCO;
                        tb[row,column].bsize:=4;
                    end
            else
                if (way = 'U') or (way ='u') or (way = 'arriba') then
                    for row := row downto 4 do
                        begin
                            tb[row,column].bstate := BARCO;
                            tb[row,column].bsize:=4;
                        end
                else
                    if (way = 'D') or (way = 'd') or (way = 'abajo') then
                        for row := row  to 4 do
                            begin
                                tb[row,column].bstate := BARCO;
                                tb[row,column].bsize:=4;
                            end;
        write('&& BARCO (Longitud 3) && - Selecciona la direccion para ubicarlo: [U]arriba/[D]abajo/[L]izquierda/[R]derecha?: ');
        readln(way);
        writeln();
        repeat
            write('Por favor, del 1 al 8, indica la coordenada de la fila: ');
            readln(row);
            writeln();
            write('Por favor, del 1 al 8, indica la coordenada de la columna: ');
            readln(column);
            Sound(220);        { Beep }
            Delay(200);        { Durante 200 ms }
            NoSound;           { Y... silencio! }
            writeln();
            if (row>8) and (column>8) then
                begin
                textcolor(red);
                writeln('&& ERROR: Esta fuera de rango!');
                textcolor(white);
                writeln();
                readln();
                end;
        until row<=8;
        if (way = 'L') or (way = 'l') or (way = 'izquierda') then
            for column := column  downto 3 do
                begin
                    tb[row,column].bstate := BARCO;
                    tb[row,column].bsize:=3;
                end
        else
            if (way = 'R') or (way = 'r') or (way='derecha') then
                for column := column to 3 do
                    begin
                        tb[row,column].bstate := BARCO;
                        tb[row,column].bsize:=3;
                    end
            else
                if (way = 'U') or (way ='u') or (way = 'arriba') then
                    for row := row downto 3 do
                        begin
                            tb[row,column].bstate := BARCO;
                            tb[row,column].bsize:=3;
                    end
                else
                    if (way = 'D') or (way = 'd') or (way = 'abajo') then
                        for row := row  to 3 do
                            begin
                                tb[row,column].bstate := BARCO;
                                tb[row,column].bsize:=3;
                            end;
        write('&& BARCO (Longitud 2) && - Selecciona la direccion para ubicarlo: [U]arriba/[D]abajo/[L]izquierda/[R]derecha?: ');
        readln(way);
        writeln();
        repeat
            write('Por favor, del 1 al 8, indica la coordenada de la fila: ');
            readln(row);
            writeln();
            write('Por favor, del 1 al 8, indica la coordenada de la columna: ');
            readln(column);
            Sound(220);        { Beep }
            Delay(200);        { Durante 200 ms }
            NoSound;           { Y... silencio! }
            writeln();
            if (row>8) and (column>8) then
                begin
                textcolor(red);
                writeln('&& ERROR: Esta fuera de rango!');
                textcolor(white);
                writeln();
                readln();
                end;
        until row<=8;
        if (way = 'L') or (way = 'l') or (way = 'izquierda') then
            for column := column  downto 2 do
                begin
                    tb[row,column].bstate := BARCO;
                    tb[row,column].bsize:=2;
                end
        else
            if (way = 'R') or (way = 'r') or (way='derecha') then
                for column := column to 2 do
                    begin
                    tb[row,column].bstate := BARCO;
                    tb[row,column].bsize:=2;
                end
            else
                if (way = 'U') or (way ='u') or (way = 'arriba') then
                    for row := row downto 2 do
                        begin
                            tb[row,column].bstate := BARCO;
                            tb[row,column].bsize:=2;
                        end
                else
                    if (way = 'D') or (way = 'd') or (way = 'abajo') then
                        for row := row  to 2 do
                            begin
                                tb[row,column].bstate := BARCO;
                                tb[row,column].bsize:=2;
                            end;
        repeat
            textcolor(yellow);
            writeln('&& ULTIMO Barco para ubicar, selecciona ubicacion: ');
            textcolor(white);
            writeln();
            write('Por favor, del 1 al 8, indica la coordenada de la fila: ');
            readln(row);
            writeln();
            write('Por favor, del 1 al 8, indica la coordenada de la columna: ');
            readln(column);
            Sound(220);        { Beep }
            Delay(200);        { Durante 200 ms }
            NoSound;           { Y... silencio! }
            writeln();
            if (row>8) and (column>8) then
                begin
                textcolor(red);
                writeln('&& ERROR: Esta fuera de rango!');
                textcolor(white);
                writeln();
                readln();
                end;
        until row<=8;
        begin
            tb[row,column].bstate := BARCO;
            tb[row,column].bsize:=1;
        end
end;