Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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

use a função strstr para buscar uma substring em uma string.

  • Curtir 1
  • Haha 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






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

×