Salve a tutti,
Devo scrivere un metodo in c++ che : dato un albero binario di ricerca, in cui sono inseriti, come in una mappa(STL):
chiave=> Numero Identità alunno;
valore=> Alunno;
mi restituisca il numero di volte in cui compare un alunno il cui numero di identità comincia per 3;
Ho provato a scrivere questo ma non funziona (mi restituisce sempre 0) :
codice:
/**
* Funzione che ritorna il numero dei DNI (num. identità alunni) che cominciano per 3 (chiama a cuentaDNI3Aux).
*
* @return Numero di DNI che cominciano per 3.
*/
unsigned ABB::cuentaDNI3() const
{
return cuentaDNI3Aux(miRaiz);
}
/**
* Funzione ausiliare di cuentaDNI3.
*
* @param raiz Nodo radice
*
*/
unsigned ABB::cuentaDNI3Aux(ABB::PtrNodoBin raiz) const{
int count;
if(raiz==NULL)
count=0;
else {
if (raiz->clave[0]==3)
count = 1 + cuentaDNI3Aux(raiz->izq) + cuentaDNI3Aux(raiz->der);
cout << "\n";
cout << "He encontrado " << count << " DNI que comienzan por 3" << endl;
}
return count;
}
è in spagnolo dunque izq => sinistra; der=>destra; miRaiz = nodo radice albero binario;
Altra cosa :
il modo di inserire il numero di DNI dovrebbe essere aleatorio... perchè invece mi calcola sempre DNI che cominiciano per 5 e maggiori?
Di seguito il metodo per la creazione dei DNI e il Main() per la prova :
classe alunno :
codice:
/**
* Implementacion de la clase Alumno
* Curso 2015/2016
*/
#include "alumno.h"
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <sstream>
using namespace std;
// Nombres de ejemplo
string Alumno::list_nombre[] = {
"Javier",
"Jorge",
"Angel",
"Raul",
"Jose",
"Inigo",
"Jose Antonio",
"Julio",
"Beatriz",
"Ismael",
"Oliver",
"Carlos",
"Alberto",
"Francisco Manuel",
"Lluis Carles" };
// Apellidos de ejemplo
string Alumno::list_apellido[] = {
"Albaladejo" ,
"Albiach" ,
"Aldana" ,
"Alonso" ,
"Anda" ,
"Andres" ,
"Angel" ,
"Aranda" ,
"Bernal" ,
"Bonell" ,
"Calderon" ,
"Chakkour" ,
"Contreras" ,
"Correa" ,
"Dacasa" };
/**
* Constructor Alumno.
* Genera un alumno con datos aleatorios excepto el curso, que se pasa como parametro.
* @param curs curso del alumno
*/
Alumno::Alumno(unsigned curs): curso(curs)
{
unsigned num = rand() % 100000000;
stringstream s;
s << num;
string letra;
letra.push_back( rand() % (90-65+1) + 65 ); // A 65, Z 90
dni = s.str() + letra;
nombre = list_nombre[ rand() % NUM_NOMBRE];
apellidos = list_apellido[ rand() % NUM_NOMBRE];
telefono = rand() % 100000000 + 600000000;
}
/**
* Escribe el alumno en un stream de salida
* @param out Stream de salida
* @param alu alumno a escribir
*/
ostream & operator<<(ostream & out, const Alumno & alu)
{
const string tab = " ";
out << "==================================" << endl;
out << tab << "DNI: " << alu.dni << endl;
out << tab << "Nombre: " << alu.nombre << tab << alu.apellidos << endl;;
out << tab << "Curso: " << alu.curso;
out << tab << "Telefono: " << alu.telefono << endl;
out << "==================================" << endl;
return out;
}
main() :
codice:
int main()
{
ABB arbol;
int i = 0;
string dni;
Alumno al_aux;
for (int i=0; i<1000; i++){
Alumno al_aux(rand());
arbol.insertar(al_aux.getDNI(),al_aux);
}
arbol.inorden(cout);
cout << endl;
}
il metodo inorden oltre a scorrere l'albero secondo una scansione inorder ... lo stampa ordinato.