Some suggested reading for you...
To Get Your Hands Dirty
Books to Read
Learn Code the Hard Way series (they are online and free!)
Learn Python the Hard Way
The one that started it, and Python probably is a good language for you to get started at your age, as it may be more fun and less constraining than other languages, while being very expressive and powerful: definitely a good choice to get into programming).
Learn Ruby the Hard Way
Might actually be even more appropriate for you, as Ruby is an extremely fun language to play with, and extremely fast to pick up! That being said, I tend to find that people develop a few bad habits with Ruby, that will them be hard to shake off and that might hinder their learning of other languages. Still, if motivation is one of your issues, then Ruby might be even better than Python in your case.
Learn C the Hard Way
That being said, I'm a strong defender of C and of its importance for programmers. Still think it's a bit early to tackle it, but doable, and this book could help you (though I haven't used it, to be honest, but it does get you from basics to more complicated stuff without assuming much). I don't think your age really is the issue to learn C in any way, but it does impose a lot of constraints and it does take TIME to learn, LOTS OF TIME to master, and a decent amount of TIME to do even somewhat simple things sometimes, in comparison with what we know call high-level languages (a label C once had itself, back in the fun days of machine code and assembly).
Learn Yourself a Haskell For Great Good
OK, I expect many people will say maybe I shouldn't point you to that one, for many (some potentially valid) reasons. But you may like it, and if you do it can get you places. It can also spoil you for life and make you look down on all other languages afterwards, but mostly it can teach you some cool stuff and make you see what powerful languages can do.
Why's (Poignant) Guide to Ruby
Also a very fun guide to get started with.
Environments to Experiment
You mentioned CS, not progamming nor software engineering. This means theoretical stuff as well, though you seemed more enclined to see the practical aspects from what I gathered from your question.
Eventually, you really should get into these theoretical stuff, but it's hard to find resources that aren't borderline (if not extremely) boring. That's not the case for some of them, but many of the references and textbooks are pretty... well, compact, solid and dangerous to hit people in the face with. Doesn't mean they're bad, they may just not an example of good pedagogy. Plus, some day, you might come across something and from a deep and dusty corner of your memory you'll remember there was something about it it one of these books that are more akin to bricks than to guides. That's what they're for, though with today's online resources, that's a bit less relevant.
Some of my favourite reads are:
this is a work in progress, will keep editing this answer
It's Not Just by Programming...
... that you get interested in programming. Maybe some other stuff can get your motivation going. These are amazing books to inspire you to do great things and learn how others got into it before you, and built and modelled the computers and their systems you use today.
For more on this, read my answer (and others') to What are some things you have read that inspired and guided you as a programmer?, where I detail this a lot more. But my top-list for this would be:
- Books (both hyper inspirational, extremely educative, and deeply humbling):
A Personal (and Cautionary) Tale...
Hmm, sorry, that part got way longer than I originally planned.
I got into computers when I was about 10, in a time where they were not as accessible as now, in your case (and they were still a LOT more accessible than for some of my older peers, of just a few years... we live a fast-paced era, in terms of technology advances). I got into "programming" (yes, quotes, and I'll bet you a beer - when you reach legal drinking age wherever you are - you'll use some yourself in retrospect in a few years) shortly afterwards, after having broken my first computer a few times and provoked a few blunders.
And here's the point of this (wow, already lengthy) anecdote: though I was extremely motivated at the time to learn, I did pick up at the time things that were too big to chew for me, I have to admit. Maybe I could have learned them, had I had the right things at hand (again, the internet was a bit less wide-spread at the time...). But I failed at some things back then that I excel at nowadays.
I remember trying to learn C, without even quite knowing much about it and without even having a development environment at the time, because I wanted to understand the stuff I saw in these funky Phrack and 2600 articles, for instance (oh yes, I wanted to play with the stack for fun and profit too, but mostly for fun... gimme...). I just wasn't ready, and didn't quite manage to do anything with that, as I didn't even have any environment at hand to do this, or didn't know where to find one (also, I'm not English native, so back then that considerably reduced the pool of online-resources to look for).
I also remember that I went to a class trip to England carrying with me a huge Java 1.2 book. I still have it somewhere. Worst book ever, won't even mention it. It was so bad and so unpractical, and full of things now recognized as bad practices. But maybe, had I known a bit more and had more experience, would it have taught me something. But quite frankly it didn't. Read the thing cover to cover, tried to run examples, tried to write my own stuff, but it assumed I knew some principles that I hadn't seen until now (Object Oriented programming isn't exacly a staple of BASIC, for instance, and so weren't really the Observer Pattern and event-driven APIs like Java's Swing). I gave up, and funnily enough years later I picked up Java in just a few days, remembering some of this (and not even needing that book), because in-between I had properly learned other stuff. And failed at learning other ones.
In-between, I had an high-school optional class for programming, where we mostly did Pascal and Delphi. It was a bit of an half-baked class, to be honest (plus, it was done in German, which also isn't my native language, so that didn't quite help, I guess), but the guy was interesting and that was still programming... even though sometimes it was programming on paper... Ah the joy of losing points because you forgot a semi-colon (son of a gun...). And, well, early Pascal was easy to pick up, because I knew BASIC well and had a read a herd of other stuff, but other stuff hit me in the face. Hmm, recursion to do Koch's snow-flake? What the heck is that? Multiple recursions? You're dreaming, boss... And then early attempts at using Delphi introduced me to a concept I'd really only fully grasp later: pointers (mostly one of the reason why C is important to learn, and also mostly one of the reasons why it may not be the best to start with for you right now). I think the German didn't help at all here, when the guy used to speak about "Hut"s for the Pascal/Delphi pointer sign and so forth... :) They say communication is everything, well, that's not only for marriage.
But, despite these road-blocks, I learned some stuff, was still interested, and when I entered a software engineering school right adter high-school I knew a bunch of stuff. I didn't let it go to my head and think I already knew much, and instead pretty much assumed I knew nothing to really force myself to learn the basics with my peers, and keeping in mind most of what I had taught myself may have been wrong. And every now and then, some concept I had to learn made sense because of something had learned back then. Sometimes I thought I must had been a dumb-ass to not get it back then from the get-go, and sometimes I realized why I didn't. To everyone their own pace.
I had even started to get interested, for some odd reason, in operating systems (maybe for the security aspects, I recall). In particular, I got my hands on a QNX copy, which at the time was previewing a new version of Real Time Operating System based on their brand new Neutrino microkernel. Didn't know shit, didn't know C, wasn't quite sure why the kernel was different or what RTOS or POSIX implied, but figured it looked way cool to be able to play with that, and it was a UNIX. Finally had something I could write C on, and it had this amazing operating system and kernel, this different user interface called Photon, and it did that thing called "real time" which didn't quite make sense to me back then. So I bought the books on the QNX Neutrino Architecture and the QNX Programming Guide by Rob Krten and... well, failed to grasp most of it because my general knowledge of Operating Systems, of C, of kernel design (and of English, quite simply) wasn't well established enough at the time.
And years later, when I had an operating systems course, suddenly I was one of the rare guys who knew QNX, or even what the words microkernel and real-time meant. And I could go back to this book and read it with a deeper understanding. And you know what? Just a few years after that, I was an assistant on a course for Operating System Programming AND a lecturer on Embedded Systems Programming, showing off QNX (and other competing RTOS) to my students.
The time difference between when I bought that QNX book and that class I gave? About 15 years. Looks like a lot of time for you (longer than your life) but it simultaneously seems like a very short time for me (it's less than half my life as of the time of this writing in 2012). Time difference between when I actually started to program (day one of my university, not when I dabbled in it when I was your age) and this course was pretty much 5 years.
I failed to learn basic stuff when I could have grasped them, and understood some ahead of my time. Probably learned more from the failures. Most importantly, even when I failed, I built some degree of understanding of an area, and some general knowledge about something.
And you know what, as dumb as it sounds, that's how you get an expert at something: by sucking at it, failing at it, over and over, time and time again, picking up pieces here and there. Until you finally totally get it... and still suck at other stuff you can now try to improve.
Bottom line, don't sweat it. I was very eager to learn back then, but didn't know where to look. So I tried to look everywhere, and try to do everything. Which is fine. But know this: I failed!! Very happily, but I failed. And so will you... until some day. And I'm sure many people will recognize themselves in this scenario.
Keep having fun, don't get frustrated by the books, and if that's really what you like doing, you'll have picked up a lot of things without realizing it.
So... keep failin'.