Exercício em C [RESOLVIDO]

1. Exercício em C [RESOLVIDO]

Geovani Leite
GeovaniLeite

(usa Outra)

Enviado em 19/06/2017 - 21:00h

Boa noite, pessoal.
Estou com um exercício da faculdade pra fazer e não estou conseguindo.
Trata-se de um algoritmo em C onde o usuário digita o nome completo e o programa deve imprimi-lo como se fosse uma referência.
Exemplo:

Entrada: Armando Luiz Nicolini Delgado
Saída: DELGADO, Armando Luiz Nicolini

Agradeço se alguém puder ajudar


  


2. Re: Exercício em C [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/06/2017 - 21:02h

A norma é você começar a escrever alguma coisa do código para poder ser ajudado.

Procure por funções de string em C.

#include <string.h>

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



3. RE: Exercício em C

Geovani Leite
GeovaniLeite

(usa Outra)

Enviado em 19/06/2017 - 21:11h

listeiro_037 escreveu:

A norma é você começar a escrever alguma coisa do código para poder ser ajudado.

Procure por funções de string em C.

#include <string.h>

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden


Opa, obrigado pela dica, sou novo aqui. Vou postar sim o código que estou tentando fazer




4. Re: Exercício em C [RESOLVIDO]

Geovani Leite
GeovaniLeite

(usa Outra)

Enviado em 19/06/2017 - 21:13h

listeiro_037 escreveu:

A norma é você começar a escrever alguma coisa do código para poder ser ajudado.

Procure por funções de string em C.

#include <string.h>

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden


Eu estou tentando assim:

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

int main(){

setlocale(LC_ALL, "Portuguese");

char nome[100],sobrenome[20];
int i;

printf("Digite um nome: ");
scanf("%[^\n]s",nome);

for(i=strlen(nome);i>0;i--){
if(nome[i]!= ' '){
sobrenome[i]=nome[i];
}else{
break;
}
}


}




5. Re: Exercício em C [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/06/2017 - 22:36h

GeovaniLeite escreveu:

Eu estou tentando assim:

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

int main(){

setlocale(LC_ALL, "Portuguese");

char nome[100],sobrenome[20];
int i;

printf("Digite um nome: ");
scanf("%[^\n]s",nome);


Tire esse “s” após fechar os colchetes, pois ele está sobrando (desse jeito, a função vai procurar pelo caráter “s” na string de entrada). “%[” é uma conversão de seu próprio direito, distinta de “%s”, e seu argumento termina com o sinal “]”.

    for(i=strlen(nome);i>0;i--){
if(nome[i]!= ' '){
sobrenome[i]=nome[i];
}else{
break;
}
}


}


O código começa bem, medindo o tamanho da string, mas logo depois se perde.

O índice i é válido para os dois arrays ao mesmo tempo (dica: compare os tamanhos dos arrays, e lembre-se de que ele começa grande, e depois diminui)?

Quantas iterações você acha que serão realizadas antes de se executar o comando break?


6. Re: Exercício em C [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 20/06/2017 - 00:39h

A quantidade de caracteres da string final será do tamanho da string inicial mais um por causa da virgula.

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



7. Re: Exercício em C [RESOLVIDO]

Higor da Silva Lopes
ThinKing

(usa Debian)

Enviado em 20/06/2017 - 02:11h

Bom cara, estou sem tempo agora...
Porém...
Dê uma olhada nesse código e vê se "abre a mente".

String text = "Testando o código";
String[] s = text.trim().split(" ");
System.out.println("Primeira: "+s[0]);
System.out.println("Ultima: "+s[s.length-1]);


Aqui você pega a primeira e última posição da frase...


8. RE: Exercício em C

Geovani Leite
GeovaniLeite

(usa Outra)

Enviado em 20/06/2017 - 08:16h

Entendi onde estou errando.. Irei tentar resolver e postarei o código aqui.

Obrigado à todos pela ajuda até agora


9. Re: Exercício em C [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/06/2017 - 09:19h

Vou dar uma dica.

strlen() mede o tamanho da string. Como strings em C têm seu tamanho indicado por um terminador colocado ao final da string, toda vez que você quiser saber o tamanho da string, você tem de varrê-la novamente, desde o início, até encontrar esse terminador.

Você certamente é capaz de escrever sua própria versão de strlen().

Pareceu-me que, no seu código, você usou strlen() para poder, logo em seguida, varrer a string de trás para o começo, procurando a primeira (de trás para frente) ocorrência de espaço seguido de um não-espaço. Entretanto, você poderia fazer essa varredura do começo para o fim, procurando pelo último espaço (ou, na verdade, pelo início da última palavra após o último espaço) antes do fim da string. Isso eliminaria o uso de strlen(), e reduziria o número de varreduras de dois (uma do início para o fim, com strlen(), e outra do fim para o início, procurando pelo espaço) para um (apenas do início para o fim, procurando pelo terminador, mas marcando o início de cada nova palavra encontrada).


10. RE: Exercício em C

Geovani Leite
GeovaniLeite

(usa Outra)

Enviado em 22/06/2017 - 15:04h

Boa tarde! Desculpem pela demora.
Eu consegui resolver o exercício parcialmente. Ele faz corretamente quando a pessoa possui apenas 2 nomes.
Exemplo:

Entrada: Geovani Leite
Saída: LEITE, Geovani.

Porém, quando a pessoa possui mais de 2 nomes ele mostra apenas o ultimo e o primeiro.
Assim:

Entrada: Geovani Leite Olá
Saída: OLÁ, Geovani.

Segue o código..
#include<stdio.h>
#include<locale.h>
#include<string.h>
#include<ctype.h>
//Aluno: Geovani Leite

int main(){

setlocale(LC_ALL, "Portuguese");

char nome[100],sobrenome[20];
int i,j;

printf("Digite um nome: ");
scanf("%[A-Za-z 0-9]",nome);

i=strlen(nome);
j=0;
while(nome[i] != ' '){
sobrenome[j]=nome[i-1];
i--;
j++;
}
for(i=strlen(sobrenome);i>=0;i--){
sobrenome[i]=toupper(sobrenome[i]);
}

for(i=strlen(sobrenome);i>0;i--){
printf("%c",sobrenome[i-1]);
}
printf(", ");
for(i=0;i<strlen(nome);i++){
if(nome[i] != ' '){
printf("%c",nome[i]);
}else{
break;
}
}
printf(".\n");

return 0;
}




11. Re: Exercício em C [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/06/2017 - 13:39h

Como você já marcou o tópico como resolvido, segue uma versão que varre a string com o nome completo apenas uma vez (logo não usa strlen(), que contaria como uma varredura), do início para o final, e vai marcando posições interessantes através de ponteiros para dentro do nome completo. Ela sabe tratar monônimos (como “Moisés”, “Isaías”, “Lucas”, “Platão” ou “Voltaire”), e não altera a string inicial nem copia caracteres para outras variáveis ou para funções, exceto na hora de os imprimir.

Variáveis interessantes:

- p: ponteiro usado para precorrer a string;
- p_first_name: ponteiro para o início do primeiro nome (se for antecedido por espaços, esses espaços são descartados).
- p_space_before_last: ponteiro para o primeiro espaço antes do último nome (indica onde parar de imprimir os nomes que antecedem o último);
- p_last_name: ponteiro para o início do último nome;
- p_after_last: ponteiro para a posição após o fim do último nome.

#include <ctype.h>
#include <stdio.h>

void print_reference(const char *full_name){
const char *p;
const char *p_first_name, *p_last_name;
const char *p_space_before_last, *p_after_last;

p_first_name=p_space_before_last=NULL;
// Descarta espaços antes do primeiro nome, se existirem.
for(p=full_name; *p && !p_first_name; ++p)
if(isspace(*p)){
if(!p_space_before_last)
p_space_before_last=p;
}
else
p_first_name=p;
// Neste ponto, p_first_name aponta para o primeiro nome, depois de
// pulados eventuais espaços.

// Como o nome pode ser um monônimo, supõe, por enquanto, que
// o primeiro nome é também o último.
p_last_name=p_first_name;
p_after_last=NULL;
// Verifica se existem outros nomes além do primeiro.
for(; *p; ++p)
if(isspace(*p)){
if(!p_after_last || p_after_last<p_last_name)
p_after_last=p;
}
else if(p_after_last && p_last_name<p_after_last){
p_space_before_last=p_after_last;
p_last_name=p;
}
// p_after_last indica onde termina o último nome. Se for um espaço
// (i.e. os últimos caracteres da string são espaços em branco), já
// foi definido no laço de repetição acima. Contudo, se for o fim da
// string, faz com que aponte para esse fim.
if(!p_after_last || p_after_last<p_last_name)
p_after_last=p;

// Encontrou o último nome?
if(p_last_name){
// Imprime o último nome um caráter por vez, convertido em maiúsculo.
for(p=p_last_name; p<p_after_last; ++p)
putchar(toupper((unsigned char)*p));

// Se tiver mais de um nome, imprime apenas os nomes iniciais, usando
// o recurso de limitar a quantidade de caracteres na string de
// formatação da função printf().
if(p_first_name!=p_last_name)
printf(", %.*s", (int)(p_space_before_last-p_first_name), p_first_name);
putchar('\n');
}
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts