This is definitely possible, may require a few code snippets to get it to work exactly as you like.
Some links that should help you get started.
Set up the form with some hidden fields that are then Dynamically populated. Either for defining whether it’s a pre/post form, or the user/course/etc that it relates to.
With number fields you can use calculations to tally the difference between pre and post survey fields.
If the date(s) for start and complete of the course are known, Gravity Flow might be an excellent part of your solution. Using two user input steps that are scheduled to start before the course and after, with different editable/displayed fields.
If you want to get into aggregate data reports like your 95% example hinted at, GravityKit’s Chart add-on would be one to consider.