Ir ao conteúdo
  • Cadastre-se

C programa em c para abreviar nomes


gabrielzin44

Posts recomendados

Preciso fazer um código que a primeira entrada seja o número de nomes que vou digitar e depois que eu digite os nomes ele abrevie esses nomes como nos exemplos abaixo:
Albert Einstein -> Einstein, A.
Napoleão Bonaparte -> Bonaparte, N.
Franklin Delano Roosevelt -> Roosevelt, F.D.
O problema é que na hora de printar o nome abreviado o ele ta imprimindo um espaço em branco.
segue o código abaixo:

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

//Essa funcao remove as palavras indesejadas
void removerSubstring(char *s,const char *remover)
{
    while((s = strstr(s,remover)) != NULL)
        memmove(s, s + strlen(remover), 1 + strlen(s+strlen(remover)));
}

void abrevia(char *nome)
{ 
  char aux [51];
  int i,auxiliarult,j,ult,esp=0;
  for (i=0;i<strlen(nome);i++) if (nome[i]==' ') esp++; //conta o nº de nomes
  for (i=0;i<strlen(nome);i++)
    {
      j=0;
      if (nome[i]==' ') j++;
      ult=i+1; //posição do começo do último nome
    }  
    for (i=0;i< strlen(nome)-(ult-1);i++) // passa o ultimo nome para um auxiliar
    {
      auxiliarult=ult;
      aux[i]=nome[auxiliarult];
      auxiliarult++;
    }
    
    int proxlivre=strlen(nome)-ult+2; //prox. posição livre no aux
    aux[proxlivre]=','; // adiociona a virgula dps do nome
    proxlivre++;
    aux[proxlivre]=' '; // adiociona o espaço
    proxlivre++;
    aux[proxlivre]=nome[0]; // adiociona 1ª inicial
    proxlivre++;
    aux[proxlivre]='.'; 
    proxlivre++;
    aux[proxlivre]=' ';
    proxlivre++;
    for (i=0;i<ult;i++)
    {
      if (nome[i]==' ') 
        {
          aux[proxlivre]=nome[i+1];
          proxlivre++;
          aux[proxlivre]='.';
          proxlivre++;
        }

    } 
    printf ("%s",aux);
    strcpy(nome,aux);
}


int main( void ){
	int n,i;
  char nome [51];
  scanf ("%d",&n);
  getchar();
  for (i=1;i<=n;i++){
  gets (nome);
  removerSubstring(nome, "da "); //usamos a função para remover
  removerSubstring(nome, "das ");// todas as palavras que devem
  removerSubstring(nome, "de "); // ser ignoradas
  removerSubstring(nome, "des ");
  removerSubstring(nome, "do ");
  removerSubstring(nome, "dos ");
	abrevia(nome);
	puts(nome);
  }
	return 0;
}
 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@gabrielzin44     seu código está bom ,  mas ele não está imprimindo nada , então seu código com algumas modificações poderia ser assim  :

#include <stdio.h>                           /* para usar as funções de entrada e saída                   */
#include <conio.h>                           /* para usar a função getch()                                */
#include <string.h>                          /* para trabalhar com string                                 */
#include <ctype.h>                           /* para usar a função toupper                                */
char nome[51];                               /* var global p/ usar em qquer parte do programa             */
void abreviar(){
    int j,i=1,w=0,q;
    char k;

    for(j=0;j<nome[j]!='\0';j++){            /* percorrer toda a string                                   */
        if(nome[j]==' '){                    /* encontrando um espaço                                     */
            if(nome[j+1]==' '||nome[j+2]==' '||nome[j+3]==' '||nome[j+4]==' '){
                                             /* se algum dos próximos 4 caract for um espaço              */
                while(nome[j+i]!=' ')i++;    /* conta quantos caracteres até o espaço                     */
                for(q=j;nome[q+i]!='\0';q++){/* percorrer a string desse ponto até o final                */
                    nome[q]=nome[q+i];       /* puxa os carateres da string para traz eliminando          */
                                             /* caracteres indesejáveis                                   */
                }
                nome[q]='\0';                /* marca o novo final da string para poder usar o            */
                                             /* comando strlen                                            */
            }
        }
    }
    for(j=strlen(nome);j>=0;j--){            /* lê a string do final para o começo                        */
        if(nome[j]==' '){                    /* encontrando um espaço , aí está o último sobrenome        */
            printf("%c",toupper(nome[j+1])); /* imprime o 1º carc do último sobrenome em maiúsculo        */
            for(i=j+2;nome[i]!='\0';i++){    /* até encontrar o final da string " \0 "                    */
                printf("%c",nome[i]);        /* imprime cada caractere do último sobrenome                */
            }
            printf(", ");                     /* imprime uma vírgula depois do último sobrenome           */
            for(i=0;i<j+1;i++){               /* percorrer as string do começo até aquele último espaço   */
                if(w==0)k=nome[i];            /* pega o primeiro cract do nome edos outros sobrenomes     */
                w++;          /* modifica o valor , para não pegar os outro caracteres de mesmo sobrenome */
                if(nome[i]==' '){             /* encontrando outro espaço                                 */
                    w=0;           /* volta o valor à zero para pegar o primeiro caract do próx sobrenome */
                    printf("%c. ",toupper(k));/* imprime o carac daquele sobrenome em maiúculo e um ponto */
                }
            }
            break;                            /* sai desse loop , pois já imprimiu todos os sobrenomes    */
        }
    }
}
int main(){
    int j,n;
    printf("Quantos Nomes ");
    scanf("%d",&n);
    printf("%d\n",n);
    for(j=0;j<n;j++){
        printf("O Nome -> ");
        fflush(stdin);
        gets(nome);
        printf("\n");
        abreviar();
        printf("\n\n");
    }
    getch();
    return 0;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...