Check out
USACO. Once you
register you are given increasingly difficult problems to solve. You have to submit each program and have it function correctly to move on to the next set of problems. Accepted languages include C, C++, Java, and Pascal. Even the "easiest" problems are difficult and require reasonable programming experience.