If your classes are growing so large you are thinking about how to chop them up into separate source files, you probably have a design problem.
The model-view-controller (better, model-controller-view) design pattern creates small modular code almost automatically.
The model handles everything related to the data. The view manages the actual visual UI and the controller glues the two together. Each is a separate class and ideally the model and view should be so independent that they can be easily plugged into another app.
The key is to be utterly ruthless in separating function. It's always tempting to park data in the controller. This is especially true when you're just learning and writing small programs with very little data. However, as the data complexity grows, your controller soon explodes with complexity.
All good design starts with the data model. The model should handle all the logical relationships with in the data, i.e. creating, modifying, verifying, saving etc. A properly designed data model is entirely agnostic as to the UI. Ideally, a data model should work with standard views, webviews, command line or dumped out a URL.
I always start a project by creating the data model within a test app with the absolute minimal interface. (Often it is just a blank app that launches, programmatically manipulates the data model, prints to the console and quits.) Only when the data model is working independently do I turn to the rest of the program.
Now that I understand the data and data operations, I can design a UI for each environment that I will running on. The UI understands only how to create UI elements and how to responds to events. It doesn't contain any data or even logic relating the elements to one another.
The controller glues the view/s and data model together. The controller only knows which messages to send to the data model to get the data that goes in a particular UI element in response to a particular event. It doesn't validate the data or perform any logical operations on it. It just routes information between the data model and view of the moment.
Any operation, such as printing, that creates another interface should have its own controller object. For example, when printing, only the data model understands how all the data fits together on a page. There is no reason why the same controller that controls the UI view should control printing. Instead a printing controller just ask the data model for the data to print. The UI controller need do nothing more than call the printing controller and point it to the data selected by the user.
In your particular example, the calculating methods would be in the data model, the printing methods in a printing controller etc. Using model-view-controller, you end up with a lot of surprisingly small modular classes that are easily managed, tested and ported.