/*
* a8_p1: Contador de palavras
*
* Input: Uma frase escrita pelo utilizador
* Output: Numero de palavras da frase
*/
#include <stdio.h>
#include <string.h>
main()
{
char frase[128];
char caracter, prox_caracter;
int n_palavras, i;
do
{
printf("Escreva uma frase:\n");
gets(frase);
}
while ( strlen(frase) == 0 );
n_palavras = 0;
i = 0;
caracter = frase[i];
prox_caracter = frase[i+1];
while (caracter != '\0')
{
if ( caracter != ' ' && (prox_caracter == ' ' || prox_caracter == '\0') )
n_palavras++;
i++;
caracter = frase[i];
prox_caracter = frase[i+1];
}
if (n_palavras == 0)
printf("Nao foi escrita qualquer palavra!\n");
else if (n_palavras == 1)
printf("Foi escrita apenas %d palavra\n", n_palavras);
else
printf("Foram escritas %d palavras\n", n_palavras);
}
/*
* a8_p2: Contador de vogais
*
* Input: Uma frase escrita pelo utilizador
* Output: Numero de vogais usadas na frase
*/
#include <stdio.h>
#include <string.h>
main()
{
char frase[128];
char caracter;
int n_vogais, i;
do
{
printf("Escreva uma frase:\n");
gets(frase);
}
while ( strlen(frase) == 0 );
n_vogais = 0;
i = 0;
caracter = frase[i];
while (caracter != '\0')
{
if ( strchr("AEIOUaeiou", caracter) != NULL )
n_vogais++;
i++;
caracter = frase[i];
}
if (n_vogais == 0)
printf("Nao foi escrita qualquer vogal!\n");
else if (n_vogais == 1)
printf("Foi escrita apenas %d vogal\n", n_vogais);
else
printf("Foram escritas %d vogais\n", n_vogais);
}
#include <stdio.h>
#include <string.h>
char primeiro[40];
char ultimo[40];
char nome[80];
main()
{
printf("Escreva o primeiro nome (nome proprio): ");
fgets(primeiro, sizeof(primeiro), stdin);
primeiro[strlen(primeiro)-1] = '\0';
printf("Escreva o ultimo nome (apelido): ");
fgets(ultimo, sizeof(ultimo), stdin);
ultimo[strlen(ultimo)-1] = '\0';
strcpy(nome, primeiro);
strcat(nome, " ");
strcat(nome, ultimo);
printf("O nome e' %s\n", nome);
}
/*
* a8_p4a: Formata nome completo
*
* Input: Nome completo
* Output: Nome completo formatado e num de caracteres
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define SIZE 100
#define TRUE 1
#define FALSE 0
main()
{
char nome[SIZE], buffer[SIZE];
char caracter;
int i, i_substr, encontrou;
long int e_substr;
/* Recebe um nome completo do teclado */
do
{
printf("Escreva um nome completo:\n");
fgets(nome, sizeof(nome), stdin );
}
while ( strlen(nome) == 0 );
nome[strlen(nome)-1] = '\0';
/* Converte nome para letras maiusculas */
for( i = 0; i < SIZE; i++ )
{
buffer[i] = toupper(nome[i]);
}
/* Retira substring "E" e "&" */
do
{
encontrou = TRUE;
if ( strstr(buffer, " E "))
e_substr = (long int)strstr(buffer, " E ");
else if( strstr(buffer, " & "))
e_substr = (long int)strstr(buffer, " & ");
else
encontrou = FALSE;
if (encontrou == TRUE)
{
i_substr = e_substr - (long int)buffer;
for (i = i_substr; i < SIZE-2; i++)
buffer[i] = buffer[i+2];
}
}
while(encontrou == TRUE);
/* Retira substrings "DA", "DE", "DO" */
do
{
encontrou = TRUE;
if ( strstr(buffer, " DA "))
e_substr = (long int)strstr(buffer, " DA ");
else if( strstr(buffer, " DE "))
e_substr = (long int)strstr(buffer, " DE ");
else if ( strstr(buffer, " DO "))
e_substr = (long int)strstr(buffer, " DO ");
else
encontrou = FALSE;
if (encontrou == TRUE)
{
i_substr = e_substr - (long int)buffer;
for (i = i_substr; i < SIZE-3; i++)
buffer[i] = buffer[i+3];
}
}
while(encontrou == TRUE);
/* Retira substrings "DAS", "DOS" */
do
{
encontrou = TRUE;
if ( strstr(buffer, " DAS "))
e_substr = (long int)strstr(buffer, " DAS ");
else if ( strstr(buffer, " DOS "))
e_substr = (long int)strstr(buffer, " DOS ");
else
encontrou = FALSE;
if (encontrou == TRUE)
{
i_substr = e_substr - (long int)buffer;
for (i = i_substr; i < SIZE-4; i++)
buffer[i] = buffer[i+4];
}
}
while(encontrou == TRUE);
printf("%s\n(%d caracteres)\n", buffer, strlen(buffer));
}
Obs: Repara que esta solução, embora de leitura simples, adopta uma análise por casos que exige várias passagens pela string para a depurar completamente das substrings "de", "do", "das", etc. A solução que se segue, faz a mesma depuração com uma só passagem pela string original e já tira partido de uma técnica que é apanágio da programação estruturada: a definição de funções e passagens de parâmetros para funções.
/*
* a8_p4b: Formata nome completo
*
* Input: Nome completo
* Output: Nome completo formatado e num de caracteres
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define SIZE 100
#define TRUE 1
#define FALSE 0
/*
* converte a string 's' para maiusculas
*/
void maiusculas( char s[] )
{
int i;
for( i = 0; i < strlen(s); i++ )
s[i] = toupper(s[i]);
}
/*
* converte a string 's' para minusculas
*/
void minusculas( char s[] )
{
int i;
for( i = 0; i < strlen(s); i++ )
s[i] = tolower(s[i]);
}
/*
* verifica se um caracter e branco
*
* Input: Um caracter 'c'
* Output: TRUE se 'c' for um espaco ou um 'tab', FALSE caso contrario.
*/
int eh_branco( char c )
{
return ( c == ' ' || c == '\t' );
}
/*
* salta caracteres brancos num array
*
* Input: Uma string 's' e uma posicao 'k'
* Output: Devolve a primeira posicao i (i>=k) tal que s[i] nao eh branco
*/
int salta_brancos( char s[], int k )
{
int i = k;
while( i<strlen(s) && eh_branco(s[i]) )
i++;
return (i);
}
/*
* Input: Uma string 's' e uma posicao 'k'.
* A funcao assume que s[k] nao eh um caracter branco.
* Output: 'palavra' vai ser string que contem uma sequencia maxima
* de caracteres s[k..i], todos eles nao brancos.
* Devolve a posicao i+1
*/
int apanha_palavra( char s[], int k, char palavra[] )
{
int i, j;
j = 0;
i = k;
while( i<strlen(s) && !eh_branco(s[i]) )
{
palavra[j] = s[i];
j++;
i++;
}
palavra[j] = '\0';
return (i);
}
/*
* Input: Uma string 's'
* Output: TRUE se 's' eh "e", "&", "de", "da", "do", "das", "dos".
* FALSE caso contrario.
*
* Nota: a funcao nao distingue maiusculas e minusculas.
*/
int eh_e_da_de_do_das_dos( char s[] )
{
char temp[SIZE];
strcpy( temp, s );
minusculas( temp );
return( strcmp( temp, "e") == 0 ||
strcmp( temp, "&") == 0 ||
strcmp( temp, "da") == 0 ||
strcmp( temp, "de") == 0 ||
strcmp( temp, "do") == 0 ||
strcmp( temp, "das") == 0 ||
strcmp( temp, "dos") == 0 );
}
/*
* A ideia do programa eh ir engolindo as palavras uma a uma
* e filtrar os "de", "do", "da", etc.
*
* Uma frase eh uma sequencia de:
* 0 ou mais caracteres brancos seguida de
* 1 ou mais caracteres nao brancos seguida de
* 1 ou mais caracteres brancos seguida de
* 1 ou mais caracteres nao brancos seguida de
* ...
* ...
* seguida de '\0'
*/
main()
{
char nome[SIZE]; /* nome completo */
char nomef[SIZE] = ""; /* nome formatado */
char palavra[SIZE];
int i;
/* Recebe um nome completo do teclado */
do
{
printf("Escreva um nome completo:\n");
fgets(nome, sizeof(nome), stdin );
}
while ( strlen(nome) == 0 );
nome[strlen(nome)-1] = '\0'; /* -1 porque o fgets mete um '\n' */
maiusculas( nome );
i = 0;
i = salta_brancos( nome, i );
while( i < strlen(nome) )
{
i = apanha_palavra( nome, i, palavra );
if( !eh_e_da_de_do_das_dos( palavra ) )
{
strcat( nomef, palavra );
strcat( nomef, " " );
}
i = salta_brancos( nome, i );
}
/* elimina o ultimo espaco */
if( strlen(nomef) > 0 )
nomef[ strlen(nomef) - 1 ] = '\0';
printf("%s\n(%d caracteres)\n", nomef, strlen(nomef) );
}
/*
* a8_p5a: Formata nome
*
* Input: Nome escrito descuidadamente
* Output: Nome escrito adequadamente
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define TRUE 1
#define FALSE 0
main()
{
char nome[80], buffer[80];
int i, j;
int primeira_letra, encontrou;
long int e_substr;
/* Recebe uma string */
do
{
printf("Escreva um nome: ");
fgets(nome, sizeof(nome), stdin);
}
while ( strlen(nome) == 0 );
nome[strlen(nome)-1] = '\0';
/* Limpa espacos e atribui maiusculas/minusculas */
i = 0; j = 0; primeira_letra = TRUE;
do
{
while(nome[i] != ' ' && nome[i] != '\0')
{
if(primeira_letra == TRUE)
{
buffer[j] = toupper(nome[i]);
primeira_letra = FALSE;
}
else
buffer[j] = tolower(nome[i]);
i++; j++;
}
if (nome[i] == ' ')
{
buffer[j] = ' ';
primeira_letra = TRUE;
j++;
}
while(nome[i] == ' ')
i++;
}
while(nome[i] != '\0');
buffer[j] = '\0';
/* Transforma "E/Da/De/Do/Das/Dos" em "e/da/de/do/das/dos" */
do
{
encontrou = TRUE;
if ( strstr(buffer, " E "))
e_substr = (long int)strstr(buffer, " E ");
else if ( strstr(buffer, " Da "))
e_substr = (long int)strstr(buffer, " Da ");
else if( strstr(buffer, " De "))
e_substr = (long int)strstr(buffer, " De ");
else if ( strstr(buffer, " Do "))
e_substr = (long int)strstr(buffer, " Do ");
else if( strstr(buffer, " Das "))
e_substr = (long int)strstr(buffer, " Das ");
else if ( strstr(buffer, " Dos "))
e_substr = (long int)strstr(buffer, " Dos ");
else
encontrou = FALSE;
if (encontrou == TRUE)
{
i = e_substr - (long int)buffer + 1;
buffer[i] = tolower(buffer[i]);
}
}
while(encontrou == TRUE);
strcpy(nome, buffer);
puts(nome);
}
Obs: Repara que também esta solução adopta uma análise que exige várias passagens pela string para a formatar conforme foi pedido. A solução que se segue, faz o mesmo com uma só passagem pela string original e voltando a tirar partido das funções desenvolvidas para o programa anterior.
/* * a8_p5b: Formata nome * * Input: Nome escrito descuidadamente * Output: Nome escrito adequadamente */ #include <stdio.h> #include <string.h> #include <ctype.h> #define SIZE 100 #define TRUE 1 #define FALSE 0
/*
* incluir as funcoes feitas para o problema 4.
*/
/*
* O programa eh quase igual ao problema 4
*/
main()
{
char nome[SIZE]; /* nome completo */
char nomef[SIZE] = ""; /* nome formatado */
char palavra[SIZE];
int i;
/* Recebe um nome completo do teclado */
do
{
printf("Escreva um nome completo:\n");
fgets(nome, sizeof(nome), stdin );
}
while ( strlen(nome) == 0 );
nome[strlen(nome)-1] = '\0'; /* -1 por causa do '\n' */
minusculas( nome );
i = 0;
i = salta_brancos( nome, i );
while( i< strlen(nome) )
{
i = apanha_palavra( nome, i, palavra );
if( !eh_e_da_de_do_das_dos( palavra ) )
{
/* a primeira letra da palavra passa a maiuscula */
palavra[0] = toupper( palavra[0] );
}
strcat( nomef, palavra );
strcat( nomef, " " );
i = salta_brancos( nome, i );
}
/* elimina o ultimo espaco */
if( strlen(nomef) > 0 )
nomef[ strlen(nomef) - 1 ] = '\0';
printf("%s\n(%d caracteres)\n", nomef, strlen(nomef) );
}
/*
* a8_p6: Ordena lista de N palavras
*
* Input: N palavras (do teclado)
* Output: Essas N palavras escritas por ordem crescente
*/
#include <stdio.h>
#include <string.h>
#define N 10
char nomes[N][80];
void PreencheArray(void)
{
int i;
printf("Escreva %d palavras (fazendo Enter apos cada palavra)\n", N );
for (i = 0; i < N; i++)
gets(nomes[i]);
}
void MostraArray(void)
{
int i;
puts("");
for (i = 0; i < N; i++)
printf("nomes[%d] = %s\n", i, nomes[i]);
}
void OrdenaArray(void)
{
char min_palavra[80];
char temp[80];
int i, k, m;
/* Ordenar o array */
for( k = 0; k <= N-1; k++ )
{
/* descobre o indice do minimo em a[k], a[k+1], ..., a[N-1] */
strcpy(min_palavra, nomes[k]);
m = k;
for( i = k; i <= N-1; i++ )
if ( strcmp(nomes[i], min_palavra) < 0 )
{
strcpy(min_palavra, nomes[i]);
m = i;
}
/* troca a[k] com a[m] */
strcpy(temp, nomes[k]);
strcpy(nomes[k], nomes[m]);
strcpy(nomes[m], temp);
}
}
main()
{
/* array nomes com 'global scope' */
PreencheArray();
MostraArray();
printf("\nArray em ordenacao...\n");
OrdenaArray();
MostraArray();
}