0% found this document useful (0 votes)
53 views

Welcome To Introduction To Programming

The document provides an introduction to computer programming, covering topics such as what programming is, how programs are executed by computers, the role of programming languages and integrated development environments. It aims to give beginners an overview and starting point for learning computer programming.

Uploaded by

Dea Selviana
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
53 views

Welcome To Introduction To Programming

The document provides an introduction to computer programming, covering topics such as what programming is, how programs are executed by computers, the role of programming languages and integrated development environments. It aims to give beginners an overview and starting point for learning computer programming.

Uploaded by

Dea Selviana
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 48

Welcome to Introduction to programming. My name is Steven in my name is Shawn.

Over the next 90 minutes, we'll be taking you through this series consisting of 21
different segments that hope to cover the basics of computer programming, which can
apply to any and all programming languages you might want to learn. We'll be starting
with the simplest question of what is programming. And from there, we will be
working our way up as we talk about common features of computer science such as
loops and arrays, we'll discuss how to read and write code, debug code that you've
written some strategies to help you plan out your code and much, much more. The
complete list of topics that are going to be covered in this lecture style video are
shown on the screen. Now, additionally, there will be timestamps in the description, so
feel free to skip around. If you're already proficient in some areas of computer science,
or just want to know about a specific topic we will be covering. Hopefully, by the end
of the series, you'll have a basic understanding of what computer science is, along with
an armory of useful skills that will help you unravel whichever programming language
you decide to learn. First, we'll only be covering the major key points that apply to all
programming languages. So we'll be shying away from topics such as object oriented
coding, and command line navigation, as those are things which are language specific.
Additionally, there will be no software required for you to download in order to follow
along with this tutorial, as we won't be writing any code in an ID to keep things simple
and concentrated. This video is meant for those who are interested in computer
science and programming but have no idea where to start and have little to no
background information on coding. And so if that sounds like you, then strap in, as
Shawn and I work our way through the wacky world of computer science, starting
with the biggest question probably on your mind, which is what even is programming?
Well, the dictionary defines it as the process of preparing an instructional program for a
device. But that's a really confusing definition. So in layman's terms, what exactly does
that mean? Essentially, it is attempting to get a computer to complete a specific task
without making mistakes. Imagine this for example, you want your less than
intelligent friend to build a Lego set, except he has lost the instructions and can only
build based on your commands. Remember, though, your friend is far from competent.
And so if they are not given very specific instructions on how to build the set, there are
many mistakes that they could make. If he thinks like a computer, then if there's even
one piece that you have not told him specifically where to place and how to place it,
the entire Lego set will be ruined, and you will be left to suffer a complete mental
breakdown, causing the whole goal of the project to be corrupted. giving instructions
to your friend is very similar to how programmers code. Instead of a less than
intelligent friend, you have a less than intelligent computer. And instead of
instructions on how to build a Lego set, we are feeding information on how to complete
a program like a game or a web application. And an important thing to note is that
computers are actually very dumb. We built them up to be this super sophisticated
piece of technology, when in actuality, a computer's main functionality comes from
how we manipulate it to serve our needs. Now, programming isn't as simple as giving
your friend instructions. Since in a programmers case, the computer doesn't speak the
same language as you. The computer only understands machine code, which is a
numerical language known as binary that is designed so that the computer can quickly
read it and carry out instructions. Every instruction fed to the computer is converted
into a string of ones and zeros and then interpreted by the computer to carry out a
task. Going back to the Lego example, this process wouldn't be like if he was not only
less than intelligent. But to make matters worse, he could not understand English and
only speaks in Mandarin Chinese. In order to speak with him, you have to convert the
instructions that you understand in English into the language that your friend
understand. This process is essentially what you must do for your computer in order
to make it understand the instructions that you give. The big difference between the
two examples, however, is that it is very difficult for people to understand machine
code in binary. Directly translating what you want the computer to do into machine
code is extremely difficult, in fact, almost impossible, and will take a very long time to
do it if you could. Each program is composed of millions upon millions of those ones
and zeros. So how exactly are we supposed to translate our instructions into machine
code. This is where programming languages come into play. programming languages
are fundamentally a middleman for translating a program into machine code. These
languages are much easier for humans to learn than machine code, and thus are very
useful for programmers. Going back to our Lego example, a programming language
would sort of be like an interpreter that's able to take the instructions you give them in
English and translate them into instructions your non English speaking friend can
understand. This makes programming languages extremely useful and the backbone
of any good program. Think of programming languages as not English and not machine
code, but somewhere in the middle. There are many different programming languages
out there that each have their own unique uses. languages such as Python and Java, are
just general purpose languages that can perform a variety of computational tasks, or
robots C or HTML or CSS, or languages designed for more specific purposes, such as
moving a robot or constructing a website. languages can also vary and how powerful
they are. For instance, JavaScript is a scripting language that is designed for smaller
tasks, or Java or Python can carry out much more computationally taxing processes.
We can measure a programming languages power, or level by how similar it is to
machine code, the series of zeros and ones we talked about earlier. low level
programming languages, such as assembly, or C, are closer to binary than a high level
programming language, such as Java or Python. The basic idea is that the lower the
level of your programming language, the more your code will resemble what the
machine can interpret as instructions. Aside from the different purposes that each
language fulfills, choosing a language typically comes down to a matter of preference,
as are usually many languages that can accomplish similar tasks. Try different
languages, and decide which ones rules interface and level of simplification you like
best? So now that we know what programming is, how do we actually write code? It
sounds like we can simply type words into a text document and automatically assume
that the computer can translate it into machine code, read it and carry out a task like
opening up a browser. And additionally, we can't just write down rubbish in certain
programming languages mentioned in the previous segment, and expect the computer
to understand. So how are we supposed to write code then? Well, the answer is with
an ID. And ID, which stands for integrated development environment allows the
facilitation of code by a computer. It is provide a graphic interface on your computer in
which the programmer can easily write, run and debug code without having to worry
about problems with complication or interpretation of the program. Think of an ID is
any other program on your computer, such as a game browser, or even the file
explorer, except we'll be using it to write code, IDs are able to turn your code into
machine code and run it through the computer to produce results. In addition to
providing a place for programmers to develop their code IDs provide some extremely
useful tools for programmers to ease the job of writing code, such as built in error
checking, because as we'll talk about later, code doesn't always run correctly. Auto
filling for frequently used words or phrases, and a project hierarchy, which will help
you organize and manipulate the files within your project. Back in the olden days
before IDs code used to be written on punch cards and then fed into computers, which
would take hours and cause a lot of pain. IDs nowadays act as sort of a fast track to
writing code and make things a whole lot easier for programmers. An example of a
specific ID can be seen on your screen now. In the center, you can see the program that
is currently being written. And right below it is the console, which can print out useful
information for the programmer. This specific ID is used to write Java code. IDs are
extremely powerful and will be used in almost 100% of your programming projects.
So through these IDs, we are finally able to write and compile code smoothly without
worrying about the computer not being able to understand it. The next problem we
run into then becomes how do we write this code in the ID. Because it's not like we can
just type random words from a certain programming language and expect the
computer to understand this is where a programming languages syntax comes into
play. Now, just as if you were learning a real language, learning a computer language
can be very similar. Some have different styles that may seem odd. Some may make you
use weird or abstract concepts which may be confusing. And like all languages,
programming languages have a set of rules that you must follow when writing code in
that language. And at the forefront of those rules is grammar. Programming grammar
is referred to as syntax and is very similar to real world grammar. Each programming
language has its own syntax or rules that you have to follow to a tee if you want your
program to run correctly, just as if you were speaking in real life. These can be things
such as how you type out certain functions, what you put at the end of the line of code,
and how you set up certain functions. Each language is unique in its syntax, and while
some may share similar rules, all will have some quirk which makes it stand out from
the rest. syntax is something that catches a lot of people off guard since many expect
every programming language to follow the same set of rules. But as we spoke about in
the last segment, because each language is specialized for a specific task, each needs
its own set of rules to function. Breaking or disregarding these rules will result in an
error. Just how breaking or disregarding rules in real life will result in an unintended
message. As an example, if you wanted to do something simple, such as initialize a
variable, which is something that we haven't covered yet, but the example is still
relevant. In Java, you'll notice how we have to specify what type of variable we're
defining, in this case an integer and also add a semi colon after the statement. In
Python, we don't even need to define that we are trying to create a variable and just
have to type what we want to create. And in JavaScript, we just specify that we are
making a variable, but we don't include what type of variable we want to make like in
Java. Even in this simple example, you can see how much a syntax matters when
learning a new language. Since while the goal of our program remained the same,
which was to define an integer with the value three, all the programming languages
shown took different approaches. All these languages require that you follow this
syntax because remember, computers are extremely dumb. If you forget one semi
colon or misplace a character, the entire program will not run and send you back a
syntax error, which is something we'll talk about later. Think of this as if you forget a
comma in a sentence and the entire context of what you're trying to say gets
misinterpreted. For example, in the sentence, let's eat grandma. If you were to forget
that comma. While it may seem like a small mistake, it changes the entire context of
the sentence, making it sound like you're going to eat your grandma. The same rules
follow for programming. If you forget a semi colon, the entire context of your program
can be corrupted and misinterpreted by the ID. Now another thing which makes it so
useful is that they will let you know if and when there are syntax errors in your code.
syntax errors, of course, being parts of your code, which do not follow the same rules
where we talked about previously, the ID will tell you where in your code the errors,
and also won't let you run your program until the error has been fixed. Because of how
important syntax is to writing code and learning a new language. It's recommended
that you learn the rules and syntax of a language before beginning to write complex
programs in that language. Most of the rules are tedious to learn but easy to master.
And as soon as you can do that, you'll be able to easily identify syntax errors and take
care of them easily and be writing code in no time. That covers the basic gist of syntax
and programming rules. So now that we know how to write code and where to write
code, we next need to cover what happens after we have typed out our program and
run our code. Because writing a piece of code for a game or for a database is cool and
all. But after the computer interprets the program, how will we know what's
happening and whether or not is working? Well, programmers do this by looking at the
console. The console is a text interface within your computer that us programmers can
use for a variety of different purposes. If you remember, a short while ago, we heard a
picture of a basic ID. And one of the main parts of the picture was the console. The
main use of the console is to output text from the program. This is usually done by
using a print statement. A print statement is a command that does exactly what it
sounds like. It prints text to the console. The print statement is the first piece of actual
code we've talked about in this series. And it's about as simple as the print statement.
Despite its simplicity is one of the most important functions in programming and
exists in some form in just about every programming language. The most basic thing
you can ask the print statement to do is to just simply make it Say something. This is
done by instructing the console to print, and then include wherever you want to be
printed inside the parentheses. For example, in Python, the segment of code print hello
world will cause a message reading HelloWorld to appear onto the console. Pretty
neat. The print statement is also vital for viewing interpreting the computer's output
from program. For instance, if you could tell a computer to run a simple calculation.
For example, to determine what four plus three is, they will run the program internally
and compute an answer. However, what is the purpose of having the computer run
this program if you will not be able to tell what the result is, instead of simply telling
the computer to perform this calculation, instruct the computer to print the output of
the program to the console, and upon the program's completion, seven will appear on
the console. As you can see, the console allows us to easily print information out to the
developer for a variety of uses. It is important to note that the print statement varies
depending on the programming language being used. For example, in Java, there are
multiple versions of the print statement depending upon whether you would like a
line break after the printed text or not, as well as specialized print statements which
make your code run more efficiently. Also, the general syntax of using a print statement
and certain nuances of its function contains between languages. However, you can
generally rely on it to carry out the same overall function as it is a foundational
statement for programming in general. All of its functionality makes a print statement
along with the console and very useful developer tool. However, it is important to
remember that that is all it is the developer tool. The console is not really meant to be
viewed by the end user of your program. It tends to be hidden away behind the scenes
and other methods of displaying information, such as displaying text, graphics, or
images are used to convey information to the user instead, think of it like this. When
you're using your phone, you see the console and none of the programs you use. So
while you can use the console to give yourself information about how your program is
performing, don't try to implement it in the final product because it fundamentally just
isn't meant for that. Overall, remember to use the console to its fullest extent when
writing and fixing problems in your programs, as it is a great tool to use to tell how
your program is performing behind the scenes. So now that we know a bunch of
information about programming languages, and how and where to write them, along
with the print statement under our belts, let's go over some intuitive things that the
computer can do all by itself without you having to tell it how To. More specifically,
we'll be covering some basic number mathematics as well as string math. Starting off
with basic mathematics, the computer already knows how to do simple arithmetic.
This includes addition, subtraction, multiplication, and division, all of which are
represented by the symbol shown on the screen now, in any ID that you may install,
you'll be able to print out the answer to simple math problems using the print
statement. Which may seem counterintuitive, because why would you use the
computer to do math when you have a perfectly good calculator on your phone. But you
have to remember that computers are dumb. And anything we want a computer to do,
we have to build up from scratch. basic arithmetic, while simple helps out in almost
any program you may write. For example, if we wanted to build a basic calculator app,
we need to utilize this functionality in order to correctly display the answer to an
arithmetic problem when our user tries to add, subtract, multiply or divide two
numbers. Now in addition to the four basic math equations, most programming
languages include an additional operator known as modulus. If this is your first time
hearing this word, don't worry, since it's not usually taught in math classes. modulus
allows us to get the remainder of a divisional operation. For example, when we take 10
modulus three, we're essentially telling the computer to take 10 divided by three,
ignore the actual answer and just give us the remainder of the operation. In this case,
one, since when we divide 10 by one, the answer is three remainder one. The one in
this case is what gets printed out to the console. If there is no remainder, say in the
case that we take 50 modulus two, since the remainder is zero, the function would
return zero if we were to print it out to the console. This can be extremely useful. In
many cases, the most obvious being if we want to determine whether or not a certain
integer is even or odd. If we take a certain number, modulus two, and it returns zero,
then we know that is even because any number divided by two will always result in a
full answer without a remainder. But if the system returns one, then we know that the
integer is odd, you will find yourself using the basic math operators a lot more than
you think. So it's good to keep them in mind when running your program. Now, not
only can our computer work with numbers, but it can also work with strings. strings,
by the way, are just another way to say text. For example, hello world is a string, the
letter A is a string, and anything enclosed by quotation marks is denoted as a string in
programming languages. We'll cover more about strings in a bit when we talk about
variables. But for now, let's continue. We already talked about printing strings to the
console. But let's say we're making a game and we wanted to print out the statement,
game over for was your final score. Now while we could just make a string that says
that exact phrase and print it out to the console, in some cases, it would be more useful
to print out the actual integer value, especially in the case of a game where the score
can change each time you play. Because score definitely isn't always going to be for.
Well, we're also able to print out multiple strings of text and even integers by adding
them together in the print statement. This is known as concatenation. Continuing with
our score example, if we wanted to print out the statement gameover for was your
final score, using four as an integer rather than a string. We could do this by breaking
down the statement into two strings and an integer like so. Print game over plus four
plus was your final score. We of course begin with a print statement, which again will
be different across all languages. But in this case, we're using Python. Inside the print
statement, we start off by printing the string game over. Now here comes the
important part. From there, we use a plus sign and add four to the print statement.
Just like if you were adding two numbers, then we can repeat this process with another
plus sign for the final string was your final score. And we're able to print out the
entirety of our statement easily. Doing this we can easily print out multiple different
strings and integers together in one print statement. We could also combine the two
lessons we've learned thus far and do something such as game over plus four plus four
plus was your final score. In the case, let's say where you have a game which gives you
a base score and then four points for a certain task that you complete it. This
demonstration also displays Another important part of programming, which is that
oftentimes to get your program to be the most efficient, you have to combine aspects
of code. Now it's important to note that the computer will take whatever you put in the
parentheses and print it out character for character. So oftentimes programmers will
forget to add a space onto the end of their strings. This can result in a small mistake in
which the string from the previous example would be printed out as if to say
gameover four was your final score, which isn't that appealing when displayed on the
screen to the user. So it's a good practice to always put a space after and before your
strings to make sure this doesn't happen, and your string doesn't end up like that.
Another important thing to note is the difference between four in quotation marks,
and four without quotation marks. Now for in quotation marks is treated as a string,
rather than a four without quotation marks, which is treated as a number. This may not
seem like a big deal, but again, computers are dumb. And if you try to do math with a
number in quotation marks, it will return an error. Because the computer doesn't
understand that you're trying to perform the operation on a number and thinks you're
trying to add an integer to a string, which is a big no no in programming when you're
adding numbers. So when you're programming, make sure to make a mental note of
whether or not you want to make something an integer or string, because that type of
stuff makes a big difference. All right, that concludes our segment on the base power of
computers. Now Next up, we're going to be covering one of the most important
components of computer science. So make sure you pay attention because next up
we're going to be discussing variables, what they are and how we use them. First of all,
what exactly is a variable? A variable is simply something that can store information
and can be referenced and manipulated. Think of variables like a cardboard box.
cardboard boxes, servers means to store items in them, which can be changed that
replaced and modified variables are like cardboard boxes to store information for the
programmer to reference or manipulate. each variable simply has a type, a name, and
a piece of information stored inside of it. The type and piece of information will be
covered next, and the name is simply a name for the variable. Think of it as writing out
a label on the cardboard box in Sharpie. Now there are many different types of
variables that a programmer can use, or right now, we will just be covering what are
called primitive variables, which include integers, Boolean, floats, and doubles, strings,
and characters. We'll start off by talking about an integer. An integer or int for short, is
as simple as it sounds, a variable that can store an integer value. This includes all
whole numbers from negative 2,147,483,648 to 2,147,483,648. Notice how I said
whole numbers, integer values can not and will not hold any decimal values. So keep
that in mind when using variables. Secondly is a Boolean. A Boolean is very primitive
variable which can store a value of either true or false. Boolean variables can only hold
these two values, and are extremely useful for conditional statements, which we will
cover soon. The next few types of variables are floats and doubles. Both of these
variable types are floating point data types, which essentially means that these
variables can store numbers with decimal places. Whereas integers values cannot hold
decimal values, floats and doubles can. The main difference between the two is that a
float variable can store numbers of our precision up to 32 bit. All doubles can store
numbers with a precision up to 64 bit. Essentially, a double can store more decimal
places than a float. So it all comes down to how precise you want the variable to be.
Up. Next, we have string variables, which are like the strings we've talked about
beforehand, except store somewhere in a value. String variables can store strings of
letters, which are just words and sentences. Strings are useful for displaying text and
storing input information. Strings can also be concatenated together to form
combinations of string variables and pre written strings. This can be very useful for
outputting information in a readable format for the user. For example, imagine we
have a string called name. The code asked for input and storage that string of text and
name. To output this information to the user. Rather than simply displaying their
name, you can add the phrase Your name is and make it into a sentence by
concatenating. Your name is plus a name plus a period. This makes it easier to read
your code, while also adding variability to your code, which always makes things more
interesting for the end user. Finally, we have char variables. char stands for character,
and just as a name suggests, they can each hold one character. This is useful when a
programmer wants to read one button press or one character in a string without using
a string variable. a specific example is being a game that is controlled by the keyboard,
the program needs to recognize the character that is pressed and translate that into
carrying out some function. Now strings can also hold one character, but chars can
hold more than one character. So keep that in mind when defining variables. Now, why
are variables so useful? Well, being able to store information in a format that can be
easily referenced later is essential for any good program. Oftentimes, in code, you're
going to want to keep track of things such as a user's name, or score. And so by
creating a variable called name or score, you store this information in the variable and
then reference it, add to it or modify it. Also, many times to program will want to take
input from the user, which cannot be pre programmed into the code, and thus the
variables required to store the information. A program may also rely on factors that
will change as the program progresses, in which case a variable is once again required.
Also, taking these variables and manipulating them is quite necessary for carrying out
many of the tasks you want to program to carry out. For instance, multiplying in
variables or concatenating string variables. Overall variables are the backbone of any
program, and you'll find yourself using them often if you want to clean and efficient
code. So it's best that you learn what types of variables you need to use and when. So
now that we know all about the different variable types, and we've talked about them a
little bit, we're going to delve further into what happens when we actually define or
create a variable, how we reference them, and how we can manipulate them for our
programs. To start, let's go over what happens when we actually define a variable.
Now when we write a line of code, which initializes a variable, and that code is
executed, the computer essentially creates a little space in memory that stores your
variable name and its contents so that it can be referenced later. Going back to our
cardboard box example from the previous segment. Think of this as if you had your
own storage facility, and you make a new cardboard box labeled name. And inside of it,
you put a piece of paper with the word no pointer exception on it. Now, anytime you
want to know the contents of your name box, you could simply look inside and see that
it has the contents no pointer exception. This is what the computer does, except the
storage facility is the memory in your computer. The box is a variable and the contents
of the box or whatever the variable is set to be equal to. Anytime you want to know the
contents of the name variable, you can simply call it and the computer will pull the
information that is stored in that variable, and use it how the user see fits. Another
thing to note really quickly is that you can actually make a variable without putting
information inside of it. This would simply be like if you built up a new cardboard box,
gave it a label with a sharpie, but just didn't put information inside of it. You're simply
saving that space in your storage facility for later. This can be maybe because you
want to store information in it later down the road. Or if you're going to use it to store
information given to you by the user, in which case you can't give it information since
you don't know what the user will input. Just to note that if you try to reference or
point to a variable, which does not have any information in it, you'll get what's known
as a null pointer exception, which despite being an amazing name for a YouTube
channel is something you generally want to avoid when programming. Now
programming languages allow us to do some pretty cool things with these boxes that
we've created. For example, let's say we created a second variable called channel
name. And instead of setting it equal to no pointer exception, we instead set it equal to
our already created named variable. This doesn't create a space in memory for this
new variable. However, it simply points to the same location of memory we have
already created for the name variable. Going back to our storage facility example, this
would be like instead of creating a whole new box label channel name and storing
sheet of paper with the word no pointer exception on it, we instead simply added
another label below the name box, and titled channel name. Now we have two
variables which point to the same contents, that being the string no pointer exception,
we usually do this to save space in our code for things that we know are going to have
the same value. variables can also be updated throughout your code. For example, let's
say you had an age variable, and inside of it was the integer 17. Then you celebrated a
birthday and wanted to update your age, all you would have to do is reference the
variable and set it equal to whatever new integer you want the variable to hold. In this
case, 18. This would be the same as having a box labeled age with a sheet of paper
eating 17 inside of it, and then taking that piece of paper out, erasing 17, replacing it
with 18 and then placing it back in the box. Doing this we are able to easily update the
contents of our variables throughout the code as things dynamically shift. As another
example, if you were making an RPG, your character would likely have stats such as
attack, defense manner, etc. As the game progressed, you could continuously update
the variables so that the player could get more powerful, the further along they went
through the game. And you wouldn't have to create new variables, you would simply
need to just keep grabbing that box from your storage facility, erasing and replacing
the numbers on the piece of paper and then continue along with your code. Just keep
in mind that these variables are nothing more than places in memory in which a
certain value is stored. So we can easily update the numbers and their place will remain
constant. After the code has run its course the place in memory is deleted until you run
the code again, and the program dedicated space for the variable again, each time you
run the code, you're making new boxes in your storage facility. And at the end of the
code, you destroy them all to make room for the new boxes next time. Another cool
thing you can do with integer float and double variables is add them subtract them,
divide them, multiply them and even modulus them. For example, if you're making a
calculator app and you store the first number, the user entered as number one and the
second as number two. You could then multiply num one and num two together and
either print them or store them in a new variable entitled result. Then each time you
run the program, the user could input new numbers into the number one and number
two variables. And they would simply be set to those new integers that the user
inputted and return the result that correspond Through those specific numbers, this
allows you to keep easy track of which numbers are which, and what's going on in
your program, which is extremely useful. Also, while you cannot subtract, multiply,
divide or take the modulus of strings, you are able to add them. Like we said
previously, let's say you had a string str one with the contents Hello, and a string str
two with the contents there, you could add str one and str two to create a string that
had the contents Hello there, either storing it in a third variable or printing it out to
the console. The last topic we'll be covering on the topic of variables is the naming
conventions of variables, which will be it may seem odd, but it's extremely important
when trying to read your code. So we'll be covering it now. Now variables have to be
one continuous string. And so if you wanted to make a variable that store the player
score, you'd have to find some way to combine the words player and score. Since you
can't have the phrase player score be the name of a variable. All programmers have
their own personal preference when it comes to naming variables. But the one we'll be
using in this lecture is called camelcase, which is the process of not capitalizing the
first word, but capitalizing every word that follows it. Going back to the player score
example, using the camel case method, the variable would be called player score. This
allows us to easily see and identify each word and becomes really useful for long
variable names, like the player score before the final boss. Whereas if we just type it
out without camelcase, it would be really confusing and hard to read. This will help
you out a ton when we start finding bugs in our code and need to quickly scan through
our program to figure out what is wrong and adds to the overall readability of the
program. Other programmers might use different naming conventions like using
underscores to separate the words in a phrase. But for now, and this series, we'll be
sticking with camel case. Next, we'll be moving on to conditional statements, which at
their core, are statements that change the path of our code depending on certain
conditions. For the sake of keeping things simple for this section, where Atlanta will
connote that our code will not be following the specific path. In Greenland's I mean,
our code is following the path. The main type of conditional statement that
programmers use is the if statement, and this will show up countless amount of times
in any program you write. It is as simple as it sounds, if some condition is true, and
usually that condition will be enclosed by braces, then carry out the instructions
located within the if statements brackets, else do another thing. Now, brackets are
used in most programming languages to indicate a segment of code which will run it
works like this. If the condition in parentheses is true, then all of the code contained
within the brackets will run. And if the condition within the parentheses is not true,
then it will skip over all the statements within the brackets. A quick note is that while
this is the case, with most programming languages, some, like Python, use columns
and whitespace to determine where a piece of code starts and ends. But for the sake of
this series, we'll be using curly braces. Now, the condition within the parentheses can
take on 1000s of different forms, such as if the value of the string variable name is
equal to Steven, or if the player score stored in an int variable is greater than five. The
list goes on and on. Each of these statements is evaluated as a Boolean, which you will
remember from when we talked about variables is either true or false. If the Boolean is
true, we run the code inside the curly braces. If it's not, we pretend everything inside
the curly braces never existed, and move on with our code. The if statement comes
with two more additional statements that go with it elsif and eltons. elsif is a
conditional statement used directly after an if statement, and carries out mainly the
same function as an if statement. However, the elsif statement will only be evaluated if
the proceeding F or the preceding elsif statement is bypassed due to its condition
being false. So we will run through it like so. If something is true, we will run the code
inside of that statements curly braces out if that's something is not true. But another
statement inside of the parentheses is true, we would then run that code segment. And
if neither of them are true, we would skip both segments of code and move on in our
program. This can be a hard concept to wrap your head around to so let's do an
example. If we had a program that evaluated the if statement, if age is equal to 10, we
then have a statement under that which stated outs if age is equal to 12. Now, if the
age variable was 10, which we can see from the example that it is, then the code
immediately following that conditional statement in the brackets would run. The Ultra
statement we made will not even be tested. Since we know that it is going to be false.
And thus the print statement inside of that conditional statements brackets will be
ignored, and the code will move on to the rest of the program. Now for example, let's
say we change the age variable to be 12 instead of 10. Now instead of the first
conditional statement being true, it actually evaluates as false since age is no longer
equal to 10. So what we do now is first skip over the print statement, which prints out
that ages 10 and does not. And then we evaluate the elsif statement, we check if age is
equal to 12, which again it is. And so now we run all the code inside of that conditional
statement before finally moving on to the rest of our program. So as a review, we
check the initial if statement. If it's good, then we run all the code within that if
statements curly brackets and move on with our program. If the initial if statement is
not true, we then move on to any elsif statements and evaluate if those conditional
statements are true. We can have as many elsif statements as we want, although this
could lead to clutter amongst your code. So we'll talk about some alternatives later to
help us out. Now that takes care of the FL statement. So now we'll move on to the else
statement. The out statement, once again, it comes after an IF or an elsif statement,
and we'll carry out its instructions no matter what. As long as the proceeding
statement slash statements are evaluated as false. If we went back to our previous
program, we could add an elf statement, which would only have the code in his
brackets run at the age variable wasn't 10, or 12. This will catch all cases of the
program that didn't fit into our parameters. It's good practice to always have another
statement at the end of your conditional statements to catch any weird cases that may
come up in your program. Now remember back to the fact that we could have 1000s of
Elif statements after a while that can get pretty cluttered. And so another very useful
conditional statement helps circumnavigate this problem is a switch statement. A
switch statement is functionally similar to many if and else statements together, you
write a switch statement in the form of switch variable. And then below that you write
out how many cases the variable can be. For instance, if we wrote switch var, and then
under read write out five cases that the variable var could be and then the instructions
listed under each case would be carried out if the var variable it would be equal to that
case. Now switch statements are different sets. Instead of using brackets, they use a
column to signify the start of a set of instructions and a break statement to end them.
This is very useful, because you are able to essentially use many if and else if
statements without having to write nearly as much. In switch statements, you just
always have to remember to include default case at the bottom of the expression to
denote any and all cases that don't meet the above requirements. There simply catches
all the inputs that don't fit within the program's main cases. It's very similar to just
case the end of an if else chain. Now, why are these statements so useful? Well, many
times programmers want their programs to function differently depending on different
conditions. For instance, a program could function differently depending on the
information that the user inputs, such as allowing user to use a program or not user
program if they are above or below 18 years old, respectively. Or in say, a video game.
If the user experiences above a certain threshold, you might want to give them harder
opponents to battle. Another example could be a program was changing the color
scheme depending on the time of day. Or even more simply, if a user presses a button
that is meant to move on to another screen in an app, the programmer would only
want that app to change screens if the user clicks that button. A program without
conditional statements would do the same thing every time, and would be very
primitive compared to one that can change depending on its conditions. So now that
we know how to make and use variables, how to compare them, and what we can do
with those comparisons, let's move on to another foundational concept of computer
science. And that is arrays. Now we've already talked about variables, and how great
they are for storing singular bits of information for making our code more simplistic.
But one of the biggest drawbacks that comes with variables is their inability to hold
more than one piece of different information. For example, let's say you're making an
app which allows a user to create a grocery list. Well, there's no real easy way to
create lists using variables. Because it's not like you can have one variable store the
names of six or seven different food items. Remember, we can only put one piece of
paper in our cardboard box no more. And besides, even if you were able to add multiple
items to one string variable, you would still have a lot of trouble doing simple tasks
you might want from a list such as searching through it, splitting it or even deleting
items from the list when you're done with them. This is the problem that using arrays
solves for us. An array is as you may have guessed by now, a list, you can have an array
of integers, an array of strings, and even an array of other arrays, which is something
we'll cover in a minute. Programmers use arrays when they want to store a lot of
variables containing information that is all related to each other, such as a grocery list
or a high score list in the game. Think of arrays as a column in Excel or Google Sheets.
Here the title at the top and then below it are a bunch of bits of information, which all
relate back to the title. Arrays are super useful when programmers want to store a lot
of information that can be easily searched through because programmers have
developed methods of breaking down and using arrays to find specific information in
arrays full of 1000s of different variables. As an example to show just how useful
arrays are. Let's say you're a startup company that owns an app that has 100,000
users. Every time a user wants to create a new account, they input the username they
want and then your program will have to check to make sure the account name hasn't
already been taken. Doing this requires you to search through the information of all
100,000 of your users to see if that username has an account with your service and
array would be able to get Pain all of this information and make it easy to search
through and find out if the account name has already been taken with little to no delay.
Now, the single most important thing to note about arrays is how you reference each
element of the array within them. Let's create a basic array called numbers and inside
of it, put the digits one through 10. Now, when we want to refer to each cell in his
array, we would call upon its index. an index is just a fancy way of saying that numbers
placed within the array. Now you would think that the first integer in this array would
be the first index, the second would be the second index and so on. But that's simply
not the case. In computer science, programming languages refer to the first cell as zero
with element in the array. This means that if we were talking about our array of
numbers we just made, the number four would actually be in the third index, five
would be in the fourth, and so on. So instead of starting our count from one, we start
from zero. It's extremely weird and confusing, but it's one of those programming
quirks, you're going to have to memorize and commit to memory. If you were to not
follow this nomenclature, and refer to the last element in this array as the 10th, you
get what is referred to as an array out of bounds error, since you're trying to reference
the 10th element, but there is no 10th element, where you're actually trying to do is
reference the ninth element. Another extremely important thing to note about arrays
has to do with their size. When you initialize an array, you can do it in either one of
two ways. You can either populate it with the elements that you want contained in the
array right then in there, creating and filling the array at the same time. Or you can
define how many elements you want the array to hold, essentially the array size, and
then populate it with elements later. This is because when we initialize an array, it
creates a space in memory that has a size of exactly what you give it. no more and no
less. This is great for when we want to access elements in the array, because we can do
so instantaneously because the computer knows exactly where in memory the array is
stored. But the one downside is that we can't increase the size of the array later on. All
array sizes are final. Think of this like setting up a bookshelf with books by populating
a bookshelf with a certain number of books. And then moving on and filling the next
shelf with different books, we have no way to go back and add books to that first shelf
without shifting everything over. Once we decide how much space to dedicate for an
array, in this case, there's no way to add more space. Once again, because this is
extremely important to remember. This means that once an array has been defined,
there is no way to change the size of it. If you have an array titled names with a size of
eight, and you try to add another name to the array, you will receive an error. So be
careful when messing around with array sizes. Of course, you can always go back to
the start of your code, when you initially make the array and allocate more space to it,
increasing its size. If you find out that you need more space to hold items, but once it's
defined, you cannot change its size through conventional methods. Another small
thing I want to touch upon really quickly is that when you initialize an array, you must
determine which type of array it is right then in there, for example, you have to
specifically say it will be an array of strings or integers when defining it. And also
you're not allowed to mix and match. Meaning that you can't have an array full of
integers with a few strings and some doubles thrown into the mix, they all have to be
the same type. Now the last thing we're going to cover on arrays is a little funky. And
that is the practice of putting arrays inside of arrays. If you make an array of arrays is
referred to as a 2d or two dimensional array. Think of these as matrices if you've taken
an algebra class before. Now, if you haven't Think back to our Google Sheets example,
but instead of using columns, we would add rows as well. So now each element in an
array would simply just be a string variable or an integer variable. But an entirely new
array with its own set of values and elements. The way we index these is mostly the
same, except we would have two numbers to index instead of one. We start with the
row and then the column. So a number in the positions 02 would be in the first row,
three columns down, in this case, the name Clint a number in the position one one
would be two rows down and to columns across, in this case, the name Chris, you get
the idea. Now you can also make three dimensional arrays by putting an array inside
of an array inside of an array, but that's a little above what we're going to be covering.
So I'm going to cut it off there. Next up, we're going to be talking about loops. So what
exactly are loops? Next up, we're going to be talking about loops. So what exactly are
loops? Next up, we're going to be talking about loops. So what exactly are loops? Next
up, we're going to be talking about loops. So what exactly are loops? Next up, we're
going to be talking about loops. So what exactly are loops? Well, as you can probably
tell by that statement right there. A programming loop is a statement that is used to
run certain instructions repeatedly. Just like how the opening statement of this topic
was repeated five times. loops are very useful for a variety of reasons. For instance,
imagine you want to print something 15 Sure, you could just copy and paste the print
statement 15 times, but this is really annoying to have to do, it becomes even more
unrealistic when that number goes up to say 100 or so. Now what if instead of
rewriting the same instructions over and over again, you would simply place the print
statement inside of a loop, and it will occur as many times as you would like. Now
that's the power of loops. With loops were able to repeat parts of code multiple times.
Now, there are three different types of loops that we will be discussing today. And first
is the for a for loop is very useful for situations like the one described above, where
you would like to carry out a certain set of instructions numerous times. The syntax for
a for loop varies depending on the language, however, it usually consists of three parts
an integer value, a condition which the integer value must meet in order to exit the
loop, and an operation to modify the integer value at the instructions inside the loop
are completed. Each time the for loop runs, the operation you set will be performed on
the integer as long as that integer still needs to condition your set, usually being
greater than or less than a constant value, the for loop will continue to run. Eventually,
when the integer has been modified by either increasing or decreasing it to the point
where it no longer meets the condition, the for loop will terminate and the code will
continue to run. For example, let's say our integer value was I and we set it equal to
zero, then we set the conditional statement as I being less than three. So basically,
we're saying that as long as I the variable we just created is less than three, continue
running the instructions contained within the loop. Finally, we make the operation i
plus plus, meaning each time the loop runs, we increase it by one, and inside of the
loop, let's just put a simple print statement. Now let's run through the for loop, we
start with i equals 00 is less than three, so we enter the loop and print out hello world.
Now that the instructions are done, we add one two, I'm making it one moving on. One
is again less than three. So we want to get into the loop and print out hello world.
Again, we had one two, I'm making a two now to is still less than three, so enter the
loop again and print out hello world. Finally, we add one to it once again, and it
becomes three. Three is not less than three though, is equal to three, and so we don't
enter the loop and it terminates. Moving on to the next segment of code. This is a
simple example. But you can extrapolate it across programming to fit your needs. Now
when using a for loop, we have to make sure to set up a condition that given the initial
integer value and the operation will at some point not be met to avoid creating an
infinite loop and crashing your program. an infinite loop occurs when you give a for
loop a condition which will always be met given the parameters of the program. And
so software crashes. For example, a for the beginning at 10. And checking if is over less
than zero, and then adding one to either the end of the loop will never terminate since I
will suggest increase infinitely. After the for loop is the very similar for each loop. A for
each loop, or a for in a list loop in Python is used for iterating through arrays or lists.
Essentially, the loop will go through each element in the array and carry out some
server instructions for each value. If you would like to read all of the elements in an
array and compare them to some value, or perform some operation on them, a for
each loop is extremely useful. So for example, we could have a for each loop which
iterated across an array and simply printed out the value of each array location. Next
up we have the while loop. A while loop will continually carry out instructions while a
conditional statement given to it is true. This can be as long as a certain variable is
true. As long as the numbers that's another number, or while a value is still equal to
another value. For example, while loops are different than for loops in that the loop is
not contained within one statement but stretched out and will continue to run. As long
as this condition is true. Like a for loop, you could make the condition such that it will
eventually return false and exit the loop. However, while loops will not crash your
computer should you create an infinite loop. In fact, it is very common for wild lips to
run infinitely. As for certain programs, you would like the program to continually be
iterated through instead of running once all the way through until you exit out of the
program. When programming a game for instance, a while loop would be used to
iterate through your code, continually refreshing the screen as the game runs. From
there you can perform operations on the screen to make the game playable. Creating
infinite while loop could be done by simply using the syntax, while true, as the
condition true will always be evaluated as true. Finally, I'd quickly like to cover the
extension of a while loop the do while loop. Do while loops are very similar to while
loops, except they will carry out their instructions at least once even if the condition is
false. And then we'll carry on like a basic while loop. Essentially, the conditions inside
of the loop will run at least once. And then if the condition is still met, they will run
again and function as a normal while loop would. As you can see loops in there many
varieties has some extremely useful functions. using them, you're able to perform an
operation many times in a row. You can iterate through arrays and lists and overall
decrease the clutter of your code. Next up, we're going to be taking a break from
learning about common programming statements and dive into what happens when
the code we write doesn't work. More specifically, we'll be covering the different types
of errors that can occur when you're programming and what causes them. Now when
you're writing code, you have to understand that things aren't always going to go the
way you expected them to. And sometimes the program doesn't always work as you
had intended. too. We programmers call these errors. And while annoying, they're
always going to come up in computer science, and so it's best to learn what they are
and how to deal with them. Often referred to as bugs, errors and scripting languages
can be narrowed down to one of three types, syntax errors, runtime errors, and logic
errors, all three of which we'll be covering in today's video. To kick things off, let's talk
about syntax errors. These are usually the easiest of the three to solve, since they are
oftentimes something that can be fixed within seconds. If you remember back to
earlier in the video, when we talked about syntax and programming rules, we said that
if you were to break the programming rules or syntax that would result in an error.
Well, that's what syntax errors are parts in your program where you fail to meet the
programming rules, and so the computer doesn't know how to interpret your code.
This can be anything from forgetting a semicolon at the end of a statement in Java,
accidentally defining a variable with two words instead of one, or even just
misspelling the word string when you're trying to define a string variable. Lucky for
you guys, these errors are extremely easy to fix, since you just need to figure out
where the error occurred, and what the syntax rule you broke was. Now thinking back
to IDs, we mentioned that IDs are so useful because they do precisely that. They
underline the syntax errors and usually provide helpful hints as to how to fix them.
Think of syntax errors as small misspellings or grammatical errors in an essay you're
writing annoying, yes, but not the most infuriating things. Another useful thing about
it is when it comes to syntax errors is that the program will actually restrict you from
running the code unless all syntax errors are cleared, making them even easier to
identify and fix. The second type of error we will be covering is the runtime error.
These errors don't show until you actually run the code, hence the name runtime
error. runtime errors are usually caused by a statement in your code that seems
logically sound, but the computer physically has no way of computing it in a
reasonable amount of time. The most common of these errors is one which we've
already talked about the infinite loop, as a refresher or an example. Think of an infinite
loop like this. Say you set your friend down in front of the TV, put on the office, and told
him he could leave as soon as Michael made it. That's what she said joke. Seems pretty
simple, right? Wrong, because instead of putting in the office, you put in friends on blu
ray. Now, Michael, no inappropriate joke, meaning your friend would be sitting there
for the rest of his life. This is basically what happens with a computer, you give it some
condition that it has to complete before the program can terminate. However, you give
it no feasible way to finish that task. This puts the computer in error mode, and most
likely it will crash your program. As the computer desperately tries to complete the
condition you gave it. As a computer example, if we try to have a program terminate
when integer i is no longer greater than 99. But eyes initially 100 and only ever
increases, the loop will never terminate, and the program will crash. To avoid these,
you generally want to think through the flow of your code before running it, especially
with loops to make sure that all of your statements can be completed by the computer.
Carefully planning out your code before you begin writing is an extremely useful
practice, and something we'll be covering towards the later part of this video. The final
type of error that we'll be covering is a logic error. This error is also pretty self
explanatory. A logic error occurs when the code runs smoothly without any runtime or
syntax errors. But the result that you get just isn't what you want it. For example, let's
say you had a calculator app, and you want it to instruct a program to add two
numbers, except it multiplied them because you use the multiplication symbol on
accident. This leads to the sum being 36 instead of 13. nothing went wrong with the
code syntax or runtime wise, the code runs just fine. It just doesn't work as you had
intended it to. These are often the hardest types of errors to debug. Since most of the
time, you'll have no idea why the code isn't working, and certainly not any idea of how
to fix it. This is why it's a good idea to test your code incrementally. Don't wait until
you've been programming for an hour before testing your application. We're all to run
into a lot of logic errors. Logic errors can be extremely fury ating, and could cost you a
lot of time making them a huge pain. But if you know how to effectively debug your
code, you'll be just fine. Speaking of debugging your code that brings us straight into
our next topic, which is how to debug your program. Now let's say you've written a
program, you think it's ready and you're ready to test. You've been working hard on
this and you're just wanting to see it in action. You run the program and wait for it to
run smoothly and efficiently. Only it doesn't work. you've encountered one of the three
errors we've just mentioned. You really want this code to work but how this is where
debugging comes into play. If the code is giving you an error, the first thing you should
do is read the error. Oftentimes for syntax and runtime errors, the ID will print an
error message out to the console. See what line or lines it points to since those little
lines with the occurred, and see if you can understand and fix what the problem is. If
the error isn't clear, or you've never heard of it, then try googling it as there are many
websites out there. So just Stack Overflow, which service forums to ask an answer
problems with code. Chances are, if you've had a problem, someone else has had the
same issue and there's likely a tested solution. Usually, when the syntax or runtime
error pops up, you should be able to find a fix for it fairly easily. However, as I said
before, the issue may arise from some loophole or oversight in the code you hadn't
planned for beforehand. Maybe you did something as simple as multiply two variables
instead of adding them. These are logic errors we talked about previously, these
problems usually won't have red text show up to explain what went wrong, you'll have
to figure it out yourself. Now, there are a few different strategies that you can use in
order to track down and fix a logic error. First, you could use print statements and the
console in order to determine where the code is going wrong. Imagine you have a
conditional statement that will run one segment of code if an integer x is greater than
five, and it will run another segment of code if not, if in your program. X is supposed to
be greater than five when the program reached this conditional, but for some reason,
the program is still printing out x is small, you can use a wrench they're meant to help.
For this problem. Specifically, you could place the print statement before the branch or
the conditional that would print the value of x. Now when you run the program, you
know exactly what the computer is thinking, printing out the value of x just before the
FL statement. While you know the variable has the value you wanted to have. And if it
doesn't, you know that somewhere above that conditional is something went wrong,
and x was set to a value you didn't want it to. In this case, x is equal to two, which is
why x is small is being printed out. Now that we know what the problem is, we can
track down where and when in the code, we modify x in order to solve it. Use print
statements to determine where your program goes wrong, and then try to track down
the cause of these issues and solve them. If you use this strategy, make sure you end
up deleting the print statements afterwards to avoid clutter in the console. The
situation described above could also be solved using a breakpoint. a breakpoint
pauses your program when the line you placed a breakpoint at is reached. If say you
would like to program to run through a certain conditional and set a variable based on
that conditional. But you are unsure if this actually happens in your code, you can
place a breakpoint inside the conditional path that you expect to run. Upon the
breakpoint being reached, the program will pause and wait for you to continue it
through a button press. This signals that this button occurred where the breakpoint
was placed. In this case, the correct conditional path has been reached by your
program. You can then continue the program knowing that this was or wasn't where
the error in your code occurred. breakpoints can be used in conjunction with print
statements. In order to do both pause the program and perhaps view the values of
your variables at the moment in time to give yourself all of the information you could
want. You can also have multiple breakpoints to help slowly work your way through
your program and determine where an error has occurred. A combination of these two
strategies will help you easily determine where in your code you have incurred a logic
error. Next, let's go over what to do if you think you have tracked down the section of
code that causes the problem. You may think you should delete it, but it's likely you
put it there for a reason. And you don't want to lose all that work if you don't have to.
Firstly, try commenting it out. Comments are used to markup code and explain their
surrounding sections. They can also be used to the bug. Anything that is designated as a
comment will not be read by the program as code and will be skipped over.
Essentially, it becomes something that is only there for you, the programmer to read.
The syntax varies from language to language, but it usually involves placing some
symbols before or around the code you would like to be commented, examples of how
to comment in different languages can be seen on the screen now. Also, when you
comment something, the ID will grayscale that line of code, making it extremely easy
to determine what's commented and what's not commenting code deletes it in the
computer's eyes without actually deleting it. If a problem is present before you
comment a section of code, but it's gone afterwards, then that section of code is the
culprit. If you comment part of the code out and there are still issues and move on to
another section until you find the culprit. Once you do, you can tweak it until it works
as intended or deleted entirely. And you'll have a fully functioning program once again.
Now that we've talked about what to do if you've encountered an error, and a strategy
on how to find and fix it, I'd like to talk about some strategies you can use to avoid
errors in the first place. Firstly, backup your code frequently. In the event of the code
completely bugging out and you being unable to fix it, you will want the ability to
revert to a previous version where the code was still working. If you save frequently
enough, you will probably not lose too much work. Version managers like GitHub or
subversion can help with this as they backup code to an online cloud service, which
you can easily pull previous versions of the program from at any point. Also on top of
saving, running your program frequently to ensure that the current version works as
intended. This accomplishes two things. First of all, it prevents you from saving a
backup that doesn't work second If you encounter a problem, it will be easier to find if
you have only made a small number of changes since the last time you ran it, and it
worked. And thus, you will only have to look through the new code for problems. If
you've spent five hours coding and hadn't run it during that time period, it's going to
be likely that at some point, during that five hour code session, you messed up, and it's
going to be even harder to figure out where you went wrong. errors, while annoying
and extremely frustrating, are a fundamental part of making you a better programmer.
Alright, now that we've covered errors for a bit, let's hop back onto the programming
statement train and talk about one of the most important concepts in computer
science, they'll function. Now, you may not know it, but we've actually been talking
about a few functions, this entire series, print statements for loops. And even the basic
math operations we've talked about are all examples of functions, which of course,
begs the question of what actually defines a function? Well, a function is a segment of
code that can be easily run by calling the function name. And depending on the type of
function will do something in return. functions can be called numerous times and in
numerous places in your code. Essentially, they're like wrapping up a segment of code
into a nice present, and giving it a name, which, when called, will unwrap the present
and go through the code that you had wrapped up. For example, the print statements
we've been using this series allow us to print something to the console anytime we
want. Those are functions, you see, we just call the print function and enter in what we
want to be printed to the console into the parentheses, and the computer does it for
us. Behind the scenes, there's actually even more complex code that is in charge of
taking your text and translating it to the console to be printed. The developers of
almost all programming languages realize that you don't want to program something
that manually has to print something to the console through the use of complex
programming. And so they implemented the print statement to reduce the stress and
complexity of code on the user, abstracting it to the single line of code that is print. All
of that code that is used to print something to the console is wrapped up like a present
and given to us in the form of one line. This is actually the main theme of all functions
and the backbone of any good program. Oftentimes, in your program, there are going
to be sections of code which are repeated and serve the same purpose, or equations,
which you want to allow different inputs of. And so you can use functions in order to
condense these down into singular lines of code to save both time and reduce clutter
on your code. As you will see soon functions are extremely powerful, and will
definitely be something you utilize all the time in your computer science journey. The
print statement is just one example of functions in everyday code. There are 1000s of
functions that are available to you through the IDs. However, because we won't always
use all the functions that are available to you in a single program, you have to import
these functions from packages found in the ID E, which is something that we'll be
covering later on. Now, there are four main types of functions in most programming
languages. And they are separated by two defining features, whether or not they take
in arguments and whether or not they return values. Let's start by separating them by
whether or not they take arguments. But first we have to cover what arguments
actually are. arguments are essentially variables that we pass into the function in
order to be manipulated, and then either returned back to us printed to the console or
used in another operation. Think of functions with arguments like this. If you walked
up to your local Five Guys, and told them that you wanted to get food without
supplying a type of food, they would probably look at you confused. In order to get the
food that you want, you need to tell them exactly what you want to order so that they
can give it to you. In this case, getting food is the function and what you order in terms
of food is being passed in as the argument based on what you tell them or the argument
that you pass into the get food function, they will do something different. You should
also note that the argument can be many different things. It could be fries, burgers,
sodas, really anything on the menu, and such as the case with arguments in
programming. Arguments can be strings, integers, arrays, pretty much anything. As an
example of a function that takes in arguments, let's look at the max function, which
takes in two integers as arguments and returns the maximum number between the
two. Now for this function, if you don't input two numbers or variables for it to
compare, it's going to throw you an error. Just like the five guys employee. He doesn't
know what you want to eat Since you didn't provide him with any arguments. And the
computer doesn't know which two numbers you want it to compare and return Since
you didn't provide it with two integers. arguments are a way for programmers to have
one function that can do many different things depending on whichever variables can
be passed through arguments, add variability to programming and can help diversify
your code. Think of it like this, a restaurant that only allows one type of food to be
made regardless of what you order isn't going to be very useful or diversified but We're
able to pass in arguments and tell them what food we want, our experience can be
heightened and more options can become available to us, which is exactly what
happens when you start using arguments in your function. Now that we've talked
about functions that take in arguments, let's move on to functions which do not,
because functions can also be created and used without taking arguments in and still
be incredibly useful to the programmer. For example, let's say you're making a text
based RPG game, and one of the options you give your player is the ability to view
their stats at various points throughout the game. Now every time you come upon this
option, and they choose the view stats button, you don't have to type out six different
print statements for every statistic they may have, your code would get cluttered and
messy very quickly. Instead, what you could do is you could package the six different
print statements in a simple function called print stats, you don't need to pass in any
arguments into the function, since the function will do the same thing no matter what
the statistics on the player are. Now, every time the user wants to view their stats, you
could simply call the print stats function, and voila, the user stats are printed for them
to view. This allows you to save a lot of time writing code, but also a lot of space, which
is extremely important when your programs begin getting into hundreds and 1000s of
lines of code, and you want to easily search through it to maybe debug. Okay, now that
we've separated functions into those that take arguments and those that do not, let's
again, split these up into those that return values and those that do not. Another thing
you have to understand is that when you're making your own functions, which is
something that we'll be covering very soon, you have to choose what your function
will return, if anything at all, functions are able to return values back to the user,
whether they be in the form of string variables, integer variables, or even arrays. Now,
the thing to note about returning variables is that calling the function alone won't do
anything, you have to return the value into something or print it out. As an example,
the max function we talked about previously would return an integer back to the user.
But in order to do something with it, we would have to either set a new integer
variable equal to the result of that max function. Or we can print out the result of the
function, which in this case, which is print out the maximum value between the two
integers. Using functions which returned values don't do much on their own, you have
to pair it with something in order to gain the use from it. Let's do another example.
Let's say you had created a function which took in two string variables as arguments
and combine that using that fancy string that we talked about earlier, and then return
them as a singular string. This combined string function could then be used to create
new string variables. Since what it returns is basically a string, the variable would
simply be set to whatever is returned from this combined string function. The last type
of function is one that does not return anything. And these are known as void
functions. Oftentimes, these are like the print stack functions that we created earlier.
Simply use to condense large amounts of print statements that appear often in your
code. These cannot be set to variables since they don't return anything, and just get the
code that's within them run through. So there you have it, the four types of functions,
ones that taking arguments and return something, ones that take in arguments and
don't return something. ones that don't take in arguments, but still return values, and
ones that take in arguments and don't return anything. Each of these four types of
functions are useful and unique in their own way. And you will probably find yourself
using each of them through your programming journey. So get used to the different
types of functions and know how to make the most of them, as they are all extremely
powerful. Finally, I'd like to talk about one of the major benefits of functions, which is
that it makes it super useful to make large changes to your code without having to go
through the entire program. Each function call is essentially just a copy of that
functions original code. And so it's very easy to make changes to that initial function,
and have it translate across your entire code. Let's go back to our print stats function
and say that you wanted to go back and add in a new statistic that the player could
level up and through experience in the game. Without functions, you'd have to go back
into your code and find every instance that you'd printed out the user stats and create
another print statement to display the new statistic. However, if you had created a
print stats function like we did just a while ago, all you would need to do is find out
where you define that function and add in a print statement, which displays the new
statistic and you're done. Now every place which you had previously called the print
stats function will now also print the new statistic as well. You can see just how
powerful functions can be if used properly, and we haven't even scratched the surface
yet. Now, up next, we're going to cover how we can import other people's functions
that they've written and use them in our code. Before we get technical, close your eyes
and imagine you're trying to build a house. Sure, you could grow your own trees, chop
down your own wood, make your own tools and nails and build from scratch. But why
do that when you can simply go to your local Home Depot and buy these materials that
others have already made ready for you. That's the main idea behind importing
functions into your code. Importing functions allows you to gain access to libraries of
functions that other people have already made for you. This is just as useful as it
sounds. There are so many functions that are super useful for any given program, that
it will take you forever to write them all yourself. Luckily, other people have already
done most of this for you. In each programming language, you were able to use an
import statement to import libraries of functions into your program that you can use
as you write it. A library is simply a collection of functions that all have the same
theme, and maybe a math library, a data analysis library, a library that was translated
text, or anything you can think of really, there's such a variety of libraries for any given
language that most functions you require that are not hyper specific to your program
can likely be found at some library. In fact, a good portion of any programmers job is
looking online for packages, which can make his or her job easier, instead of hand
writing functions. Now I can hear you saying, Wow, that's sick. How do I do it? Well, it's
quite simple, an import statement. In most languages, an import statement consists of
three parts. The library you would like to import from the package you would like to
import from that library, and then which class from that package you would like to
use. For example, we can load up the Java library. And from there import the util
package, short for utilities. And then from that utilities package, import the scanner
class, a class which allows us to read information from the user. A package is simply a
smaller set of functions and methods to help differentiate between the 1000s of
methods contained in a library, and a class is even more specialized than that. Now, if
you don't know what specific classes you're going to want to pull methods from, you
can use a start import all classes within the package you'd like. However, it can be
beneficial to be more specific, and only import the classes you would like, as it helps
with the efficiency of the program in the long run. For instance, in Python, the syntax
to import a library is import followed by the library name. However, importing an
entire library is more computationally taxing than importing specific functions from a
library. Imagine you would only be using the factorial function from the Python math
library, it would be a waste of computing power to import the entire library, and it
would increase the load time for your program. For smaller programs, this isn't a big
deal. But it really starts to add up when dealing with larger projects. Therefore, you
would instead use from math import factorial, or the Java equivalent import java dot
math dot factorial, and now have access to that one math command only. This limits
the functions that you can use. However, it saves programming runtime, if you decide
you want to use another function that you hadn't planned for, you can always go back
and import that too. Many times. If you try to use a function from a common package,
and you have not yet imported, the ID, he will prompt you to do so if you're trying to
figure out which libraries you want to import, think of the functions you're going to
need in your program, perform a simple Google search. And you will probably run into
a package or library that already exists in your ID that you can use. And if you can't,
there are ways to download and import additional projects to fit your needs. But what
if, after all that you still can't find a library that contains the function you're looking
for? Well, that's a perfect segue into what we're going to talk about next, which is the
basic structure for writing your own functions. So at this point, we've talked about
both what functions are and how we can get some very useful functions by importing
them through packages. But there are definitely going to be moments in your
programming career where you're going to want to make your own functions because
you want one to be made specifically to your program in code. Luckily, making your
own functions is extremely simple. There are just some basic rules that I want to
cover. Now we've previously used making functions as an example. For other topics
such as the Player Stats function from a little bit ago, they were extremely abstract and
didn't go into depth into what is needed for an actual function to operate. So right now,
we're going to be covering a skeletal system of everything that needs to be included in
a function in order to get it to work. Now think back to the four different types of
functions that we talked about previously, functions that do and don't return values
and functions that both do and don't take in arguments. For creating your own
functions. We're just going to have to go down the list and talk about how to approach
creating each one of them. Starting with the most basic of the bunch, one which takes
in no arguments and returns no values. Before we start that there are a few small
things I want to note about function naming conventions, the variable naming
conventions we talked about previously. also translate over to function names. So you
can't have two word functions, and you can't use special characters like periods or
commas. Generally, you're going to want to follow the same camel case style, which we
talked about in the variables video, which is not capitalizing the first word, but
capitalizing each word after that. Alright, so in general, for making functions, each
language differentiates on how you tell the computer, that it's actually a function. In
Java, you have to define the function scope, which is something you don't really need
to know unless you're going to become more invested in Java. But basically, it tells the
computer which parts of the code can use the function in which type can, for this
series, all of our functions that we make are going to be public. From there, you then
determine which type of function it is. So in this case, since it won't be returning any
variables, we'll just put void to signify this type of function will not be returning
anything. Finally, you put the function name after those two identifiers, along with a
set of parentheses after it like so, the parentheses are where your arguments would go,
if you were making a function that took in arguments. But since for our first type of
function, we're not incorporating arguments into this function, let's just leave those
blank. All of that is just for Java, Python, on the other hand, all you have to do is put the
word def, short for define, and then the function name with a set of parentheses. So as
you can see, each language is going to be a little bit different in how you make
functions. But the main thing we want to remember is to always add parentheses. From
there, we just have what we want our void function to do within the confines of the
function and close it off, and we're done. In Java, the confines of the loop would be
whatever is contained within the curly braces. And in Python, it would be until you are
no longer indented. At its core, this is the most primitive type of function, we've made.
Something which takes in no arguments and returns no values, quite similar to the
print stats function from early on. Moving on to the next type of function, creating a
void function that takes in arguments. Now this process is going to seem very similar
to the previous except for one small adjustment. Remember the parentheses that I
mentioned earlier? Well, we put any variables, we want the user to pass into the
function into these parentheses. And then when we call that specific function, it will be
required to have those variables passed into it. For example, in Java, let's make a
function that takes in two numbers and prints out the product of those numbers. We
start with the public void plus name of function setup again, since we won't be
returning any values, and here comes a new part. Inside the parentheses, you define
which type of variables you would like to pass in as arguments, in this case, an integer
and then a name for that variable. This name is what you will use to refer to the integer
that the user passes in. For example, let's just call it num one. Then if we want to add
another argument, we simply add a comma in between the two and we can make
another integer variable num two to hold the second number. We can do this for
however many variables we want to pass into the function. But for now, let's close off
the parentheses and just print out the product of num one and number two, as you can
see, we refer to the two numbers that the user will input into the function has num one
and m two, whatever numbers that the user passes into the function will be converted
into num one and m two. Now, whenever we want to call the multiply numbers
function, we just have to make sure that we are putting two numbers in as arguments.
In this case, the number five becomes num one and the number eight becomes num
two. From there, we simply run the code and the number 40 is printed to the console.
It's pretty important to note that you can also mix and match variables when making
arguments. So you can have some function which takes in a car, an integer, and two
strings all within one function. The last thing I want to mention about arguments is
that when you call a function, you have to follow the variables you defined when
making the function. So for our multiply numbers function, you couldn't put in a string
and then an int, it has to be two integers, because that's what the computer is
expecting to be passed into the function. So now that we've gone over how to make
functions that don't return variables, we have to cover those that do. And we'll start
with ones that don't take in arguments. Now the main difference between defining
functions that return variables and defining ones that do not is that in some cases, you
have to specify that you want this function to return an integer variable. This is most
common in Java, where you would replace void with int to tell the computer that you
want this function to give you something back to you in the form of an integer. This
works the same as if you wanted to return a string care or even in an array. You simply
replace the word after public with whatever variable you want to be returned by that
function. The most important thing to remember about making functions that return
variables is that no matter what path your code takes, it must return a variable no
matter What? What does this mean? Well, let's say you had some string function in a
game. And inside of it, there was an if statement where if the player score was above
10, you returned a congratulatory message. This works fine if you printed the result of
this function, and the player score is above 10. But if the player score was less than 10,
then you don't enter the if statement, and then you don't have something prepared to
be returned to the user. And so the function is going to throw you an error, you have to
have all your paths covered, which may seem simple. But if you're making a function
with a switch statement in it containing high amounts of cases, then this can get out of
hand very quickly. Something I like to do to make sure this doesn't happen is put a
return statement at the bottom of a function with a string or an integer so unique that
I'm able to tell that the code is not running properly and can fix it. Also, usually, an ID
will let you know if there's a path in your code or in a function that does not return a
variable when it should. The main point I'm trying to get across however, is always
cover your exits and make sure you have a return statement prepared for any case the
user may throw at you. Another small thing to note is that you can't return one type of
variable if you've already defined the function to return another type. For example,
you can't return a string and an integer function or vice versa. The return statement
must always match the type of function no matter what the final type of function is one
that returns variables and also takes in arguments. And for these, all you need to do is
combine what we've learned from the previous cases. First, you assign your
arguments in between the parentheses making sure that you've also defined what type
of variable you want to return, and then ensure that no matter what path the code
takes, that you're always returning that variable type. That concludes our discussion
on functions. As you can probably tell, functions are an extremely vast subject area,
and require a little bit of practice to fully understand, which is why later on in this
series will recommend some websites you can use to practice those more difficult
topics. Now, I'd like to switch gears a little bit and continue our discussion from earlier
on arrays. arrays, while useful aren't the only way to store and manipulate
information. In fact, there are a multitude of different ways to store data in computer
science, including linked lists, stacks, queues, maps, trees, and many others to right
now though, I'd like to talk about two cool, wacky and zany ways to store data that we
haven't previously covered, array lists and dictionaries. But before we get into those,
let's get a little review and reinforcement of arrays. As you may remember, arrays are
basically lists of values that are stored together. When you initialize an array, you give
it a size and this size is fixed, you won't be able to increase the size of the array. So
when you make an array of length is final. To access the values in an array, you
reference them using an index for starts at zero. What this means is that the first item
of an array is not at position one, it is that position zero. And its position is commonly
referred to as its index location. So to find the nth item in an array, you would refer to
it as index location n minus one. However, as the size of an array is fixed, you have to be
careful to not reference a position that's beyond the total size of the array, or to
append too many items to it. As this will return an error. We also have what are
known as two dimensional arrays, which is an array containing an array and each of
its indexes. Or you could have an array containing arrays containing arrays containing
arrays containing arrays, depending on what you're trying to do. multi dimensional
arrays can be useful in more advanced programs for organizing a wide volume of
related values. If that's confusing at all, just get back to earlier for our full discussion
on arrays, the timestamps will be in the description. Now that we've reviewed arrays,
let's go over array lists. Array lists are just lists in Python can be thought of as a
growing array. Earlier, we mentioned how you have to be careful to set an appropriate
size of your array, and to make sure that you only referenced in the pin values such
that you remain within the size. However, with array lists, this isn't a problem. After
you initialize an array list instinctively has a size of 10. What if you append values,
such that the size of the array list goes beyond 10 elements, an array list will grow
itself, meaning that the computer will allocate more memory to the array to increase
its total size so that the new values can be appended. This is quite useful when you
don't know the exact number of values that the array will need to store. Or you want
the ability to store more values to your heart's content. such as when you're making a
database with an unknown amount of users that will sign up. There's a lot more to
uncover when regarding array lists. But for this surface level series, that is all you
pretty much need to know. So let's move on to dictionaries. Now when we're talking
about dictionaries, we're not referencing that thick book you probably have lying
around your house, which has 1000s of definitions. In computer science. dictionaries
are like arrays in that they store multiple values. Use, however, their values are stored
very differently. Rather than being referenced by their linear position within the
dictionary, each value is tied to another value that is used to reference it, or its key.
Because of this, we need to throw away all conceptions of dictionaries as a linear way
of looking at data. Since in actuality, it is much more fluid and entertaining. Basically,
we say that each position in a dictionary holds a key value pair. When referencing a
value in a dictionary, you will use its unique key, and the dictionary will tell you the
value that it is tied to think of it like this. Each time when item to your dictionary, your
computer creates the handcrafted box to store the data. And also a custom makes a
jewel key one of a kind, no other like in the world. This way, there's only one key that
goes to the box that stores a certain bit of information. Because each key must be
unique, we're using the key in a dictionary, it will result in an error being thrown.
Because having two keys that are exactly the same will confuse the computer as to
what box or piece of information that key leads to. However, you can store the same
value in multiple key value pairs since the keys would all be different. Now, like I said,
dictionaries are more fluid, making them easier to organize and then arrays as
everything is set up in a more logical manner. That is to say, it is easier to find the
value you are looking for when you're using keys, rather than simply referencing their
positions. Let me explain what I mean. Imagine you have a dictionary of prices at a
store where the key is the name of the product, and the value is the price of the item.
Maybe apples cost $1 milk costs $2 and bread costs $3. You can see the in the
dictionary, each key is the name of a product, and each value corresponds to the price
of each product. So to find the price of bread, all you need to do is simply call the
dictionary using the key bread. This makes it extremely easy to track values through
your code. Since you're working with tangible values rather than numbers which don't
mean anything to you. You can also manipulate dictionaries and money the same way
as you can manipulate arrays and array lists. You can iterate through a dictionary and
perform many operations and comparisons on the values. If you want to find the
product with the highest price for example, you can iterate through the dictionary to
find the value that is highest amongst the grocery store items. arrays, array lists and
dictionaries are useful in their own right, as are the mass amounts of other ways to
store data, and each boasts certain advantages over one another. We already covered
the basics of these three. But since there are so many, we don't have time to go in
depth into each and every one of them. And so in order to help you grasp the basics of
storing information, we're now going to talk about one of the most important
functions needed to understand arrays, which are searching algorithms. Now just as
there are many ways to store information in computer science, there are even more
ways of searching through lists. Searching algorithms at their core are ways in which
we can look through a list of values stored in an array, say a patient name list or a high
score list and find a particular piece of data. The goal of a searching algorithm is
simply to give the algorithm a string or object you want it to find and have it return the
index of the array that contains that string or object as fast as possible. Now while this
may seem simple, lots of software runs on the backbone of being able to search
through lists extremely quickly, making searching algorithms and in particular,
efficient searching algorithms an important topic to cover. Additionally, this is the
main functionality that arrays are used for. And it's the backbone of many of the
methods used within ArrayList as well as many other storage methods. So knowing
them will take you a very long way. Typically, searching algorithms are used to return
the index of a particular data points so that it can be used, modified or updated or
checked on. For example, if you're about to check into a hospital run on an array
system for patients, the staff must search through your name in the database. And by
returning the index of where your name is, they now have a quantifiable number that
they can use to easily check you in, rent out prescriptions schedule you for checkups,
update your personal information, etc. Without having to search through the list for
your name every single time. You may think that there's little difference between
searching algorithms since computers nowadays can perform millions of calculations
per second. But when you're a huge multi billion dollar corporation trying to find a
certain data point in a list containing 1000s, or even millions of data points, small
differences in efficiency are going to make or break the user experience. Even a 1%
improvement in efficiency can mean a big differences in the amount of time that a user
is waiting for a simple task. Now before we jump into different types of searching
algorithms, we must discern between the two states that a razor list can be in either
sorted or unsorted. A sorted list of information is characterized by some sort of rankl
value, whether that be a patient ID, credit card number, or even by alphabetical values
like usernames or legal names. An unsorted list is just some random assortment of
related information not sorted by any particular order or reason. Some searching
algorithms only work for sorted lists, usually the more efficient ones, and some work
for both sorted and unsorted lists. Although these are usually less efficient if you end
up pursuing computer science further, you'll have to deal with both sorted and
unsorted lists. So it's good to know a common searching practice for both. Another
thing to note is that we determine the efficiency of searching algorithms, based on both
the worst case scenario and the average number of items that must search in order to
find the index. We call this big O notation in which each searching algorithm has an
equation which takes in the size of the array as an integer and, and will output a worst
case scenario efficiency value that we can use to compare with other searching
algorithms. We can then also look at how long on average it takes to find an element in
a list. Using these two methods allows us to easily compare how efficient two
algorithms are. Alright, now that we've got some background on searching algorithms,
let's hop right into it. The first type of search we'll be talking about is called a linear
search. And Eve honestly probably uses multiple times throughout your life. Every
time you have to search for your name on a list of people, you probably follow the
same pattern, you start at the top check to see if the first name on the list is yours. If it
is great. If not, you move on to the next name on the list until either you find your
name or you don't in which case you leave. A linear search works in the same way, you
start with the first element in the list compared to the value that you're trying to find.
And if they're the same, you found your match and you return the index of that
element. And if not, you move on to the next element in the list until you either find the
thing you're searching for, or you run out of lists to check. Pretty simple, right? This is
because linear searches are pretty bad when it comes to efficiency, especially in the
worst case scenario. If the item you're searching for in the list is the last element,
you're going to have to check the entire list of items before you find the one you're
searching for. On average, however, you're going to get it about halfway through the
list. This makes the linear search oven worst case scenario since in the worst possible
case, it will take the entire length of the array or n to find the correct value. But linear
search on average will return the correct index in O of n divided by two. We're halfway
through the list. Now while the linear search is in great, it can work with both sorted
and unsorted lists, because of the fact that it will eventually cover every element in the
list. The other search we're going to cover requires the list to be sorted, which may
seem like a drawback, but having a sorted list allows you to use algorithms that are far
more efficient than the linear search. So overall, the linear search is a good basic
searching algorithm for if you have an unsorted list. But if your list is sorted, there are
way more efficient options out there for you, such as the binary search, which we'll be
talking about now. The binary search uses a recursive process to break the data in your
list down into more and more manageable bites. Taking advantage of the fact that it's
sorted in order to find the item you're looking for faster. This one is much harder to
wrap your head around. So let's start with an example. Let's say you have a list of 10
names sorted alphabetically, like shown on the screen now, and you want it to find your
name within that list. in binary search, you would look for the middle most name, in
this case, the one at the fourth index. Just a quick aside, since there is no true middle
since the list is 10 names long, the computer automatically uses the next one down as
the middle value. Now, once you find your middle value, you first check to see if the
name you're searching for at the index you've chosen is the name that you're looking
for. If it is you simply return that index. But 99% of the time it's not going to be
including right now. So let's keep going. If the value at the middle name is not equal to
the one you're searching for, you check to see if the value you're searching for comes
before or after the middle index. For example, if you were looking for the name
Brandon, and the value at the middle index was Carl, Brandon obviously comes before
Carl alphabetically. And since we know that the list is sorted, what we can now do is
ignore the entire bottom half of the list and just focus on the top. Since we know that if
Brendon is even in the list, it's going to be in that top half. Now we simply treat the top
half of the list as an entirely new entity and repeat the process over again. Again, we
would find the middle most element of this new list of names and again compared to
the name you're trying to find. If it's the name we're trying to find we return that
index, but if not, we compare it to see if it comes before or after the middle index. Going
back to our example. Let's say the middle index of this new list is AJ. Now we know
that Brennan comes after AJ alphabetically. So what we can now do is ignore the top
half of the list. Since we know that if Brennan is in the list, it's not going to be in the top
half of our list. Now we again repeat this process again and again until we find the
name we are looking for. So if For example, the middle index is time is Brenden. And
that's what we're searching for. So finally, we would return the index to in binary
search. Eventually, the index we were compared to our search term will be the same.
And once it is we can return the index and move on. Now if we don't find it, which
happens after we have eliminated the entirety of the list without finding our search
term, the algorithm will simply return a null value to let you know that the item you're
searching for cannot be found in the list. The binary search is way faster and more
efficient than a linear search. Since we are drastically cutting down the amount of
elements, we have to look at making the program run faster. In almost 99.9% of cases,
in which your list is sorted, the binary search it's going to return a result faster than
the linear search. So if you have a sorted list, your best option is to go for binary. As for
efficiency, the binary search is O log n for the worst case scenario, which could be
confusing if you don't fully understand logarithms. But all you need to know is that it is
way more efficient than the linear search. Its average scenario is actually also o log n
as well, which again, is infinitely times more efficient than linear cases. Now while
there are other types of searching algorithms you can use, these two are the most
common for both unsorted and sorted lists. So we will stop there for now. Up next,
we're going to be covering one of the most confusing and important topics in
computer science recursion. Let's start with the most important question, what exactly
does recursion mean? in programming recursion refers to functions that repeatedly
call themselves meaning that any instructions that occur within a function, one of the
instructions will be a call to that same function you're already in. In the extremely
primitive example, on your screen. Now, you can see we have some function which, in
the confines of itself, calls itself, a recursive function will usually take into account
some integer as an argument. And we'll use this to carry out some instructions,
modifying the integer that was entered before calling itself again with a new integer as
its argument. To better understand these functions, let's discuss the basics of how we
go about programming one of them. A really good and easy example of a recursive
function is one which sums up all numbers from one to n. So let's make a recursive
function that does just that. The first thing we need is the actual function. And we're
going to make it an integer function, which takes an integer and as its argument, the
reason we do this will be explained later. But for now, let's move on to the base case. A
base case is simply a definite value, which all recursive statements are the ones that
are being repeatedly called as we go through the function tried to get towards at the
beginning of the function, we test the value that was passed in by the argument against
the base case to see if it is satisfied. Usually, these base cases are some requirements
like of n as I described before, which has a certain value or is equal to a certain value, it
is extremely important that the base case is set to some requirement that and will
eventually meet for the same reason that it is important to avoid an infinite loop. We
do not want a Stack Overflow error to occur. For example, if our base case, what's the
stop calling the recursive function when n was greater than 100. And if it is not, we
will call the same function again. But with n minus one. And we started with ns, say 99,
we would never reach the base case and the recursive functional or purely call itself
over and over again, subtracting one from n and hoping that somehow it will eventually
be greater than 100 until your computer crashes. Not fun. So anyways, back to our
recursive some example, let's make our base case when n is less than or equal to one.
This way when you start at some positive integer and and subtract from it until it is
less than or equal to one, in which case we can exit the recursive statement. Cool. Now,
if n is not less than or equal to one, what we want to do is return the sum of both n and
then the returning value of our recursive sum method minus one. Why do we add and
the function call? Well, let's actually go through the function as if we were at the
computer and see why we start with a call of recursive sum with n equals three, we
know that three is not less than or equal to one. So now we tried to return a recursive
sum of n, which is three and the returning value of recursive sum within n of two. We
don't know what the returning value of recursive sum with an N of two is. So we have
to go through the function again, only this time and is two again, and is not less than or
equal to one. And so this function will go through the lF statement and return to plus
another recursive statement, in this case, the returning value of recursive sum with an
N of one. So once again, we have to go through the recursive sum function to get that
value that will be added to two and then returned and added to three And then
returned, hang in there, we're close now in this function, and is less than or equal to
one, and so we return n, which is one. Now we take that n, which again is one, and that
is what gets added to to the previous function call, and then return. So this would
return three. Now, this three is what gets added to the first function call, which is three,
and so it becomes three plus three, which is six. And finally, after all that time, we get
six return from the function, which if you've been following along at home, three plus
two plus one is indeed six. Now this may seem like a waste of time, since three plus
two plus one is not a hard operation. But those of you saying that I asked you to please
give me a sum of all the numbers from one to 3567. Godspeed. Now recursion is a very
difficult concept to wrap your head around. So if you're not 100% comfortable with it
at the moment, feel free to rewatch this section of the video in order to better
familiarize yourself with it. Alright, cool. Now that we have a little background on
recursion, let's talk about why it works so well. Now to understand why and how
recursion works, we must first understand what a stack is. A stack is a data structure
that contains all of the tasks you instruct your program to complete. Based on a certain
method, your program will then carry out the tasks you give it is called a stack.
Because if we start another process before the previous one completes, the process is
stacked on top of the other one, such as the animation on your screen is showing now,
programs we write will follow the LIFO structure. For those unfamiliar with
accounting LIFO means lastin. First out, or the last item put on the stack will be the
first one removed from it. Essentially, every time you ask your computer to complete a
task, that task is added to the stack, and will be the first one to be resolved. Think of it
like a stack of stones, you can keep adding stones on top of your pile. But in order to
get to the one at the bottom, you must first remove all the rocks on top of it. Now when
your functions continually cause itself without end, without a base case, like in our
infinite loop example, then this stack will never be resolved, as items will be
continually added to the stack without any of them ever been completed. In this case,
the memory allocated to the stack exceeds the maximum allowed and a Stack Overflow
error occurs resulting in your program crashing. Think of this as if you're doing
chores. And before you complete one chore, you get called to do another chore. And
then before you can complete that one, you get called to do another one. Since you
keep stacking tasks, or shores on top of one another, the stack of tasks will never be
completed. And you will probably die before ever finishing all of your chores. This is
the same logic that makes infinite loops crash your program. recursion works on these
same principles. The initial call makes a second call, which is added to the stack. And
now that one must be taken care of first. But in that one, another function is called
which gets added to the stack, and so on until you reach the base case and what you
slowly start going back down the stack. In conclusion, recursion in general is
extremely useful, because by calling the same functions repeatedly, it breaks down the
problem into smaller sections, and results in the program being more efficient. small
parts of problems are easier to solve and less taxing to compute than the entire
problem at once. And the computer can combine these small solutions into the whole
solution at the end. Now as we wind down our introduction to programming series, we
want to take some time and go over some of the soft skills needed to be successful
computer scientists. Since it's not all about writing code. In fact, many professional
computer scientists will tell you that the majority of their job is spent thinking about
code rather than actually writing it. This is because much of programming boils down
to problem solving. How do we optimize the system? How can we make this feature for
our app? What type of movement Do we want for our game? And how can we program
it? The harsh truth is that no good program has ever been written simply from the
programmer, getting the prompter idea, sitting down, hopping on an ID and starting to
write code. There are many tasks we should go through beforehand in order to plan
out our code. So we ensure that when the time comes to program, it's a clean and easy
process and not riddled with mistakes and bugs. This is where pseudocode comes into
play. Think of pseudocode like this, if you wanted to take a family trip to the Grand
Canyon, would you simply hop in your car and drive off and figure out things later? No,
because that would be ridiculous. Instead, you would spend some time planning out
the trip. What sites or places do you want to visit? What hotel reservations are you
going to have to make? What kinds of things are you going to do when you get there?
What routes or highways are you going to take and why? All of these things must be
determined before you can even think about hopping in your Ford Explorer. So how
does this translate to pseudocode? Well think of our family trip to the Grand Canyon as
a program, programmers use pseudocode pseudo meaning not real, and code, meaning
code as a means to plan out their programs before they write them. Just like how we
planned out our trip before going. They throw away syntax and naming conventions
for variables and just focus on what they want the program to accomplish, and how
they plan on doing that. pseudocode is very similar to constructing an outline for a
paper that you're writing, you write down the main topics of the essay, and plan out
your major talking points. But you don't worry about the nitty gritty details of it all,
such as word choice, grammar, conventions, and proper formatting. By doing this, we
allow ourselves to think freely and not worry about stressing the small stuff, at least
not yet. Alright, now that we know what pseudocode is, let's talk about how we write
pseudocode. You see, the best part about pseudocode is that it can take the form of
many different things for many different people. Each computer scientist has their
own methodology for planning out their code. And there are probably hundreds of
different methods of writing pseudocode that are out there today. Today, however, I'd
like to focus on three popular ones that I think you might find to be extremely useful.
The first of these is known as flowcharts. And mainly they can be used to think
through the process of a particular function. a flowchart is fundamentally a graphical
representation of a function and how it might flow. Many programmers do this and lay
out the conditional statements and loops that they want as different blocks in the flow
chart connected by arrows and charting out every path of their function. From there,
it's extremely easy to create test cases and follow them through the flow of the
function through the different blocks and arrows. For example, we could have a flow
chart that goes something like this, a user enters in a number, and if the number is
eight, I want the program to return true. However, if the number is not eight, then I
want it to return false. It's a great way to visualize what the functions overall purpose
is, and also look for any errors that you may have missed when thinking about the
function, such as a missing path. It also abstracts the programming statements up to
simple blocks, making it easier to modify or change completely. The best part is that
when you have finished testing cases, you can simply convert the blocks into
programming statements, and you have a well written function without any debugging.
Another popular pseudocode technique that is often used is to simply write out what
you want your code to do chronologically. don't necessarily think about what
programming statements and functions you want to use. just jot down from start to
finish what it is the program you're writing is going to do step by step. For example,
let's say you're making an app that takes in two numbers and divides them. The
pseudocode for that would look a little something like this. First, I want to prompt the
user to enter a number. And then I want to wait for the user to enter in that first
number. After I get the first number, I want to again prompt the user to input a second
number. Once they do, I complete the operation by defining the two numbers entered
and returning the result back to the user. This all seems like it would be common
sense. But remember that oftentimes, we're not going to be working with simple
multiplication or division functions. We may be working with full scale games,
algorithms or user interfaces with many different options. This method allows you the
programmer to not get bogged down with the syntax and conventions that you have to
follow, you're simply making a note of what the program's ultimate goal should be, as
if you were explaining it to a friend of yours. This method really lets you plan out
everything that needs to happen in your program in order for it to run smoothly. It
also ensures you don't forget about a piece of an algorithm or a certain function that
you need to write in afterwards. And the final pseudocode strategy that I'd like to talk
about to you today is writing out the main features you want the user to have when
using your program, and what functions or smaller programs, you're going to need to
complete these features. Let's do another example. Say you're making a banking
interface. And on startup, you want the user to initially have two options, they can set
up a new account, or log into an existing account. From there, if they log into their
account, then you want them to have the functionality to withdraw money, deposit
money, take out a loan or pay back a loan. If they decide to set up a new account, you
want them to be able to create an account, store their information in a database, and
then access all of the features that are returning member would have. This may look
very similar to the flow chart method. The only difference being that this is abstracted
one level higher over an entire program, rather than just a single function. If you really
wanted to, you could also create a flowchart that would go through the functionality of
all the four methods described above. Setting up a hierarchy like seeing on your screen
now makes it easy and clear to see every function interface you're going to have to
make. This prevents you from having to try to shoehorn a function or feature into an
already finished program at the last second, which is not a very fun experience in the
slightest. So There you have it three pseudocode strategies you can use to plan out
your code before you even start writing any the flowchart method, which is good for
thinking through the flow of a certain function. The write up method, which is good for
getting the general idea down for a program, or the functionality planning method,
good for listing out the functions of a certain programs, you can use all of them, none
of them are a mixture of them, or even disregard these and find and create your own
pseudocode methods. The main goal here is to drastically minimize the amount of
errors that occurred during your program and relieve a lot of stress on your head. The
importance of pseudocode cannot be stressed enough. And if you don't believe me, I
urge you to try to complete a large project without it. Okay, so if you've watched the
series up until this point, you've gotten a pretty good understanding of many aspects of
programming, and also how to plan out your programs. Now it's time to go out into the
real world and write some actual code. But what kind of program I can hear you asking
me? And the answer is truly whatever you want, really, as I'm sure you know, by now,
you can program just about anything you have on your mind. Anything from simple
games to complex software. This video has equipped you with the basics that are going
to need to be used in pretty much any program you decide to write. But that doesn't
mean that every programming language is perfect for every application. Each language
has its own strengths and weaknesses. and choosing the right one is very important
for making it easier, and sometimes just even possible for you to program what you
want. So that's what we're going to be talking about now, choosing the best language
for what you want to accomplish. Now, we talked earlier about low level versus high
level programming languages. In case you forgot, let's do a quick refresher. higher
level programming languages have a higher level of abstraction from machine
language, that series of zeros and ones from way back when, while lower level
programming languages have a low level of abstraction for machine language. For
example, block program where you can drag and drop programming statements
together like 2d Legos would be a high level language, as it does not take a high level of
understanding of the inner workings of a computer to programming. The theoretical
highest level of a programming language would be if I could just write down what I
wanted the computer to do in Simple English, and it would just work. But sadly, that
doesn't exist yet. On the other side of the spectrum, the lowest level programming
language would be just feeding zeros and ones into the computer at supersonic speed,
which would be almost impossible and extremely absurd. So how do you choose what
type of language is best for your needs? Well, it depends on what you are trying to do,
as sometimes you need very specialized languages to get done what you want. The
world of computer science is vast and contains many fields. So trying to cover
everything in one language would be impossible. This has led to the creation of
hundreds of different programming languages, each designed for a specific task. Right
now though, we'll cover some of the most popular languages and their uses. Now, if
you are trying to design a website, using HTML and CSS is probably your best bet.
HTML is a markup language that is designed for writing the content of a website. While
CSS is great for designing the style of the website. you interact with HTML every day.
And you can even see it right now. If you right click and hit Inspect Element. This will
truly show you how complex HTML and CSS can be. Maybe it would be best for you to
use a scripting language. A scripting language is a language that has many commands
for you to use. And that can also be run without needing to be compiled. Scripts can be
faster to write in most programs, and tend to be easier to port between operating
systems allowing for cross platform support. Scripts can also be used with websites,
oftentimes adding to the overall user experience of the site. If you want to go into web
design, this might also be a path for you to go down. Examples of scripting languages
are Perl, PHP, Ajax, and JavaScript. For most programs, you could probably use a
general purpose language. General Purpose languages, as they sound have a wide
range of applications. Usually, these should be your go to languages. Examples of
general purpose languages are Java, c++, and Python. They each have their own
different benefits over one another. Java is very useful for developing games and
interactive web pages. Python can act as a scripting language for web programming, as
well as writing applications and data analysis. And c++ tends to be used for writing
applications and system programs. They all have a variety of packages that you can
import and use to achieve the functionality you need from them. while selecting the
right general purpose language for your big projects is very important. For most of
your programs, any one of them will work. It really comes down to preference. Get to
know each language and decide which ones syntax rules you like best and find most
comfortable. If you get to know one general purpose language really well and enjoy
programming with it, you can apply it to just about any of the programs you plan on
writing. Personally, I tend to use Python for most of my projects. This is mostly not
due to any functional difference between Python and any other general purpose
language, though there are a few, but it is mainly because I find it syntax rules most
convenient and easiest to write programs with. Overall, either you can consider the
product you plan on doing and research and see which language boasts the most
advantages for your purposes. Or you can simply become comfortable with a language
and use it for most of the programs you decide to write. will now be looking at our
final topic of this introduction to programming miniseries, you now have the basic
knowledge of programming, which will take you far in any language that you decide to
learn, you know, some good pre programming pseudocode strategies to help you
design your code from the ground up. And you might already have a good idea as to
the type of programming language you might want to start with. So what's the next
step? How can I learn that language? And what applications can it be used for? Well,
that's what we're going to be covering now. So let's just jump right into it. Starting
with the biggest question, which is what is the next step? Well, now that you might
know which type of language you might be interested in, research that language and
find out whether or not you truly want to pursue that programming language. Most
languages like Python or c++ will have either an official website where you can read
up on the language, or Wikipedia page, which will provide you with useful information
in deciding whether or not you want to pursue that path. From there, the next step is
to actually learn the language, which can be done right here on YouTube. While we've
taught you the basics of any programming language, each specific language is going to
expand upon these concepts. And so watching tutorial videos on a certain language is
going to be very beneficial. I would start with an introduction series, like the one
you're currently watching both for the language you've chosen and work your way
through that series, picking up on the syntax and rules of that language until you
become comfortable with it. Once you do that, you come to a crossroads. You know how
to program in a certain language, but you may be completely clueless as to what to
make in that language. Programmers blog can leave you uninspired and not want to
continue programming. So I'd like to give you a few websites to help out. First is
coding bat, a completely free website which has hundreds of coding challenges in both
Java and Python to help you refine your programming skills, and even learn some new
programming shortcuts and tips. This is great if you want to get better at improving
your efficiency and need something to hone your skills as a developer. The next is
coder bite, which offers over 200 plus challenges that you can complete in over 10
different languages, something that is sure to help you improve. The final website I'd
like to talk about is hacker rank, which not only provides programming challenges to
keep you on your toes, but also provides support for you using your programming
skills to find jobs or internships. These and many more websites exists solely to keep
you interested in code and work on refining your skills to become better. Now if you're
a teenager watching this series in high school, I also encourage you to take
programming classes in your high school. AP Computer science principles and AP
Computer Science a are both amazing courses which can help you greatly in the future,
and are also incredibly informative and important to colleges. Your school might also
offer other classes in the field of computer science, including ones on key data
structures, game design, and data science. Any and all classes you can take to help
expand your knowledge of programming and help you find your niche is going to be
extremely helpful. As you can see, the world of code has now been opened up to you.
These are just a few examples of where you can go from here. But there are many
more we didn't talk about. You could get into GitHub and start contributing to projects.
You could work on your own projects and collaborate with others. The possibilities
are endless. The next step is up to you. This concludes our introduction to
programming mini series. We hope you enjoyed watching it as much as we enjoyed
making it. If you enjoyed the series as a whole consider subscribing to our channel, no
pointer exception, which will be linked in the description for more content like this
coming soon. Thank you so much for watching.

You might also like