Dictionary does not return all possible words

0

The idea of the program is to be a dictionary, the user informs the word, the program performs a check on the characters of the word finds the position in the vector and returns the definition if the word appears in the dictionary.

The problem is that it never returns a word error to found, only the first or second definition: /

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> //lider com variaveis booleans
#define NUM_DEF 7

struct dicionario
{
    char palavra[20];
    char definicao[50];
};

//confere os caracteres das palavras
bool compString(const char palavra1[], const char palavra2[])
{
    int i = 0;
    while (palavra1[i] == palavra2[i] && palavra1[i] != '
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> //lider com variaveis booleans
#define NUM_DEF 7

struct dicionario
{
    char palavra[20];
    char definicao[50];
};

//confere os caracteres das palavras
bool compString(const char palavra1[], const char palavra2[])
{
    int i = 0;
    while (palavra1[i] == palavra2[i] && palavra1[i] != '%pre%' && palavra2[i] != '%pre%')
    {
        ++i;
    }
    if (palavra1[i] == '%pre%' && palavra2[i] == '%pre%')
    {
        return true;
    }
    else
    {
        return false;
    }
}

//busca a palavra no dicionario
int procString(const struct dicionario lingua[], const char procurar[], int numPalavra)
{
    bool compString(const char palavra1[], const char palavra2[]);
    int i = 0;
    while (i < numPalavra)
    {
        if (compString(procurar, lingua[i].palavra))
        {
            return i;
        }
        else
        {
            return ++i;
        }
    }
    return -1;
}

int main(void)
{
    int procString(const struct dicionario lingua[], const char procurar[], const int numPalavra);

    char palavra[20] = {'%pre%'};
    int resultPesq;

    const struct dicionario portu[NUM_DEF] = {
        {"pao", "comida de farinha"},
        {"feijao", "comida brasileira"},
        {"tropeiro", "tipo de feijao"},
        {"queijo", "comida de minas"},
        {"macarrao", "comida de vo"},
        {"mortadela", "comida de carne"},
        {"pizza", "comida da italia"}};

    printf("Digite uma palavra:\n");
    scanf("%s", &palavra);

    resultPesq = procString(portu, palavra, NUM_DEF);

    if (resultPesq != -1)
    {
        printf("%s\n", portu[resultPesq].definicao);
    }
    else
    {
        printf("Palavra n encontrada");
    }

    return 0;
}
' && palavra2[i] != '%pre%') { ++i; } if (palavra1[i] == '%pre%' && palavra2[i] == '%pre%') { return true; } else { return false; } } //busca a palavra no dicionario int procString(const struct dicionario lingua[], const char procurar[], int numPalavra) { bool compString(const char palavra1[], const char palavra2[]); int i = 0; while (i < numPalavra) { if (compString(procurar, lingua[i].palavra)) { return i; } else { return ++i; } } return -1; } int main(void) { int procString(const struct dicionario lingua[], const char procurar[], const int numPalavra); char palavra[20] = {'%pre%'}; int resultPesq; const struct dicionario portu[NUM_DEF] = { {"pao", "comida de farinha"}, {"feijao", "comida brasileira"}, {"tropeiro", "tipo de feijao"}, {"queijo", "comida de minas"}, {"macarrao", "comida de vo"}, {"mortadela", "comida de carne"}, {"pizza", "comida da italia"}}; printf("Digite uma palavra:\n"); scanf("%s", &palavra); resultPesq = procString(portu, palavra, NUM_DEF); if (resultPesq != -1) { printf("%s\n", portu[resultPesq].definicao); } else { printf("Palavra n encontrada"); } return 0; }
    
asked by anonymous 17.10.2017 / 11:55

3 answers

1

If you intend to write your own strings comparison function avoiding the use of strcmp() family functions, I suggest you modify your compString() function to something like:

bool compString( const char palavra1[], const char palavra2[] )
{
    int i = 0;

    for( i = 0; ; i++ ) {
        if (palavra1[i] != palavra2[i])
            return false;
        if (palavra1[i] == '
#include <stdio.h>
#include <stdbool.h>

#define NUM_DEF 7

struct dicionario {
    char palavra[20];
    char definicao[50];
};

bool compString( const char palavra1[], const char palavra2[] )
{
    int i = 0;

    for( i = 0; ; i++ ) {
        if (palavra1[i] != palavra2[i])
            return false;
        if (palavra1[i] == '
bool compString( const char palavra1[], const char palavra2[] )
{
    int i = 0;

    for( i = 0; ; i++ ) {
        if (palavra1[i] != palavra2[i])
            return false;
        if (palavra1[i] == '
#include <stdio.h>
#include <stdbool.h>

#define NUM_DEF 7

struct dicionario {
    char palavra[20];
    char definicao[50];
};

bool compString( const char palavra1[], const char palavra2[] )
{
    int i = 0;

    for( i = 0; ; i++ ) {
        if (palavra1[i] != palavra2[i])
            return false;
        if (palavra1[i] == '%pre%')
            return true;
    }
}

int procString( const struct dicionario dic[], int numPalavra, const char procurar[] )
{
    int i =0;

    for(i = 0; i < numPalavra; i++ )
        if(compString( dic[i].palavra, procurar ))
            return i;

    return -1;
}

int main(void)
{
    char palavra[20] = {0};
    int resultPesq;

    const struct dicionario portu[NUM_DEF] =
        {{"pao","comida de farinha"},
        {"feijao","comida brasileira"},
        {"tropeiro","tipo de feijao"},
        {"queijo","comida de minas"},
        {"macarrao","comida de vo"},
        {"mortadela","comida de carne"},
        {"pizza","comida da italia"}};

    printf("Digite uma palavra: ");
    scanf("%s", palavra );

    resultPesq = procString( portu, NUM_DEF, palavra );

    if( resultPesq == -1 ){
        printf("Palavra nao encontrada!\n");
        return 1;
    }

    printf("%s\n", portu[resultPesq].definicao );

    return 0;
}
') return true; } }
') return true; } } int procString( const struct dicionario dic[], int numPalavra, const char procurar[] ) { int i =0; for(i = 0; i < numPalavra; i++ ) if(compString( dic[i].palavra, procurar )) return i; return -1; } int main(void) { char palavra[20] = {0}; int resultPesq; const struct dicionario portu[NUM_DEF] = {{"pao","comida de farinha"}, {"feijao","comida brasileira"}, {"tropeiro","tipo de feijao"}, {"queijo","comida de minas"}, {"macarrao","comida de vo"}, {"mortadela","comida de carne"}, {"pizza","comida da italia"}}; printf("Digite uma palavra: "); scanf("%s", palavra ); resultPesq = procString( portu, NUM_DEF, palavra ); if( resultPesq == -1 ){ printf("Palavra nao encontrada!\n"); return 1; } printf("%s\n", portu[resultPesq].definicao ); return 0; }
') return true; } }

Testing:

%pre%     
17.10.2017 / 12:39
3

The main problem is in the function that compares words, procString :

int procString (const struct dicionario lingua[],const char 
procurar[], int numPalavra){ //busca a palavra no dicionario

    bool compString( const char palavra1[],  const char palavra2[]);
    //^---------esta definição é desnecessária

    int i=0;
    while (i<numPalavra){

        if(compString(procurar,lingua[i].palavra)){
            return i;
        }else{
            return ++i;
        }
        //^---- if e else com return

    }
    return -1;
}

Whenever you have a loop with a return in if and else then the loop only executes once, which causes it to lose its meaning. For the type of logic you are using, for is often the most appropriate.

Now look how you would be fixing the problem and changing it to a for :

int procString (const struct dicionario lingua[],const char procurar[], int numPalavra)  //busca a palavra no dicionario
{
    int i=0;
    for (i=0;i < numPalavra; ++i){
        if(compString(procurar,lingua[i].palavra))
        {
            return i;
        }
    }

    return -1;
}

No main reading palavra is also not right here:

char palavra[20] = {'
scanf("%s",palavra);
'}; ... scanf("%s",&palavra /*<--aqui*/);

palavra is actually a pointer to the first letter of the string, so in scanf does not carry & :

int procString (const struct dicionario lingua[],const char 
procurar[], int numPalavra){ //busca a palavra no dicionario

    bool compString( const char palavra1[],  const char palavra2[]);
    //^---------esta definição é desnecessária

    int i=0;
    while (i<numPalavra){

        if(compString(procurar,lingua[i].palavra)){
            return i;
        }else{
            return ++i;
        }
        //^---- if e else com return

    }
    return -1;
}

And if you read to palavra with a scanf it becomes unnecessary to set {0} as the initial value.

See the search example for a word that does not exist in Ideone

Note: I do not know if I was trying to implement word comparison as an exercise, but in <string.h> already has the function strcmp that does this to you.

    
17.10.2017 / 12:17
3

The problem here is that you are not comparing the strings correctly. You need to use the strcmp() function to compare character to character. Perhaps by not knowing it the algorithm was confusing doing unnecessary things.

What he should do is just scroll through the array of words and compare with words typed, finding apposition returns to get the definition, if it passes through everything and does not find returns -1. p>

Since there is a constant definition of the number of elements in the array , you may be able to delete a parameter from the function that passes this number, at least for this case I think it gets better.

There were other errors solved, for example in% w / o% was passed a pointer to an array . A array is already a pointer , then passes the array itself em>

I took everything that was unnecessary.

#include <stdio.h>
#include <string.h>
#define NUM_DEF 7

struct dicionario {
    char palavra[20];
    char definicao[50];
};

int procString (const struct dicionario lingua[], const char 
procurar[], int numPalavra) {
    for (int i = 0; i < numPalavra; i++) {
        if (strcmp(lingua[i].palavra, procurar) == 0) {
            return i;
        }
    }
    return -1;
}

int main(void) {
    const struct dicionario portu[NUM_DEF] = {
        {"pao","comida de farinha"},
        {"feijao","comida brasileira"},
        {"tropeiro","tipo de feijao"},
        {"queijo","comida de minas"},
        {"macarrao","comida de vo"},
        {"mortadela","comida de carne"},
        {"pizza","comida da italia"}};
    printf("Digite uma palavra:\n");
    char palavra[20] = {'
#include <stdio.h>
#include <string.h>
#define NUM_DEF 7

struct dicionario {
    char palavra[20];
    char definicao[50];
};

int procString (const struct dicionario lingua[], const char 
procurar[], int numPalavra) {
    for (int i = 0; i < numPalavra; i++) {
        if (strcmp(lingua[i].palavra, procurar) == 0) {
            return i;
        }
    }
    return -1;
}

int main(void) {
    const struct dicionario portu[NUM_DEF] = {
        {"pao","comida de farinha"},
        {"feijao","comida brasileira"},
        {"tropeiro","tipo de feijao"},
        {"queijo","comida de minas"},
        {"macarrao","comida de vo"},
        {"mortadela","comida de carne"},
        {"pizza","comida da italia"}};
    printf("Digite uma palavra:\n");
    char palavra[20] = {'%pre%'};
    scanf("%s", palavra);
    int resultadoPesquisa = procString(portu, palavra, NUM_DEF);
    if (resultadoPesquisa != -1) {
        printf("%s\n", portu[resultadoPesquisa].definicao);
    } else {
        printf("Palavra n encontrada");
    }
}
'}; scanf("%s", palavra); int resultadoPesquisa = procString(portu, palavra, NUM_DEF); if (resultadoPesquisa != -1) { printf("%s\n", portu[resultadoPesquisa].definicao); } else { printf("Palavra n encontrada"); } }

See running on ideone . And no Coding Ground . Also put it in GitHub for future reference .

    
17.10.2017 / 12:20