Catarina Silvestre Posted March 11, 2014 at 06:27 PM Report #548259 Posted March 11, 2014 at 06:27 PM Digite um nome que inicia com letras maisculas e de seguida permita escrever o nome com as iniciais: Eli Vieira -> E.V Exemplo: Digite o nome completo com iniciais maiusculas: Raquel Pereira Nome abreviado: R.P. Agradeço que alguem me ajude, que eu não estou a ver como tenho de fazer.
HappyHippyHippo Posted March 11, 2014 at 06:43 PM Report #548262 Posted March 11, 2014 at 06:43 PM 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 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Mimato Posted March 11, 2014 at 11:37 PM Report #548304 Posted March 11, 2014 at 11:37 PM 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.
HappyHippyHippo Posted March 11, 2014 at 11:58 PM Report #548309 Posted March 11, 2014 at 11:58 PM 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 Portugol Plus
cdgramos Posted March 12, 2014 at 12:00 AM Report #548310 Posted March 12, 2014 at 12:00 AM Sempre podes usar a função strtok e dividires nos espaços. dos tokens que vao ficando "aproveitas" a primeira letra da string. Funciona caso o utilizador se engane e escreva o nome com letra minuscula 😛 www.cdgramos.com
thoga31 Posted March 12, 2014 at 12:16 AM Report #548315 Posted March 12, 2014 at 12:16 AM (edited) 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 March 12, 2014 at 12:23 AM by thoga31 Knowledge is free!
Mimato Posted March 12, 2014 at 12:37 AM Report #548321 Posted March 12, 2014 at 12:37 AM "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.
thoga31 Posted March 12, 2014 at 12:53 AM Report #548323 Posted March 12, 2014 at 12:53 AM (edited) 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 March 12, 2014 at 12:53 AM by thoga31 Knowledge is free!
HappyHippyHippo Posted March 12, 2014 at 12:54 AM Report #548324 Posted March 12, 2014 at 12:54 AM É 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 Portugol Plus
Mimato Posted March 12, 2014 at 01:31 AM Report #548325 Posted March 12, 2014 at 01:31 AM 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
HappyHippyHippo Posted March 12, 2014 at 02:11 AM Report #548326 Posted March 12, 2014 at 02:11 AM (edited) Estás-me a querer dizer que o codigo ASCII não é o básico? sim estou a dizer que o ASCII não é básico assim como as operações com números em binário. não é algo que se deva leccionar na segunda aula. Edited March 12, 2014 at 02:11 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Flinger Posted March 12, 2014 at 10:00 AM Report #548343 Posted March 12, 2014 at 10:00 AM 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.
pikax Posted March 12, 2014 at 10:08 AM Report #548350 Posted March 12, 2014 at 10:08 AM 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."
Rui Carlos Posted March 12, 2014 at 10:51 AM Report #548363 Posted March 12, 2014 at 10:51 AM 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. Rui Carlos Gonçalves
thoga31 Posted March 12, 2014 at 05:15 PM Report #548431 Posted March 12, 2014 at 05:15 PM 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!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now