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

Anuncios

[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;
}

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

Punteros en C/C++

Los punteros son un tipo de dato especial, el cual guarda una direccion de memoria. Podemos usar un puntero para modificar un dato utilizando su dirección de memoria.

Los punteros deben apuntar a cierto tipo de dato (por ejemplo a int o a char, etc.). Por ejemplo, para guardar la dirección de memoria de una variable entera llamada “numero” (int), declaramos el puntero de la manera que sigue:

La declaración de un puntero es así:


int numero;
int * puntero;

puntero = &numero;

Primero que todo, notamos que la variable “puntero” se antepone de un asterisco, el asterisco (*) se utiliza para decirle al compilador que estamos declarando un puntero. Sigue leyendo

Estructuras en C/C++

En este primer post de contenidos, les hablaré de lo que son las estructuras y cómo utilizarlas en C y C++.

Una estructura es un tipo de dato compuesto de uno o más tipos de datos.

¿Para que nos sirve? Las estructuras nos ayudan a agrupar datos de una manera más ordenada y fácil para nosotros. Por ejemplo, supongamos que queremos guardar el nombre, la edad y el número de teléfono de un contacto en un programa en C/C++.

Podríamos hacer esto:

#include<iostream>
using namespace std;
int main()
{

    int edad,numero;
    char nombre[30];
    cout << "Ingrese Nombre: ";
    cin >> nombre;
    cout << "Ingrese Edad: ";
    cin >> edad;
cout << "Ingrese Numero: ";
cin >> numero;
cout << "\nNombre: " << nombre << "\nEdad: " << edad << "\nNumero de Telefono: " << numero << endl;
return 0;
}

Nota: Código en C++, pero traspasar código de C++ a C o viceversa, no es muy complicado.   Utilizando estructuras, sería así:

Sigue leyendo