Dave Schoeffler's Spring 2012 Opus
My last semester at CCC
Hey all. My name is Dave Schoeffler but most people call me by my nickname Sheffy. I am a Computer Science major at Corning Community College. This is my 6th and final here at semester at CCC. Once I graduate I will either be transferring to Rochester Institute of Technology or SUNY at Binghamton in the fall. My plan is to get a Bachelors in Computer Science with a Minor in Math and possibly go on to get a Master's in Computer Science, but we will see how long I can put up with school :).
I've enjoyed my experience at Corning so far, mainly because of my awesome teachers. Last semester I took Data Structures and I really enjoyed learning about different methods of storing data. I look forward to using that knowledge to be a better programmer. I currently have my own lawn mowing business to pay the bills but I can't wait to be able to get some computer based job. I am not sure what job field I would like to get into yet but I know I wanna work with computers.
I'm excited to have Joe and Matt team teaching this course cause I think we all will be able to learn alot.
Well let me summarize what we have done so far in class. Our big project this semester is a cpu simulator. We have started this out by building the basic logic gates that everything else will be built on. Yesterday we were introduced to flipflops. Flipflops are these crazy things that I have no idea how they work. I am currently trying to get some understanding of them so I can move on to registers. I am excited even now to see how everything we are doing is building on itself.
Today I worked on my first keyword for my opus. As I was thinking, I realized this would be my last first keyword. As I held back the tears I started to define me some logic gates which was pretty fun. I'm still pretty excited about this whole cpu simulator thing. I've been reading more in my book about how we are going to be building everything. Peace out yo!
I'm back dating this entry since I forgot to do it on Friday.
Today in Computer Organization we all discussed a Turing machine. A Turing machine is a device that changes symbols on a infinite strip of tape. It changes these symbols by referencing a table of instructions. This machine can simulate logic that is used in computer algorithms. This theoretical device was imagined by Alan Turing in 1936 and is useful for representing a computer..
Other than that, our class is still working on our CPU simulator. The next steps are building a menu and building registers.
Toady had been fairly productive. I finished up my keywords and have started work on my experiments. I'm kinda struggling with what to do for my experiments though. Some of the experiments I can think of just seem trivial to do. I'll keep thinking about it and come up with something.
I also need to do an objective. Looking at the course objectives, most of them have to do with knowing the assembly language. I think that I still can do one of them at this point.
Well have a happy leap day tmrw!
Logic operations are represented by logic gates in Computer Science. These gates perform Boolean operations, meaning they get input and produce a single output(usually represented as true(1), false(2)).
The AND operation can be represented by the following true table.
p | q | p AND q | ||
T | T | T | ||
T | F | F | ||
F | T | F | ||
F | F | F |
A True will be returned iff both inputs are true. Otherwise, the returned value is false.
The OR operation can be represented by the following true table.
p | q | p OR q | ||
T | T | T | ||
T | F | T | ||
F | T | T | ||
F | F | F |
OR returns False if both inputs are false. Otherwise, it returns true.
The XOR operation can be represented by the following true table.
p | q | p XOR q | ||
T | T | F | ||
T | F | T | ||
F | T | T | ||
F | F | F |
A true is returned if the inputs are not equal. Otherwise a false is returned.
The following code is attributed to the Computer Organization class.
#include "and.h" bool AND::getX() { bool tmp = false; if((A == true) && (B == true)) { tmp = true; } return tmp; }
#include "or.h" bool OR :: getX() { bool tmp = false; if((A == true) || (B == true)) { tmp = true; } return(tmp); }
bool XOR::getX() { bool tmp = true; if((A == B)) { tmp = false; } return tmp; }
Like the title says, Negated logic operations simply negate the output from their logic operator cousins. A NOT gate simply negates whatever input it gets. If it gets as input FALSE, it will output TRUE and vice versa. The other three logic operations can be made by sending there logic operator cousin through a NOT gate.
I will not bother demonstrating all the gates because I think that would be a waste of precious opus space but I think if you understand one of them you will understand the rest. I realize as I write this explanation of why I will not be demonstrating all the negated logic gates that I am wasting opus space in this explanation. Now that we've got that settled, I will demonstrate a NAND gate.
Remember that a NAND gate is a negated AND gate.
#include "nand.h" NAND::NAND() { myandgate = new AND(); mynotgate = new NOT(); } bool NAND::getX() { bool tmp = true; myandgate -> setA(A); myandgate -> setB(B); tmp = myandgate -> getX(); mynotgate -> setA(tmp); tmp = mynotgate -> getX(); return(tmp); }
The code above sends two inputs into an AND gate and gets an output. It then sends that output into a not gate and returns that Boolean value.
The other two negated logic gates work the same way.
When we think of numbers, we think of 0 1 2 3 4 5 6 7 8 and 9. This is called a base 10(Decimal) number system. But what if instead of have 10 different symbols to represent values, we only had 2. This number system is called Binary. These two values are 0 and 1. Hexadecimal (base 16)on the other hand has 16 different symbols ( 0 1 2 3 4 5 6 7 8 9 A B C D E and F) that represent values.
For example, lets take the decimal number 45. Since this is base 10, the 4 is in the 10^1 place and the 5 is in the 10^0 place and can be represented as (4 * 10^1) + (5 * (10^0) = 45. Representing 45 in binary is different now because there is only two symbols to represent the number. In binary the first placeholder from the right is the 2^0 place followed by 2^1 place and so on. Therefore to represent 45 in binary we have to start with the 2^5 (32) place. Since 32 goes into 45 we place a 1 in that position and subtract 32 from 45 giving us 13. Since 13 doesn't go into the next position(2^4 = 16), we place a 0 in that position and move to the next one. Since 13 goes into 8(2^3) we place a 1 in the position and subtract 8 from 13 giving us 5. We move onto the next position which is (2^2) a see if 5 goes into that. Since it does we place a 1 in that position and subtract 4 from 5 giving us 1 left. Now we look at the 2^1 position and see that 1 does not goes into 2, we place a zero in that position and move onto the final position which is 2^0. Since 1 goes evenly into 1 we place a 1 in the 2^0 position and we are done. We get in binary is 101101 which is equal to 45 in decimal.
To represent 45 in hexadecimal we must look at the place holders for base 16. The rightmost place holder is 16^0 followed by 16^1 and so on. For example 10 in hexadecimal is equal to 16 in decimal. This is because ((1 * 10^1) + (0 * 10^0) = 10). Therefore, the hexadecimal equivalent of 45 is 2D( where D represents 13).
von Neumann computer architecture is based around a Central Processing Unit, interaction with a memory device that contains both the instructions and data and sending/receiving data through input/output.
Harvard architecture has physically separate storage and signal pathways for instructions and data.
When you compare these two different architectures, the biggest difference is how the CPU functions. With the von Neumann architecture, the CPU “can be either reading an instruction or reading/writing data from/to the memory. Both cannot occur at the same time since the instructions and data use the same bus system. (Wikipedia)”. Whereas a Harvard computer architecture allows for simultaneous instruction/data reading/writing.
The following pictures show diagrams of how these different architectures work.
Harvard architecture
von Neumann architecture where the memory contains both the data and the instructions
The fetch-execute cycle “is the basic operation cycle of a computer. It is the process by which a computer retrieves a program instruction from its memory, determines what actions the instruction requires, and carries out those actions. This cycle is repeated continuously by the central processing unit (CPU), from bootup to when the computer is shut down” (Wikipedia).
The fetch-execute cycle is basically how the computer functions. It starts by retrieving instructions, determine what those instructions mean, and then doing whatever those instructions say.
Computers storage refers to the way computers retain data. Storage comes in several different forms but when broken down, there are two main types of storage. The first type is called volatile storage. Volatile storage requires constant power for it to retain the data it stores. Volatile storage is typically seen in the computers Random Access Memory.
The other main type of storage is non-volatile storage. Unlike volatile storage, non-volatile storage does not require constant power to retain its data. The most common types of non-volatile storage are flash memory, optical storage and magnetic storage.
The following diagram shows how storage functions in the operation of a computer.
A subroutines(also know as functions, methods, etc…) is a block of code that is used to perform a certain task. This task is usually a task that needs to be repeated. This is useful because having to rewrite that portion of code over and aver again would waste time and space. Instead, a subroutine can be written to perform a certain task. Every time that task needs to be done, we say that you call the function. Once you call the function, the program goes to where the function is in memory and performs the task. Once that is done it either returns a value or if it is a void function it does not return anything.
/* * This program uses a function to find the avererage of three numbers */ #include<stdio.h> int average(int,int,int); int main() { int a = 1; int b = 5; int c = 10; int ave = 0; ave = average(a,b,c); printf("The average of the %d, %d, and %d, is = %d\n",a,b,c,ave); return 0; } int average(int x, int y, int z) { return((x + y + z)/3); }
Writing a function that finds the average would be useful if you need to find alot of averages.
Input/Ouput is how the computer communicates with the outside world.
Common input devices are keyboards, mice, scanners, etc. This is how a user can communicate with the computer.
Common output devices are display monitors and printers. This is how the computer communicates with the user.
Computers are also able to communicate back and forth to each other though I/O. They do do this using NIC's and modems.
I'm not sure just how to demonstrate this keyword but I was thinking that even looking a command line would work.
Through the keyboard I can type a set of characters into the command line and hit enter(me communicating with the computer). It then processes that command and outputs it answer(the computer communicating with me).
lab46:~$ whoami dschoeff lab46:~$
Familiarity with the organization of a computer system.
This objective will require a knowledge of how computers function. This includes memory, storage, processing and I/O to name a few.
I will start to gain a familiarity with the organization of a computer system by reading, writing up keywords, performing experiments and more reading.
This is an ongoing process through out the semester. Refer to the keywords I have defined and demonstrated above. Also look at the experiments I have tested.
Reflect upon your results of the measurement to ascertain your achievement of the particular course objective.
I don't know if this is a particular question but I will playing around with a fairly new feature in C++. This feature is the auto typed variable. What this allows you to do is create a variable with the keyword auto. The compiler will determine what kinda of variable it is based upon its initializing expression.
I guess I will be testing whether this actually works or not.
Based upon my reading of this article, I think the feature will work as expected.
I will create a test program that declares variable of different types including the auto type. I will the initialize them to the same value and print out the contents of the variables.
The following is the test program that I wrote.
#include<iostream> using namespace std; int main() { int intvar1 = 'a'; char charvar1 = 'a'; double doublevar1 = 'a'; auto autovar1 = 'a'; int intvar2 = 65; char charvar2 = 65; double doublevar2 = 65; auto autovar2 = 65; int intvar3 = 65.51; char charvar3 = 65.51; double doublevar3 = 65.51; auto autovar3 = 65.51; cout << "intended value 'a'" << endl; cout << "intvar1 = " << intvar1 << endl << "doublevar1 = " << doublevar1 << endl << "charvar1 = " << charvar1 << endl << "autovar1 = " << autovar1 << endl << endl; cout << "intended value 65" << endl; cout << "intvar2 = " << intvar2 << endl << "doublevar2 = " << doublevar2 << endl << "charvar2 = " << charvar2 << endl << "autovar2 = " << autovar2 << endl << endl; cout << "intended value 65.51" << endl; cout << "intvar3 = " << intvar3 << endl << "doublevar3 = " << doublevar3 << endl << "charvar3 = " << charvar3 << endl << "autovar3 = " << autovar3 << endl << endl; return (0); }
I then tried to compile this code with the following command and got this error message.
lab46:~$ g++ autotest.cc -o autotest autotest.cc: In function 'int main()': autotest.cc:10: error: ISO C++ forbids declaration of 'autovar1' with no type autotest.cc:14: error: ISO C++ forbids declaration of 'autovar2' with no type autotest.cc:18: error: ISO C++ forbids declaration of 'autovar3' with no type lab46:~$
I then talked to Matt about why this was happening and he found out that i needed to include the following argument.
lab46:~$ g++ --std=c++0x autotest.cc -o autotest lab46:~$
I believe this was to tell the compiler to include the right libraries which it wouldn't do by default.
Once the code was compiled I ran the code.
lab46:~$ ./autotest intended value 'a' intvar1 = 97 doublevar1 = 97 charvar1 = a autovar1 = a intended value 65 intvar2 = 65 doublevar2 = 65 charvar2 = A autovar2 = 65 intended value 65.51 intvar3 = 65 doublevar3 = 65.51 charvar3 = A autovar3 = 65.51 lab46:~$
Based on the data collected:
The auto typed variable is just as simple to use as any other type of variable. As of now I am not aware of any big advantages this type of variable has besides dumbing down the programming a bit. Maybe as I explore this more some of those advantages will show themselves.
I guess this will piggy back of the last experiment. The question I am posing is will a auto typed variable once initialized be able to change types.
I believe it will not be able to change data types once initialized.
I will write a program that declares and initializes an auto typed variable to an int. I will then try to put different data types in it and see what happens.
Here is the short program I wrote to test my hypothesis.
#include<iostream> using namespace std; int main() { auto autovar = 'a';//i will be changing this initialization through my testing proccess. cout << "value stored in auto typed variable - > " << autovar << endl; cout << "enter value to put in auto typed variable: " ; cin >> autovar; cout << "value stored in auto typed variable - > " << autovar << endl; return (0); }
I then compiled and ran my code.
lab46:~$ ./autotest value stored in auto typed variable - > a enter value to put in auto typed variable: b value stored in auto typed variable - > b lab46:~$ ./autotest value stored in auto typed variable - > a enter value to put in auto typed variable: 7 value stored in auto typed variable - > 7 lab46:~$ ./autotest value stored in auto typed variable - > a enter value to put in auto typed variable: 6.234 value stored in auto typed variable - > 6 lab46:~$
I then changes the initialized value to 5.
lab46:~$ ./autotest value stored in auto typed variable - > 5 enter value to put in auto typed variable: 6 value stored in auto typed variable - > 6 lab46:~$ ./autotest value stored in auto typed variable - > 5 enter value to put in auto typed variable: a value stored in auto typed variable - > 5 lab46:~$ ./autotest value stored in auto typed variable - > 5 enter value to put in auto typed variable: 6.34 value stored in auto typed variable - > 6 lab46:~$
Based on the data collected:
Just as expected, once an autotyped variable is given a data type it cannot be changed.
My final experiment will be whether you can declare an auto variable without initializing it and if so how will it respond.
I believe you will not be able to declare the auto typed variable without initializing it.
I will write a program that declares an auto typed variable without initializing it. If it compiles, I will then try to store data in the variable and print its contents.
Here is my code.
#include<iostream> using namespace std; int main() { auto autovar; cout << "enter value to put in auto typed variable: " ; cin >> autovar; cout << "value stored in auto typed variable - > " << autovar << endl; return (0); }
I then tried to compile my code and got this error.
lab46:~$ g++ --std=c++0x autotest.cc -o autotest autotest.cc: In function 'int main()': autotest.cc:7: error: declaration of 'auto autovar' has no initializer lab46:~$
Based on the data collected:
This experiment has furthered my lack of understanding for why there would be a need for this type of declaration.
If the the variable has to be initialized before compile time, you obviously know what type of variable you will need anyways. Ugh!
It's Friiiiiiiiiiiiiiiiiiiiiiiiiiiiidddddddddddddddddddddaaaaaaaaaaaayyyyyyyyyyyyyyyyyyyyyyyyyyyyy!!!!!
WOOHOO! The best way to start a weekend is by spending that time in the lair. So many magical things happen down here it is incredibal. Today I plan on spending some time doing opus and maybe working on the cpu simulator. Check back later for an update……
Today in Comp Org I think we have begun the process of making real progress on our CPU simulator. We have decided on simulating the 6502.
We were talking today about instruction sets and how they relate to the simulator. We have decided that each of out instructions will be four bytes in size. We also have narrowed down what different instructions we will have. This coming Friday we should be able to actually begin to write down our instructions. Once we get that down I think we should be able to move at a much faster pace!
From this day forward, I declare March 15th……… OPUS DAY!!!!!
Today I will be working on my opus cranking out keywords and such. I just finished up the interrupts keyword and I feel I have a better understanding of them now but not to the point I would like. This will require some more study on my part. I think I will also attempt to do the Address Bus and Data Bus keywords as well.
Welcome to my final dated entry for the month. Today I will be working on my opus. I have 5 more keywords to do and the objective and experiments. I have been reading through my book a little bit about registers and instruction sets. I wasn't here on friday but from the looks of the board we have decided on what our instruction set will be. Now it will be up to us to write it and implement it in our simulator.
Interrupts are changes in the flow of the instruction set. These are not caused by the running program but typically are related to some form of I/O. It is important to note that interrupts are asynchronous, meaning that they do not have to occur at a specific point in time but can executed at various different times.
The following is a paraphrased version of a list of how the interrupt process works at a software level.
In computer science a data bus is a system that transfers data different parts of the computer.
Modern buses can use both parallel and bit serial connections and can be wired in many different ways. Without buses there would be no way for data to be transferred between two different pieces of hardware.
For a more in depth description of this check out this link → http://en.wikipedia.org/wiki/Bus_%28computing%29
An Address Bus is an internal channel from the CPU to memory where addresses are transferred.
The number of wires that this bus contains determines the amount of addressable memory there can be.
for a more detailed description check out this link → http://en.wikipedia.org/wiki/Address_bus
In Computer Science, a word is a unit of data that is used by a particular processor. It usually is a group of bits handled as a unit by the instruction set. The word size will change depending on what processor you have.
In the case of our instruction set, the machine word is 4 bytes. The Motorola 6800 is an 8 bit processor therefore the word size is 8 bits.
There are only two main operation that can be perfromed on a stack. The first one is called push. push allows you to add a piece a data to the top of the stack in memory. The second one is called pop. pop allows you to remove a the topmost piece od data from the stack in memory.
A full demonstation of the operations have been performed by me at this link → http://lab46.corning-cc.edu/opus/fall2011/dschoeff/start#stacks
These type of registers can hold both data and registers and are used for a variety of purposes.
This type of register can hold floating point data values.
This type of register can hold numeric data values, as well as characters, small bit arrays and other data.
The stack pointer is used to manage the runtime stack which keeps track of the of where the current program should return control when the subroutine stops runnning.
The program counter is a special purpose register used to point to the current instruction that is being executed in the instruction sequence.
This regester is a collection of flag bits for the processor. This register contains information about process state. It typically contains at least three flags including zero,carry and overflow.
An index register is a processor register used for changing the operand addresses during the runtime of the program.
The contents of an index register is added to an immediate address to form the effective address of the actual data.
Understand the impact of number systems
This will involve not only knowing about number systems suck as binary and hexadecimal, but also understanding how they play a part in the operation of a computer.
I will achieve this goal by studying how number systems are used in the operation of the computer.
I will measure my success by how well I know how number systems function in the operation of a computer
What is the question you'd like to pose for experimentation? State it here.
Collect information and resources (such as URLs of web resources), and comment on knowledge obtained that you think will provide useful background information to aid in performing the experiment.
Based on what you've read with respect to your original posed question, what do you think will be the result of your experiment (ie an educated guess based on the facts known). This is done before actually performing the experiment.
State your rationale.
How are you going to test your hypothesis? What is the structure of your experiment?
Perform your experiment, and collect/document the results here.
Based on the data collected:
What can you ascertain based on the experiment performed and data collected? Document your findings here; make a statement as to any discoveries you've made.
What is the question you'd like to pose for experimentation? State it here.
Collect information and resources (such as URLs of web resources), and comment on knowledge obtained that you think will provide useful background information to aid in performing the experiment.
Based on what you've read with respect to your original posed question, what do you think will be the result of your experiment (ie an educated guess based on the facts known). This is done before actually performing the experiment.
State your rationale.
How are you going to test your hypothesis? What is the structure of your experiment?
Perform your experiment, and collect/document the results here.
Based on the data collected:
What can you ascertain based on the experiment performed and data collected? Document your findings here; make a statement as to any discoveries you've made.
Perform the following steps:
Whose existing experiment are you going to retest? Provide the URL, note the author, and restate their question.
Evaluate their resources and commentary. Answer the following questions:
State their experiment's hypothesis. Answer the following questions:
Follow the steps given to recreate the original experiment. Answer the following questions:
Publish the data you have gained from your performing of the experiment here.
Answer the following:
Answer the following:
Spring is in the air! The birds are chirping the sun is shining… but I'm in the lair so I can't enjoy any of that. I finished everything in my Opus last month except for the experiments. I really could not think of anything having to with class that I could do an experiment on. I know that the experiments don't have to be related to class but it just seems pointless to do an experiment that has nothing to do with this class. I will work this month on getting to my experiments earlier on so I have more time to think about them.
Today I will be working on my Opus and simulator. Got a little catching up to do but I'll get it done.
It is so nice outside today! Yesterday I did some Opus stuff with boolean arithmetic and dated entries while doing some reading up on registers. Today feels like another fun Opus day. I have 7 more keywords to do so I'll get at it…
I have started work on my EoCE and am going to bang out my keywords the next few days. I'm starting to understand exactly what I have to do for the simulator and I think I won't have too many problems getting most of the stuff working.
In Boolean algebra, there are only two possible values for any quantity or operation that you may be able to perform on them, a 1 and a 0.
Boolean addition works practically the same way that addition with integers works. Consider the following sums.
0 + 1 + 1 = 1 |
1 + 1 + 1 = 1 |
0 + 1 + 1 + 1 = 1 |
1 + 0 + 1 + 1 = 1 |
Since you can only represent a quantity by either a one or a zero, the answer for these four equations is 1.
The following pictures show how boolean addition is related to an “or” gate.
There is also Boolean multiplication. This follows the same rules as integer multiplcation. Anything multplied by zero is zero and 1 times 1 is 1. The follwing pictures show the relationship between boolean multiplication and the AND gate.
From my understanding both subtraction and division are invalid boolean operations.
An instruction set is a group of commands that allow a computer to do specific things. These may include instructions to add two registers or branch to another location and perform the instructions there. CISC stands for complex instruction set computing. This means a single instruction can execute several different low-level operations. Risc stands for reduced instruction set computing. This strategy is different than a CISC design because there are fewer, more optimized set of instructions.
Examples of CISC architectures are PDP-11, VAX, and the Motorola 68000.
Examples of RISC architectures areDEC Alpha, AMD 29k and ARM processors.
Computers are only able to represent data as one's and zero's. The way those 1's and 0's are grouped or ordered determines the way they are interpreted by the computer.
Big Endian means that the given data unit is ordered from left to right as most significant to least significant.
Little Endian means that the given data unit is ordered from left to right as least significant to most significant.
Integer data representation can vary between computer architectures. In C, an integer represents a grouping of 4 bytes. This means it can represent the values of −2,147,483,648 to 2,147,483,647 signed and 0 to 4,294,967,295 unsigned.
Floating point is a method of representing real numbers that can support a wide variety of values. It can do this because it represents data in the form Significant digits * base^exponent.
ASCII is an encoding scheme that is used to represent characters. In ASCII the character 'A' is signified by the binary number 1000001. ASCII can represent a total of 128 different things.
Wikipedia says “In computer science, control flow (or alternatively, flow of control) refers to the order in which the individual statements, instructions or function calls of an imperative or a declarative program are executed or evaluated.” It is basically they order that stuff is run by the computer.
By default, the flow of a program is linear. Like sequential statements. This however is not the case in a in an if statement because depending on a certain condition the program can branch to different places.
A linker takes a bunch of object files and converts them into a single executable file.
When computers represent positive and negative numbers, it is different than we represent them by slapping a - in front of it. Computers have different ways of doing this. Two of these ways are One's Compliment and Two's Compliment.
One's compliment form of a negative binary number is simply the bitwise NOT operation. 00000000 represent 0 and 11111111 represents -0. The decimal number 15 is 00001111 and -15 is 11110000.
In two's compliment, there is only one 0 and it is represented by 00000000. The negative of a number is found by negating all the bits then adding 1. 15 is 00001111 and -15 is 11110000 + 1 = 11110001.
A CPU has many different parts: Registers, control unit, ALU, etc…
The control unit has the task of fetching, decoding and managing execution and then storing those results.
Registers allow data to be stored in a convenient place for the processor to handle it.
The ALU performs all the arithmetic operations required.
Data conversion is simply converting data of one format to another format. This is like when using the static_cast operator to convert a variable of type int to type double or converting an .mp3 to a .wmv file.
The smallest form a data computers can manipulate is a bit. They do this by performing logical operations on them such as AND, OR, NOT and so on.
familiarity with the role of the C library
I believe this objective entails not only knowing what the C library has to offer but implementing that efficiently in a program
State the method you will use for measuring successful academic/intellectual achievement of this objective.
I will become familiar with the C library by using it frequently and reading more about it.
Follow your method and obtain a measurement. Document the results here.
By using the C library of functions frequently, I think I have gained a good understanding of most of the basic functions.
Reflect upon your results of the measurement to ascertain your achievement of the particular course objective.
What is the question you'd like to pose for experimentation? State it here.
Collect information and resources (such as URLs of web resources), and comment on knowledge obtained that you think will provide useful background information to aid in performing the experiment.
Based on what you've read with respect to your original posed question, what do you think will be the result of your experiment (ie an educated guess based on the facts known). This is done before actually performing the experiment.
State your rationale.
How are you going to test your hypothesis? What is the structure of your experiment?
Perform your experiment, and collect/document the results here.
Based on the data collected:
What can you ascertain based on the experiment performed and data collected? Document your findings here; make a statement as to any discoveries you've made.
What is the question you'd like to pose for experimentation? State it here.
Collect information and resources (such as URLs of web resources), and comment on knowledge obtained that you think will provide useful background information to aid in performing the experiment.
Based on what you've read with respect to your original posed question, what do you think will be the result of your experiment (ie an educated guess based on the facts known). This is done before actually performing the experiment.
State your rationale.
How are you going to test your hypothesis? What is the structure of your experiment?
Perform your experiment, and collect/document the results here.
Based on the data collected:
What can you ascertain based on the experiment performed and data collected? Document your findings here; make a statement as to any discoveries you've made.
Perform the following steps:
Whose existing experiment are you going to retest? Provide the URL, note the author, and restate their question.
Evaluate their resources and commentary. Answer the following questions:
State their experiment's hypothesis. Answer the following questions:
Follow the steps given to recreate the original experiment. Answer the following questions:
Publish the data you have gained from your performing of the experiment here.
Answer the following:
Answer the following: