Functional testing aims to figure out whether given functionality works as specified. System testing aims to figure out whether the whole system fulfills the requirements given to it.
So in functional testing you test that given part of the whole system functions in a specified way. And in system testing you test the system as a whole fulfills the requirements given to it.
For example testing that 1+1=2 tests the plus function and sum function. And thus is a functional test. Testing whether user can calculate correct amount of tip using the calculator or not, is a system test, since it tests a requirement (calculate tip), but not a specific function of the application.
And non-functional testing includes stuff like usability and performance.