The best textbook I have ever seen for programming is Structure and Interpretation of Computer Programs remains my all-time favorite computer science textbook. Two of the big reasons that I like it are (1) it covers the concept of data abstraction extremely well and (2) the problems that it has to offer are wonderful. Note that many of the problems can be done in C++ as well, and the concepts transcend programming languages. Thanks to Zachary Burt for pointing out that the full text of the book is online! Yes, you could literally make copies of the book from this, but if you really want one in hard copy, I would recommend purchasing one from a bookseller. (Copies aren't free--someone does have to foot the bill.) Of course, you could always just view the book online.
The natural question, of course, is, "OK, but how can I get a Scheme interpreter so I can learn the really cool stuff?" Glad you asked. I have tested this on Windows 2000 and it works fine although I have had trouble when I didn't specifically perform the extraction of the WinZip file in the C:\Program Files folder. If you have a Linux distribution, it will almost certainly come with UMB Scheme. Note that the Berkeley STk is a modification of the original STk specifically for their version of their course. So if you want to take the Berkeley course remotely--and the problems do get more interesting as time goes on--you may wish to install their distribution.
The book is free. The Berkeley distribution is free. The course can be seen and done online. All you need is a computer, and while that isn't free, it is the only core cost of which I am aware.
MIT Scheme can be found here if you prefer it instead. Thanks to Marcello Herreshoff for the link.
People use Java and C++ far more than Scheme in the real world, so the perception may be that these are the best languages with which to teach programming concepts. My own feeling is that one or two classes on programming, regardless of textbook or other course materials don't make someone a programmer. There is no substitute for doing programming and lots of it. Also, while understanding abstraction is important, getting closer to the machine is also important, and getting down to actual assembly code is important.
At this time, we don't have the resources or personnel to do everything we might like in terms of computer science classes. Because the programming problems found in the Scheme-based books are so good, we are using those books. The AP course uses Java, but we will dig into Scheme in the Abelson and Sussman book. Between the two, an introduction to Java makes some sense. Unfortunately, that's all we can offer at the moment, so we give up the types of learning that might occur with other programming languages at the high school level.
Perhaps the medical profession offers an analogy. If a person has a cold, going to the store to get a remedy is easy enough. If that cold persists for a long time, understanding some of the details helps, and that's where doctors come into play. If the problem persists or gets worse, that's where a specialist may be necessary. With programming, the knowledge required to solve a task is a function of what you are trying to do. (Writing this particular web page in the context of the medical analogy is like saying that humans need water to survive. It isn't complex at all. You need to be able to turn on a tap and find a cup; the skills to drink water are pretty much wired into your brain.)
Anyway, what we are doing at Gunn is taking one piece of the big picture--a piece that also helps satisfy a requirement with the AP CS exam. That will be good for the common cold. And knowing how to deal with the common cold may take care of the vast majority of your needs.
For those of you who are contemplating becoming a Computer Science major somewhere, you may wish to take some time to look at the UC-Berkeley and Stanford web sites to see very different approaches to delivering big ideas. My own view (and bias, I suppose) is informed by the Berkeley CS3 and CS61ABC sequence because I was there and taught CS61A and CS3.