Ir ao conteúdo
  • Cadastre-se
Jessé P. de Melo

C Algoritmo de pesquisa texto

Recommended Posts

Boa tarde.

Estou resolvendo o seguinte exercício.

 

Faca um programa para ler uma tabela contendo os nomes dos alunos de uma turma de 5 alunos. O programa deve solicitar ao usuário os nomes do aluno, sempre perguntando se ele deseja inserir mais um nome na lista. Uma vez lidos todos os alunos, o usuário ira indicar um nome que ele deseja verificar se esta presente na lista, onde o programa deve procurar pelo nome (ou parte deste nome) e se encontrar deve exibir na tela o nome completo e o índice do vetor onde esta guardado este nome.

 

Desenvolvi o algoritmo que segue. Só compilei, ainda não testei, tenho medo porque antes de chegar a esse resultado fiquei travado umas 2x e tive que começar do zero. Mais tarde volto e seria muito bom se já soubesse onde esta errado.Isso economiza um tempão. Segue script.

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

void main(void){
char alunos[5][30]; //lista de alunos de ate trinta caracteres
char cont=' '; //variavel para validar se continua ou nao
char nome_proc[30];//String a procura
int tam=0;

    printf("Digite o nome dos alunos ");

    for(int x=0;x<4;x++){ //Preencher lista alunos
    scanf("%s",&alunos[x]);
    cont=' ';
    printf("Deseja continuar inserindo nomes?(S/N)");
    scanf("%c",&cont);
        if (cont=='N'){ //Se não quzer preencher mais retorna 0 e passa para proxima instrução
            break;
        }
    }
    printf("Digite o nome que esta procurando: "); //Preenche votor com palvra que esta procurando
    scanf("%s",&nome_proc);

    for (int x=0;nome_proc[x]!='\0';x++){ //calcula o tamanho da string procurada, como a pesquisa pode ser feita por trechos o \0 não funcina
        tam=x;
        }

    for (int x=0;x<5;x++){  //Percorre coluna do vetor alunos
        for (int y=0;y<29;y++){ //percorre linha do vetor alunos
            int igual=0; //variavel booleana, se for diferentes
                for(int z=tam;z>tam;z--){ //percorre vetor da palavra que esta procurando
                if (nome_proc[z]==alunos[x][y]){ //verifica se os valores das posiçoes são iguais, iniciando com o valor maximo da palavra procurada e termina a pesquisa com valor min
                    while(z>0){
                        if(nome_proc[z]!=alunos[x][y]){
                            break;
                        }
                    }
                 printf("Nome completo: %s\n",alunos[x]);
                 printf("O indice %i",x);
                }
            }
        }
    }
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só pode ser bricadeira...Fiquei horas e horas tentando criar a solução sendo que ela ja existe em uma simples função. :muro:

Hoje anoite ou amanha a tarde posto a solução.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim... porém muitas vezes eles querem que você faça o algoritmo pois isso lhe fará dominar a técnica de manipular strings, conhecer como funciona as coisas. Com o tempo você irá conhecendo muitas bibliotecas, porém não há uma biblioteca para tudo, muitas vezes você tem que faze-la do zero.para coisas simples quase sempre já existe uma biblioteca.
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa a demora, estão trocando a fiação dos postes, fiquei sem internet.

 

Olá novamente Srs.

Consegui fazer ficou da maneira que segue abaixo...

Tenho algumas duvidas.

1- Porque a linguagem C interpreta o espaço " " como final de string ? Resolvi esse problema colocando underline "_" no lugar do espaço. Existe uma maneira simples de contornar esse problema colocando o espaço genuinamente?

2- Se fosse o caso de saber o lugar exato onde encontrou a palavra (índice da linha e índice coluna), existe uma maneira fácil de fazer isso?

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


void main(void){
    char alunos[5][30];
    char nome_procura[30];
    char perg;
    int loop=0;
    char *retorno;

    for(int x=0;x<5;x++){
       if(loop==0){
        printf("Digite os nomes dos alunos: \n");
        scanf("%s",&alunos[x]);
        fflush(stdin);
        if (x<4){
        printf("Deseja continuar inserindo nomes ? (S/N)\n");
        scanf("%c",&perg);
        fflush(stdin);

        if (perg ==('n' ||'N'))
            loop=1;
        }
      }
    }
    printf("Qual nome está procurando ?\n");
    scanf("%s",&nome_procura);
    fflush(stdin);
    for (int x=0;x<4;x++){
        if((retorno=strstr(alunos[x],nome_procura))!=NULL){
            printf("Nome completo : %s\n",alunos[x]);
            printf("O nome esta guardado na posicao: %d na lista",x);
            }
        }
    }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

scanf tem a "má" costume de ler até encontrar ou um espaço, ou um tabulador(\t) ou até encontrar ou caractere enter(\n), visto o visto, ele não é capaz de ler algo como "Antonio Pereira" pois ele pararia no primeiro espaço justo depois do "Antonio". Como solucionar isso? Fácil! Usando o especificador %[] com ^\n como "parâmetro", ficando tal como %[^\n]. Um exemplo completo seria:
char nome[100];
scanf("%[^\n]", nome);

E para facilitar leituras consecutivas evitando lixo no buffer, em vez de usar fflush(stdin) você pode adicionar o especificador %*c justo ao fim do anterior especificador.
char nome[100];
scanf("%99[^\n]%*c", nome);

Isso faz possível ler frases com espaços até 99 letras como máximo ignorando a tecla enter que causa problemas de leitura. É a forma mais efetiva de ler strings em C que conheço.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema não é o scanf, mas sim o especificador escolhido.

 

O especificador %s espera que sejam lidos caracteres até encontrar um caractere vazio (espaço, tabulação ou nova linha), logo lê apenas 1 palavra, o que em muitas situações é conveniente.

 

O especificador %[ é o especificador para selecionar quais caracteres podem ser capturados, ou que não podem ser capturados, na string digitada no terminal pelo usuário.

 

No %[^\n], o ^ logo após o colchetes indica que nos próximos caracteres estaremos indicando caracteres que não devem ser capturados, nesse caso está dizendo que não deve capturar o caractere nova linha '\n', então como apenas o caractere nova linha não deve ser capturado o comando pode capturar todos os outros caracteres que forem digitados (inclusive espaços e tabulações). Resultando, que %[^\n] é útil para capturar frases inteiras, e não apenas palavras.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×