elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Programa que muestra la frecuencia de una lista de compras en: 9 Junio 2020, 16:40 pm
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
  1. #include <stdio.h>  // printf
  2. #include <stdlib.h> // malloc y free
  3. #include <string.h> // strcasecmp
  4. #include <conio.h>
  5. #include <iostream>
  6. #include <fstream>
  7. #include <bits/stdc++.h>
  8.  
  9. using namespace std;
  10.  
  11. //Prototipos de funciones
  12. void agregar(struct frecuenciaCompras indice);
  13. void agregarLista(char id[100]);
  14. void imprimir();
  15. void guardar();
  16. bool OrdenarPorIndice(const pair<int, int>& a, const pair<int, int>& b);
  17. void OrdenarPorFrecuencia(int recibo[], int n);
  18. void menu();
  19.  
  20. struct Nodo *superior = NULL;      //Como estara vacio entonces es Null
  21.  
  22. //Declaro Una estructura con datos ID y NumeroCompras
  23. struct frecuenciaCompras{
  24. char id[200];
  25. int NumeroCompras;
  26. };
  27. //Declaro un nodo que me ayudara a crear mi pila
  28. struct Nodo{                                //Declaro una Estructura la cual es un Nodo y contiene los valores de indice
  29. struct frecuenciaCompras indice;
  30. struct Nodo *sigue;                     //Apunta a un nodo siguiente por tratarse de una pila
  31. };
  32.  
  33.  
  34.  
  35. //----------------------------------------------Funcion Main-----------------------------------------------------
  36. int main(){
  37.  
  38. cout<<"\tSupermercado \n\n " <<endl;
  39. menu();
  40.  
  41. getch();
  42.  
  43.  
  44. }
  45. //----------Declaracion de las funciones--------------------
  46. void agregar(struct frecuenciaCompras indice){                          //Esta funcion hace un push, es decir, agrega un struct
  47.  struct Nodo *agregaNodo = (Nodo*)malloc(sizeof(struct Nodo));
  48.  agregaNodo->indice = indice;
  49.  agregaNodo->sigue = superior;
  50.  superior = agregaNodo;
  51. }
  52. void buscarPorFrecuencia(char id[200]){                    //Esta funcion recorre toda la pila y compara cada caracter, si encuentra un caracter repetido la frecuencia aumenta
  53. struct Nodo *aux = superior;
  54. while (aux != NULL){
  55. int buscafrecuencia = strcasecmp(aux->indice.id, id);
  56. if(buscafrecuencia==0){
  57. aux->indice.NumeroCompras++; //Si se repite entonces se le sumara 1 al numero de compras
  58. return;
  59. }
  60. aux = aux->sigue;
  61. }
  62. struct frecuenciaCompras indice;
  63. strcpy(indice.id, id);
  64. indice.NumeroCompras = 1;                               //Si solo se repite 1 vez entonces el numero de compras es 1
  65. agregar(indice);
  66. }
  67.  
  68. void imprimir(){
  69.  char guiones[] = "---------------------";
  70.  printf("%s%s\n", guiones, guiones);
  71.  printf("|%-20s|%-20s|\n", "ID producto", "Veces Comprado");
  72.  printf("%s%s\n", guiones, guiones);
  73.  
  74. struct Nodo *aux = superior;
  75.  
  76. while (aux != NULL){
  77. printf("|%-20s|%-20d|\n", aux -> indice.id, aux->indice.NumeroCompras);
  78. aux = aux -> sigue;                                                         //Con esto imprimo el que sigue
  79. }
  80.  
  81. printf("%s%s\n", guiones, guiones);
  82.  
  83. }
  84.  
  85. void guardar(){
  86.    ofstream archivo;                                      //Se ejecuta la funcion ofstream
  87. char fecha[15];
  88.  
  89. cout<<"Fecha de Guardado: ";                            //Se le pide al usuario que digite la fecha
  90. cin.ignore();
  91. cin.getline(fecha,15, '\n');
  92.  
  93. archivo.open("BaseDatos.txt",ios::app);                 //Se abre el archivo
  94. archivo<<"Fecha de guardado: "<<fecha<<"\n";            //se escribe la fecha de guardado del archivo
  95.  
  96. struct Nodo *aux = superior;                                   //Creo una variable auxiliar y la iguala a superior
  97.  
  98. char guion[] = "--------------------";                  //Apartado unicamente para la interfaz grafica
  99.  
  100.    archivo<<"+"<<guion<<"+"<<guion<<"+\n";
  101.    archivo<<"   Producto          |     Frecuencia     \n";
  102.    archivo<<"+"<<guion<<"+"<<guion<<"+\n";
  103.  
  104. while(aux != NULL){                                     //Se declara un bucle para guardar los datos
  105. archivo<<aux->indice.id<<"                             "<<aux->indice.NumeroCompras<<"\n";  //accedo a los valores de mi estructura indice y el numero de compras
  106. aux = aux->sigue;
  107. }
  108.  
  109. archivo<<"+"<<guion<<"+"<<guion<<"+\n";                 //Apartado para graficos
  110.    archivo.close();                                        //Cierro mi archivo
  111. cout<<"Base de datos actualizada\n\n";
  112. }
  113.  
  114.  
  115. //------------------------------Esta funcion me ordena mi cadena de enteros dependiendo de la frecuencia-----------------------------------------
  116. //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
  117. unordered_map<int, int> valor;                                              //unordered_map almacena elementos formados por la combinacion de un valor clave y un valor mapeado
  118.  
  119. bool OrdenarPorIndice(const pair<int, int>& a, const pair<int, int>& b){
  120.  
  121.    if (a.second == b.second)
  122.        return valor[a.first] < valor[b.first];
  123.  
  124.    return a.second > b.second;
  125. }
  126.  
  127. void OrdenarPorFrecuencia(int recibo[], int n){                   //Funcion que me ordena, recibe una lista de enteros, el int n solo sirve para los bucles for{
  128.    unordered_map<int, int> mapaa;
  129.    vector<pair<int, int> > vec;                                //El pair consta de 2 elementos, el primero elemento se hace referencia como primero(first) y el segundo(second)
  130.  
  131.    for (int i = 0; i < n; ++i) {
  132.        mapaa[recibo[i]]++;
  133.  
  134.        if (valor[recibo[i]] == 0) // Actualiza el valor del mapa solo una vez
  135.            valor[recibo[i]] = i + 1;
  136.    }
  137.  
  138.  
  139.    copy(mapaa.begin(), mapaa.end(), back_inserter(vec));      //copio mapa al vector mediante la funcion copy
  140.  
  141.    sort(vec.begin(), vec.end(), OrdenarPorIndice); //sort me  sirve para ordenar el vector en orden ascendente (por indice)
  142.    int elj; //declaro una variable int la cual convertire a char
  143.    string je;
  144.    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
  145.        for (int j = 0; j < vec[i].second; ++j){
  146.            elj = vec[i].first;
  147. //----------------------Convierto el int a string ------------------
  148.            stringstream ss;
  149.            ss<<elj;
  150.            string s;
  151.            string space(" ");                              //Dejo un espacio por cada valor
  152.            ss>>s;
  153.            s.append(space);                               //Concateno los string
  154.            je.append(s);
  155.  
  156. }
  157. }
  158. //-------------------------Convierto de string a char---------------
  159. char c[je.size()+1];
  160. strcpy(c, je.c_str());
  161.    cout<<"La lista ordenda por frecuencia es: "<<c<<endl;
  162. //strrev(c);   //se invierte el orden de la cadena
  163.                char delimitador[] = ", ";                     //Esto me indica que al presentarse una coma o espacio se dividara la cadena
  164. char *token = strtok(c, delimitador);           //tokenizo mi char con la funcion strtok
  165. while (token != NULL){                      //Establesco un While para ingresar token por token a mi pila
  166. buscarPorFrecuencia(token);
  167. token = strtok(NULL, delimitador);
  168. }
  169.  
  170. cout << "Lista agregada correctamente\n\n";
  171.  
  172. }
  173.  
  174. //------------------------Menu interactivo------------------------------------------
  175. void menu(){
  176. int opcion;
  177. do{
  178. cout<<"\t Proyecto Supermercado\n";
  179. cout<<"(1) Insertar lista\n";
  180. cout<<"(2) Ver Tabla\n";
  181. cout<<"(3) Guardar Datos\n";
  182. cout<<"Ingrese una opcion: ";
  183. cin>>opcion;
  184.  
  185. switch(opcion){
  186. case 1:{    int lista[] = { 30,10,20,90, 30,30,40,40,40, 55,55,75,75,100,55,55 };       //Se ingresan las listas
  187. 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,
  188.                                                                                            //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.
  189. OrdenarPorFrecuencia(lista, bucle);                                 //Llamo a mi funcion y envio mi lista y mi n
  190.  
  191. }break;
  192.  
  193. case 2:{ cout <<"Mostrando Datos \n";
  194. imprimir();                                               //Llamo a mi funcion imprimir
  195. }break;
  196. case 3:{guardar();                                                //Llamo a mi funcion guardar
  197. }break;
  198. }
  199. }while(opcion!=4);
  200.  
  201.  
  202.  
  203. }
