paso de vectores a una funcion

Iniciado por flony, 4 Septiembre 2014, 22:50 PM

0 Miembros y 1 Visitante están viendo este tema.

flony

hola amigos del foro tengo una duda y es que tengo dos vectores, a una función.
un vector es (int *, const int) y el otro es (string * , const int) y quiero pasar los dos vectores y se unan en una sola funcion
se pasar un vector a una función, pero pasar dos vectores y que se unan no le encuentro la vuelta  ::).
intente (int *, const int, string * , const int) pero solo entiende el primero como le hago  :huh:
si un problema no tiene solucion entonces no es un problema...es algo inevitable

ecfisa

#1
Hola flony.

No sé si interpreté bién la consulta, pero fijate si te sirve del modo de este ejemplo:

Código (cpp) [Seleccionar]

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

void joindata(int*, const int , string* , const int, string*);

int main() {
 int vi[10] = {1,2,3,4,5,6,7,8,9,10};
 string vs[6] = {"uno", "dos", "tres", "cuatro", "cinco", "seis"};
 string res[100];
 int isize = sizeof(vi)/sizeof(vi[0]);
 int ssize = sizeof(vs)/sizeof(vs[0]);
 int maxsize = isize > ssize ? isize : ssize;

 joindata(vi, isize, vs, ssize, res);
 for (int i=0; i < maxsize; i++)
   cout << res[i] << endl;
 cin.get();
 return 0;
}

void joindata(int* vint, const int nvi, string* vstr, const int nvs, string* result) {
 int minsize = nvi < nvs ? nvi : nvs;

 for(int i=0; i < minsize; i++) {
   stringstream aux;
   aux << vint[i];
   result[i] = aux.str() + " " + vstr[i];
 }
 if (nvi > nvs)
   for(int i=minsize; i<minsize+abs(nvi-nvs);i++) {
     stringstream aux;
     aux << vint[i];
     result[i] = aux.str();
   }
 if (nvi < nvs)
    for(int i=minsize; i<minsize+abs(nvi-nvs);i++)
      result[i] = vstr[i];
}


Saludos.

flony

#2
bueno acá mi problema  :-[
Código (cpp) [Seleccionar]
/*
Me dieron la tarea de crear un programa que cumpla con las características para resolver el siguiente problema:
En una elección, existen 7 candidatos, cada votante puede votar una vez ,
por el candidato de su elección . El voto se registra con un numero del 1 al
7.El numero de votantes es desconocido de antemano ,pero la elección termina cuando
se ingresa un 0 , cualquier voto que no pertenezca al hongo [1,7] se considerara como
nulo .

Un archivo llamado votos.txt contiene los nombres de los candidatos. El primer nombre es
considerado como el candidato numero uno , así sucesivamente.("ACA DECIDI HACERLO MAS DIFICIL Y QUE TENGAN NOMBRES Y NO NUMEROS SINO ES FACIL YA TENGO LA RESPUESTA")

Los nombres son seguidos por los votos.

Se debe escribir con programa que lea los datos y realice el escrimo de la elección, escribiendo
los resultados en un archivo llamado resultado.txt

La salida de especificar el numero total de votos, el numero total de votos por candidato
, total de votos nulos y los ganadores.
*/
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

void votacion (int); //determina a que candidato se esta votando o si es nulo
void conteo(int);    //determina a que candidato que es un [i] en un vector va el voto
void leer_txt();     //lee de un txt los nombres de los candidatos y pasan a formar parte de un vector
void fin(int * const, const int ); //quiero conteo() y leer() salgan en pantalla candadato[i]-voto[i]
void escribir_txt(); // la funcion fin() se escribe en un txt


int main() //funcion main todavia no concluida del todo
{
int voto;
cout<<"bienvenido a la votacion de vaya a saber que cosa"<<endl;
cout<<"los candidatos son: " <<endl;
leer_txt();
cout<<"emita su voto UNO para el primer candidato"<<endl;
cout<<"DOS para el segundo etc etc"<<endl;
if (voto!=0)
{
votacion(voto);
}
else
{
cout<<"parece que termino la votacion "<<endl;
cout<<"gracias por usar nuestros servicios :)"<<endl;
fin();       
}



return 0;
}

void votacion(int voto_candidato)
{

if (voto_candidato>0 && voto_candidato <8)
{
conteo(voto_candidato);
}
else
{
if(voto_candidato<0 || voto_candidato >8 )
{
cout<<"ingreso voto nulo" <<endl;
voto_candidato=7;
    }

}
}

void conteo (int posicionEnElVector)
{
const int tamanioHongo=7;
int hongo[tamanioHongo]={0};
hongo[posicionEnElVector-1]+=1;
fin(hongo, tamanioHongo);
}

void fin(int * const elementoPuntero, const int tamanio1)
{

}

void leer_txt()
{
const int tamanio=7;
int candidatosTxt [tamanio];
ifstream MiArchivo ("votos.txt");
if (MiArchivo.is_open())
{
for (int i = 0; i < 8; i++)
{
candidatosTxt[i];
}
fin(candidatosTxt, tamanio);//ver tema de pasar un string cuando espera recibir un int
}
}

void escribir_txt()
{
ofstream myFile;
myFile.open("resultado.txt");
myFile<<"aca hasta podemos poner la funcion fin"; // aca pondremos la funcion fin y quedara en un txt ;)
myFile.close();
}
si un problema no tiene solucion entonces no es un problema...es algo inevitable

eferion

Tienes varias opciones a la hora de enfocar el problema:

Usar contenedores

Los contenedores de C++ son de los elementos más útiles en programación. Elegir el contenedor adecuado a cada situación puede ahorrarte mucho código.

En tu caso, imagina que tienes X candidatos. Podrías crear un vector de X+1 elementos, de tal forma que el índice cero se use para almacenar los votos nulos, el resto de índices se usa para contar los votos de cada candidatos:

Código (cpp) [Seleccionar]

// Este número lo calculas al leer el fichero
int numCandidatos = 10;

// Creamos un vector que inicialmente va a tener X + 1 elementos
// Al ser un vector de tipo int, el valor inicial de cada elemento es 0.
std::vector< int > votos{ numCandidatos + 1 };

// Fase de votación
std::cout << "Emite tu voto: ";
int voto;
std::cin >> voto;

if ( voto == 0 )
{
  // Fin de la votación
}
else if ( voto < 0 || voto >= votos.size( ) )
  votos[ 0 ]++; // El voto es nulo
else
  votos[ voto ]++; // Incrementamos los votos del candidato


Con este formato, la presentación de los resultados es bastante trivial:

Código (cpp) [Seleccionar]

for ( unsigned int i = 1; i < votos.size( ); ++i )
{
  std:cout << "Candidato " << i << ": " << votos[ i ] << " votos" << std::endl;
}

std::cout << "Votos nulos: " << votos[ 0 ] << std::endl;

// Total de votos versión 1:
int total = 0;
for ( auto it = std::begin( votos ); it != std::end( votos ); ++it )
  total += *it;

// Total de votos version 2:
int total = std::accumulate( std::begin( vector ), std::end( vector ), 0 );

std::cout << "Total de votos: " << total << std::endl;


Otro contenedor que puedes usar es 'map'. Los mapas tienen la ventaja de que pueden usar un string por índice (y quien dice un string dice un float, una clase propia, ... ), lo cual viene bien en bastantes ocasiones.

También puedes usar new y delete para crear un arreglo. A mi no me parece una buena idea salvo que quieras practicar con ello.