for every real number, you can create a program that prints out that number
Why do you claim that? It is false. In order to print out a number, you need to be able to express that number in the programming language. If you claim that every real number is expressible, it's up to you to show how to encode arbitrary real numbers in the programming language of your choice.
An evident way to express real numbers, which is offered by many programming languages, is to write them in base 10, with a decimal point. This only allows expressing numbers that can be written with finitely many digits after the decimal point (decimal numbers), since a program is finite (if you allow infinite programs, what you call a program is not what everyone else calls a program). Many programming languages further restrict to a bounded number of digits (often in base 2 rather than base 10) so they can only represent a finite subset of the real numbers.
There are languages where you can represent more numbers. For example, some languages have no bound on the size of integers. A given implementation may run out of memory, but that's because this implementation is only an approximation of the actual language. Some languages put no limit on the size of manipulated data, and they can be implemented with the provisio that for any given program and, you may need to provide a sufficiently large computer (as opposed to other languages such as C which require you to commit to a memory size before you write the program). Lisp and Haskell are two examples of languages that support arbitrary integers ($\mathbb{Z}$), as well as arbitrary rationals ($\mathbb{Q}$).
Some (rather non-mainstream) languages can express arbitrary computable reals. By definition, any number that is expressible in a programming language that can exhibited explicitly is computable. For example, Coq has a type for reals, as does Isabelle/HOL — here's a definition of $\pi$ in Coq. In both cases, the real numbers that can be expressed are actually a subset of the computable reals, restricted by the ability to not only write a program that computes a number but also prove the termination of that program within the framework of the language (both languages only contain terminating programs and membership in these languages is decidable, so by Rice's theorem they reject some terminating programs).
The set of all programs is countable because every program can be written as a finite string over a finite alphabet. This is in fact the easiest way of proving the existence of non-computable reals: for every computable real, there is a program that computes it, and distinct reals are of necessity computed by distinct programs. Since there are only countably many programs that compute numbers, there are only countably many computable reals. But the set of all reals is not computable, so there are uncountably many non-computable reals.
No, I can't point you to a non-computable real. They exist, but by definition, the ones I can describe are the computable ones. You can exhibit a non-computable real using a diagonal argument (pick a numbering of the countable reals written out in decimal, and change the $n$th digit of the $n$th number). This proof is not constructive because the existence of a numbering sequence does not have a constructive proof.