Jump to content

Escrever nome e depois repetir a primeira letra de cada palavra


Catarina Silvestre
 Share

Recommended Posts

esta é a resolução esperada para um exercício de inicialização

(assumindo que os dados inseridos estão de acordo com o pedido)

- declarar/iniciar as variáveis necessárias

- enquanto não tens uma frase
 - pede um nome completo com as primeiras letras de cada nome como maiúsculas
 - lê os dados do teclado
 - se houve erro na leitura
   - apresenta uma mensagem de erro
   - sai da aplicação

- ciclo de apresentação das iniciais
 - se o caracter iterado pelo ciclo for uma letra maiúscula
   - apresenta o caracter iterado mais o caracter ponto (.) separador

- fim

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Boa noite.

Presumo que estejas a aprender e eu não sei o que é que já sabes, mas vou tentar explicar com cuidado em comentários ao meu codigo:

int main(){
 char c;
 while(scanf("%c", &c)==1) //a função scanf devolve o numero de caracteres que lê e no EndOfFile devolve 0 (caso de saida do ciclo).
		 if(c<=95 && c>=65) printf("%c.", c); //Todos os caracteres têm o seu codigo ASCII, o das letras maiusculas é entre 65 e 95
 return 0; //quem me ensinou usava o return 0 no fim da main. Há quem use return 1. No fim vai dar ao mesmo.
}

Esta função lê sempre até ao EndOfFile que no teclado é o ctrl+D. Se queres que leia só uma linha, há sempre uma alternativa usando um array de caracteres (string):

#include <stdio.h>

int main(){
 char c[100];
 int i;
 scanf("%[^\n]", c); //%[^\n] é uma expressão regular que significa tudo excepto \n. Ou seja, o scanf vai ler todo o input até encontrar um \n (que significa mudar de linha)
 for(i=0;c[i]!='\0';i++)
		 if(c[i]<=90 && c[i]>=65) printf("%c.", c[i]);
 printf("\n"); // so para ficar mais apresentavel
 return 0;
}

Esta função com mallocs gastava menos memoria, mas acho que ainda não chegaste a essa parte. Se ainda não aprendeste nada sobre arrays, então ignora esta.

Se tiveres alguma duvida podes perguntar.

Espero ter ajudado.

Link to comment
Share on other sites

bem ... já que uma solução foi apresentada ... pequenas correcções/notas são necessárias :

#include <stdio.h>

int main(void) {
 char str[100]; // dar o nome da variável com significado, será uma string e não um caracter
 int i;

 scanf("%100[^\n]", str); // limitar o número de caracteres a serem lidos : prevenir invalid memory access
 for (i = 0; c[i] != '\0' || i == 100; ++i) // não podes assumir que terás sempre o caracter '\0' no final de uma string lida do stdin
                                            // se quiseres, posso te arranjar exemplos em como isso não acontece.
                                            // se é usado um incremento for indiferente de prefixo ou sufixo, então
                                            // o prefixo é recomendado em termos de performance
   if (c[i] >= 'A' && c[i] <= 'Z') // decorar os valores dos caracteres é completamente desnecessário
                                   // além disso, o uso do caracter alphanumérico simplifica a leitura
     printf("%c.", c[i]);

 printf("\n");

 return 0;
}
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Sei que a leitura de strings não deve ser feita preferencialmente por scanf, mas neste caso parece-me uma opção minimamente viável. Sendo o input tão bem definido, torna-se simples usar o primeiro argumento do scanf para fazer este controlo logo à partida. A partir daí, é aplicar o algoritmo já descrito.

#include <stdio.h>

#define BUFFER_SIZE 41

int main(void) {
   char nome[bUFFER_SIZE], apelido[bUFFER_SIZE];

   if (2 != scanf("%41[^ ] %41[^\n]", nome, apelido)) {
       printf("Erro na leitura\n");
       return -1;
   }

   if (nome[0] >= 'A' && nome[0] <= 'Z' && apelido[0] >= 'A' && apelido[0] <= 'Z')
       printf("Abreviatura: %c.%c.", nome[0], apelido[0]);
   else {
       printf("Nome e/ou apelido não começam por maiúscula");
       return -1;
   }
   return 0;
}

EDIT: isto só funciona com nome e apelido, pareceu-me que era só introduzido isso, mas é referido "nome completo". 🙂

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

"bem ... já que uma solução foi apresentada ... pequenas correcções/notas são necessárias"

Não, não são. Se não reparaste eu estava a tentar ensinar algo a alguém que aparentemente começou agora a aprender a programar. É preciso falar da existencia do codigo ASCII, não precisas de o saber de cor, mas convem ter algumas noções, até porque entre o 'Z' e o 'a' estão caracteres especiais. E não vale a pena confundir alguém com noções de buffer e de posições de memória nesta fase. Começa-se pelo básico e o melhor é tentar fazer o codigo mais simples possivel.

