Ir para conteúdo
Fórum Script Brasil
  • 0

Percorrer vetor e comparar strings


valeuleo

Pergunta

Tenho que fazer um cadastro de produtos que estarão armazenados em um arquivo binário. Porém antes de cadastrar tenho que verificar se já não existe um produto cadastrado com o mesmo nome. já tentei usar for, while mas não onsegui. Alguma dica? Grato. Ah, é em C++ feito no Visual C++ Express 2010.

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Opa, Você pode utilizar uma função chamada "strcmp", que compara duas strings;

Exemplo 1:

funcao srtcmp(valor1,valor2) 
  * retorna 0 se valor1 e igual a valor2
  * retorna -1 se valor1 e menor que valor2
  * retorna 1 se valor 1 e maior que valor2
Faça um for dentro do arquivo e compare a string digitada pelo usuario, com a existente dentro do arquivo. Exemplo 2:
for(i=0;i<100;i++)        
{
                    x = strcmp(vet[i].nome,nomedigitado); 
                  
                    if (x == 0){
                     //comandos;  (são iguais)
                    }
                    else{
                     //comandos;   (são diferentes) 
                    } 
}

Editado por Prog_Junior
Link para o comentário
Compartilhar em outros sites

  • 0

Amigo, eu tenho um código muito parecido com o que você precisa.

Se quiser pode reaproveitar. É utilizando uma tabela hashing (vide http://pt.wikipedia.org/wiki/Hashing).

Basicamente você teria que copiar o conteúdo do arquivo para uma estrutura intermediária (tabela de dispersão) e, dada a entrada do usuário, você faria a consulta por aquela entrada na tabela. A complexidade da pesquisa, idealmente, é de ordem constante, independente do número de produtos no estoque.

Fica bem mais rápido do que fazer uma busca em laço. Segue o código para uma estrutura definida por uma string e um inteiro (produto e qte em estoque).

/**
 * @file dicionario.c
 * @author Eduardo Vasconcelos
 * @brief Tabela de dispersao aberta
 * @date 28 Nov 2011
 */

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

#define TAM_PALAVRA 30
#define TAM_TABELA 13

typedef struct bloco {
    char palavra[TAM_PALAVRA];
    int valor;
    struct bloco *prox;
}no;

typedef struct {
    no *ini, *fim;
}lista;

lista dicionario[TAM_TABELA];

int hash(char *p_hash) {

    int i = 0, r = 0;
    for (; i < strlen(p_hash); i++)
        r += p_hash[i];

    return (r % TAM_TABELA);
}

inicializa () {

    int i = 0;
    for (; i < TAM_TABELA; i++) {
        dicionario[i].ini = NULL;
        dicionario[i].fim = NULL;
    }
}

inserir(char *p_inserir, int v_inserir) {

    int h = hash(p_inserir);
    no *aux = (no*) malloc (sizeof(no));
    strcpy(aux->palavra, p_inserir);
    aux->valor = v_inserir;
    aux->prox = NULL;

    if (dicionario[h].ini == NULL) {

        dicionario[h].ini = aux;
        dicionario[h].fim = aux;
    } else {

        dicionario[h].fim->prox = aux;
        dicionario[h].fim = aux;
    }
}

int pesquisar(char *p_pesquisar) {

    int h = hash(p_pesquisar);
    if (dicionario[h].ini == NULL) return -1;

    else {

        no *aux = dicionario[h].ini;
        while (aux != NULL) {

            if (strcmp(aux->palavra, p_pesquisar) == 0) return aux->valor;
            else aux = aux->prox;
        }
    }

    return -1;
}

int main (int argc, char *argv[]) {

    int t, n, v;
    char c[3], *p = (char*) malloc (TAM_PALAVRA * sizeof(char));
    scanf("%d", &t);

    for (; t > 0; t--) {
        inicializa();
        scanf("%d", &n);

        for (; n > 0; n--) {

            fflush(stdin);
            scanf("%s", c);
            if (strcmp(c, "I") == 0) {

                scanf("%s %d", p, &v);
                inserir(p, v);
            } else {

                scanf("%s", p);
                printf("%d\n", pesquisar(p));
            }
        }
    }

    return 0;
}

Dicas:

-> Defina TAM_TABELA com um número primo próximo do número de elementos que você espera guardar no dicionario, para otimizar a pesquisa.

-> A pesquisa retorna -1 se o elemento não está na tabela e a qte relacionada a ele se o elemento está lá.

Editado por tucano
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...