Pages: [1]   Go Down
Print
Author Topic: Lezione 11/11/2011  (Read 2530 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
MisteroLupo
Apprendista Forumista
**
Offline Offline

Posts: 273

Tra il dire e il fare c'è distanza di hamming 2.


« on: 11-11-2011, 19:22:49 »

Oggi il Prof. ha introdotto dei concetti di programmazione ad oggetti in C++, tra cui gli header file, i namespace, i modificatori di accesso etc.

Ha chiesto di implementare, per la prossima volta, una classe Stack in un namespace "Strutture Dati" che contenga:

  • costruttore
  • metodo boolean push(int a)
  • metodo boolean pop(int &a)

La classe sarà composta da due file:
Stack.hpp   in cui definiamo la classe
Stack.cpp    che conterrà le implementazioni

La dimensione massima dello stack deve essere impostata con una #define.


Spero di non essermi scordato nulla, buon lavoro univ
Logged
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #1 on: 14-11-2011, 15:01:36 »

push e pop boolean?? che significa? forse devo dare TRUE se l'operazione è andata a BUON FINE e FALSE se l'operazione NON è ANDATA bene?
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
MisteroLupo
Apprendista Forumista
**
Offline Offline

Posts: 273

Tra il dire e il fare c'è distanza di hamming 2.


« Reply #2 on: 14-11-2011, 16:27:02 »

Esatto!

Mi correggo, il tipo è bool, non boolean, deformazione da Java testate
Logged
Giovi89
Apprendista Forumista
**
Offline Offline

Posts: 273


« Reply #3 on: 14-11-2011, 17:51:53 »

Salve ragazzi, ho provato a implementare la classe stack nel seguente modo:

file header:
Code:
#ifndef STACK_H_
#define STACK_H_

#define dimensione_stack 10;

class Stack
{

public:
Stack();
int puntatore;
int *array = new array[dimensione_stack];

void push(int a);
void pop();
bool isEmpty();
bool isFull();
}


#endif

file cpp:

Code:
#include "Stack.h"
#include <iostream.h>
Stack::Stack()
{
puntatore=0;
}
void Stack::push(int a)
{
if (isFull()) {

cout << "stack pieno,non puoi fare la push!!!"<<endl;
}
else {
int *array[puntatore]=a;
puntatore++;
cout << "messo il numero dentro lo stack"<<endl;

}


}
void Stack::pop()
{
if (isEmpty()) {
cout << "stack vuoto,impossibile fare la pop "<<endl;
}
else {
int *array [puntatore] = NULL;
puntatore=puntatore-1;


}

}
bool isEmpty()
{
return puntatore==0;
}
bool isFull()
{
return puntatore==dimensione_stack;
}

compilando entrambi i file rispettivamente nel file .h mi da errore alla seguente riga int *array = new array[dimensione_stack]; , dicendomi le seguenti cose:
Code:
Multiple markers at this line
- expected type-specifier before 'array'
- `new' cannot appear in a constant-expression
- ISO C++ forbids initialization of member 'array'
- making 'array' static
- invalid in-class initialization of static data member of non-integral type
'int*'
- expected ';' before 'array'
mentre nell'altro mi dice che ci sono degli errori nelle seguenti righe:

prima riga: int *array[puntatore]=a;
Code:
Multiple markers at this line
- unused variable 'array'
- variable-sized object 'array' may not be
initialized

seconda riga: int *array [puntatore] = NULL;
stesso errore precedente.

terza riga: return puntatore==0;
Code:
'puntatore' was not declared in this
 scope

quarta riga: return puntatore==dimensione_stack;
stesso errore precedente.

Premetto che ancora sono alle prime armi col c++ e vorrei sapere, cortesemente, cosa bisognerebbe correggere.
Grazie in anticipo per eventuali risposte.
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #4 on: 14-11-2011, 18:27:35 »

Non ho capito invece come creare il namespace, cioè è un file in cui all' interno creo la classe che sarà il mio header?
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
amnesia12
Matricola
*
Offline Offline

Posts: 28


« Reply #5 on: 15-11-2011, 02:49:21 »

Il Namespace va creato insieme alla classe dopo aver creato il nostro Progetto c++. Cioè dopo aver fatto (per esempio con eclipse) new/porject c++, e quindi creato il nostro nuovo progetto,  basta cliccare con il tasto destro del mouse sul progetto creato e fare new/Class, dove vi è un campo per creare il namespace inserendo la spunta ed il nome, e un campo Class per creare la classe con i file h e cpp.
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #6 on: 15-11-2011, 14:30:07 »

Il Namespace va creato insieme alla classe dopo aver creato il nostro Progetto c++. Cioè dopo aver fatto (per esempio con eclipse) new/porject c++, e quindi creato il nostro nuovo progetto,  basta cliccare con il tasto destro del mouse sul progetto creato e fare new/Class, dove vi è un campo per creare il namespace inserendo la spunta ed il nome, e un campo Class per creare la classe con i file h e cpp.

Ok, appena fatto con Eclipse  yoh
Grazie.
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
Giovi89
Apprendista Forumista
**
Offline Offline

Posts: 273


« Reply #7 on: 16-11-2011, 21:39:37 »

Code:
#ifndef STACK_H
#define STACK_H

#define dimensione_stack 10



class Stack
{

public:
Stack();
int puntatore;
int array[dimensione_stack];

void push(int a);
void pop();
bool isEmpty();
bool isFull();
}

#endif /* STACK_H */

Salve ragazzi, nel progetto della classe stack compilo il tutto e l'unico errore che mi da è il seguente, relativo alla classe header:

unexpected token <EOF>

questo errore mi viene segnalato subito prima di #endif. Qualcuno sa dirmi cosa correggere?
Saluti
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #8 on: 16-11-2011, 21:55:35 »

Mh....non saprei dirti, EOF dovrebbe stare per "End of File". Che sia un errore di stream?
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
MisteroLupo
Apprendista Forumista
**
Offline Offline

Posts: 273

Tra il dire e il fare c'è distanza di hamming 2.


« Reply #9 on: 17-11-2011, 10:16:27 »

Al contrario di java, c++ si aspetta il punto e virgola per chiudere la dichiarazione di una classe. Manca quindi il punto e virgola dopo la parentesi graffa chiusa.

L'errore sta a indicare che il parser incontra il marker di fine file <EOF> prima di trovare il ";" che si aspettava.
Logged
MisteroLupo
Apprendista Forumista
**
Offline Offline

Posts: 273

Tra il dire e il fare c'è distanza di hamming 2.


« Reply #10 on: 17-11-2011, 10:23:20 »

Posto la mia implementazione della classe stack, una di quelle viste a lezione:

Stack.h:
Code:
/*
 * File:   stack.h
 * Author: salvoadriano
 *
 * Created on 12 novembre 2011, 19.12
 */
#ifndef STACK_H
#define STACK_H
#define SIZE 10

namespace struttureDati {

    class Stack {
    private:
        int array[SIZE]; // vettore che conterrà gli elementi dello stack
        int top;         // indica la prima posizione libera (non la cima)

    public:
        Stack();
        bool push(int a);
        bool pop(int &a);
        bool isEmpty();
        bool isFull();

        int getMaxSize();             // restituisce la capienza massima
    };

}
#endif


Stack.cpp
Code:
#include "Stack.h"

// la struttura della classe è già definita nel file header
// qui inseriamo solo i metodi

using namespace struttureDati;

// costruttore
Stack::Stack() {
    top = 0;
}

//metodi

bool Stack::push(int a) {
    // inserisce l'elemento solo se lo stack non è pieno
    if (!Stack::isFull()) {
        array[top++] = a;
        return true;
    }
    return false;
}

bool Stack::pop(int& a) {
    // estrae l'elemento solo le lo stack non è vuoto
    if (!Stack::isEmpty()) {
        a = array[--top];
        return true;
    }
    return false;
}

bool Stack::isFull() {
    return (top > SIZE);
}

bool Stack::isEmpty() {
    return (top == 0);
}

int Stack::getMaxSize() {
    return SIZE;
}

main.cpp (effettua solo una push e una pop)
Code:
/*
 * File:   main.cpp
 * Author: salvoadriano
 *
 * Created on 11 novembre 2011, 11.04
 */

#include <cstdlib>
#include <stdio.h>
#include <iostream>

#include "Stack.h"

using namespace std;
using namespace struttureDati;

int main(int argc, char** argv) {
    Stack *stack = new Stack();
    int a;
    stack->push(5);
    stack->pop(a);
    cout << a;
}
Logged
Giovi89
Apprendista Forumista
**
Offline Offline

Posts: 273


« Reply #11 on: 17-11-2011, 12:20:29 »

Grazie per la dritta, ora provo a correggere. 
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #12 on: 17-11-2011, 20:53:51 »

Il Namespace va creato insieme alla classe dopo aver creato il nostro Progetto c++. Cioè dopo aver fatto (per esempio con eclipse) new/porject c++, e quindi creato il nostro nuovo progetto,  basta cliccare con il tasto destro del mouse sul progetto creato e fare new/Class, dove vi è un campo per creare il namespace inserendo la spunta ed il nome, e un campo Class per creare la classe con i file h e cpp.

Ho fatto esattamente come dicevi, se però apro eclipse non mi trova alcun progetto con quel nome e non so come fare ad aprire i file in modo da fare la compilazione, se apro solo i file .cpp e .hpp non posso fare il building e non c' è modo di aprire altri progetti.....
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
Pages: [1]   Go Up
Print
Jump to: