Forse ho capito. Forse.
E domani c'è il compito in classe sulle stringhe Adesso mi uccido tentando di programmare qualcosa di funzionante
Forse ho capito. Forse.
E domani c'è il compito in classe sulle stringhe Adesso mi uccido tentando di programmare qualcosa di funzionante
Arieccomi! Dopo aver passato il compito precedente in linea con il resto dell'anno (7,5) avrei bisogno di una mano.
Nel programma che ci ha lasciato per casa dato un valore char dobbiamo sostituirlo il carattere che viene 5 volte dopo. Quindi se è A deve diventare F (A+5). Avevo pensato di creare un vettore in char con tutti i caratteri dell'alfabeto e spostarmi in base al confronto prima e incremento dell'indice dopo. Ma non si potrebbe lavorare sul valore ASCII e quindi evitare la creazione del vettore? Per spiegarmi A nel codice ASCII 41, per trovare il valore 5 volte successivo basta fare 41+5. È fattibile come ragionamento?
una somma normale funziona:
ma è inguardabileCodice:char a = 'a'; printf("\n a=%c\n",a); int b =(int)a+5; printf("\n b=%c\n",(char)b); //output: a=a b=f
spero uno che effettivamente sa programmare fornisca una via migliore
edit:anche la mia scelta delle variabile è abbastanza infelice, vabbuò
Ultima modifica di Pozz; 29-04-13 alle 16:42:47 Motivo: explicit castssss
Se ho capito bene, dovrebbe bastare leggere in input un char e sommare direttamente 5, e funziona, non ce bisogno di convertire in intero.
Soluzione sotto spoiler
Spoiler:
Codice:#include <stdio.h> int main() { char a; printf("Inserisci un carattere:"); scanf("%c",&a); printf("Carattere in input:%c \n",a); a=a+5; printf("Carattere + 5 :%c \n",a); return 0; }
I char sono interi per definizione quindi si, basta fare una somma, ma attenzione, puoi usare solo i caratteri dell'alfabeto o tutti i caratteri della tabella ascii? Perchè nel primo caso quando arrivi alla quartultima lettera dell'alfabeto (in poi) non devi sommare in quanto sfori negli altri caratteri, quindi sarebbe il caso di usare un array e farti un algoritmino semplice semplice. Se invece puoi usare tutti i caratteri della tabella allora nessun problema, somma e vai con dios
EDIT:
Per capirci meglio, devi fare tipo la cifratura di Cesare?
Cosa?
Comunque no, non posso utilizzare tutti i codici ascii, solo le lettere, ma se è per questo basta fare un calcolo veloce, vedere di quanto sfora e sommare lo sforamento al codice precedente alla A (in modo da ottenere, così, A se sfora di 1 dalla Z ecc...)
Esatto, vedo che hai capito allincircasupergiùCosa?
Comunque no, non posso utilizzare tutti i codici ascii, solo le lettere, ma se è per questo basta fare un calcolo veloce, vedere di quanto sfora e sommare lo sforamento al codice precedente alla A (in modo da ottenere, così, A se sfora di 1 dalla Z ecc...)
Il cifrario di Cesare è questo:
http://it.wikipedia.org/wiki/Cifrario_di_Cesare
In soldoni tu fai lo stesso ma spostandoti di 5 caratteri al posto che di 3
Se l'avessi saputo prima avrei fatto copia-incolla da wikipedia modificando solo qualcosina
Buonsalve!
Torno sul post per altri dubbi.
Abbiamo iniziato la programmazione ad oggetti, ma dichiarando la classe come file a se e aggiungendola alla libreria nel programma interessato non riesce a trovarmelo, cosa dovrei fare per dire al compilatore che quel file esiste e c'è da qualche parte?
Per ora abbiamo fatto programmi creando la classe proprio sopra al programma, ma così è un po' nosense...
Per fare le cose fatte bene bisogna costruire un makefile ma forse è troppo avanzata come cosa per il momento.
In generale cmq dovresti compilare la classe eseguendo:
g++ -c classe.cpp
Poi il tuo programma:
g++ -c programma.cpp
E poi linkare insieme i due file risultanti dai precedenti comandi:
g++ programma.o classe.o
Il metodo "stupido" è includere il file .cpp invece che il .h nel programma anche se non ci metto la mano sul fuoco che funzioni... non programmo in c++ da un po' purtroppo o per fortuna, gh.
Inviato dal mio Nexus 4
per favorire il riutilizzo del software, è buona norma è separare anche l'interfaccia della classe (contenente le dichiarazioni e i prototipi) dall'implementazione vera e propria (contenente le definizioni). Così otterresti due file: TuaClasse.h (interfaccia) e TuaClasse.cpp (implementazione). Poi nel tuo sorgente principale (quello con la funzione main() ), vai a fare include solo di TuaClasse.h, così:
#include <iostream>
#include "TuaClasse.h" // le " non sono un errore ed è giusto fare così... e devi includerlo anche nel file TuaClasse.cpp, altrimenti il linker non può lavorare
using namespace std;
int main() {blablabla}
esempi presi dall'ottimo manuale Deitel & Deitel 8th edition:
main.cpp:
Codice:// Fig. 3.13: fig03_13.cpp// GradeBook class demonstration after separating // its interface from its implementation. #include <iostream> #include "GradeBook.h" // include definition of class GradeBook using namespace std; // function main begins program execution int main() { // create two GradeBook objects GradeBook gradeBook1( "CS101 Introduction to C++ Programming", "Lt. Spalman" ); GradeBook gradeBook2( "CS102 Data Structures in C++", "Lt. Focaccia" ); // display initial value of courseName for each GradeBook cout << "gradeBook1 created for course: " << gradeBook1.getCourseName() << "\nThis course is presented by: " << gradeBook1.getInstructorName() << "\n\ngradeBook2 created for course: " << gradeBook2.getCourseName() << "\nThis course is presented by: " << gradeBook2.getInstructorName() << endl; string omega; cin >> omega; } // end main /************************************************************************** * (C) Copyright 1992-2012 by Deitel & Associates, Inc. and * * Pearson Education, Inc. All Rights Reserved. * * * * DISCLAIMER: The authors and publisher of this book have used their * * best efforts in preparing the book. These efforts include the * * development, research, and testing of the theories and programs * * to determine their effectiveness. The authors and publisher make * * no warranty of any kind, expressed or implied, with regard to these * * programs or to the documentation contained in these books. The authors * * and publisher shall not be liable in any event for incidental or * * consequential damages in connection with, or arising out of, the * * furnishing, performance, or use of these programs. * **************************************************************************/
GradeBook.h
Codice:// Fig. 3.11: GradeBook.h // GradeBook class definition. This file presents GradeBook's public // interface without revealing the implementations of GradeBook's member // functions, which are defined in GradeBook.cpp. #include <string> // class GradeBook uses C++ standard string class using namespace std; // GradeBook class definition class GradeBook { public: GradeBook( string, string ); // constructor that initializes courseName void setCourseName( string ); // function that sets the course name void setInstructorName(string); // function that sets the instructor's name string getCourseName(); // function that gets the course name string getInstructorName(); // function that gets the instructor's name void displayMessage(); // function that displays a welcome message private: string courseName; // course name for this GradeBook string instructorName; // name of the course Instructor }; // end class GradeBook /************************************************************************** * (C) Copyright 1992-2012 by Deitel & Associates, Inc. and * * Pearson Education, Inc. All Rights Reserved. * * * * DISCLAIMER: The authors and publisher of this book have used their * * best efforts in preparing the book. These efforts include the * * development, research, and testing of the theories and programs * * to determine their effectiveness. The authors and publisher make * * no warranty of any kind, expressed or implied, with regard to these * * programs or to the documentation contained in these books. The authors * * and publisher shall not be liable in any event for incidental or * * consequential damages in connection with, or arising out of, the * * furnishing, performance, or use of these programs. * **************************************************************************/
GradeBook.cpp
Codice:// Fig. 3.12: GradeBook.cpp// GradeBook member-function definitions. This file contains // implementations of the member functions prototyped in GradeBook.h. #include <iostream> #include "GradeBook.h" // include definition of class GradeBook using namespace std; // constructor initializes courseName with string supplied as argument GradeBook::GradeBook( string name, string instructor ) { setCourseName( name ); // call set function to initialize courseName setInstructorName( instructor); // call set function to initialize instructorName } // end GradeBook constructor // function to set the course name void GradeBook::setCourseName( string name ) { courseName = name; // store the course name in the object } // end function setCourseName void GradeBook::setInstructorName(string instructor) { instructorName = instructor; } // function to get the course name string GradeBook::getCourseName() { return courseName; // return object's courseName } // end function getCourseName string GradeBook::getInstructorName() { return instructorName; } // display a welcome message to the GradeBook user void GradeBook::displayMessage() { // call getCourseName to get the courseName cout << "Welcome to the grade book for\n" << getCourseName() << "!" << endl; } // end function displayMessage /************************************************************************** * (C) Copyright 1992-2012 by Deitel & Associates, Inc. and * * Pearson Education, Inc. All Rights Reserved. * * * * DISCLAIMER: The authors and publisher of this book have used their * * best efforts in preparing the book. These efforts include the * * development, research, and testing of the theories and programs * * to determine their effectiveness. The authors and publisher make * * no warranty of any kind, expressed or implied, with regard to these * * programs or to the documentation contained in these books. The authors * * and publisher shall not be liable in any event for incidental or * * consequential damages in connection with, or arising out of, the * * furnishing, performance, or use of these programs. * **************************************************************************/
Spero ti possa essere d'aiuto
Ultima modifica di Drake Aran; 07-02-14 alle 09:58:13
Grazie mille (y)
Ultimamente sono mancato spesso a scuola, e mentre non c'ero la prof. ha spiegato le funzioni friend. Ora, per quanto ho capito servono per fare un'operazione tra elementi della stessa classe... ma sono tanto fondamentali? In un programma lasciato di recente c'era questa classe (sto omettendo alcune parti)
class fattura {
private:
int importo;
struct data{
int gg;
int mm;
} dataemissione, datapagamento;
public:
void inserimento ();
void visualizzazione ();
};
Ora, per fare un'operazione tra dataemissione.gg e datapagamento.gg (esempio) dovrei utilizzare una funzione friend per forza? Alla fine sono due variabili distinte
Mentre facevo il programma non ho fatto caso al problema ed ho svolto il programma come nulla fosse, ma sentendo la prof. spiegare oggi mi è venuto questo dubbio...
No. Una funzione friend è una funzione definita fuori dalla classe MA che la classe dichiara amica e quindi può accedere agli attributi e ai metodi privati della classe.
Ho risposto alla tua domanda? Perché, imho, sei partito da una premessa sbagliata e quello che è venuto dopo ha poco senso.Codice:class A { int a; public: A () { a = 0 }; friend void foo(); }; void foo(A a_obj) { a_obj.a = 10; // Non sarebbe permesso in una funzione non-friend }
Btw, mai usate funzioni friend e neanche classi friend. Penso vadano contro ai principi base dell'OOP anche se in alcuni particolari casi sono strettamente necessarie.
Aggiungo che le amicizie non si ereditano
Inviato dal mio Nexus 4
In informatica non esiste un solo modo per fare qualcosa.
Premesso questo, se hai veramente bisogno di utilizzare dei membri/attributi privati sì ti serve dichiarare una funzione friend.
Mettiamo il caso di questa classe:
Per sommare due oggetti di A, in questo caso sarebbe a1.a+a2.a, non avendo metodi che ti ritornano a non è possibile non utilizzare una funzione friend:Codice:class A { int a; public: A(int i) { a = i}; }
Con A che diventa:Codice:A operator+(A a1, A a2) { return A(a1.a + a2.a); }
Codice:class A { int a; public: A(int i) { a = i}; friend A operator+(A, A); }
Torno per chiedervi ancora una mano, ma a sto giro porto anche una lieta novella
Vi comunico con gioia che mi hanno ammesso alle regionali delle olimpiadi di informatica
Il livello di difficoltà però, è aumentato e supera la formazione scolastica (almeno del mio anno). Molto probabilmente sarà richiesto l'utilizzo di file tramite comandi quali
fr = forpen("input.txt","r");
fw = fopen("output.txt","w");
Se mi aiutaste a capirne il funzionamento e la gestione vi sarei molto grato
Intanto leggiti la documentazione a proposito.
http://www.cplusplus.com/reference/cstdio/fopen/
Btw, complimenti
Inviato dal mio Nexus 4
Thanks
Ho letto tutto ma non ho afferrato come fare ad utilizzare dentro al programma i valori inseriti in un file
Praticamente dovrei passare i valori contenuti alle variabili
Devi scriverti un simil-parser in modo che legga il contenuto del file di testo e assegna i vari valori alle variabili.
Oppure potresti usare un parser xml per semplificarti la vita ( e saltar la rogna di scrivertelo da solo), ad esempio tinyxml è buono, ma se cerchi in internet ne trovi svariati
http://www.grinninglizard.com/tinyxml/index.html
Poi sta a te, se il file di testo contiene poca roba allora puoi scrivertene uno da solo ad hoc, è anche un buon esercizio sull'utilizzo delle stringhe , se vuoi risparmiare tempo vai di qui sopra
Ultima modifica di ZioYuri78; 07-03-14 alle 21:11:07
Usando fgets puoi "bufferizzare" un tot di caratteri.
A quel punto hai una stringa che puoi gestire come vuoi. Se i valori sono dei numeri devi fare la solita menava del -48*10^x per ricavarti l'integer.
Stai attento a non troncare accidentalmente qualche strina/numero significativo.
http://www.cplusplus.com/reference/cstdio/fgets/
Con fgetc invece leggi un carattere solo.
Inviato dal mio Nexus 4
Grazie ancora, e, chiedo venia, ma se volessi inizializzare un vettore con gli elementi di un file?
silenzio radio?