C is a procedural programming language (and a member of the imperative paradigm). The programmer writes statements and flow control that describe changes in state and the compiler translates this into equivalent machine code. Imperative languages do not care what the programmer wants the program or procedure to do, just what the programmer tells the program or procedure to do. Imperative programming is all about describing how to do something without describing what the desired result is. Classic example: C.
Functional programming languages (members of the declarative paradigm) are an entirely different beast. In functional languages, the programmer describes the program using some sort of logic without specifying implementation. Functional programming is all about describing what to do without describing how to do it. In functional programming, the compiler, interpreter, or parser evaluates the logic and figures out how to arrive at the what on its own. Classic example: SQL.
Some languages, especially those used for safety critical applications, support elements of both imperative and declarative programming. A programmer may write a program imperatively which describes how to do something, and then attach formal logic in the form of descriptors, preconditions, and postconditions that can be used by the compiler or interpreter to ensure that the program code does not only what it is written to do, but what it is formally intended to do. This kind of programming takes a very, very long time to do but it will be damn near bulletproof when done properly.