SWITCH Error - Sequential Search and Binary Search

Asked

Viewed 137 times

-4

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

 #include <iostream>
 #include <fstream>

 #include "pessoa.h"

 using namespace std;

 int main()
 {
//CADASTRA PESSOAS
ofstream fout("pessoas.dat");
Pessoa p;

do{
    p.novaPessoa();
    fout.write((char *)&p, sizeof(Pessoa));
    cin.ignore();
    cout << "\nDeseja inserir uma nova pessoa (s/n)?";
}while(getch() != 'n');
//FIM CADASTRA PESSOAS


char pNome[60];
int nTipBusca;

ifstream fin("pessoas.dat", ios::binary);
int leituras = 0;
do{
//ESCOLHE UM TIPO DE BUSCA (BINARIA OU SEQUENCIAL)
cout << "\n\n----------TIPOS DE BUSCA-----------\n";
cout << "\n1 - BUSCA SEQUENCIAL";
cout << "\n2 - BUSCA BINARIA";
cout << "\n0 - SAIR";
cout << "\nEscolha o tipo de busca: ";
cin >> nTipBusca;

switch (nTipBusca){

//SE BUSCA FOR SEQUENCIAL
case 0:
system("pause");
return 0;

case 1:
    cout << "\n\nDigite um nome para a busca: ";
    gets(pNome);

    fin.read((char *)&p, sizeof(Pessoa));
    while(fin){
        leituras++;
        if(strncmp(p.nome, pNome, strlen(pNome)) == 0){
             p.imprime();
            break;
        }
        fin.read((char *)&p, sizeof(Pessoa));
    }

    if(!fin) cout << "\nNome nao encontrado!\n";
//FIM SE BUSCA FOR SEQUENCIAL

//SE BUSCA FOR BINÁRIA
case 2:
    long inicio=0, fim, meio;
    bool achou = false;

    fin.seekg(0, ios::end);
    fim = (fin.tellg())/sizeof(Pessoa) - 1;
    meio = (inicio+fim)/2;

    cout << "\n\nDigite o nome para busca: ";
    gets(pNome);

    while(fim >= inicio){
        fin.seekg(meio*sizeof(Pessoa), ios::beg);
        fin.read((char *)&p, sizeof(Pessoa));
        cout << meio << ": " << p.nome <<endl;
        leituras++;

        if (strncmp(p.nome, pNome, strlen(pNome)) == 0){
             p.imprime();
            achou = true;
            break;
        }
        if(strncmp(p.nome, pNome, strlen(pNome))<0)
            inicio = meio+1;
        else
            fim = meio-1;
        meio = (inicio+fim)/2;
    }
    if (!achou) cout << "\nNome nao encontrado!\n";
    //FIM SE BUSCA FOR BINÁRIA

}
}while(getch() != 0);
//FIM TIPO DE BUSCA
return 0;
}

//cpp person.

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

#include <fstream>
#include <iostream>


#include "pessoa.h"
using namespace std;

void Pessoa::novaPessoa(){
cout << "\nENTRE COM O NOME: ";
gets(nome);

cout << "\nENTRE COM O SOBRENOME: ";
gets(sobrenome);

cout << "\nENTRE COM O SEXO: ";
gets(sexo);

cout << "\nENTRE COM O RG: ";
cin >> rg;
}

void Pessoa::imprime(){
cout << "\nNome: " << nome << endl;

cout << "\nSobrenome: " << sobrenome << endl;

cout << "\nSexo: " << sexo << endl;

cout << "\nRG: " << rg << endl;
}

//person. h

#ifndef PESSOA_H
#define PESSOA_H

using namespace std;

class Pessoa
{
public:
    void imprime();
    void novaPessoa();
    char nome[61];
    char sobrenome[61];
    char sexo[2];
    int  rg;
};

#endif // PESSOA_H
  • 1

    Hi Stefhany. You shared a lot of code, but what’s your question? Please edit the question to make it clear where you are in trouble. Otherwise, someone will hardly be able to help you.

  • There’s not much to know about the problems, but it seems to have to do with the person switch.ccp. I think, I’m not sure, that you forgot to put the breaks. Because there’s only one break inside the if. Another tip would be to divide your code into methods and functions it will become clearer and easier to read.

1 answer

1

At the end of each case, if no one is hit break;, The flow of control moves forward. For example:

switch(int i){
    case 0:
        std::cout << "case 0 executado" << std::endl;
    case 1:
        std::cout << "case 1 executado" << std::endl;
    case 2:
        std::cout << "case 2 executado" << std::endl;
        break;
}

If i == 0 the output will be:

case 0 executado
case 1 executado
case 2 executado

A possible modification that makes sense is to put a break; at the end of each case:

switch(int i){
    case 0:
        std::cout << "case 0 executado" << std::endl;
        break;
    case 1:
        std::cout << "case 1 executado" << std::endl;
        break;
    case 2:
        std::cout << "case 2 executado" << std::endl;
        break;
}

If there is any other problem it would be easier if you post the error messages maybe.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.