MAC0122  Princípios de Desenvolvimento de Algoritmos
Home  |   Administração  |   Fórum  |   Livros  |   WWW  |   Diário  |   Tarefas  |   Alunos

 

Cadeias de caracteres (= strings)

Este é um resumo da seção 3.3, p.123-138, do livro do Eric Roberts.

Pig Latin

A função abaixo foi copiada (com algumas modificações) da figura 3-5, p.130, do livro de Eric Roberts.

typedef char *string;

#include <stdlib.h> // preciso de malloc
#include <string.h> // preciso de strlen etc.
#include <ctype.h>  // preciso de tolower
string PigLatin( string word);
string FindFirstVowel( string word);

#define MaxWord  20


int main( void)
{
    char word[MaxWord+1];

    printf( "Enter a word with no more than %d letters: ", MaxWord);
    scanf( "%s", word);
    printf( "Pig Latin: %s\n", PigLatin( word));
    return 0;
}


// Function: PigLatin
// ------------------
// This function translates a word from English to Pig Latin.  
// The rules for forming Pig Latin words are as follows:
// 
// o If the word begins with a vowel, add "way" to the
//   end of the word.
// o If the word begins with a consonant, extract the 
//   consonants up to the first vowel, move that substring
//   to the end of the word, and add "ay". 
// 
// Examples: Inglês     PigLatin
//           ----------------------
//           ash        ashtray
//           structure  ucturestray
//           pointer    ointerpay
//           address    addressway

string PigLatin( string word)
{
    string vp, pig;
    int wordLength;

    wordLength = strlen( word);
    vp = FindFirstVowel( word);
    if (vp == word) {
        wordLength += 3;
    } else if (vp != NULL) {
        wordLength += 2;
    }
    pig = malloc( wordLength * sizeof (char) + 1);
    if (vp == NULL) {
       strcpy( pig, word);
    } else if (vp == word) {
       strcpy( pig, word);
       strcat( pig, "way");
    } else {
       strcpy( pig, vp);
       strncat( pig, word, vp - word);
       strcat( pig, "ay");
    }
    return pig;
}

// The FindFirstVovel function returns the address of the 
// first vowel in word. If word does not contain a vowel, 
// the function returns NULL.

string FindFirstVowel( string word)
{
    char *cp;
    for (cp = word; *cp != '\0'; cp++) {
       char c = tolower( *cp);
       if (c == 'a' || c == 'e' || c == 'i' 
           || c == 'o' || c == 'u')
              return cp;
    }
    return NULL;
}

Exercícios

  1. Escreva o código de uma função que faça o mesmo que strncat.

  2. A documentação da função PigLatin omite o caso de palavras sem vogais. O que a função faz com uma palavra que só têm consoantes?

  3. Escreva um programa que use a função PigLatin para traduzir um texto que consiste em uma seqüência de palavras.

  4. [Roberts, p.128]  O que há de errado?
         char *src = "Alo";
         char *dst;
         strcpy( dst, src);
    

 


A biblioteca strlib de Roberts

Eric Roberts escreveu uma biblioteca de manipulação de cadeias que é mais amigável que a biblioteca padrão pois faz as necessárias alocações dinâmicas internamente. O arquivo-interface dessa biblioteca é strlib.h e a correspondente implementação está em strlib.c.

Veja como a função PigLatin fica mais simples e mais legível se usarmos as funções da biblioteca de Eric Roberts:

#include "strlib.h"

string PigLatin( string word)
{
    int vp; 
    string head, tail;

    vp = FindFirstVowel( word);
    if (vp == -1) {
        return word;
    } else if (vp == 0) {
        return Concat( word, "way");
    } else {
       head = SubString( word, 0, vp - 1);
       tail = SubString( word, vp, StringLength( word) - 1);
       return Concat( tail, Concat( head, "ay"));
    }
}

 


Exercícios

  1. [Roberts 5, p.156]  Escreva uma função que receba uma cadeia de caracteres, converte o primeiro caracter (se ele for uma letra) para maiúscula e converte os demais caracteres que forem letras para minúsculas. Por exemplo, transforma "BOOLEANO" em "Booleano". Outro exemplo: transforma "boolean0" em "boolean0".

  2. [Roberts 6, p.156]  Escreva uma função que verifica se uma dada cadeia de caracteres é ou não é um palíndromo. Um palíndromo é uma palavra que pode ser lida, indiferentemente, da esquerda para a direita ou da direita para a esquerda. Exemplo: "ovo".

  3. [Roberts 9, p.157]  Escreva um programa que receba um arquivo texto e diga quantas linhas, quantas palavras e quantos caracteres ele tem. O fim de cada linha é indicado pelo caracter \n; você pode supor que o arquivo termina com um \n. Uma palavra é qualquer seqüência maximal de caracteres não-brancos (um caracter branco é  ' ', '\n', '\r', '\t', '\v').  O programa deve aceitar o nome de um arquivo na linha de comando e exibir a resposta na tela do monitor. Compare o comportamento do seu programa com o programa wc (abreviatura de word count) presente em qualquer sistema Unix ou GNU/Linux.

 


Veja minhas anotações sobre Cadeias de Caracteres.
URL of this site: www.ime.usp.br/~pf/mac0122-2003/
Last modified: Mon Oct 9 07:14:45 BRT 2017
Paulo Feofiloff
IME-USP