Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C++] Classe

  1. #1
    Utente di HTML.it L'avatar di Necsus
    Registrato dal
    Oct 2006
    Messaggi
    87

    [C++] Classe

    Salve a tutti, avevo intenzione di realizzare un programma in C++ utilizzando una classe.
    È la prima volta che ne utilizzo una ed infatti ho riscontrato alcuni problemi che spero voi riusciate a risolvermi, aiutandomi ad imparare

    Questa è la codifica:

    codice:
    #include <iostream.h>
    using namespace std;
    
    class alunno {
    	public:
    	int materie,materia;
    	float matrice[materie][3];
    	float GetMedia() {
    		for(int i=0;i<3;i++)
    			float media[materia]+=matrice[materia][i];
    		return media[materia];
    		}
    	float TotalMedia() {
    		for(int i=0;i<3;i++)
    			{
    			for(int k=0;k<materie;k++)
    				float mediaTot+=matrice[materia][i];
    			}
    		return mediaTot;
    		}
    	};
    
    int main() {
    alunno pallino;
    cout << "Quante materie sono?" << endl;
    cin >> pallino.materie;
    cout << "Tra " << pallino.materie << "materie, con quale iniziamo? (indicare con 1 per la prima, 2 per la seconda e così via)" << endl;
    cin >> pallino.materia;
    for (int i=0;i<pallino.materie;i++)
    {
    	switch(i)
    	{
    	case 0: cout << "Inserisci voto orale" << endl;break;
    	case 1:	cout << "Inserisci voto scritto" << endl;break;
    	case 2:	cout << "Inserisci voto pratico" << endl;break;
    	default: continue;
    	}
    	cin >> pallino.matrice[pallino.materia][i];
    }
    cout << "La media è " << GetMedia() << endl;
    return 0;
    }
    I problemi in compilazione sono questi:

    codice:
    classe.cpp:6: error: invalid use of non-static data member ‘alunno::materie’
    classe.cpp:7: error: from this location
    classe.cpp:7: error: array bound is not an integer constant
    classe.cpp: In member function ‘float alunno::GetMedia()’:
    classe.cpp:10: error: expected initializer before ‘+=’ token
    classe.cpp:11: error: ‘media’ was not declared in this scope
    classe.cpp: In member function ‘float alunno::TotalMedia()’:
    classe.cpp:17: error: expected initializer before ‘+=’ token
    classe.cpp:19: error: ‘mediaTot’ was not declared in this scope
    classe.cpp: In function ‘int main()’:
    classe.cpp:38: error: ‘class alunno’ has no member named ‘matrice’
    classe.cpp:40: error: ‘GetMedia’ was not declared in this scope
    Come potrei risolvere?
    Grazie a tutti per eventuali risposte!

  2. #2
    Il codice è pregno d'errori e warning.

    Primo warning:

    Non includere #include <iostream.h> ma #include <iostream>
    ragione?
    codice:
    warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
    Primo errore:
    Codice PHP:
        float matrice[materie][3]; 
    "materie" che valore ha a tempo di compilazione?
    Il compilatore non lo sa, perciò si arrabbia.

  3. #3
    Utente di HTML.it L'avatar di Necsus
    Registrato dal
    Oct 2006
    Messaggi
    87
    Ho tolto il .h ed ho inizializzato le due variabili materia e materie a 0.

    codice:
    classe.cpp:6: error: ISO C++ forbids initialization of member ‘materie’
    classe.cpp:6: error: making ‘materie’ static
    classe.cpp:6: error: ISO C++ forbids in-class initialization of non-const static member ‘materie’
    classe.cpp:6: error: ISO C++ forbids initialization of member ‘materia’
    classe.cpp:6: error: making ‘materia’ static
    classe.cpp:6: error: ISO C++ forbids in-class initialization of non-const static member ‘materia’
    classe.cpp:7: error: array bound is not an integer constant
    classe.cpp: In member function ‘float alunno::GetMedia()’:
    classe.cpp:10: error: expected initializer before ‘+=’ token
    classe.cpp:11: error: ‘media’ was not declared in this scope
    classe.cpp: In member function ‘float alunno::TotalMedia()’:
    classe.cpp:17: error: expected initializer before ‘+=’ token
    classe.cpp:19: error: ‘mediaTot’ was not declared in this scope
    classe.cpp: In function ‘int main()’:
    classe.cpp:38: error: ‘class alunno’ has no member named ‘matrice’
    classe.cpp:40: error: ‘GetMedia’ was not declared in this scope

  4. #4
    Utente di HTML.it L'avatar di Necsus
    Registrato dal
    Oct 2006
    Messaggi
    87
    Altre idee? :master:

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non mi sembra che MacApp ti abbia detto di togliere l'header file, ma solo di cambiare da <iostream.h> ad <iostream>

    Poi non si può inizializzare la dimensione di un array con una variabile sconosciuta a compile time. (Ed è questo che intendeva dire con il secondo quote).

    Questa è una dichiarazione valida.
    codice:
    const int materie(3);  // deve essere esterno alla classe 
    float matrice[materie][3];
    Questa no. (Solo lo standard C99 riconosce una sintassi simile. Il C++ no )
    codice:
    int materie(3); 
    float matrice[materie][3];
    Altimenti devi allocare l'array con new.
    Dopodichè ricorda che un metodo di una classe può essere chiamato solo se c'è un oggetto dichiarato di quella classe (fanno eccezione solo i metodi static).
    codice:
    cout << "La media è " << GetMedia() << endl;
    qui manda l'oggetto a cui appartiene GetMedia()

  6. #6
    Originariamente inviato da shodan
    Non mi sembra che MacApp ti abbia detto di togliere l'header file, ma solo di cambiare da <iostream.h> ad <iostream>
    eddai, magari con "Ho tolto il .h" intendeva proprio quello.
    ;-P

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    D'oh! Mea culpa, non ci avevo pensato.

  8. #8
    Utente di HTML.it L'avatar di Necsus
    Registrato dal
    Oct 2006
    Messaggi
    87
    Originariamente inviato da shodan
    D'oh! Mea culpa, non ci avevo pensato.
    Sì, infatti.
    Avevi capito male

    Cmq oggi a mente fredda ho ridato una lettura al codice accorgendomi che presentava davvero dei errori incredibili, oltre che di sintassi anche errori semantici.
    La stanchezza ha avuto il suo peso, ieri

    Grazie cmq per la vostra collaborazione!

    Ecco la codifica corretta, se vi interessa:

    codice:
    #include <iostream>
    using namespace std;
    
    #define materie 3
    
    class alunno {
    	public:
    	float matrice[materie][3];
    	float GetMedia(int k) {
    		float somma=0.;
    		float media;
    		for(int i=0;i<3;i++)
    			{
    				somma+=matrice[k][i];
    			}
    		media=somma/3;
    		return media;
    		}
    	float TotalMedia() {
    		float sommaTot=0.;
    		float mediaTot;
    		for(int i=0;i<3;i++)
    			{
    			for(int k=0;k<materie;k++)
    				sommaTot+=matrice[i][k];
    			}
    		mediaTot=sommaTot/(materie*3);
    		return mediaTot;
    		}
    	};
    
    
    int main() {
    alunno pallino;
    for (int k=0;k<materie;k++)
    {
    	for (int i=0;i<3;i++)
    	{
    		switch(i)
    		{
    		case 0: cout << "Inserisci voto orale ";break;
    		case 1:	cout << "Inserisci voto scritto ";break;
    		case 2:	cout << "Inserisci voto pratico ";break;
    		default: break;
    		}
    		cout << "della " << (k+1) << "° materia" << endl;
    		cin >> pallino.matrice[k][i];
    	}
    cout << "La media è " << pallino.GetMedia(k) << endl;
    }
    cout << "La media totale è " << pallino.TotalMedia() << endl;
    return 0;
    }

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 © 2025 vBulletin Solutions, Inc. All rights reserved.