How can we prove in an elementary fashion that any Riemann integrable function can be approximated by a sequence of $C^{\infty}$ functions? More precisely, for $f:[a,b]\to\mathbb{R}$ Riemann Integrable on $[a,b]$ how can we find $f_n\in C^{\infty}([a,b])$ such that:
$$\lim\limits_{n\to\infty} \int_{a}^b |f_n(x)-f(x)|=0$$?
This is tedious but elementary:
If $f$ is Riemann integrable there is a sequence of partitions $P_n$ such that $L(f,P_n) \to \int f$. Without loss of generality, we can assume the partitions are nested. We can also assume that the number of points in $P_n$ satisfies $|P_n| \ge n$.
Since $f$ is Riemann integrable it is bounded and we can assume $|f| \le B$.
Each partition defines a step function $s_n$ that is constant in the subintervals of the partition. We have $\int s_n = L(f,P_n)$. Now modify the step function $s_n$ so that it is continuous in the following way:
Suppose the partition is $x_0=a,x_1,...,x_m=b$ and let $\alpha_k = \sup_{t \in [x_k,x_{k+1}]} f(t)$. Pick a $\delta>0$ so that the points $x_0, x_1-\delta, x_1+\delta, x_2-\delta, x_2+ \delta,...,x_{m-1}-\delta, x_{m-1}+\delta, x_m$ still form a partition with the obvious ordering and $\delta < {1 \over m^2}$. Define $f_n$ by linearly interpolating $s_n$ through the points $(x_0,\alpha_0)$, $(x_1-\delta, \alpha_0)$, $(x_1+\delta, \alpha_1)$, $...$, $(x_{m-1}+\delta, \alpha_{m-1})$, $(x_m,\alpha_{m-1})$. $f_n$ is clearly continuous and bounded by $B$. By construction we have $\int |s_n-f_n| \le (m-1)B \delta \le {1 \over n} B$.
Then $\int |f_n-f| \le \int |f_n-s_n| + \int |s_n -f| \le \int f - L(f,P_n) + {1 \over n} B$.
As @lzralbu noted in the comments below, the $f_n$ are just continuous. not smooth, so this is not as elementary as I intended.
One could follow @lzralbu's suggestion or rely on the fact that the polynomials are dense in the continuous functions.