Ejercicios resueltos laboratorio 13 - Cadenas de caracteres (strings)

Asignatura: Fundamentos de Informática
Especialidad: Electrónica - UPV/EHU
Curso académico: 2013-2014
Profesor: Ismael Etxeberria Agiriano

Enunciado del ejercicio 13-000

Escribe un programa C que pida una frase y la convierta a "lenguaje de mensajes SMS", escribiéndola a continuación en pantalla.

Las normas para convertir la frase a SMS son las siguientes:

Se supone que la frase inicial está en minúsculas y que puede contener un máximo de 255 caracteres.

Ejemplo: Si la frase inicial leída es cad1:


Figura 13.1. Frase a traducir al lenguaje de los SMS.

La cadena con el resultado del mensaje SMS cad2 será:


Figura 13.2. SMS correspondiente a la frase traducida.

Nota: los puntos suspensivos posteriores al terminador de la cadena indican que el contenido es indiferente.

Ejemplo de ejecución:


Dime una frase: quedamos a las 3 y paso por tu casa para ver la peli
Mensaje SMS: kdams a las 3 y pas x t casa xa vr la pl

Nota: el texto subrayado del ejemplo es el introducido por teclado.

Resolución del ejercicio 13-000

Una posible resolución de este ejercicio se proporciona a continuación:


/* 13-000.c */

#include <stdio.h>

int EsVocal (int car);

void main (void)
{
  char fra[256];
  char sms[256];
  int  i, j;

  printf ("Introduce la frase: ");
  gets (fra);

  for (i = j = 0; fra [i] != '\0'; i++) {
    if (fra[i] == 'q' && fra[i+1] == 'u') {
      sms[j++] = 'k';
      i++;  /* Adelantamos la 'u' ya leía */
    }
    else if (fra[i] == 'p' &&
            (fra[i+1] == 'o' || fra[i+1] == 'a') &&
             fra[i+2] == 'r') {
      sms[j++] = 'x';
      i += 2;  /* Adelantamos "or" o "ar" ya leídos */
    }
    else if (!EsVocal (fra[i]) || fra[i] == 'a')
      sms[j++] = fra[i];
    /* Si no ignoramos el carácter, es decir, no lo compiamos */
  }
  sms[j] = '\0';
  printf ("Frase: [%s]\nSms:   [%s]\n", fra, sms);
}

int EsVocal (int car)
{
  return car == 'a' || car == 'e' || car == 'i' || car == 'o' || car == 'u';
}