Link to comment
Share on other sites

A minha professora de Aplicações Informáticas dizia qualquer coisa deste género, e é algo que eu guardo e aprecio: "Quando um programador experiente tenta simplificar de mais algo a um iniciado, tentando nunca levantar o véu de nada novo, nada mais está a fazer do que passar um atestado de ignorância."

Eu aprendi imenso por vários programadores experientes me terem levantado o véu acerca de coisas que muitas vezes nem sabia que existia. Muito agradeço a esses "incentivos", e eles foram dados aqui no fórum, por sinal.

Portanto, o @Happy introduziu pequenas correcções e/ou modificações que até são boas dicas, e pelo meio eu introduzo a definição de uma constante que dizes ser introdução ao buffer (em vez de "BUFFER_SIZE", podia ter chamado "TAMANHO", pergunto-me se dirias o mesmo acerca do buffer).

De qualquer das formas, estas pequenas dicas são importantes e são parte das bases do C. Não faz mal mostrar a alguém iniciado estas dicas.

É uma opinião pessoal, e vale o que vale.

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

É preciso falar da existencia do codigo ASCII, não precisas de o saber de cor, mas convem ter algumas noções, até porque entre o 'Z' e o 'a' estão caracteres especiais.

hum ... deves ter esquecido que escreveste isto logo a seguir ...

Começa-se pelo básico e o melhor é tentar fazer o codigo mais simples possivel.[/font][/color]

E não vale a pena confundir alguém com noções de buffer e de posições de memória nesta fase.

eu vou ter em conta o número de resposta que já deste neste fórum e presumir que não fazes ideia a quantidade de tópicos abertos sobre esse assunto por pessoas que estão ao nível da pessoa que abriu este tópico ...

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Estás-me a querer dizer que o codigo ASCII não é o básico?

Adiante, não é connosco que alguém vai aprender a programar, não pelo forum pelo menos. Tentamos dar as nossas dicas da melhor forma possivel e, na minha opinião, nao devemos estar a inserir conceitos que a pessoa em causa ainda nao aprendeu. Ela vai lá chegar... programando. O código ASCII de uma maneira ou de outra é necessario para este exercicio e muitos outros deste tipo. Eu aprendi isso na minha segunda aula de programação imperativa.

De qualquer maneira eu ja dei o meu contributo e se houver alguma duvida eu ajudo no que puder/souber.

Cumprimentos

Link to comment
Share on other sites

Concordo com o Hippo. É algo que faz confusão a muitos programadores já com alguma experiência, então quando metes encodings ao barulho, upa upa.

Mas isso já é divagar. Não vejo o problema em usar o termo buffer. Para o programador inexperiente é apenas um nome, ao qual eles se vão habituando até terem a exacta noção do que significa.

Adiante, não é connosco que alguém vai aprender a programar, não pelo forum pelo menos. Tentamos dar as nossas dicas da melhor forma possivel e, na minha opinião, nao devemos estar a inserir conceitos que a pessoa em causa ainda nao aprendeu.

Embora eu seja fã da aprendizagem em contexto de sala de aula, principalmente no início, se procurares pelo fórum vais encontrar múltiplos exemplos de pessoas que aprenderam a programar por elas próprias, recorrendo a livros, tutoriais e fóruns. E o pessoal já está a ir devagar, ninguém lhe apresentou uma solução usando o strtok, embora o cdramos a tenha sugerido, que poderia ser uma solução mais elegante e eficiente.

Link to comment
Share on other sites

E o pessoal já está a ir devagar, ninguém lhe apresentou uma solução usando o strtok, embora o cdramos a tenha sugerido, que poderia ser uma solução mais elegante e eficiente.

Tambem se podia usar RegEx 😛

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

E o pessoal já está a ir devagar, ninguém lhe apresentou uma solução usando o strtok, embora o cdramos a tenha sugerido, que poderia ser uma solução mais elegante e eficiente.

Não é por nada, mas acho o strtok uma função muito mal desenhada, e a evitar quando possível. Neste caso, não estou a ver em que é que permitia obter implementação mais elegante ou eficiente. Isto resolve-se com um simples ciclo.

Link to comment
Share on other sites

Adiante, não é connosco que alguém vai aprender a programar, não pelo forum pelo menos. Tentamos dar as nossas dicas da melhor forma possivel e, na minha opinião, nao devemos estar a inserir conceitos que a pessoa em causa ainda nao aprendeu. Ela vai lá chegar... programando.

Devo ser um caso de estudo, então. 🙂

Knowledge is free!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.