SWITCH error - Sequential Search and binary search

-3
 #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;
}

// person.cpp

#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
    
asked by anonymous 07.05.2015 / 03:23

1 answer

1

At the end of each case , if a break; is not reached, the flow of control goes on. 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

One possible modification that makes sense is to put break; at the end of every 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 are any other problems it would be easier if you post the error messages perhaps.

    
07.05.2015 / 04:03