none
nesesito ayuda con un programa

    Pregunta

  • hola queria preguntarles como hacer una pila de libros con arreglos dinamicos todo dinamico ya que tiene que llevar un libro todos sus datos pero no logro que me salga

    codigo:

    #include<iostream>
    #include<cstdlib>
    #include <string>
    #include<cstring>
    using namespace std;

    struct nodo{
        int nro;
        struct nodo *sgte;
    };

    typedef struct nodo *Puntero;

    class Pila{
        public:
            Pila(void);
            void Apilar(char );
            int Desapilar(void );
            void Cima(void);
            bool PilaVacia(void);
            void MostrarPila(void);
            void DestruirPila(void);

        private:
            Puntero cima;

    };
    Pila::Pila(void){
        cima=NULL;
    }

    bool Pila::PilaVacia(void){
        if(cima==NULL)
            return true;
        else
            return false;
    }

    void Pila::Apilar(char x){

        Puntero p_aux;
        p_aux=new(struct nodo);
        p_aux->nro=x;
        p_aux->sgte=cima;
        cima=p_aux;

    }

    void Pila::Cima(){
        char x;
        if(cima==NULL)
            cout<<"\n\n\tPila Vacia...!";

        else {
            x=cima->nro;
            cout<<"\n\tLa Cima es :"<<x<<endl;
        }
    }

    int Pila::Desapilar(void){
        char x;
        Puntero p_aux;
        if(cima==NULL)
            cout<<"\n\n\tPila Vacia...!!";
        else{
            p_aux=cima;
            x=p_aux->nro;
            cima=cima->sgte;
            delete(p_aux);
        }
        return x;
    }

    void Pila::MostrarPila(void){
        Puntero p_aux;
        p_aux=cima;

        while(p_aux!=NULL){
            cout<<"\t "<<p_aux->nro<<endl;
            p_aux=p_aux->sgte;
        }
    }

    void Pila::DestruirPila(void){
        Puntero p_aux;

        while(cima!=NULL){
                p_aux=cima;
                cima=cima->sgte;
                delete(p_aux);
        }
    }
    void menu(void)
    {
        cout<<"\t -------------------------------------------\n";
        cout<<"\t|        IMPLEMENTACION DE UNA PILA         |\n";
        cout<<"\t|-------------------------------------------|\n";
        cout<<" \t|                                           |"<<endl;
        cout<<" \t|  1. APILAR                                |"<<endl;
        cout<<" \t|  2. DESAPILAR                             |"<<endl;
        cout<<" \t|  3. MOSTRAR PILA                          |"<<endl;
        cout<<" \t|  4. DESTRUIR PILA                         |"<<endl;
        cout<<" \t|  5. MOSTRAR CIMA                          |"<<endl;
        cout<<" \t|  6. SALIR                                 |"<<endl;
        cout<<" \t|                                           |"<<endl;
        cout<<"\t -------------------------------------------\n";
        cout<<"\t Ingrese opcion: ";
    }

    int main(void ){

        system("color 0a");
        Pila pila;
        char x;
        int op;
        char a[ ][ ];
        do
        {
            menu();  cin>> op;

            switch(op)
            {
                case 1: cout<<"cuantos libros a ingresar"<<endl; cin>>a[ ][ ];
                        cout<< "\n\t INGRESE dato A APILAR: "; cin>> x;
                        pila.Apilar(x);
                        cout<<"\n\n\t\tdato  " << x << " apilado...\n\n";
                        break;

                case 2:
                        if(pila.PilaVacia()==true)
                            cout<<"\n\n\tPila Vacia....";
                        else{
                            x = pila.Desapilar( );
                            cout<<"\n\n\tdato "<<x<<" desapilado\n";
                            }
                        break;


                case 3:
                        cout << "\n\n\t MOSTRANDO PILA\n\n";
                        if(pila.PilaVacia()!=true)
                            pila.MostrarPila(  );
                        else
                            cout<<"\n\n\tPila vacia..!"<<endl;
                        break;


                case 4:
                        pila.DestruirPila(  );
                        cout<<"\n\n\t\tPila eliminada...\n\n";
                        break;
                case 5:
                        pila.Cima();
                        break;
             }

            /*cout<<endl<<endl;
            system("pause");  system("cls");
    */
        }while(op!=6);

    return 0;
    }

    alguien que me ayude

    viernes, 08 de junio de 2018 16:11

Todas las respuestas

  • No me queda muy claro si su programa debe ser C o C++.  Arreglos dinámicos no es algo que tenga que usarse mucho cuando se permite el uso de las bondades de C++.  Por ejemplo, C++ provee la clase vector, que es lo más recomendado para listas dinámicas.

    Aquí le presento una implementación super sencilla de una pila usando un vector como almacén interno.  Luego como necesita almacenar información de libros, creé una clase Book que representa un libro.  La clase es bien sencilla y solamente almacena el nombre del libro y el ISBN.

    Si algo así es aceptable, sería cuestión de mostrarle cómo leer de teclado para crear instancias de Book y almacenarlas el la pila.

    Esto es Book.h, la cabecera de la clase Book:

    #pragma once
    
    #include <string>
    
    class Book
    {
    protected:
    	std::string name;
    	std::string isbn;
    
    public:
    #pragma region Constructors
    	Book();
    	Book(const char* name, const char* isbn);
    	~Book();
    #pragma endregion
    
    
    	//API.
    	std::string& Name();
    	std::string Name() const;
    	std::string& Isbn();
    	std::string Isbn() const;
    };

    Esto es Book.cpp, la implementación de la clase Book:

    #include "stdafx.h"
    #include "Book.h"
    
    #pragma region Constructors
    Book::Book()
    { }
    
    Book::Book(const char* name, const char* isbn)
    	: name(name), isbn(isbn)
    { }
    #pragma endregion
    
    Book::~Book()
    {
    }
    
    std::string & Book::Name()
    {
    	return this->name;
    }
    
    std::string Book::Name() const
    {
    	return this->name;
    }
    
    std::string & Book::Isbn()
    {
    	return this->isbn;
    }
    
    std::string Book::Isbn() const
    {
    	return this->isbn;
    }
    

    Esto es Stack.h, la cabecera de la clase genérica Stack, que sería la implementación de la pila:

    #pragma once
    
    #include <vector>
    
    template <class TData>
    class Stack
    {
    protected:
    	std::vector<TData> storage;
    public:
    	//Constructors, Destructor.
    	Stack()
    	{ }
    	~Stack()
    	{ }
    
    	//API.
    	void Push(TData &item)
    	{
    		this->storage.push_back(item);
    	}
    	TData Pop()
    	{
    		TData item = storage[storage.size() - 1];
    		this->storage.pop_back();
    		return item;
    	}
    	unsigned int Count() const
    	{
    		return this->storage.size();
    	}
    	TData Peek() const
    	{
    		return this->storage[this->Count() - 1];
    	}
    	TData Peek(int i) const
    	{
    		return this->storage[this->Count() - 1];
    	}
    };
    
    

    Nótetse cómo esta clase es diferente a Book.  Esta clase es genérica y sirve para almacenar cualquier tipo de elemento, no solamente elementos de tipo Book.

    Finalmente, este es el CPP principal de la aplicación, donde está main():

    #include "stdafx.h"
    #include "Stack.h"
    #include "Book.h"
    #include <iostream>
    
    void DisplayBook(const Book & b)
    {
    	std::cout << "==================" << std::endl;
    	std::cout << "Name:  " << b.Name() << std::endl;
    	std::cout << "ISBN:  " << b.Isbn() << std::endl;
    	std::cout << std::endl;
    }
    
    void DisplayStack(Stack<Book>& stack)
    {
    	for (unsigned int i = 0; i < stack.Count(); ++i)
    	{
    		std::cout << "Book at position " << i << std::endl;
    		const Book b = stack.Peek(i);
    		DisplayBook(b);
    	}
    }
    
    int main()
    {
    	Stack<Book> s;
    	Book b;
    	b.Name() = "Inside OLE 2.0";
    	b.Isbn() = "ABCD1234-1";
    	s.Push(b);
    	DisplayStack(s);
    	b.Name() = "Windows With C/C++";
    	b.Isbn() = "DEFH7894-9";
    	s.Push(b);
    	std::cout << std::endl << "------COLLECTION MODIFIED------" << std::endl << std::endl;
    	DisplayStack(s);
    	Book poppedBook = s.Pop();
    	std::cout << std::endl << "Popped Book:" << std::endl;
    	DisplayBook(poppedBook);
    	DisplayStack(s);
    	return 0;
    }
    

    Este código produce el siguiente resultado:

    Book at position 0
    ==================
    Name:  Inside OLE 2.0
    ISBN:  ABCD1234-1
    
    
    ------COLLECTION MODIFIED------
    
    Book at position 0
    ==================
    Name:  Windows With C/C++
    ISBN:  DEFH7894-9
    
    Book at position 1
    ==================
    Name:  Windows With C/C++
    ISBN:  DEFH7894-9
    
    
    Popped Book:
    ==================
    Name:  Windows With C/C++
    ISBN:  DEFH7894-9
    
    Book at position 0
    ==================
    Name:  Inside OLE 2.0
    ISBN:  ABCD1234-1


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    domingo, 10 de junio de 2018 7:37
    Moderador