Resources for Teaching C to High School Students? 166
mctk asks: "I'm a high school teacher who, disappointed with the lack of computer science in school, has promised to teach a few motivated students programming after school. As an enthusiastic novice with three semesters of C under my belt and a few side projects worth of experience, I feel competent yet ignorant. I would really appreciate suggestions for resources on C that are written to be accessible to high school students and contain lots of ideas for activities. Perhaps you've had success with a series of books that spans beginner to advanced? Do you have any activities you would recommend? How would you map a student's first year of coding? I welcome any and all suggestions. While we're on the subject, is there a brace style that is most standard in the industry?"
Don't teach the language (Score:5, Insightful)
Teach the mentality, the methodology of problem solving.
Teach basic algorithms, data structures and coding theory - give them an understanding of where the libraries they are suing will come from.
More importantly for modern world working teach colaberation, give them a real group project to do, each of them writing different interfaces or different parts of an interface for a whole program (something like a simple game such as tron is ideal for this)
By doing all of this the language becomes almost incidental - which is really what you want, who knows what the demand for C, C++, javam C# will be in a few years time, but learning the right methodology and colaberative practices will stand them in good stead for years to come.
Re: (Score:2)
Pretty much every popular language around uses similar syntax to C, so I'd say just get them to make something trivial, and then correct the obviously ugly and brain-dead code that emerges. It's kinda like teaching someone to play go, just make them used to the shapes and sequences that emerge. Afterwards they can learn the more complex concepts.
Re: (Score:2)
Re: (Score:2)
University actually stopped me coding because I started spending my time with friends in the evening rather than coding bots (AI type, not cheats) for CS
Brace style (Score:2)
On your brace style question, about the only agreed thing in the industry is that each dev team/company should pick a standard. Preferably with reasons for each decision.
Its not just about braces either, what about constants, variables, upper/lower case, underscores, sub routine calls, tab indenting, spaces vs tabs, the lsit goes on.
I'd recommend that you read Damian Conway's Perl Best Practices (O'Reilly) - not to say that thos
Re: (Score:2)
Re:Don't teach the language (Score:4, Informative)
Try a few exercises away from the computer where the students can learn without the pressure of a blinking cursor demanding some kind of input from them right off the bat. Look at things that are popular in their culture such as games and have them try to break the rules of each game down to instructional steps, as well think about the thought process that goes into planning a move, and then explain it in instructional terms... all of it in plain english.
Another good one, is learning how to sort various forms of data, along with the numerous ways one can achieve a sort (such as the bubble sort). A great physical example of sorting are things like the Towers of Hanoi puzzle (the one with the disks and three pegs), or a deck of playing cards.
Pushing an entire programming language on someone before they know the basics of how programs function will only scare or frustrate them... especially when they have the prospect of a failing grade looming overhead.
Get them thinking outside the box before putting them *in* one.
Re: (Score:2)
At the same time, these are self-motiva
Re: (Score:2)
Re: (Score:3, Interesting)
Text book (Score:2)
I found the text very good and the same author offers the same text aimed at C (though I will admit I have never looked at the C version, though I suspect it would be similar to the Ada text in most places)
Data Structures and Algorithm Analys
Re: (Score:2)
This seems like a very strange goal for a university to have. Why would it choose to handicap people who already knew some of the subject material?
We decided to only teach the series form of differential equations because nobody really uses them in practice and someone who was already applying differential equations wouldn't have any advantage...
Strange.
Ross
Re: (Score:2)
Going out of their way to make things equal between students is fairly common in UK universities - little differences such as the fact you NEVER put your name on the exam paper and the marks are stadardised across the university. Not to mention 70% being the top grade (but the exam being designed such that if you only know what was taught on the course and you didn't do more research you could only g
Re: (Score:2)
Speaking of university, why didn't this high school teacher try looking up the Arts & Sciences department of the local university and try calling some CS teachers to see what books they use or other suggestions on how to teach 1st year CS students? Seems like that'd be a much better option than asking
Re: (Score:2)
Re: (Score:2)
Re: (Score:2)
Re: (Score:2)
SCO stop teaching our kids for pity sakes!!
Re: (Score:2)
s/su/us/
Re: (Score:2)
Re: (Score:2)
Re: (Score:2)
But when you're learning how to write, you do need to learn how to use a pencil. It took my teachers months to break me of the habit of simply clenching it in my fist. In the same way, there's little point in teaching kids how to solve high-level, abstract problems if you don't also put a lot of effort into teaching
Re: (Score:2)
An object in a higher level language is just a struct in C. A class is just an object that has been bundled with code that acts upon that object. No big deal- basic C can handle this, and there's a darn good teaching opportunity in doing it the long way.
This will be the final time I'll post in this thread- a text adventure game is an interesting enough exercise that it will take up to a full semester to program, and
Re: (Score:2)
The same goes for data structures. Once a student is comfortable with the idea o
Re: (Score:2)
But I do have a tendency to agree- thus my emphasis on text adventures I've noted previously. Basic IO, a single data structure, and pointers. What more do you need?
Watch out, though... (Score:3, Insightful)
Re: (Score:1)
Re: (Score:2, Informative)
It's an after school program. I really don't see cheating as a problem. They're kids who want to learn something: not just get their ticket punched. In a normal school class, though, I'd agree with you - up to a point.
I could easily make a block of code look and function different without having any knowledge of how or if it works.
They could learn a bit if they tried to replace var++ with ++var. Or, if t
I know I'll get modded down for this: (Score:5, Interesting)
There's a reason there are so few resources on teaching C to high school students; it wasn't meant to be taught to high school students.
Re: (Score:2)
As long as its a relatively strict langauage that doesn't encourage lazy coding styles then its useful to teach it. Having a good understanding of pointers, passing by reference, memory management and basic datastructures will never hurt - even if in later life you leave all of that to the compiler and garbage collector.
Languages I would consider as teaching tools
C, C++, Java, Ada, LISP, Pascal
Languages I would avoid until they know atleast one of the a
Re:I know I'll get modded down for this: (Score:4, Informative)
I agree with the OP, C would be a terrible choice for first-time programmers IMHO. You need to keep them motivated, and that works best when the reward-to-effort ratio is high. Python would be a great choice: learn them the basics (forced indenting! \o/), and introduce them to stuff like pygame which allow nice results with very little code. At the end of the semester they would be able to make small stand-alone games. Kids like flashy things.
For a follow-up course, you could choose to go C/C++. But it would only be of use to those who will eventually get a CS/EE degree, which already (should) have enough courses on C.
Re: (Score:2)
I know I found when I did the 2nd year of my degree in the US that US college freshman/sophmore courses tend to be on a similar level to UK A levels (at least how they were when I took them, they seem to have g
Re: (Score:2)
The availability of libraries is totally irrelevant to the question, only the syntax matters. And, speaking of C++, you can dig up a class for nearly anything. A good first language should have a clear syntax for implementing the vanilla CS concepts, that's all. The concepts are: data structures and objects, control structures, functions, pointers (references), recursion. I agree with you, C[++] is not a bad choice at all, but for a different reason.
A free book to learn CS using Python (Score:5, Informative)
If you want to teach basic programming skills using Python, there's a very nice free book which can help: How to Think Like a Computer Scientist: Learning with Python [greenteapress.com]
Re: (Score:2)
Re: (Score:2)
Yes, forced indenting is a basic! Okay, let's get real here. Py
Re: (Score:2)
I like the idea of starting with an OO mindset, but haven't myself thought through decisively which I prefer.
Thanks...
Sam
Re:I know I'll get modded down for this: (Score:4, Insightful)
Re: (Score:2)
Never programmed professionally, never taught CS, but really want to agree with you. Python is awesome in that it allows you to start writing simple yet very instructive programs, like sorting, without worrying about #include and other such nonsense (I love C, don't get me wrong, but teaching the first course in CS is not the same as writing HalfLife 2 engine). Python has very clear syntax, and it implements all the bells and whistles of the OO programming.
The only difficulty I can see is that you would
Re: (Score:2)
"The only difficulty I can see is that you would have to explain what an object is first (same problem with Java)."
You can program Python procedurally and could certainly get new programmers comfortable and acclimatized to the language without covering OO stuff first. Python is a great language with an excellent object model, but in contrast to Java it doesn't push you to do everything the OO way. As a simple example, Compare and contrast the Java hello world program [wikibooks.org] with Python's [wikibooks.org].
Re: (Score:2)
Make it fast, make it fun, because most of the class isn't going to end up being programmers. That's why Python (plus Pygame, LiveWires, SDL) is being recommended.
Pascal... (Score:2)
I found that to be an excellent course...
Re: (Score:2)
Re: (Score:2)
VB is in the above list for a different reason - its full of bad practices and bar being able to create GUIs quickly has very
Re: (Score:3, Insightful)
This is a key point, I think. Python doesn't force you to do the things that good programmers do anyway. Then again, C, Java etc. let you get away with all sorts of bad programming practices too.
I think it is easier to explain the concept of "type" with a language that forces you to declare your variables and their types before using them. But, that'
Re: (Score:2, Insightful)
Sure, if these kids are going to become professional programmers. But if this class is intended to just give them a taste of programming or some simple skills - they discipline isn't the most important thing to learn.
Actually accomplishing something is important. And doing it with a minimum of distraction and fuss is also probably important. And if this is the case, then python is probably a nearly perfect first language. And since python tends to push you t
Free Pascal (Score:2)
But I digress. Instead of teaching the language, teach the concepts, yes. I agree with that. I'm still teaching myself some basic things as a hobbyist, and this language/compiler have helped me come to understand some comp sci concepts, such as: linked lists, pointer management
Re: (Score:2)
Yes perl is a great language. Its a good teaching tool as you can do pretty much anything in it, very quickly usually - from low level C style manipulations to OO and regex.
But perls flexability is its downfall. The difference between what you can do and what you should do is huge. Perl has a very bad reputation for unreadable code (executable line noise) and whi
Re: (Score:2)
Assembler is beautiful (Score:2)
C IS a learning tool (Score:2, Interesting)
One of the coolest things we did was to write an asm method, write a C program that uses it, compile them with -O0 and debugging info, and then link them together manually, load them in a debugger and see what exactly happens. Not something you should do in your everyday life, but a fantastic experience.
However, I agree that it's not a language to teach day-to-day programmi
Re: (Score:2)
Oh! How I disagree!
It's the low level stuff that is fun to learn. When I was in High School - I was programming in pascal with inline assembler. It was fun. It was _Great_ fun. I always wanted someone to teach me C.
Object Oriented programming don't teach people the
Re: (Score:2)
Re: (Score:2)
The language you are looking for sir, is Ruby.
You need more... (Score:4, Funny)
1. Funding to buy letters.
2. A better lesson plan so you can aim for something higher than a class of C students.
3. A tech savvy room of students.
1. For a class of 30, I would suggest 10 As, 20 Bs, 10 Cs, 5 Ds and 2 Fs. Yes, it doesn't add up to 30, but you should give mostly As and Bs, a couple Cs for those seniors who just want something, anything to take and pass while they transition from HS to college, and the D/Fs are for those who are truly slackers and just don't even give you the half effort.
2. Sorry, I hate to shoot down others, but you seriously want a class of C students? I'm sure administration wouldn't be too happy with that.
3. I hate to lay it to you, but I've seen average college students have a hard time dealing with scripting, and teaching programming is thinking differently to a higher level. You said you want to teach a few motivated students, yet you need to be open to everyone who enrolls. I would suggest you have lower and upper level classes. Lower level will teach the basics of how a computer thinks, and how to write a basic program. Those in the upper level, is more independent study and you're there as their troubleshooter, adviser, and teacher for when they need new concepts and get stuck. And while you're at it, make writing a short paper (maybe 300-1000 words) on the project they did. It's good for them to learn documentation, communication and know you're boss.
Ok, 1 and 2 were a joke, but 3 was serious. If anyone is upset, laugh. it's meant to enlighten your day. god its 3am, and i have a final in 5 hours and i'm only 50% prepared.
Grump.
I share your sentiment (Score:3, Funny)
[foot icon here]
Re: (Score:3, Insightful)
My experience (Score:1)
Memory (Score:2)
Many books don't do hardware / memory fundamentals right, if at all, and that might be a prob
Re: (Score:3, Insightful)
Personally I would favour Java as a teaching language because its basic syntax and structure is similar to most modern languages, its OO, easily debugged, requires exception handling, a
Re: (Score:2)
Educate the Youth (Score:1)
Re: (Score:2)
Re: (Score:2)
Practical C (Score:2)
If you're talking about programming C++ and not straight C, I think a good book would be "How to Think Like a Computer Scientist [greenteapress.com]". It'
K&R2 (Score:2)
1. Realize that you are only qualified to do so much with this. Your job here is to facilitate these students' independent learning, rather than to try to teach them C programming, since you barely understand that yourself.
2. Get a few copies of The C Programming Language, Second Edition [amazon.com], by Kernighan & Ritchie. Aside from the ISO standards, it's the authoritative source for C, and it describes the language in detail without a lot of fluff. As a side benefit, it will also familiarize them with the
Re:K&R2 (Score:2)
use K&R's book (2nd ed) (Score:2)
Anyway... K&R's The C programming Language
1) Cheap
2) Most importantly it's clear,short and to the point.
This is believe, suits motivated students better than crappy 1000+ pages books ( American style!
The first chapter(s) are fine as an introduction.
As a plus they can actually use it to look stuff up, instead of just tutorial oriented books.
It's clear and short. And gives you the basics
Ofcourse you could argue th
Teaching books, not reference. (Score:3, Informative)
http://www.deitel.com/books/chtp5/ [deitel.com]
Deitel & Deitel books are amazing. The professor I had in college used them to teach, even though the college didn't actually approve them. Even the worst of the students was able to understand the examples and follow along. I was amazed that he managed to teach the worst few the basics and they could actually write programs. Seriously, they had NO business trying to learn programming, and they were learning.
But don't just hand them the book and tell them to have fun. Take each chapter and make a lesson from it, as if it wasn't in the book and you had made it up yourself. (Obviously, don't read from the book.) You'll automatically say it differently than the book did, and when they go back to the book, they've got a second way of looking at it automatically.
And make them type in the code. Don't let them copy it from the CD. If sounds stupid, but it definitely helps them remember what's going on, and the mistakes they make in typing will help teach them to debug.
Re: (Score:2)
Re: (Score:2)
I started to learn to program in 4th grade, had a summer class in 6th grade, and taught myself from there. That was enough intro for the 'teaching' books to be useless and the reference books to be boring. I learned the major portion of my skills online using search engines.
My suggestion (Score:2)
in high school... (Score:4, Interesting)
In high school, I took an AP Computer Science class that taught C++. If I understood then what I understand now, learning C++ would have been a whole lot easier. My teacher focused too much on the language instead of concepts.
After several failed attempts at trying to learn how to program, I finally understood basic concepts such as variables, integers, arrays, etc. I then took a more basic computer science class, "Algorithm Design/Problem Solving," that used the book Programming Logic and Design [amazon.com]. This book does not use or concentrate on any specific programming language. All our assignments were done in pseudo-code and we had to show the logic of what we wanted accomplished. I have to admit it was a lot easier trying to convey the logic without having to worry about the syntax.
It's been a couple semesters since I've taken that class, without any programming in between, and now I've picked up The C Programming Language [amazon.com]. I am currently half way through the book and ,I must say, I finally understand and appreciate the concepts being taught. I wouldn't quite recommend this book to the pure beginner, because it assumes knowledge about basic concepts such as variables, compiling, etc. The book, at a little less than 300 pages, is written and presented much better than the 1000+ page programming books I've run across.
If I were back in high school, I would love to have these concepts introduced at a gradual progression. Basic programming concepts -> Logic & Design w/ pseudo-code -> the actual language of choice using an easy to learn (30 minute intro) compiler. Of course, hindsight is 20/20 and I'm not too sure if I would have paid as much attention to the first two concepts. Since you are teaching in a high school, I take it you have 2 semesters to teach the class. Perhaps dedicate the first half of the first semester with logic. You can have them play different logic games and tie that in with the lessons.
Creating a good foundation makes learning and teaching a whole lot easier.
Re: (Score:2)
When I was in high school, I took one of the first-offered AP Computer Science courses in 1
Webcast (Score:2)
http://webcast.berkeley.edu/courses/archive.php?s e riesid=1906978347 [berkeley.edu]
Yeah it might be over their heads, but you should be able to watch it ahead of time and glean enough understanding to show it to them.
Dan Garcia, who i think is currently teaching it is also a great and entertaining prof.
Re: (Score:2)
Here is a page listing software for either recording the stream or downloading it. I have personally only used HiDownload, which works perfectly for downloading real audio streams.
Newsgroups (Score:2)
In addition to the book recommendations, you might also like to introduce your students to the relevant Usenet newsgroups, particularly alt.comp.lang.learn.c-c++. There are a lot of people on these groups willing to help out newbies with genuine questions, and the level of understanding and correctness is much higher than many other resources (including a lot of the books you'll find in a store). Usually, all they ask is that students make a genuine attempt to solve a problem or read up on a subject before
Flamebait? (Score:2)
First, C is a horrible language to learn on. Try something like Python or Ruby. There's a book out there that teaches Python where every project is some type of game. That's a good one. [amazon.com] There's also the free online textbook, How to Think Like a Computer Scientist [ibiblio.org]. Haven't tried that one, but it's free.
Also, you asked about brace style. Yes, there is One True Brace Style . Unfortunately, no one can be told wha
Re: (Score:2)
Now, if the class is mostly projects writing realtime apps/OSs on embedded platforms, go for it, C is the right tool for the job. But he was talking about highschool.
BTW, I spend most of every day writing
A short list of resources (Score:2)
The Wikipedia article [wikipedia.org] on C lists some tutorial material.
The language doesn't matter (Score:2)
I realize I'm probably beating a dead horse here, but I'm feeling compelled to contribute my two cents' worth. (Save up the change for a root beer or something.)
You could teach C, C++, Java, Perl, Smalltalk, Fortran, or any number of other programming languages, either structured or object-oriented. But if the students don't get some of the basic concepts of building algorithms and flows, all they're going to come out with is the ability to recognize a given language based on the syntax...three out of f
Educate the Educator - Resources (Score:3, Informative)
These resources provide two similar but different approaches to learning about computers and programming.
Consider Their Maths Background (Score:3, Informative)
I've seen a lot of comments saying that you should focus less on the language, and more on things like datastructures, algorithms, analysis, and design. I agree that it's important to give some instruction on the basic concepts behind coding, but I think that you're going to have to remember that these are Highschool kids, and it is highly unlikely that they will have the mathematical background to really dig into algorithms.
I also disagree with people who are encouraging you to teach them languages such as Python. While it's true that there are languages that are much better than C at allowing you to get something impressive from a small amount of code, I think that it's detremental to students in the long run. After all, you aren't trying to specifically get these kids interested in programming, rather they are students who were interested enough to come to you.
The biggest thing that I think you can probably do to give the kids a leg up is to focus on the lower level aspects of C. Do a good bit on memory allocation and debugging, and spent a lot of time on pointers. If these kids are interested in going on to become programmers, then making sure they have a solid grasp on pointers is probably one of the best things you can do.
One of the most amazing things about kids is that, when they are cooperative, their minds are incredibly malleable. Take some of the hardest parts of programming, and start getting them to adjust their thinking toward it at an early stage, and you will find that they will become incredibly skilled programmers if they stick with it. Remember that given their mathematical background, there probably isn't a lot of point in trying to get too deep into analysing algorithms, and keep in mind that there is a lot of benefit to learning close-to-the-metal programming and they might not get it in a university (which seem to be focusing on Java more and more). Be sure to keep the assignments fun and challenging, and taylored to the things that they are interested in.
The last bit of advice is that you should focus on more than just teaching them to code. Get them into the culture as well. In my programming class, for example, we used to have a weekly assignment to read and post to two stories on slashdot. We watched Revolution OS and Pirates of Silicon Valley. Get the kids into the hacker subculture and they will go much further as developers as well.
From a college grad who spent 4 years doing C ... (Score:2, Insightful)
C is an excellent choice (Score:3, Informative)
1. It has a simple way to do console and file IO (scanf, printf) that will enable students to write and test simple programs.
2. It is used everywhere. As students learn more of C, they will be able to access and use the vast array of libraries available to C and go as deep as they want. When I was 16, it was common to learn C in order to start writing games, and then assembly language to make the fast loops faster. Another student learned assembly language in order to debug DOS viruses.
3. It is completely deterministic when run in one thread.
4. Its syntax is very simple. There are very few gotchas, most of which can be resolved with extra parenthesis.
Everyone else saying "pointers suck", "use a simpler language", etc. are forgetting two things about that first programming language. First, no matter what language you start with, it will be difficult to begin programming. The learning curve for Lisp/Python/Java/Ruby/etc. will be at least as steep as that for C for new programmers, and additionally there is little point in teaching OOP to people unfamiliar with structured programming and the problems OOP is meant to address. Second, it is frustrating to learn a language that has little use elsewhere, especially when it is because someone else claimed that it was better to know general concepts than to know a useful language.
Re: (Score:2)
Turbo Pascal (Score:2)
I would recommend Turbo Pascal, instead. That's what was taught in my high school, and it REALLY helped me gain a stronger grasp on programming concepts. It also has a very similar structure to C early on, so it'll be a good stepping stone for learning the logic required of programming.
Language not important (Score:2)
I have been a developer for the past ~10 years since dropping out of college, and in that time, I have had to use:
FORTRAN 90
C
C++
Perl
PHP
Javascript
C# (.NET)
Visual Basic / VBScript (.NET)
Picking up the new languages is easy, as they all share fundamental concepts and data structures. Teach your students about scalars and arrays, pointers and sorting/navigating through arrays, conditional statements, iteration (do n, for loops), conditional iteration (while, do while), a
Karel the robot (Score:2)
Check out the ACM K-12 model curriculum (Score:3, Informative)
I teach game programming at a community college (Score:2)
First off, you are still a very early stage beginner. That means that anything you do will require you to learn *more* than the students learn. I would try very hard to make your classes into more of a guided discussion and collaboration that a
Re: (Score:2)
Yes. I don't think my post was quite clear on that. I'm thinking of it more as tutoring three students after school twice a week. So this is definitely how it's going to run. And I'll be upfront with them about the fact that I certainly don't know everything, but I know enough to get them started.
I agree that the thought process and logical structures are more important to focus on than jumping right into the programmi
Re: (Score:2)
One other thing I would change, do not teach C, teach C++. I do not consider either of those languages good for teaching beginners, but you know C and so it is the best language for you to teach. So, why did I just say C++? Well, C is mostly a subset of C++. The basic language is the same whether you call it C or C++. But, C++ gives yo
K&R... as a resource (Score:2)
On the other hand, it has not "moved on". When I started in CIS, I had two terms of assembly, which they don't get now, by default. That, alone, has helped me debug any number of times: I don't need to know the assembly language of the specific machine, but to know *how* co
When I learned C in high school... (Score:2)
10 years ago, When I learned C in high school, on the first day, the instructor handed out a photocopy of a very simple program. Our assignment was to type in to the computer EXACTLY as printed. Many of my peers had difficulty getting their versions to run. I even had a few minutes of head scratching until I found my missing semicolon.
You give very little information about your students. Do they have any programming experience at all? Are they writing games on their calculators? Did they overhear tha
OCaml, lisp, eiffel, or brainfuck (Score:2)
Also, use Knuth and only Knuth as your text.
There are only two books (Score:2)
Contrary to popular belief, the former is suitable for beginners - they just require guidance. Do them a favour and don't buy any books that pretend to make it easier: more pages; less content. Most of them are named "C Programminig for {Scientists,Engineers}".
Finally, steal lecture slides from your local university's first C course. You might also wish to teach them something of a
Wow! (Score:2)
It might be worth it anyway; it really is an excellent C text. No C99 yet, he's working on a revision.
Re: (Score:2)
OOP is overrated (Score:2)
Patterns are for languages that doesn't support adding higher level constructs based on others.
Meanwhile, C teaches them how the computer really works without the excruciating detail of assembler, so they can evaluate in an intuitive way the performance of a given algorithm.
However, C++ seems a good compromise to me. It is multi-paradigm, so you can use objects i