Problemas usando strings

Problema 1:

Faça um programa que lê uma linha de texto em uma string (sequência de caracteres terminada por '\0') e que conta o número de ocorrências de cada letra do alfabeto.

Solução:

#include <stdio.h>
#define LIM 100

int main(){
  char str[LIM];
  int i, nletras = 'z' - 'a' + 1;
  int freq[LIM];

  /* Lê uma linha de texto */
  scanf("%[^\n]", str);

  /* Inicializa com 0 o vetor de contadores */
  for(i = 0; i < nletras; i++){
    freq[i] = 0;
  }

  /* Percorre a string, contando a frequência das letras */
  i = 0;
  while(str[i] != '\0'){
    /* Identifica letras minúsculas */
    if(str[i] >= 'a' && str[i] <= 'z')
      freq[str[i] - 'a']++;
    /* Identifica letras maiúsculas */
    else if(str[i] >= 'A' && str[i] <= 'Z')
      freq[str[i] - 'A']++;
    i++;
  }

  /* Imprime a frequência das letras com contagem não nula */
  for(i = 0; i < nletras; i++){
    if(freq[i] > 0)
      printf("letra: %c, freq: %d\n", 'a'+i, freq[i]);
  }
  
  return 0;
}
  

Problema 2:

Dada uma string, composta por uma linha de texto, faça um programa que altera o estilo do texto invertendo as palavras da frase imitando o mestre Jedi Yoda.

Por questões de simplicidade, vamos considerar apenas duas regras que funcionam para alguns casos particulares:

Sentenças negativas: Reorganize a frase movendo o "not" para o final. Por exemplo: "I will not help you" se transforma em "I will help you not".
Demais sentenças: Tome as duas primeiras palavras da frase, e coloque elas no final da frase. Exemplos:
"you will talk like yoda" muda para "talk like yoda, you will".
"you have much to learn" vira "much to learn, you have".
yoda_fig1 yoda_fig2

Curiosidade: Essa questão é baseada nos sites: the Yoda-speak generator
http://www.yodaspeak.co.uk/
http://www.yodajeff.com/pages/talk/likeyoda.shtml

Solução:

A solução abaixo trata apenas o segundo caso das demais sentenças.

#include <stdio.h>
#include <string.h>

int main(){
  char palavras[20][30];
  char pal[30];
  int r,i,n;
  char ch;

  i = 0;
  while(1){
    r = scanf("%s", pal);
    if(r == EOF || r == 0) break;
    else{
      strcpy(palavras[i], pal);
      i++;
    }
    ch = getchar();
    while(ch == ' ')
      ch = getchar();
    if(ch == '\n')
      break;
    else
      ungetc(ch, stdin);
  }

  n = i;

  for(i = 2; i < n-1; i++){
    printf("%s ", palavras[i]);
  }
  printf("%s", palavras[n-1]);
  printf(", %s ", palavras[0]);
  printf("%s\n", palavras[1]);

  return 0;
}
  

Problema 3:

Cebolinha é um personagem de história em quadrinhos que quando falava, trocava o "r" pelo "l" (problema conhecido como dislalia). Faça a seguinte função abaixo que gera em dest uma versão do texto contido em src com todos "r" e "rr" trocados por "l", exceto no caso em que o "r" ocorre no final de uma palavra.

void Cebolinha(char dest[], char src[]);

cebola_fig1

Solução:

#include <stdio.h>
#include <string.h>

void Cebolinha(char dest[], char src[]){
  int j,i,n;
  char c;
  n = strlen(src);
  j = 0;
  for(i = 0; i < n; i++){
    if(src[i] == 'r' && src[i+1] >= 'a' && src[i+1] <= 'z'){
      if(src[i+1] == 'r')
        i++;
      c = 'l';
    }
    else 
      c = src[i];

    dest[j] = c;
    j++;
  }
  dest[j] = '\0';
}

int main(){
  char dest[500];
  char src[] = "e chega de disputar essa rua com a monica, eu poderei comprar ruas bairros cidades";
  
  Cebolinha(dest, src);
  printf("%s\n", dest);
  
  return 0;
}