The uses of <tt>assert()</tt> are much more narrow than exceptions. An exception is saying basically "Something really bad happened and I have no idea how to handle it. <i>You</i> figure it out" where <i>You</i> is someone up the call stack. So throwing an exception does not necessarily mean the program is over and done, the program might be able to recover and continue execution. Uncaught exceptions will cause a runtime error and generally say something on standard error. So exceptions can be used for error recovery (when they're caught) or debugging info (when they're not caught).
An assertion, however, is not as flexible. If the assertion fails, the program exits. Unlike exceptions, assertions are not useful for error recovery, only debugging. They're extremely useful for debugging, through, because you can throw assertions in code at various places to test your assumptions. Assertions also generally tell you which file and the line of code that failed. You can get the same effect with exceptions, but it's generally easier to write <tt>assert(<i>something that needs to be true</i>)</tt> than it is to come up with a meaningful exception class.