Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - LuisUvtol

#1
Hola a todos, perdón por el retraso pero hasta ahorita tuve un poco de tiempo, les comparto mi programa, el cual dado una lista (separada por comas) calcula la frecuencia de esta misma, tambien lo guarda en un archivo de texto, les dejo el código, solo creen su archivo de texto, yo lo puse como "BaseDeDatos.txt", no es el mejor programa pero si funciona jeje
Código:
Código (cpp) [Seleccionar]
#include <stdio.h>  // printf
#include <stdlib.h> // malloc y free
#include <string.h> // strcasecmp
#include <conio.h>
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>

using namespace std;

//Prototipos de funciones
void agregar(struct frecuenciaCompras indice);
void agregarLista(char id[100]);
void imprimir();
void guardar();
bool OrdenarPorIndice(const pair<int, int>& a, const pair<int, int>& b);
void OrdenarPorFrecuencia(int recibo[], int n);
void menu();

struct Nodo *superior = NULL;      //Como estara vacio entonces es Null

//Declaro Una estructura con datos ID y NumeroCompras
struct frecuenciaCompras{
char id[200];
int NumeroCompras;
};
//Declaro un nodo que me ayudara a crear mi pila
struct Nodo{                                //Declaro una Estructura la cual es un Nodo y contiene los valores de indice
struct frecuenciaCompras indice;
struct Nodo *sigue;                     //Apunta a un nodo siguiente por tratarse de una pila
};



//----------------------------------------------Funcion Main-----------------------------------------------------
int main(){

cout<<"\tSupermercado \n\n " <<endl;
menu();

getch();


}
//----------Declaracion de las funciones--------------------
void agregar(struct frecuenciaCompras indice){                          //Esta funcion hace un push, es decir, agrega un struct
 struct Nodo *agregaNodo = (Nodo*)malloc(sizeof(struct Nodo));
 agregaNodo->indice = indice;
 agregaNodo->sigue = superior;
 superior = agregaNodo;
}
void buscarPorFrecuencia(char id[200]){                    //Esta funcion recorre toda la pila y compara cada caracter, si encuentra un caracter repetido la frecuencia aumenta
struct Nodo *aux = superior;
while (aux != NULL){
int buscafrecuencia = strcasecmp(aux->indice.id, id);
if(buscafrecuencia==0){
aux->indice.NumeroCompras++; //Si se repite entonces se le sumara 1 al numero de compras
return;
}
aux = aux->sigue;
}
struct frecuenciaCompras indice;
strcpy(indice.id, id);
indice.NumeroCompras = 1;                               //Si solo se repite 1 vez entonces el numero de compras es 1
agregar(indice);
}

void imprimir(){
 char guiones[] = "---------------------";
 printf("%s%s\n", guiones, guiones);
 printf("|%-20s|%-20s|\n", "ID producto", "Veces Comprado");
 printf("%s%s\n", guiones, guiones);

struct Nodo *aux = superior;

while (aux != NULL){
printf("|%-20s|%-20d|\n", aux -> indice.id, aux->indice.NumeroCompras);
aux = aux -> sigue;                                                         //Con esto imprimo el que sigue
}

printf("%s%s\n", guiones, guiones);

}

void guardar(){
   ofstream archivo;                                      //Se ejecuta la funcion ofstream
char fecha[15];

cout<<"Fecha de Guardado: ";                            //Se le pide al usuario que digite la fecha
cin.ignore();
cin.getline(fecha,15, '\n');

archivo.open("BaseDatos.txt",ios::app);                 //Se abre el archivo
archivo<<"Fecha de guardado: "<<fecha<<"\n";            //se escribe la fecha de guardado del archivo

struct Nodo *aux = superior;                                   //Creo una variable auxiliar y la iguala a superior

char guion[] = "--------------------";                  //Apartado unicamente para la interfaz grafica

   archivo<<"+"<<guion<<"+"<<guion<<"+\n";
   archivo<<"   Producto          |     Frecuencia     \n";
   archivo<<"+"<<guion<<"+"<<guion<<"+\n";

while(aux != NULL){                                     //Se declara un bucle para guardar los datos
archivo<<aux->indice.id<<"                             "<<aux->indice.NumeroCompras<<"\n";  //accedo a los valores de mi estructura indice y el numero de compras
aux = aux->sigue;
}

archivo<<"+"<<guion<<"+"<<guion<<"+\n";                 //Apartado para graficos
   archivo.close();                                        //Cierro mi archivo
cout<<"Base de datos actualizada\n\n";
}


//------------------------------Esta funcion me ordena mi cadena de enteros dependiendo de la frecuencia-----------------------------------------
//Si tengo una lista de enteros: 4,5,5,6,6,6 me la ordena de la siguiente forma: 6 6 6 5 5 4
unordered_map<int, int> valor;                                              //unordered_map almacena elementos formados por la combinacion de un valor clave y un valor mapeado

bool OrdenarPorIndice(const pair<int, int>& a, const pair<int, int>& b){

   if (a.second == b.second)
       return valor[a.first] < valor[b.first];

   return a.second > b.second;
}

void OrdenarPorFrecuencia(int recibo[], int n){                   //Funcion que me ordena, recibe una lista de enteros, el int n solo sirve para los bucles for{
   unordered_map<int, int> mapaa;
   vector<pair<int, int> > vec;                                //El pair consta de 2 elementos, el primero elemento se hace referencia como primero(first) y el segundo(second)

   for (int i = 0; i < n; ++i) {
       mapaa[recibo[i]]++;

       if (valor[recibo[i]] == 0) // Actualiza el valor del mapa solo una vez
           valor[recibo[i]] = i + 1;
   }


   copy(mapaa.begin(), mapaa.end(), back_inserter(vec));      //copio mapa al vector mediante la funcion copy

   sort(vec.begin(), vec.end(), OrdenarPorIndice); //sort me  sirve para ordenar el vector en orden ascendente (por indice)
   int elj; //declaro una variable int la cual convertire a char
   string je;
   for (int i = 0; i < vec.size(); ++i) { //Declaro una sentencia for anidada el primer for es para recorrer el vector y el sgundo para ir guardando los datos en mi variable elj
       for (int j = 0; j < vec[i].second; ++j){
           elj = vec[i].first;
//----------------------Convierto el int a string ------------------
           stringstream ss;
           ss<<elj;
           string s;
           string space(" ");                              //Dejo un espacio por cada valor
           ss>>s;
           s.append(space);                               //Concateno los string
           je.append(s);

}
}
//-------------------------Convierto de string a char---------------
char c[je.size()+1];
strcpy(c, je.c_str());
   cout<<"La lista ordenda por frecuencia es: "<<c<<endl;
//strrev(c);   //se invierte el orden de la cadena
               char delimitador[] = ", ";                     //Esto me indica que al presentarse una coma o espacio se dividara la cadena
char *token = strtok(c, delimitador);           //tokenizo mi char con la funcion strtok
while (token != NULL){                      //Establesco un While para ingresar token por token a mi pila
buscarPorFrecuencia(token);
token = strtok(NULL, delimitador);
}

cout << "Lista agregada correctamente\n\n";

}

//------------------------Menu interactivo------------------------------------------
void menu(){
int opcion;
do{
cout<<"\t Proyecto Supermercado\n";
cout<<"(1) Insertar lista\n";
cout<<"(2) Ver Tabla\n";
cout<<"(3) Guardar Datos\n";
cout<<"Ingrese una opcion: ";
cin>>opcion;

switch(opcion){
case 1:{    int lista[] = { 30,10,20,90, 30,30,40,40,40, 55,55,75,75,100,55,55 };       //Se ingresan las listas
int bucle = sizeof(lista) / sizeof(lista[0]);                    // sizeof (lista) devuelve el número de bytes que ocupa la matriz. Como cada elemento puede ocupar más de 1 byte de espacio,
                                                                                           //se divide el resultado con el tamaño de un elemento (sizeof (lista [0])). Esto le da un número de elementos en la matriz.
OrdenarPorFrecuencia(lista, bucle);                                 //Llamo a mi funcion y envio mi lista y mi n

}break;

case 2:{ cout <<"Mostrando Datos \n";
imprimir();                                               //Llamo a mi funcion imprimir
}break;
case 3:{guardar();                                                //Llamo a mi funcion guardar
}break;
}
}while(opcion!=4);



}
#2
Hola a todos, necesito ayuda con este pequeño problema, se que es muy sencillo pero no he encontrado la manera de resolverlo, ¿Como puedo dejar una coma en una variable int? les dejo mi codigo para que me entiendan mejor:
Código (cpp) [Seleccionar]
cout << "Ingrese las listas: ";
cin.ignore();
cin.getline(lista,200,'\n');       //Guardo mi lista
char *token = strtok(lista, delimitador); //Tokenizo mi lista
while (token != NULL){
int eje;
//int espacio = ;
eje = atoi(token); //Convierto mi token a int
int a[] = {eje};    //Guardo en mi variable a

token = strtok(NULL, delimitador);
cout<<*a;                      //Imprimo mi variable a, si mi lista es: 2,3,4,5 me imprime 2345
} //Me gustaria que me imprimiera 2,3,4,5 ¿Como puedo hacerlo?


Intente haciendo esto: int[a]={eje,}, pero no servio, esta pensando en guardar un int = ,; pero se que esto no funciona :( ayuda por favor! Gracias
#3
creo que seria muy util usar el string, como podria convertir ese string a un int[]
he usado funciones como atoi pero solo me convierte hasta que encuentra una coma, ejemplo

string ejemplo("2,2,1,3")
Si uso la funcion atoi solo me convierte en entero el primer 2
hay alguna forma u otra funcion?
Gracias a todos por sus respuestas!
#4
Hola a todos, tengo una pregunta, ¿Como puedo guardar los resultados de un for?
para que me entiendan les dejo este codigo:
Código (cpp) [Seleccionar]
   for (int i = 0; i < 10; ++i) {
  cout<<x[i];
}


como puedo guardar todos los resultados de x en una sola variable?
si mi programa imprime: 1 2 3 4 5
como guardar esos datos en una variable?
Gracias!
#5
Gracias por tu respuesta! Lo que yo busco hacer es ordenar esa cadena, dependiendo de las repeticiones y que se me genere una nuevo char, ya con este nuevo char modifico mi codigo para poder trabajar con el, puedo ordenar el char de manera ascencente con el siguiente codigo:
Código (cpp) [Seleccionar]

int main(){
int i,j,k;
char a[50],aux;

for(i=0;(a[i]=getchar())!='\n';i++){

for(k=0;k<i;k++){
for(j=1;j<i;j++){
if(a[j]<a[j-1]){
aux=a[j];
a[j]=a[j-1];
a[j-1]=aux;
}
}
}
}
for(j=0;j<i;j++){
printf("%c",a[j]);
}

Pero no lo logro ordenar por frecuencia :(
#6
Me ha funcionado! Muchas gracias, estoy por terminar mi codigo, pero quiero hacer una ultima modoficacion, tal vez me puedas ayudar, ¿Como puedo ordenar una variable tipo char? por ejemplo:
Código (cpp) [Seleccionar]

char ejemplo[] = "1,1,2,3,3,3,4,4,5,5,5,5,6,7";

Quisera ordenarla de esta manera:
ejemplo[] = "5,5,5,5,3,3,3,4,4,1,1,6,7"

Quiero ordenarla dependiendo de la frecuencia de los numeros, Gracias!
#7
Los datos se guardan correctamente en la pila, encontre una manera de guardar los datos pero no es eficiente, deberia emplear un bucle pero no se como implementarlo
Código (cpp) [Seleccionar]
while(aux != NULL){
  archivo << aux;
  aux = aux->sigue;
  archivo<<aux->sigue->indice.id;
  archivo<<aux->sigue->sigue->indice.id;
  archivo<<aux->sigue->sigue->sigue->indice.id;
}
archivo.close();

de esta manera si me guarda los datos en el archivo, he estado intentando usar un bucle ¿Alguna idea para implementarlo?
Gracias!!
#8
Los datos se guardan correctamente en la pila, encontre una manera de guardar los datos pero no es eficiente, deberia emplear un bucle pero no se como implementarlo
Código (cpp) [Seleccionar]
while(aux != NULL){
  archivo << aux;
  aux = aux->sigue;

}
archivo.close();
#9
Gracias por tu respuesta! realice las modificaciones que me dijiste y el resultado es el siguiente:

1. Tengo una pila con los siguientes datos:

ID |Frecuencia
2  |   2
3  |   2
4  |   1
5  |   3

Lo unico que se me guarda en el archivo es lo siguiente:
ID | Frecuencia
2   | 2

ahorita estoy trabajando para que se me guarde todo y por supuesto, si lo logro compartire el codigo en este hilo
si me puedes ayudar con esto estaría muy agradecido!
#10
Buen dia a todos los internautas, tengo un pequeño problema, quiero guardar mis datos a un archivo de texto pero no logro hacerlo el codigo es el siguiente:

Mis estructuras:
[code=cpp]struct frecuenciaCompras{
char id[100];
int NumeroCompras;
};

struct Nodo{
struct frecuenciaCompras indice;
struct Nodo *sigue;
};
[/code]

mis funciones para agregar:

Código (cpp) [Seleccionar]
void agregar(struct frecuenciaCompras indice){
  struct Nodo *agregaNodo = (Nodo*)malloc(sizeof(struct Nodo));
  agregaNodo->indice = indice;
  agregaNodo->sigue = superior;
  superior = agregaNodo;
}
void agregarLista(char id[100]){
struct Nodo *aux = superior;
while (aux != NULL){
int buscafrecuencia = strcasecmp(aux->indice.id, id);
if(buscafrecuencia==0){
aux->indice.NumeroCompras++;
return;
}
aux = aux->sigue;
}
struct frecuenciaCompras indice;
strcpy(indice.id, id);
indice.NumeroCompras = 1;
agregar(indice);
}

El problema lo tengo en mi funcion guardar ya que solo me guarda la direccion de memoria de 1 dato, no de n datos:
Código (cpp) [Seleccionar]
void guardar(){
ofstream archivo;
char guiones[] = "--------------------";
archivo.open("BaseDatos.txt",ios::app);
if(archivo.fail()){
cout<<"No se pudo abrir";
exit(1);
}

struct Nodo *aux = superior;
while(aux != NULL){                     //En esta parte deberia de guardarse los datos de mi aux
archivo<<aux;
aux = aux->sigue;
archivo.close();
}

}

Espero y puedan ayudarme, les agradezco