2  Programación / Programación C/C++ / ¿Como dejar espacios en un int? en: 4 Mayo 2020, 17:05 pm
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
  1. cout << "Ingrese las listas: ";
  2. cin.ignore();
  3. cin.getline(lista,200,'\n');       //Guardo mi lista
  4. char *token = strtok(lista, delimitador); //Tokenizo mi lista
  5. while (token != NULL){
  6. int eje;
  7. //int espacio = ;
  8. eje = atoi(token); //Convierto mi token a int
  9. int a[] = {eje};    //Guardo en mi variable a
  10.  
  11. token = strtok(NULL, delimitador);
  12. cout<<*a;                      //Imprimo mi variable a, si mi lista es: 2,3,4,5 me imprime 2345
  13. } //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  Programación / Programación C/C++ / Re: ¿Alguna manera para guardar resultados de un for? en: 4 Mayo 2020, 02:18 am
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  Programación / Programación C/C++ / ¿Alguna manera para guardar resultados de un for? en: 3 Mayo 2020, 23:03 pm
Hola a todos, tengo una pregunta, ¿Como puedo guardar los resultados de un for?
para que me entiendan les dejo este codigo:
Código
  1.   for (int i = 0; i < 10; ++i) {
  2.  cout<<x[i];
  3. }
  4.  

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  Programación / Programación C/C++ / Re: ¿Como guardar datos de pila en un archivo de texto? en: 3 Mayo 2020, 19:03 pm
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
  1. int main(){
  2. int i,j,k;
  3. char a[50],aux;
  4.  
  5. for(i=0;(a[i]=getchar())!='\n';i++){
  6.  
  7. for(k=0;k<i;k++){
  8. for(j=1;j<i;j++){
  9. if(a[j]<a[j-1]){
  10. aux=a[j];
  11. a[j]=a[j-1];
  12. a[j-1]=aux;
  13. }
  14. }
  15. }
  16. }
  17. for(j=0;j<i;j++){
  18. printf("%c",a[j]);
  19. }
  20.  
Pero no lo logro ordenar por frecuencia :(
6  Programación / Programación C/C++ / Re: ¿Como guardar datos de pila en un archivo de texto? en: 3 Mayo 2020, 17:59 pm
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
  1. char ejemplo[] = "1,1,2,3,3,3,4,4,5,5,5,5,6,7";
  2.  
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  Programación / Programación C/C++ / Re: ¿Como guardar datos de pila en un archivo de texto? en: 3 Mayo 2020, 02:13 am
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
  1. while(aux != NULL){
  2.  archivo << aux;
  3.  aux = aux->sigue;
  4.  archivo<<aux->sigue->indice.id;
  5.  archivo<<aux->sigue->sigue->indice.id;
  6.  archivo<<aux->sigue->sigue->sigue->indice.id;
  7. }
  8. 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  Programación / Programación C/C++ / Re: ¿Como guardar datos de pila en un archivo de texto? en: 3 Mayo 2020, 02:10 am
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
  1. while(aux != NULL){
  2.  archivo << aux;
  3.  aux = aux->sigue;
  4.  
  5. }
  6. archivo.close();
9  Programación / Programación C/C++ / Re: ¿Como guardar datos de pila en un archivo de texto? en: 2 Mayo 2020, 21:19 pm
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  Programación / Programación C/C++ / ¿Como guardar datos de pila en un archivo de texto? en: 2 Mayo 2020, 01:49 am
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:
Código
  1. [code=cpp]struct frecuenciaCompras{
  2. char id[100];
  3. int NumeroCompras;
  4. };
  5.  
  6. struct Nodo{
  7. struct frecuenciaCompras indice;
  8. struct Nodo *sigue;
  9. };
  10.  
[/code]

mis funciones para agregar:

Código
  1. void agregar(struct frecuenciaCompras indice){
  2.  struct Nodo *agregaNodo = (Nodo*)malloc(sizeof(struct Nodo));
  3.  agregaNodo->indice = indice;
  4.  agregaNodo->sigue = superior;
  5.  superior = agregaNodo;
  6. }
  7. void agregarLista(char id[100]){
  8. struct Nodo *aux = superior;
  9. while (aux != NULL){
  10. int buscafrecuencia = strcasecmp(aux->indice.id, id);
  11. if(buscafrecuencia==0){
  12. aux->indice.NumeroCompras++;
  13. return;
  14. }
  15. aux = aux->sigue;
  16. }
  17. struct frecuenciaCompras indice;
  18. strcpy(indice.id, id);
  19. indice.NumeroCompras = 1;
  20. agregar(indice);
  21. }
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
  1. void guardar(){
  2. ofstream archivo;
  3. char guiones[] = "--------------------";
  4. archivo.open("BaseDatos.txt",ios::app);
  5. if(archivo.fail()){
  6. cout<<"No se pudo abrir";
  7. exit(1);
  8. }
  9.  
  10. struct Nodo *aux = superior;
  11. while(aux != NULL){                     //En esta parte deberia de guardarse los datos de mi aux
  12. archivo<<aux;
  13. aux = aux->sigue;
  14. archivo.close();
  15. }
  16.  
  17. }
Espero y puedan ayudarme, les agradezco
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines