Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [C++]Utilizzare le stringhe

    In java per fortuna č molto semplice stampare una lista linkata scorrendo tutti i nodi e concatenando su una stringa come ad esempio:

    codice:
    while(nodo!=null)
    {
     stringa+=nodo.getElement()+",";
    nodo=nodo.getNext();
    }
    Ora in C++ posso fare una cosa analoga utilizzando la classe string.h? Oppure strings.h?
    Non ho trovato molto a riguardo....ho provato a scrivere un metodo come:

    codice:
    String toString();
    Ma non va bene quello String....evidentemente non č cosģ facile come in Java
    Ora come si fa a dichiarare una stringa e a concatenarla? Poi vorrei creare questo metodo toString() che mi concateni la stringa.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    la classe string.h? Oppure strings.h?
    string.h non č una classe ma un file header

    La classe č la string ma non ho capito alla fine cosa vuoi fare ...

    Per concatenare due string scrivi semplicemente

    codice:
    #include <string>
    
    ...
    
    	string a, b, c;
    
    	a = "Hello";
    	b = "world!";
    
    	c = a + " " + b;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Ciao oregon. scusa il ritardo ma sono stato impegnato con Fisica 1.

    Quello che intendevo č, se ad esempio noi volessimo stampare gli elementi di una lista, in Java potrei fare semplicemente cosģ: Creo una stringa, e poi con un nodo che chiamo current, scorro tutta la lista e concateno quella stringa con l' elemento, cosģ:

    codice:
    String stamp="";
    
    Node current=lista.getHead() //current č la testa della mia lista
    
      for(;current!=null; current=current.getNext())
      {
        stamp+=current.getElement()+", ";
      }
    
    System.out.println(stamp);
    Vorrei fare una cosa simile in C++, solo che non conoscendo le stringhe(perchč non ci sono state spiegate... ) non riesco a farlo....
    Facendo:

    codice:
    #include<string>
    Come faccio a dichiarare una stringa? Perchč scrivendo

    codice:
    string a="";
    Non funziona, dą errore, e un eventuale metodo che ritorna questa stringa come si dichiara?

    Tipo:

    codice:
    string toString()
    dą sempre errore....non so se sono stato chiaro.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    59
    Ciao!!!

    Non so se ho inteso bene quello che vuoi fare, comunque io farei cosģ:

    codice:
    #include <iostream>
    #include <string>
    #include <list>
    
    using namespace std;
    
    int main()
    {
        list<string> l;
        list<string>::iterator it;
        string stamp = "";
    
        l.push_back("Francesco");
        l.push_back("Aldo");
        l.push_back("Carlo");
        l.push_back("Rocco");
        l.push_back("Armando");
    
        for(it = l.begin() ; it != l.end(); it++)
            stamp += *it + ", ";
    
        cout << stamp;
        return 0;
    }
    PS: se non capisci qualcosa o non era questo il tuo intento chiedi pure

  5. #5
    Mh...si, hai capito, tu perņ lo stai facendo in modo elegantissimo .
    Ho un esercizio in cui devo implementare uno stack mediante lista, solo che ho un sacco di problemi perchč non ho capito se devo usare le classi predefinite, come list, o se devo crearmi io la classe Nodo, LinkedList , eccetera.

    P.S quando fai
    codice:
    stamp += *it + ", ";
    Come mai l' asterisco? In questo modo stampa la stringa puntata da it?

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    59
    Scusa ho dato per scontato che potessi usare le STL comunque it č un iteratore e * fa sostanzialmente quello che hai detto tu, deferenzio l'iteratore in modo da poter utilizzare l'elemento a cui punta...

    Se devi creare tu la classe allora poi dipende tutto dagli operatori che metti a disposizione tu...

    ad esempio potresti costruire lo stack partendo da una tua implementazione di lista (quindi sfruttare l'ereditarietą o la composizione) esportando solo i metodi che ti servono push pop e via dicendo...

    A questo punto una volta che hai le strutture potresti nel main dichiarare uno stack "riempirlo" con gli elementi che ti servono e poi fare un ciclo while di questo tipo

    codice:
    while(!stack.IsEmpty())
       str += stack.pop() + ", ";
    dove str č una stringa, IsEmpty verifica se ci sono ancora elementi presenti nello stack e pop elimina dallo stack e restituisce l'elemento eliminato...

    Spero di essere stato chiaro, altrimenti chiedi pure...

  7. #7
    Ah...si anche cosģ andrebbe...io ho provato a creare varie classi, ma faccio un sacco di errori di cui non capisco la causa....riporto le classi:

    hpp della classe Nodo e successivamente il .cpp:

    codice:
    #ifndef NODE_HPP
    #define	NODE_HPP
    
    class Node
    {
            protected:
                int element;
                Node* next;
                
            public:
                Node(int element);
                ~Node();
        
        
               int getElement();
               void setElement(int element);
               void setNext(Node * next);
               Node* getNext();
    };
    
    #endif	/* NODE_HPP */
    codice:
    #include "Node.hpp"
    
    Node:: Node(int number)
    {
        element=number;
    }
    
    Node:: ~Node(){ delete this;}
    
    Node:: getElement(){return element;}
    Node::setElement(int number){element=number;}
    Node::setNext(Node* succ){next=succ;}
    Node:: getNext(){return next;}
    hpp e cpp di LinkedList:

    codice:
    #ifndef LINKEDLIST_HPP
    #define	LINKEDLIST_HPP
    #include "Node.hpp"
    
    class LinkedList
    {
            protected:
                Node head;
                Node tail;
                int size;
         
                
            public:
                LinkedList();
               ~LinkedList();
               
               
               void setHead(Node n);
               Node getHead();
               void setTail(Node n);
               Node getTail();
               int getSize();
               void addNode(int element);
               void deleteNode();
              
               
    };
    
    #endif	/* LINKEDLIST_HPP */

    codice:
    #include "LinkedList.hpp"
    #include "Node.hpp"
    
    LinkedList:: LinkedList()
    {
        head=NULL;
        tail=NULL;
        size=0;
        
    }
    
    LinkedList::~LinkedList(){delete this;}
    
       LinkedList::setHead(Node n){head=n;}
       LinkedList::getHead(){return head;}
       LinkedList:: setTail(Node n){tail=n;}
       LinkedList::getTail(){return tail;}
       LinkedList::getSize(){return size;}
       
       LinkedList::addNode(int element){
           
           Node nuovo=new Node(element);
           if(size==0)
           {
               head=nuovo;
           }
           
           else
           {
               nuovo.setNext(head);
               head=nuovo;
           }
           size++;
       
          }
       
       LinkedList::deleteNode(){
          if(size!=0) 
          {
            Node tmp=this->getHead();
            head=head.getNext();
            tmp=NULL;
          }
          size--;
          
       }
    Alcune cose non vanno bene come le inizializzazioni a null...sono troppo abituato al Java.

    classe Stack con header e .cpp:

    codice:
    ifndef STACK_HPP
    #define	STACK_HPP
    #include "LinkedList.hpp"
    //#include "Node.hpp"
    
    class Stack
    {
            protected:
                LinkedList lista;
                int size;
                Node top;
                
            public:
                Stack();
                ~Stack();
                
                int Top();
                int getsize();
                void push(int nuovo);
                void pop();
    };
    
    #endif	/* STACK_HPP */

    codice:
    #include "Stack.hpp"
    #include "LinkedList.hpp"
    #include "Node.hpp"
    
    LinkedList stack;
        
    Stack::Stack()
    {
        stack=new LinkedList();
        top=stack.getHead();
    }
    
    Stack::~Stack(){delete this;}
    
    Stack::Top(){return stack.getHead().getElement();}
    
    Stack::getsize(){return stack.getSize();}
    
    Stack::pop(){stack.deleteNode();}
        
    Stack::push(int nuovo){
        stack.addNode(nuovo);
        top=stack.getHead();
    }
    Non va bene nulla

    I metodi del cpp di LinkedList non vengono trovati...non so nemmeno se questi include sono messi bene...

  8. #8
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Forse il compilatore non sa che il file .hpp č considerato un header, prova a cambiare l' estensione degli header con .h .

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    No, i file .hpp non c'entrano ... ci sono parecchi errori ...

    Il consiglio č di affrontarli uno per volta, seguendo quanto indicato dal compilatore.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Il consiglio č di affrontarli uno per volta, seguendo quanto indicato dal compilatore.
    Proverņ a farlo, ma il compilatore in C++ č poco chiaro...ho anche letto che tipo le strutture dati non le fanno molti cosģ, ma utilizzando la parola struct, mi chiedo se il mio modo di procedere sia analogo cosģ....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.