2

Igonren las librerias soy nuevo en esto. Estoy llenando una pila y luego vaciandola y mostrando el resultado en pantalla, cuando saco los datos los guardo en un array y los imprime, muestra datos que no se de donde salieron, hasta ahora me he fijado que el error se presenta cuando ingreso dos enteros. Estoy usando el siguiente codigo de C++:

#include <iostream>
#include <cstdlib>
#include <stdlib.h>
#include <fstream>
#include <string.h>
#include <cctype>
#include <cstdlib>

using namespace std;

struct Nodo {
    int dato;
    Nodo* siguiente;
};

bool esNumerico(string);

void agregarPila(Nodo*&, int);

void sacarPila(Nodo*&, int&);

int main()
{
    cout << "\n\t\tBienvenido\n";
    cout << "\tPrograma que llena una pila\n";
    char rpt;
    Nodo* pila = NULL;
    int dato;
    do {
        string linea;
        int numero;
        bool repite = true;
        do {
            cout << "\tIngrese un valor para agrega a la pila ";
            getline(cin, linea);
            if (esNumerico(linea)) {
                repite = false;
            }
            else {
                cout << "\n\tNo ha ingresado un entero. Intente nuevamente" << endl;
            }
        } while (repite);
        dato = atoi(linea.c_str());
        agregarPila(pila, dato);
        cout << "\nSe ha guardado el dato: " << dato;
        cout << "\n\tDesea agregar otro elemento a la pila (S/N)";
        cin >> rpt;
    } while (rpt == 's' || rpt == 'S');
    cout << "Los elementos ingresados a a pila son:\n";
    int datos[10];
    int an = 0;
    while (pila != NULL) {
        an++;
        sacarPila(pila, dato);
        int alfa = 0;
        if (pila != NULL) {
            datos[an - 1] = dato;
            cout << dato << ", ";
        }
        else {
            datos[an - 1] = dato;
            cout << dato << ".";
        }
    }
    for (int an = 0; an < 9; an++) {
        cout << "\n" << datos[an] << " " << an;
        /*if (datos[an]>0){
                cout<<"\n"<<datos[an]<<" "<<an;
        }else{
                cout<<"se ha llegado al final del array";
        }*/
    }
    system("PAUSE");
    return 0;
}

void agregarPila(Nodo*& pila, int n)
{
    Nodo* nuevo_nodo = new Nodo();
    nuevo_nodo->dato = n;
    nuevo_nodo->siguiente = pila;
    pila = nuevo_nodo;
    cout << "\tElemento " << n << " ha sido agregado correctamente";
}

void sacarPila(Nodo*& pila, int& n)
{
    Nodo* aux = pila;
    n = aux->dato;
    pila = aux->siguiente;
    delete aux;
}

bool esNumerico(string linea)
{
    bool b = true;
    int longitud = linea.size();
    if (longitud == 0) { // Cuando el usuario pulsa ENTER
        b = false;
    }
    else if (longitud == 1 && !isdigit(linea[0])) {
        b = false;
    }
    else {
        int i;
        if (linea[0] == '+' || linea[0] == '-')
            i = 1;
        else
            i = 0;
        while (i < longitud) {
            if (!isdigit(linea[i])) {
                b = false;
                break;
            }
            i++;
        }
    }
    return b;
}

Ésto es lo que no se de donde sale:

introducir la descripción de la imagen aquí

Escribo esto porque no me deja publicar si no coloco mas detalles, no se con que mas podría profundizar en esto todo lo siguiente sera texto sin sentido.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82

1 Answers1

5

Cuando saco los datos los guardo en un array y los imprime, muestra datos que no se de donde salieron.

No salieron de ningún lado, estaban ahí antes de que llegase tu programa.


Una de las máximas de C++ es "No pagues por lo que no usas" que se traduce en que a no ser que indiques lo contrario, el programa no se va a dedicar a gastar tiempo y recursos en poner a 0 la memoria usada. Tu formación1 no inicializa sus valores porque no se lo has pedido:

int datos[10];

Por lo tanto está almacenando valores indeterminados (en general, valores residuales, por ejemplo de la ejecución de otros procesos), si quieres que tenga valores 0 puedes añadirle unas llaves vacías:

int datos[10]{}; // <--- Esto estará todo a 0, porque la lista de valores está vacía.

Otras cosas a tener en cuenta.

Cabeceras.

Igonren las librerias soy nuevo en esto.

No. Ser nuevo no es excusa para no aprender, al contrario ¡es la mejor excusa para aprender! No puedo ignorar las librerías porque hay detalles importantes que debes aprender de las librerías usadas.

  1. Estás repitiendo la cabecera <cstdlib>. Esto suele ser inocuo porque se suelen usar guardas de inclusión, pero no evita que la inclusión sea procesada (gastando tiempo y proceso) y no ayuda a que tu código sea claro.
  2. Estás mezclando cabeceras de C y C++. Las cabeceras de C tienen extensión (.h) y las de C++ no. Hay cabeceras de C adaptadas a C++ a las que se les añade el prefijo c (y se les elimina la extensión) por lo tanto <stdlib.h> y <cstdlib> son la misma cabecera pero la primera en versión C y la segunda en versión C++. Lee este hilo para más detalles.
  3. Hay cabeceras que has incluido pero de las que no usas ninguna de sus utilidades. Esto es inocuo a priori, pero puede aumentar tus tiempos de compilación.

Paradigma.

El lenguaje C++ es multiparadigma, así que a priori no estás limitado a un paradigma concreto; pero uno de los puntos fuertes del lenguaje es su soporte a la programación orientada a objetos así que te aconsejo que crees un objeto pila, puedes ver un ejemplo leyendo este hilo.

Nomenclatura.

Usa nombres para tus variables que sean autoexplicativos y dejen claro su objetivo, nombres como rpt, n, o an dan muy pocas pistas.

Deja respirar tu códig.

En los 80 y 90 teníamos pantallas que sólo ofrecían 80 caracteres de ancho y 25 líneas de alto, por entonces era necesario apretujar el código para que cupiera la mayor cantidad posible en pantalla. Hoy día esos tiempos quedaron atrás y podemos usar pantallas mucho más grandes, por favor, no apretujes tu código, tu yo del futuro te lo agradecerá.


También conocida como arreglo o array en inglés.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82