¿Que debo aprender para ser desarrollador web?

295568_10201120688516438_2073153959_nNota: En esta oportunidad les quiero compartir un articulo que escribí hace mas de un año y medio. Ahora, con un poco mas de madurez y conocimientos, considero que hay puntos que deben debatirse, por lo cual lo dejo para intercambiar opiniones o bien porque aun sigue siendo una guia sobre las cosas que se recomiendan aprender para iniciarse en el desarrollo web.

Yo creo que todos nos hacemos esta pregunta al iniciarnos en el mundo del desarrollo web, incluyéndome.

Antes de ver lo que necesitamos, debemos saber lo siguiente. Existen 2 tipos de páginas web:

       1. Páginas Estáticas: El contenido de estas páginas siempre es el mismo. Por ejemplo el sitio web de una empresa.

       2. Páginas DinámicasImagina que tienes una página web en la cual necesitas agregar contenido cada cierto tiempo, y editar el código de nuestra web para agregar contenido, no es muy cómodo, además de no permitir indexar noticias, ni agregar usuarios ni otras funcionalidades.Por ejemplo: Sitio Web de Noticias, Artículos, Tiendas Online, etc.

Sigue leyendo

Macros en C y C++

Imagen del Twitter de “The Define School”

Los macros son muy utilizados en C y C++. Estos básicamente son un alias que podemos incluir en nuestro código el cual, al momento de compilar, sera reemplazado por lo que hayamos definido.

Creo que sera mucho mas fácil entenderlo con un ejemplo.

Este código:

#include
#define VALOR_MACRO 100

int main(){
    printf("El valor del macro es: %d", VALOR_MACRO);
}

La salida de este programa es: “El valor del macro es: 100”.

Sigue leyendo

[Google CodeJam] Qualification Round 2012 – Speaking in Tongues

Aquí les dejo la solución del problema “Speaking in Tongues”, pueden ver su enunciado (en inglés) aquí . El problema básicamente trata de que tenemos una lengua llamada “Googlerese”, la cual, tiene las mismas letras que el alfabeto inglés, con la particularidad de que para cada letra del alfabeto, existe un equivalente en la lengua Googlerese. Esas equivalencias tenemos que encontrarlas nosotros con los ejemplos que nos dan.

Haciendo un análisis manual, llegue a encontrar una relación. En el código se pueden notar 2 arreglos:

-Googlerese: Alfabeto Googlerese.

-English: Alfabeto Inglés.

Las posiciones de ambos alfabetos son las correspondientes a su traducción, e.g. La letra ‘k’ del alfabeto Googlerese, es equivalente a la letra ‘i’ del alfabeto inglés.

El objetivo de la solución es traducir una serie de frases (N frases) al inglés.

Aquí les dejo la solución, no la explico mucho porque creo que con un poco de esfuerzo se podra deducir todo lo que hice.

Lo que encuentro que puede causar confusión es la línea que dice “if(word[i]-32)”.  Al escribir la sentencia anterior, es equivalente a que escribiera “if(word[i]==32)”, ya que C++ al evaluar una igualdad resta al parámetro de la izquierda de la igualdad, el parámetro de la derecha, y ese resultado lo compara con cero. Lo comparo con 32 debido a que 32 es el código ASCII equivalente al espacio en blanco (‘ ‘).

Ahora sí, el código de mi solución:

#include
#include

using namespace std;

char Googlerese[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',' '};
char English[] = {'y','h','e','s','o','c','v','x','d','u','i','g','l','b','k','r','z','t','n','w','j','p','f','m','a','q',' '};

void speak(string word)
{
for(int i=0; i<word.length(); i++)
{
if(word[i]-32)
cout << English[word[i]-97];
else
cout << " ";
}
cout N;
cin.ignore();
string word;
while(N--)
{
getline(cin,word);
cout << "Case #" << i++ << ": ";
speak(word);
}
return 0;
}

[Google CodeJam] Qualification Round Africa 2010 – Reverse Words

Les dejo la solución de un problema que no era muy complicado (http://code.google.com/codejam/contest/351101/dashboard#s=p1), pero me costó porque nunca había tenido que solucionar un algoritmo que tuviera que leer una frase (con espacios entre cada palabra) en C++, ya que si usamos el típico “std::cin>>frase”, se lee hasta el primer espacio. La solución fue usar la sentencia “getline(cin,frase)”, a la cual se le puede agregar un tercer parámetro indicando hasta que carácter leer (por ejemplo le puedo decir que lea hasta el primer guion bajo), si se omite, se leerá hasta el primer salto de linea (caracter ‘\n’).

El algoritmo básicamente lee la frase entregada desde el final hasta el primer espacio. Por cada espacio que encuentre, imprimirá lo leído hasta el momento. Es un algoritmo eficiente, o al menos eso supongo, ya que resolvió la entrada “larga” a tiempo.

Nota1: Para cambiar el fichero de entrada, se debe cambiar el primer parámetro en la línea que dice ” freopen(“B-large-practice.in”,”r”,stdin)”, poniendo el nombre del fichero de entrada deseado.

Nota2: El programa genera un fichero de salida llamado “out.out” con la salida formateada correspondiente.

#include <iostream>
#include<cstdio>

using namespace std;

void substring(string word, int start, int end, int spaces)
{
    string substring = "";
    for(int i=start;i<=end;i++)
        cout << word[i];
    if(spaces)
    cout << " ";
}

void reverse(string word)
{
    string reversedWord = "";
    unsigned int end = word.length();
    for(int i=word.length();i>=0;i--)
    {
        if(word[i]==' ')
        {
            substring(word,i+1,end-1,1);
            end = i;
        }
    }
    substring(word,0,end-1,0);
}

int main()
{
    int N;
    string word;
    freopen("B-large-practice.in","r",stdin);
    freopen("out.out","w",stdout);
    cin >> N;
    getline(cin,word);
    int i=1;
    while(N--)
    {
        getline(cin,word);
        cout << "Case #" << i++ << ": ";
        reverse(word);
        cout << endl;
    }
    return 0;
}

Programación Orientada a Objetos (Parte II) – Encapsulamiento, Herencia y Polimorfismo

Continuando con el post anterior sobre POO, procederemos a aclarar los términos de Encapsulación, Herencia y Polimorfismo.

Antes de ver estos temas, vamos a ver lo que se denomina Sobrecarga de operadores, lo que se refiere a la posibilidad de que tener una misma función, pero que se comporte de distinta manera dependiendo de los parámetros que le entreguemos, por ejemplo, nuestro constructor de la clase Vehiculo actualmente recibe como parámetro un String correspondiente a la patente, pero supongamos que no tenemos la patente, podemos crear otro constructor que no reciba parámetros y le asigne los valores que definamos nosotros a nuestro objeto, veamos un ejemplo de 4 constructores con distintos parámetros:


public Vehiculo(String patente, int velocidad) {
 this.patente = patente;
 this.velocidad = velocidad;
 }

public Vehiculo(int velocidad) {
 this.patente = "No asignada";
 this.velocidad = velocidad;
 }

public Vehiculo(String patente) {
 this.patente = patente;
 this.velocidad = 0;
 }

 public Vehiculo() {
 patente = "No asignada";
 velocidad = 0;
 }

Sigue leyendo

Programación Orientada a Objetos (Parte I) – Introducción

La programación orientada a objetos es un paradigma de programación en el cual hacemos una abstracción de la realidad.

Esta abstracción, se hace mediante una clase, la cual posee atributos (datos o características) y métodos (funciones). Para que se entienda mejor, les mostrare un ejemplo.
Supongamos tenemos un vehiculo, un vehiculo posee muchas características (color, peso, patente, velocidad etc) y también puede hacer muchas cosas (acelerar, frenar, virar, etc).  Toda esta abstracción se realiza en una sola estructura, nuestra clase vehiculo, donde manejamos todas estas cosas.
En este caso, nuestro objeto “vehiculo”  tiene atributos tales como color, peso, patente, velocidad, etc. además de los métodos acelerar, frenar, virar, etc.

Vamos a implementar una clase auto, la cual contiene como atributos: “velocidad y patente” y como métodos “acelerar y frenar”.

Veamos una implementación de esta clase “vehiculo” en java: Sigue leyendo

La importancia de los “warning” del compilador

He visto como muchos programas que en un principio “corren”, pero más adelante nos dan errores que no tenemos idea de donde vienen, el compilador siempre (o casi siempre) te advierte de esos errores, pero uno lo toma en cuenta. Me he dado cuenta de que algunos compañeros de carrera no se dan cuenta de sus errores, siendo que la respuesta muchas veces esta en el mismo compilador (muchas veces, ya que no siempre la respuesta es tan clara). Por ejemplo, supongamos el siguiente código:

#include<stdio.h>
int main()
{
int variable;
printf("Ingrese un numero: ");
scanf("%i",variable);
printf("Ingresaste el numero %i \n",variable);
return 0;
}

Si lo ejecutamos, nos sale esto:

Cuál fue el error aquí? Sigue leyendo