Saad Malik's Opus
Spring 2012
Unix/Linux Fundamentals
C/C++ Programming
My name is Saad Malik. I am currently 18 years old, and am enrolled in CCC for my second semester.
Last semester I was chemical engineering, and I have switched majors to compsci due to it being challenging and interesting.
I currently tutor at the MLC, and am usually glad to help out anybody who has a problem that I can solve.
Today, for C/C++ in-class we learned a good deal about pointers. Beforehand, from learncpp.com I had read about pointers and even messed around with them in visual studio express but they always manage to confuse me or trip me up somehow. We also did a little on binary, and if knowing binary well becomes a necessity I will have to google and read up on it.
Regarding pointers and whatnot, we made a .c file in class with two variables, with b pointing towards a. We would assign pointer b a value, and that value would then be assigned to a. It's almost like the point is a soft shortcut to whatever address it's pointing to. What threw me off was that we would then fstream the b value, and de-reference it, and then b would suddenly be equal to 12. I'm guessing repetition, and messing with the code, will help me understand it. For the most part, it all did make sense. Along with the binary, and signed and unsigned variables.
Overall, pointers and referencing addresses of variables makes sense to me. When it comes to a bunch of things with pointers and address references going on at once, I find it a little challenging to try to follow what exactly is happening. As for binary, I can understand enough to understand how signed and unsigned works.
I am supposed to make a tree of the UNIX file system, with my home directory in it along with a couple other things.
root | home | smalik2 / | \ archives bin src / \ unix cprog
All of the things that we learned in the first two weeks for Linux has actually helped me understand more other things outside of class. Going through directories, moving files, copying files, and other commands we've learned so far I've been using.
Over the past couple weeks I've been modding and messing around with my phone, and since I try to primarily use Ubuntu, I end up using terminal a lot. When I run into a guide on a website and they just have lists of commands to type in terminal to make something happen, I actually know what they're talking about as opposed to just following directions. This level of understanding really helps when it comes to troubleshooting problems, and with not blindly following instructions just hoping that it will magically work.
Since Android phones are based on a Linux kernel, when it comes to navigating my phones contents through the terminal on the computer, I actually know how to do it. I can really appreciate how nicely my need to know this material has coincided with this class. I also appreciate how widely used Linux appears to be, although many people probably do not realize it.
This past Friday in Object Oriented Problem Solving, we were creating an algorithm to read a user entered number. The ultimate goal will be to read the number and convert it to base ten, but right now the objective is to simply read in the number, each digit separately (without the user actually entering each digit separately).
I attempted to do this using C, but kept on hitting various errors. Segmentation faults, syntax, logical errors, etc. The end result was that there was SOMETHING wrong with the line containing the modulus function, where it would take a mod of the number entered by powers of ten (basically knocking off and storing the last digit in the number), and the digit would not be stored in the Array.
I am not sure if this is a problem with the array (I am still not comfortable with C, I'm much more used to C++) or the mathematical functions being performed. I briefly talked to Professor Oppenheim about it after class, but unfortunately I was in a rush so could not check the code with him. We will look over it next time we have class hopefully.
We figured it out, the problem was that one of the variables that was being changed had not been passed by reference. Adding an & fixed this, and the program started running.
This is somewhat random, but I since I have been running Ubuntu 99% exclusively on my laptop now and it is Linux based, it is part of my everyday life pretty much. So much so that I recommend it over Windows to my friends. I was helping somebody (who is not taking UNIX) install it on their laptop, and then when they were trying to use it they had to ask me how to create just a text file - thanks to the UNIX class I could immediately just tell them 'just use terminal, and then nano [filename].txt'. I would have recommended vim, but they had tried it before and it didn't end well.
Additionally, I am contemplating attempting the Linux from Scratch project which is basically building a linux based OS from scratch – teaching you a ton about the whole thing and how it works in the process. Perhaps I will attempt this when I have more free time on my hands.
LIST FOR C/C++ KEYWORDS
The following is a list of the major topics being covered in this course:
DONE: Standard I/O (STDIO, STDOUT, STDERR)
DONE: Header Files (Local and System), C Standard Library (Libc), Libraries
DONE: arithmetic (equations, operators)
DONE: logic and operators (and, or, not, xor)
DONE: Variables (types, ranges, sizes)
DONE: Scope (Block, Local, Global, File)
DONE: Pointers (address of, assignment, dereferencing)
DONE: Type Casting
DONE: Selection Structures (if, case/switch)
DONE: Repetition/Iteration Structures (for, while, do while)
DONE: Arrays (standard notation, pointer arithmetic, single-dimensional, multi-dimensional)
DONE: File Access (Read, Write, Append)
Structures (Declaration, Accessing Elements, Pointers to)
typedef, enum, union
DONE: Functions, Parameters (Pass by: Value, Address, Reference), Return Types, Recursion, Command-line arguments
DONE: Compiler, Preprocessor, Flags, Assembler, Linker, Multi-file programs (how to structure, how to compile)
DONE: I/O Streams (cin, cout, cerr, stream operators) [C++]
DONE: Namespaces [C++]
DONE: Type Casting Operators, Const-Volatility Specifiers (const, volatile) [C++]
DONE: Classes (Objects, Constructor, Destructor, Access Control, Public, Protected, Private, Friend, “this” pointer) [C++]
DONE: Inheritance (single, multiple Inheritance), Polymorphism/Virtual Functions, Abstract Base Class [C++]
DONE: Overloading (Functions, Operators) [C++]
Exception Handing (throw, try, catch) [C++]
DONE: Templates, STL (Standard Template Library) [C++]
Repetition/Iteration Structures are basically the coding that is necessary if you want to repeat a process many times, or to count. If you wanted to input 500 values into an array, you'd have to use a repetitive structure (the alternative being typing 500 lines of code). Or let's say you want to run a process multiple times, but each time something is slightly different, you'd use a repetitive structure.
Demonstration of the chosen keyword.
If you wish to aid your definition with a code sample, you can do so by using a wiki code block, an example follows:
Using a for loop
//THIS PROGRAM WILL COUNT FROM 0-20 #include <stdio.h> #include <stdlib.h> int main() {//START MAIN int count = 0; //DECLARING AND INITIALIZING A VARIABLE FOR COUNTING for(count; count<=20; ++count) //FOR LOOP TO COUNT FROM 0-20 { printf("%u sheep.\n", count); //FSTREAM # AND SHEEP } //END FOR LOOP return (0); //RETURN 0 }//END MAIN
Using a do while loop
#include <stdio.h> int main() { int count=0; do { printf("%u sheep.\n", count); ++count; } while(count<=20); return (0); }
Using a while loop
#include <stdio.h> int main() { int count = 0; while(count<=20) { printf("%u sheep.\n", count); ++count; } return 0; }
The outputs of all of these programs lead to the SAME THING, so I'm only putting it once.
lab46:~/src/cprog/MessingAround$ nano RepetitiveDoWhile.c lab46:~/src/cprog/MessingAround$ gcc -o RepetitiveDoWhile RepetitiveDoWhile.c lab46:~/src/cprog/MessingAround$ ./RepetitiveDoWhile 0 sheep. 1 sheep. 2 sheep. 3 sheep. 4 sheep. 5 sheep. 6 sheep. 7 sheep. 8 sheep. 9 sheep. 10 sheep. 11 sheep. 12 sheep. 13 sheep. 14 sheep. 15 sheep. 16 sheep. 17 sheep. 18 sheep. 19 sheep. 20 sheep.
Variables are structures that can hold types of data that can be manipulated.
To define a variable you have to make a statement in the code.
[type][identifier] = [value];
The type is the type of variable - Char short int int long int long long int float double long double
All of these variables can also be signed or unsigned (whether or not half of the memory allocated to each variable will be used for negative values, or further positive values.)
The sizes and ranges of these variables can differ, as shown by the output of a program (Project 0) that prints it all.
An unsigned char is 1 bytes The range of an unsigned char is 0 to 255 An unsigned char can store 255 unique values An unsigned short int is 2 bytes The range of an unsigned short int is 0 to 65535 An unsigned short int can store 65535 unique values An unsigned int is 4 bytes The range of an unsigned int is 0 to 4294967295 An unsigned int can store 4294967295 unique values An unsigned long int is 8 bytes The range of an unsigned long int is 0 to 18446744073709551615 An unsigned long int can store 18446744073709551615 unique values An unsigned long long int is 8 bytes The range of an unsigned long long int is 0 to 18446744073709551615 An unsigned long long int can store 18446744073709551615 unique values A signed char is 1 bytes The range of a signed char is -128 to 127 A signed char can store 256 unique values A signed short int is 2 bytes The range of a signed short int is -32768 to 32767 A signed short int can store 65536 unique values A signed int is 4 bytes The range of a signed int is -2147483648 to 2147483647 A signed int can store 4294967296 unique values A signed long int is 8 bytes The range of a signed long int is -9223372036854775807 to 9223372036854775806 A signed long can store 18446744073709551615 unique values A signed long long int is 8 bytes The range of a signed long long int is -9223372036854775807 to 9223372036854775806 A signed long long can store 18446744073709551615 unique values
A pointer is basically a variable, that contains the address/location of another variable.
To assign a pointer, you denote it with;
*[variable declaration];
The asterisk denotes pointer. And you can have two, or even three to designate a double or triple pointer.
To dereference a pointer, you use an asterisk again.
I think of a pointer as 'going higher' and then dereferencing as 'going back down'.
So if you have a variable called pointer, which is a single pointer, that variable is one level up. To put something in it, you have to bring it down a level.
The plain variable is just the address of where the actual value is being stored.
So, given the following code and output, you can see that the normal variable you can just printf it normally. But when it comes to storing and printing to the pointer, you need to dereference it to take the pointer back down to the storage unit that it specifies.
#include <stdio.h> #include <stdlib.h> int main() { int *pointer, variable; *pointer = 9001; //need to dereference to store it variable = 1111; //not a pointer so it's fine printf("\nVariable is %d\n", variable); printf("\nPointer is %d\n", pointer); //Since it is not dereferenced, it will print an address (garbage). printf("\n*Pointer (dereferenced) is %d\n", *pointer); //Since it has been dereferenced, it will properly display the value. return (0); }
lab46:~/src/cprog/MessingAround$ ./pointers Variable is 1111 Pointer is -1584842064 *Pointer (dereferenced) is 9001
File Access is basically the term for when you read from, write to, or append a file. Basically the program can open a .txt file or a .data file or whatever, and then either read information from it (such as a list of numbers or something) or write information to it (such as results of some calculation), or append (just add onto what is already in the file).
The following program will take an input file, and then add 1 to every number in the input file, and write those results into a different file.
#include <stdio.h> #include <stdlib.h> int main() { int number; FILE *in, *out; //Defines two file variable pointers called in and out. in = fopen("numbers.txt", "r"); //Opening the input file (known as numbers.txt). The r denotes reading. out = fopen("output.txt", "w"); //Opening the output file (naming it output.txt). The w denotes writing. if(in == NULL) { printf("Error, need an input file numbers.txt"); exit(1); } //This block checks to make sure that a file gets thrown into the in variable fscanf(in, "%hhd", &number); //That in at the beginning of the statement indicates that input file while(number != 17) { int newnumber=0; newnumber = number+1; fprintf(out, "%hhd\n", newnumber); fscanf(in, "%hhd", &number); } return (0); }
Standard I/O is the Default Input, Output, and Error Output. Normally these are the keyboard, and the monitor.
When we use scanf(“%d”, &number); it inputs an integer value from the standard input, which is the keyboard.
If we use fscanf(in, “%d”, &number); it inputs an integer value from whatever is defined as 'in' (like a text file), so we changed the input.
When we use printf(“Hello”); it prints Hello to the standard output, which is the monitor.
If we use fprintf(out, “Hello”); it prints Hello to whatever output is defined by 'out' (for instance, a text file). So we changed the output.
The errors are outputted to the STDOUT typically, and we haven't covered redirecting them in C yet.
An array is basically a bunch of different data values (of the same type) that fall under the same identifier. The identifier is basically a gigantic data block, that has been sliced into smaller blocks, each of which holds the different data values.
This program will use two 1-d arrays, and 1 2-d array. It will store 0-4 in the 1-d arrays, and in the 2-d array it shows examples of counting by increasing numbers in sets of 5. So, in the first one it counts forward by zeros. In the second set it counts forward by 1s. Third by 2s. Etc.
#include <stdio.h> #include <stdlib.h> int main() { int Array[5]; //This defines an array that can hold 5 values int D_Array[5][5]; //This defines a 2-d array, so it holds 5 values, each of which have five values underneath (like a table of sorts). int *P_Array; P_Array = (int*)malloc(sizeof(int)*5); //This defines a 5 slot array, but using pointer style arithmetic. int count = 0; int count2 = 0; int number = 0; for(count = 0; count < 5; ++count) { int number2 = 0; Array[count] = number; *(P_Array + count) = number; for(count2 = 0; count2 < 5; ++count2) { D_Array[count][count2] = number*number2; ++number2; } ++number; } printf("\nThe values in Array\n"); for(count = 0; count < 5; ++count) { printf("%d ", Array[count]); } printf("\nThe values in P_Array\n"); for(count = 0; count < 5; ++count) { printf("%d ", *(P_Array + count)); } printf("\nThe values in D_Array\n"); for(count = 0; count <5; ++count) { for(count2 = 0; count2 < 5; ++count2) { printf("%d ", D_Array[count][count2]); } printf("\n"); } printf("\n"); return (0); }
lab46:~/src/cprog/MessingAround$ vim arrays.c lab46:~/src/cprog/MessingAround$ gcc -o arrays arrays.c lab46:~/src/cprog/MessingAround$ ./arrays The values in Array 0 1 2 3 4 The values in P_Array 0 1 2 3 4 The values in D_Array 0 0 0 0 0 0 1 2 3 4 0 2 4 6 8 0 3 6 9 12 0 4 8 12 16 lab46:~/src/cprog/MessingAround$
Selection structures are basically ways of checking. They allow you to check things within the program, and decide what to do based on the check. With more complex logic operating behind the checks, the more interactive and 'intelligent' the program becomes.
The following program will take a number, and using if blocks determine IF the number is even or odd.
#include <stdio.h> #include <stdlib.h> int main() { int number = 0; int x; printf("Enter a number: "); scanf("%d", &number); x = number%2; if(x == 0) { printf("\n%d is even\n", number); } else { printf("\n%d is odd\n", number); } return (0); }
lab46:~/src/cprog/MessingAround$ vim Selection.c lab46:~/src/cprog/MessingAround$ gcc -o Selection Selection.c lab46:~/src/cprog/MessingAround$ ./Selection Enter a number: 2 2 is even lab46:~/src/cprog/MessingAround$ ./Selection Enter a number: 3 3 is odd
#include <stdio.h> #include <stdlib.h> int main() { int number; printf("Enter a number: "); scanf("%d", &number); int x; x = number%2; switch (x) { case 0: printf("The number is even"); break; case 1: printf("The number is odd"); break; default: printf("The number is neither even nor odd"); break; } printf("\n"); return (0); }
lab46:~/src/cprog/MessingAround$ gcc -o SwitchCase SwitchCase.c lab46:~/src/cprog/MessingAround$ ./SwitchCase Enter a number: 6 The number is even lab46:~/src/cprog/MessingAround$ ./SwitchCase Enter a number: 9 The number is odd lab46:~/src/cprog/MessingAround$
Logic and operators allow you to make a program much more interactive and capable.
And can be used to ensure two values are both true.
Or can be used to ensure at least one value is true.
Not returns the opposite of a value , from true to false and vice versa.
XOR will return true if JUST ONE value is true.
Use pointers and variables to discover the indirect properties of data storage
Basically this means that we will figure out, and be able to utilize, pointers and variables for the sake of different methods and 'tricks' behind data storage.
Probably paying attention when Matt Haas is talking about those things would be a great start. Defining these as keywords would help as well.
I defined them both as keywords, and it did help me understand a lot more. I already knew variables for the most part, but all the stuff to do with pointers I was sketchy on and now I feel much more confident about it.
Reflect upon your results of the measurement to ascertain your achievement of the particular course objective.
I think I did great. Of course there is room for improvement, but I am no longer clueless. Not really, being forced to define them and give working examples of them (for me) works very well. Perhaps the course objective would make a little more sense if it went into a little bit more detail in what it means by 'indirect properties data storage'.
THIS IS THE LIST –
The following is a list of the major topics being covered in this course:
DONE: Local host
DONE: Remote host
DONE: Home directory
DONE: Current working directory
DONE: Types of files (regular, directory, special)
DONE: File manipulation
DONE: Text Processing
DONE: The VI editor
DONE: The UNIX Shell
DONE: Environment variable
DONE: $PATH
DONE: wildcards
DONE: tab completion
DONE: Job Control
DONE: The UNIX Programming Environment
DONE: Compiler, Assembler, Linker, Loader
DONE: Source Code, Object Code, Binary Code, Library
DONE: Pattern Matching
DONE: Regular Expressions
DONE: Filtering
DONE: Shell Scripting
DONE: networking, UNIX Networking Tools
DONE: Security
DONE: X Window System
The ability to control files, such as moving them, removing them, copying them, organizing them.
In this command line sample, you can see me moving files between directories, or for the sake of renaming, copying files, making directories, and removing a file. All of this is file manipulation.
lab46:~$ cd src/cprog lab46:~/src/cprog$ ls Feb14 Feb2.c JAN26_printf_examples.c JAN31_pointers3.c Feb14.c Feb7.c JAN26_printf_pointers.c MessingAround Feb16 Feb7x0.c JAN31_pointers.c Projects Feb16.c Feb9.c JAN31_pointers2.c out.txt lab46:~/src/cprog$ cd MessingAround lab46:~/src/cprog/MessingAround$ ls Algorithm.c RepetitiveDoWhile.c files numbers.txt pointers Repetitive.c RepetitiveWhile.c files.c output.txt pointers.c lab46:~/src/cprog/MessingAround$ rm files rm: remove regular file `files'? y lab46:~/src/cprog/MessingAround$ mv pointers lookitrenamed lab46:~/src/cprog/MessingAround$ cp lookitrenamed lookanothercopy!! cp lookitrenamed lookanothercopymv pointers lookitrenamed cp: target `lookitrenamed' is not a directory lab46:~/src/cprog/MessingAround$ cp lookitrenamed lookanothercopy lab46:~/src/cprog/MessingAround$ mkdir lookanewdirectory lab46:~/src/cprog/MessingAround$ mv lookitrenamed lookanewdirectory lab46:~/src/cprog/MessingAround$ ls Algorithm.c RepetitiveWhile.c lookanothercopy pointers.c Repetitive.c files.c numbers.txt RepetitiveDoWhile.c lookanewdirectory output.txt lab46:~/src/cprog/MessingAround$ cd lookanewdirectory lab46:~/src/cprog/MessingAround/lookanewdirectory$ ls lookitrenamed lab46:~/src/cprog/MessingAround/lookanewdirectory$
The home directory is your default directory. Whenever you open up a cmd prompt this is the file location that you start at.
So here, you can see that right when I log into lab46 my home directory is denoted by ~$. Using the pwd command (to show the full file structure) reveals that my home directory is at /home/smalik2
saad@saad-Satellite-P775:~$ ssh smalik2@lab46.corning-cc.edu smalik2@lab46.corning-cc.edu's password: __ _ _ _ __ . . . . . . . . . . . . . . . . . . . . . . . . . | | __ _| |__ / | |_/ / . Basic System Usage: Type 'usage' at prompt . | |__/ _` | '_ \\_ _/ _ \ . Events and News: Type 'news' at prompt . |_____\__,_|_.__/ |_|\___/ . Broken E-mail? Type 'fixmail' at prompt . --------------------------- . Check Lab46 Mail: Type 'alpine' at prompt . c o r n i n g - c c . e d u . . . . . . . . . . . . . . . . . . . . . . . . . Lab46 is the Computer & Information Science Department's Student Development Server for Computer-related coursework, projects, and exploration. For more information, please check out: .. . . . . . . . . . .. . Lab46 Web Page: http://lab46.corning-cc.edu/ . . Lab46 Help Form: http://lab46.corning-cc.edu/help_request . . Help E-mail: haas@corning-cc.edu or wedge@lab46.corning-cc.edu . .. . . . . . . . . . .. _ .-./*) _/___/ `. U U 'You can delete files with the 'rm' command.' No mail. Last login: Fri Feb 17 19:09:50 2012 from cpe-69-205-204-88.stny.res.rr.com lab46:~$ pwd /home/smalik2 lab46:~$
In this example, you can see me moving to a different directory using the cd command. The cd command with no argument takes you back to your home directory.
lab46:~$ pwd /home/smalik2 lab46:~$ cd src/cprog/Projects lab46:~/src/cprog/Projects$ pwd /home/smalik2/src/cprog/Projects lab46:~/src/cprog/Projects$ cd lab46:~$ pwd /home/smalik2 lab46:~$
The current working directory is the directory that you're in.
The current working directory is basically the directory that you are in. The cd command with no arguments will change your current working directory to your home directory.
The pwd command reveals the current working directory.
lab46:~$ pwd /home/smalik2 lab46:~$
There are three types of files, regular files (such as .txt), directories (technically a file with other file locations in it), and special files (a directory is a type of special file, or C programs).
In the example we see that there are regular files, which are the .c files, directories, and then the special files (the compile C code).
lab46:~$ cd src/cprog lab46:~/src/cprog$ ls Feb14 Feb2.c JAN26_printf_examples.c JAN31_pointers3.c Feb14.c Feb7.c JAN26_printf_pointers.c MessingAround Feb16 Feb7x0.c JAN31_pointers.c Projects Feb16.c Feb9.c JAN31_pointers2.c out.txt lab46:~/src/cprog$
The device that is running the session.
My laptop is running Ubuntu. The terminal on my laptop screen is an example of a local host, because my device (the laptop) is what the services are being ran on.
A remote host is a device that is running services remotely.
My laptop is connected to lab46.corning-cc.edu via ssh, which is an example of a remote host.
The VI editor is a text editor where in one mode you can always insert, and in another mode you enter commands. To toggle command mode you hit escape, and to enter insert mode you push i when in command mode.
lab46:~/src/cprog$ vim Hello.txt lab46:~/src/cprog$ cat Hello.txt I couldn't type until I hit I to enter insert mode. Now, to exit VI editor (and save the work) I will hit the ESCAPE key to enter command mode, from there I will type :wq to quit and save my work. If I didn't want to save, I would use :q! lab46:~/src/cprog$
After typing vim Hello.txt, this appeared on my screen.
I couldn't type until I hit I to enter insert mode. Now, to exit VI editor (and save the work) I will hit the ESCAPE key to enter command mode, from there I will type :wq to quit and save my work. If I didn't want to save, I would use :q! ~ ~
Manipulating text
You can print the contents of a file using the cat command. You can manipulate text using many things. The nano and vim text editors are really good for editing text based files.
Just nano filename.txt or vim to open the editor.
Familiarity with the structure of UNIX systems.
Basically this means that I will become much more familiar with how UNIX systems look like, like the file structure and whatnot.
If I can tell if a system is based off the UNIX system based on the file structure.
I think I can do this pretty well, as I can recognize that mobile phones (such as my android powered phone and my previous iPhone) are based off of UNIX because of their file structure. They have the files named var, usr, bin, and others.
I think I did pretty well. Not particularly, unless if there is some other discrepancy that I am unaware of. I don't think so. If there was a quick description associated with the objective.
My experiment is to create a program that will convert any 3 digit base 8 number to base 10, and vice versa.
http://www.unitconversion.org/numbers/base-10-to-base-8-conversion.html – To double check program once I begin testing it.
http://science.widener.edu/~schultz/mathhelp2.html – This will help me develop the logic to run behind the program.
I'm guessing that by the time I finish, I will have a program that can accomplish the goal.
See if the program will output correct data given an input (checked against the converter I found online).
Program so far:
GNU nano 2.2.4 File: Algorithm.c Modified =#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int number = 0; int array[3]; int count = 0; int random = 0; int result = 0; int choice; printf("This program will convert any three digit number to a different base\n"); printf("For base 8 to base 10, press 1\n"); printf("For base 10 to base 8, press 2\n"); scanf("%d", &choice); if(choice == 1) { printf("\nEnter a base 8, three digit number :"); scanf("%d", &number); printf("\nThat number will now be converted to base 10\n"); printf("\nThe number you input was: %d\n", number); for(count = 0; count <=2; ++count) { random = number%10; array[count] = random; number = (number-random)/10; } for(count = 2; count >=0; --count) { result = result + array[count]*(pow(8, count)); } printf("\nThat number in base 10 is %d\n", result); } if(choice == 2) { printf("Enter a base 10 number: "); scanf("%d", &number); printf("\nThat number will not be converted to base 8\n"); printf("\nThe number you input was: %d\n", number); for(count = 0; count <=2; ++count) { random = number%8; array[count] = random; number = (number-random)/8; } printf("\nThat number in base 8 is: "); for(count = 2; count >=0; --count) { printf("%d", array[count]); } printf("\n"); } return (0); }
This code can successfully convert from base 8 to base 10.
When it comes to converting from base 10 to base 8 however, there is no check to take into account that the numbers 8 and 9 don't exist in base 8, (they have to carry over). This is something that will have to be incorporated. Perhaps as a second experiment it would be good to do that, with some more menu options and invalid input coding added in.
My hypothesis was mostly correct. The program mostly works. It still needs some safety nets built into it, however.
I know the language better.
One major thing that I didn't realize was that when you input a number, you have to input it by reference (denoted by an &) if you wish to make changes to that number as the program progresses.
I know that I can change directory from one end of the file system tree to the other by stating my destination as the entire file tree starting from the root. Can I do it if I only do part of the entire file tree that I wish to get to?
No resources consulted.
I don't think it will work, but if UNIX has some sort of measure in place then I wouldn't be surprised by that.
I don't think it will work because if you don't specify the entire file tree starting from the root, then UNIX wouldn't know for sure what you're talking about.
I'm going to try to change from two different directories, first by using the file tree from the root, and then by using only part of it.
lab46:/$ cd home/smalik2/src/cprog/Projects lab46:~/src/cprog/Projects$ cd / lab46:/$ cd src/cprog/Projects -bash: cd: src/cprog/Projects: No such file or directory lab46:/$
My hypothesis was correct, and applicable.
If you want to change directories more then one level at a time, you have to start by specifying the file system from the root (or starting from your current location).
I am trying to figure out what is wrong with the code for experiment 1, where it will randomly return an incorrect value for a base 10 to base 8 conversion.
No other resources were consulted, other than the ones from Experiment 1.
I think it's a problem with carrying over a digit, because going from base ten to base 8, base 8 requires more symbols to represent the same number as in base 10, so I may need an additional placeholder.
Try to see if I can incorporate some logic to carry over a 1.
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int number = 0; int array[4]; int count = 0; int random = 0; int result = 0; int choice; printf("This program will convert any three digit number to a different base\n"); printf("For base 8 to base 10, press 1\n"); printf("For base 10 to base 8, press 2\n"); scanf("%d", &choice); if(choice == 1) { printf("\nEnter a base 8, three digit number :"); scanf("%d", &number); printf("\nThat number will now be converted to base 10\n"); printf("\nThe number you input was: %d\n", number); for(count = 0; count <=2; ++count) { random = number%10; array[count] = random; number = (number-random)/10; } for(count = 2; count >=0; --count) { result = result + array[count]*(pow(8, count)); } printf("\nThat number in base 10 is %d\n", result); } if(choice == 2) { printf("Enter a base 10 number: "); scanf("%d", &number); printf("\nThat number will not be converted to base 8\n"); printf("\nThe number you input was: %d\n", number); for(count = 0; count <=2; ++count) { random = number%8; array[count] = random; number = (number-random)/8; } array[3] = number; printf("\nThat number in base 8 is: "); for(count = 3; count >=0; --count) { printf("%d", array[count]); } printf("\n"); } return (0); }
The problem from experiment one was that with larger numbers, the program wouldn't work. It could convert 511 to 777, but fail to convert 777 to 1411. Now it does.
lab46:~/src/cprog/MessingAround$ ./Algorithm This program will convert any three digit number to a different base For base 8 to base 10, press 1 For base 10 to base 8, press 2 2 Enter a base 10 number: 777 That number will not be converted to base 8 The number you input was: 777 That number in base 8 is: 1411
My hypothesis was correct.
It wasn't necessarily a need to carry over a one, as the number%8 always returned a value between 0 and 7 (inclusive). However, if the final number that I end with is a 1, then that means I need a 1 in the thousands place. Which was a very easy fix.
This experiment was very good at developing troubleshooting, and forcing me to think on a very logical level.
For the UNIX course I am playing around with the IRC bot phenny.
It's pretty cool, but since I had a ton of trouble with scripting, the scripting for this case study is taking me awhile to take care of.
The idea behind bots is really cool though, just whenever you need something done based on some condition, you can get a bot to do it for you. Quite neat.
In C++ this past week we worked on Project 2 and more stuff on classes and whatnot in C++. This C++ material is something I've never been exposed to before, but it makes sense if you have a very very large program and want it to be even more organized. We also dealt with header files, which are useful as they make the code less cluttered.
Regarding Project 2, it's the first thing that I had to resort to using pencil and paper to get it all organized before coding it, which I know is a good habit. Hopefully I will stay on that same track.
This past week in C++ we did a lot of playing around with inheritance and all that good stuff.
We basically build classes and functions within the classes that would run logical operations and returning the boolean values.
At first it was like hitting a brick wall, I would bet because the syntax was unlike anything I have ever seen before. It does make sense why one would want to do this however… for a large scale team effort on something, it would provide a good means for organization. But when it comes to my own programming, I can't really see myself using it unless I was working on something very big and very segmented where it would be a good advantage.
It took awhile to understand it, but once I did the actual coding was fairly smooth sailing, I've managed to create classes and functions to perform and, or, not, nor, and nand operations.
In unix I did a bunch of pattern matching and regexp stuff.
At first it was kind of hard, but once I got the syntax down it was fairly easy.
I can see how it's useful, especially in word processing and stuff. It helps you manipulate information much more quickly. Which is never a bad thing.
Type casting is basically telling the program to treat a certain entity (an int, char, whatever) using the rules of a different one.
So if we use…
int a = 3; int b = 5;
int c = a/b;
c is actually zero, because of integer division. But if we use this line instead….
int c; (float)c = a/b;
The (float) is a type cast to c, telling the program to treat c as a float, which would ensure that it stores a 0.6 instead of a 0.
Needs #include <iostream>
cout produces output ~ printf cin provides input ~ scanf cerr is just the error output stream operators are things such as setf() and setw() which held you do different things with the stream.
int a=1 int b=2
printf(“a is %d, b is %d\n”, a, b); cout « “a is ” « a « “,b is ” « b « endl;
scanf(“%d”, %a); cin » a;
cerr « “Error, yo” « endl;
Stream operator in use: cout « setw(5) « a « “ sheep are sleeping.” « endl;
Header files are basically files that contain class and function 'prototypes'. It basically will let the program know that there is a class or function which is named something, and the types of parameters and return type it has. Local Header files are the ones that tend to be user made, or could get pulled in from another source I suppose. System header files are the ones that are in the system.
The C Standard Library has a bunch of the most common and useful C header files I would guess, such as stdio for input and output capabilities.
Libraries in C contain all of these functions and whatnot in them.
To call a system header
#include <stdio>
To call a local header
#include “nor.h”
Arithmetic is the way that we can manipulate data. Equations would set some value equal to something else, while operators can compare values.
To assign a value to a variable using an equation:
Density = 50*8/13;
To compare using an operator:
if (Density < 100) { printf("Wow") }
Scope is basically the region of the program in which a declared variable will exist. Block would mean the scope is in regards to the set of brackets you're in. Local would mean within a function. Global would mean within an entire file of code. File would (I assume) mean between files. Although how to do this I do not know.
if( x>3) { int Q = 5; // Q only exists within this if statement } int Sum1(int num1, int num2) //these two integers are only defined within this function! { return (num1 + num2) } int x; //this variable will be defined throughout the entire file, regardless of functions and whatnot. int main() { x = 4 }
Functions are basically isolate segments of code that can do certain things based on Parameters that you pass them. It saves a lot of coding, for example, to have a function that you just send different values of length and width to calculate the area of 50 squares is much easier than actually writing the code to do 50 different areas.
Return Types are the variable type that the function will be returning- in the case of the area function, we would probably want to return a float value.
Recursion is basically when a function calls itself within itself, with some end terminating condition. We haven't covered it in class yet though.
Command-line arguments are when you pass parameters to the main function of the program.
There are some great examples of functions in Project 1 and Project 2. Everything is used except Recursion.
Overloading a function is to use the same function name for multiple functions, with the difference being the parameters passed to the function.
Let's say we want to write a program that will calculate areas. Rectangles, Squares, and Circles. We'll overload a function to do this.
int Area(int); //for the square float Area(float, float); //for the rectangle float Area(float); //for the circle
These functions will actually work, and depending on the parameters that we send, it will either call the one meant for squares, rectangles, or circles!
Inheritance is how classes can inherit the stuff from the public and protected part of their 'parent' class. Multiple Inheritance is when there are multiple layers going on.
To see an excellent example of inheritance, over multiple files, in my directory… /home/smalik2/src/cprog/c++
There is a multifile program using classes and inheritance and multiple inheritance.
break down and separate code into functions and illustrate the use of parameter passing
If you need to write a huge long program that does multiple things, that are similar to one another, this will be the capability to recognize the need for and be able to split the program apart into functions, so that code repetition is minimized and the code is more efficient.
If I start doing what I said in the definition. Which I believe I already do fairly solidly. In Project2 we continuously printed arrays, so I actually just made a function that would print an array given the array name and the length of the array.
I did a lot of this in Project 2.
I just did it. There's always room for improvement, but it is not desperately needed. There's not really a way to enhance checking to see if you can do it. I think the objective is stated nicely.
Tab completion is being able to auto-complete typing a command by hitting tab.
If you have a program called thebiggestnumberis, and you want to execute it, you would type ./thebiggestnumberis
But using tabcompletion you can just type ./thebi [hit tab] and it will automatically fill it.
If there is another program in the directory that is called thebiggestloseris, then this won't work because there are possible combinations. you will have to type out even more of the program name before the tab completion will work.
The wildcard is the * in unix, and basically means (anything or whatever can do here).
lab46:~/src/unix/Labs$ ls la ls: cannot access la: No such file or directory lab46:~/src/unix/Labs$ ls la* lab0.txt lab1.txt lab2.txt lab3.txt lab4.txt lab5.txt lab6.txt lab46:~/src/unix/Labs$
See how the wildcard enabled the ls command to actually work.. and it gave all names that began with the la[insert anything here]. Cool.
Job control is basically multitasking. It gives you the power to perform actions and run them in the background, leaving you free to do whatever else you want. It also allows you to kill these other processes.
We can display current running processes with ps
We can tell a command to run in the background by adding a & to the end of the command. Running fg #(process number) will bring that thing back to the foreground.
You can also use kill commands to kill the process, or using ctrl + C
The UNIX shell is the way that the user uses the OS, called a Command Line Interpreter (CLI).
The shell is the command prompt. Whoa!
An Environment variable is basically a thing that stores some useful piece of information. An example would be how $HOME holds the users home directory.
lab46:~$ echo $PATH /home/smalik2/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games lab46:~$
The $PATH variable holds the locations of executable programs.
smalik2@lab46:~$ echo $PATH /home/smalik2/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games smalik2@lab46:~$ ls /usr/games adventure caesar gomoku nethack primes snake worms arithmetic canfield hack nethack-console quiz snscore wtf atc cfscores hangman number rain teachgammon wump backgammon countmail hunt phantasia random tetris-bsd battlestar cribbage mille pig robots trek bcd dab monop pom rot13 wargames boggle go-fish morse ppt sail worm smalik2@lab46:~$
Based off this, we can see that /usr/games is in $PATH. I ran ls on that directory, and sure enough, the games listed there can be run as commands from my home directory.
The UNIX programming environment is basically just the ability to create programs using a UNIX operation system.. doesn't seem like there's much else to it.
I see shell scripting as 'programming' commands. You make a file and basically use bash to 'code' a series of commands and whatnot that the shell will run if you run the file.
echo enter your birth year read birthyear currentyear=$(date +%Y) let birthyear=$currentyear-$birthyear echo $birthyear
smalik2@lab46:~/src/unix/scripts$ ./age.sh enter your birth year 1993 19 smalik2@lab46:~/src/unix/scripts$
The ability to accomplish/automate tasks.
Given a problem, one would be able to carry out the solution. Or be able to write a script to automate tasks to accomplish the goal - solving the problem.
How easily I can do the labs.
Normal stuff I can take care of reasonably easily. When it comes to scripting however, I have difficulty. It isn't impossible for me though.
I can solve problems pretty effectively, especially with the help of google. Scripting was very difficult for me to get a grasp on, but now I am moderately comfortable with it. Overall I think I am pretty good at accomplishing/automating tasks - I would give myself a B in my capability.
I'm not trying to answer a specific question, but the goal of this whole thing is to figure out all that inheritance stuff in C++ using the 'project' that Haas proposed to us in class. Of making a program that will perform and, or, not, nand, nor, etc.
All the stuff that we've done in class.
The result will be a working program that will perform various logic functions using boolean values, and
Working on coding the program.
So far I have classes and inheritance working for and, or, and not. I have multiple inheritance applying to nor and nand working right now. I believe the only thing left is XOR.
All the files are in /home/smalik2/src/cprog/c++
It's working well, the main obstacle was the syntax behind it all, as it is unlike anything I have ever seen.
When the material was originally taught, I understand the concept behind it but not how to do it. Now I have a very in depth understanding of it and how to utilize it.
In Case Study B for Unix/Linux, we were having fun with the dd command. At one point in the lab, Mason and I were combining our problem solving ability to tackle some of the more difficult questions, one of them being to add 17 bytes of information to the end of an 8kB file. We are supposed to pull JUST THOSE 17 BYTES from the file, using dd.
Eventually, Mason came up with the proposed spell: dd if=test.file ibs=c count=8017 skip=8kB of=testA.file Which worked beautifully.
It occurred to me that the count=8017 might be redundant, because the full file size is 8017 anyway - why would dd default to anything else?
So, my question is: would that command still work if we didn't specify count? I'm betting yes.
None really, except maybe:
man dd
Oh I kind of already did this in the question section. I'm betting that the command will still work if we don't specify count, because count in that case was the full file size anyway.
Do it with count, check result. Reset. Do it without count being specified, check result.
lab46:~$ dd if=test.file ibs=c count=8017 skip=8000 of=testA.file 17+0 records in 0+1 records out 17 bytes (17 B) copied, 0.0441264 s, 0.4 kB/s lab46:~$ cat testA.file more information lab46:~$ dd if=test.file ibs=c skip=8000 of=testB.file 17+0 records in 0+1 records out 17 bytes (17 B) copied, 0.0454818 s, 0.4 kB/s lab46:~$ cat testB.file more information lab46:~$
Yes, I was right. It still worked. Same result. Ohhhh I love being right. There were no shortcomings in any way, and my hypothesis was nicely applicable. Very smooth experiment.
When using dd, the count argument need only be used if you need to stop copying before you reach the end of the file. For example, in a 50 byte file, let's say you need bytes 3-18.
dd if=input.file ibs=c skip=3 count=15 of=output.file
Perform the following steps:
http://lab46.corning-cc.edu/opus/spring2012/jcavalu3/start#experiment_1 Josh Cavaluzzi
What would be printed if I replace the %u with the $d for an unsigned integer?
* Do you feel the given resources are adequate in providing sufficient background information? Yes * Are there additional resources you've found that you can add to the resources list? Not particularly, it's a pretty simple concept that can be easily surmised. * Does the original experimenter appear to have obtained a necessary fundamental understanding of the concepts leading up to their stated experiment? Yes. * If you find a deviation in opinion, state why you think this might exist. I agree with everything stated.
Hypothesis: I believe that the printed value will be the same ONLY if it is within the range of the signed integer data type. Ex. If the user inputs a value between 0 and 2,147,483,647, then it should print out fine, but if the value is greater than that range, then the value will “roll over” to the next integer in the signed integer data type, which would make the value a negative number. Due to the data type only covering positive numbers (unsigned integer), it can go to larger numbers in the 4 bytes it is given for memory, but if it is printed as a signed integer, then it will only be able to print out half of the positive integers that it could as an unsigned integer, so it will go back over into the negative numbers until it satisfies the amount of digits it has.
Yes
None.
Yes
Not realy. * Would you make any alterations to the structure of the experiment to yield better results? What, and why? Nope.
Publish the data you have gained from your performing of the experiment here.
I used his code and got the exact same results.
Answer the following:
Answer the following:
Nope
I'm currently doing Unix Case Study B (still a little behind, but catching up quickly!).
The first part has us using the dd command. I found this funny because over the past month I've picked up this habit of flashing different cell modems on my phone. In order to flash them, I have to connect to my phone using the android debugging bridge (which let's me set up a shell on my phone, accessed through my computer), and then use dd to data dump the data in the cell modem files into the proper related phone directories.
It's important because well, I've used it for tasks before. Being able to use this tool is pretty helpful. It allows me to grab parts of files and put them separately, or move parts of files into other files etc.
Just a fun little thing.
For the past couple of days I've been doing Lab B for unix. I really like having this newfound power to go through files and sort them and do searches and getting what I want out of the files. Very empowering feeling. I like it so much that writing the scripts for this lab are semi enjoyable, until I run into a huge block (like I am right now) that I can't for the life of me figure out.
It's really important to have this ability because when it comes to information manipulation, this ability is absolutely essential. The lab has some pretty excellent examples of uses, ending with scripts that automate the process so that you can just type in a command with some arguments and get masses of data from an html file.
Last night.. or rather earlier this morning, I complete Project 3. Because I love doing things in a timely manner.
Despite the negative Karma, I believe the fact that I made the arrays dynamically allocate themselves so that the answers printed are the TRUE values, instead of being cut off, was well worth the delay.
Once I had the core of the program finished (had it in one gigantic .c file) and working, I had only met 2/3 of the Projects requirements. Now I needed to split up the C source into a multifile version, C++ class based version, and C++ class based multifile version.
Thanks to all the work I put into the class based ,logic gate, C++ multifile program, doing the above was a sinch.
Even though I was half asleep and feeling quite dead after a long day (it was one in the morning) finishing the project was quite effortless. Other than having to look at my logic program for syntax, I already knew precisely what to do. :) It was quite nice, and it's good to be able to do that. Splitting a program into multiple files - even without doing a class based approach - makes the program much more organized.
Classes would make it even more organized: but it is better for longer programs, and the entire structure and gameplan has to be well thought out beforehand. The 'just sit down and spit it out' method doesn't work as well anymore.
The semester is rounding up, and I can't wait to continue taking courses next semester. I've learned a lot.
In regards to unix/linux, I really appreciate how well I know the system now. I know I'm not even near towards being a master at it, but the bit that I do now know has made everyday menial tasks much easier. I've even started writing scripts to do stupid little things. I wrote one that turns off my screen using a keyboard shortcut, and one that allows me to change the # of workplaces in ubuntu.
The code for these I majorly got online, I didn't know that stuff off the top of my head. But I then took that code and put it into scripts, so that should I ever need to use it again I could, quite easily. It's pretty cool. My multitasking productivity has gone up nicely because of it.
Namespaces are basically ways to create global variables, but with a sort of 'subscope' type of feeling. Basically, let's say you have the variable of 'health'. You have the health of your character and the health of a creature. Well, you can't use the same health for both. This is where namespaces come in - we can define your health under the namespace 'Character' or something, and the health of the creature under the namespace of 'Creature'. To call health, you need to specify the namespace::health now - ensuring that there is no mix up with the different healths.
The above paragraph is a pretty good example, but I'm going to put down some super basic code just to get the syntax on here.
#include <stdio.h> #include <stdlib.h> #include <time.h> namespace Character { int health=100; int combat; long long int gold; } namespace Creature { int health=25; int combat; long long int gold = 7; } int main() { printf("Do you wish to enter combat with 'Creature'?\n\n0 for no\n1 for yes\n"); scanf("%u", &Character::combat); if (Character::combat == 0) { printf("Have a nice glory-free day.\n"); return 0; } do { if(Character::combat == 1) { Creature::combat=1; } else { Creature::combat=0; } Creature::health=25; while((Character::combat==1) && (Creature::combat==1)) { Character::health = Character::health - 3; Creature::health = Creature::health - 7; if (Creature::health <= 0) { Character::gold = Creature::gold + Character::gold; printf("You killed 'Creature'.\nYou received %llu gold.\nYou have %u health remaining", Creature::gold, Character::health); printf("\nYou now have %llu gold\n", Character::gold); break; } if (Character::health <= 0) { printf("You have died.\n"); return 0; } } printf("Do you wish to fight another creature? 0 for no 1 for yes\n"); scanf("%u", &Character::combat); } while(Character::combat==1); printf("You have fled from combat.\n"); return 0; }
Alternatively (or additionally), if you want to demonstrate something on the command-line, you can do so as follows:
lab46:~/src/cprog/messingaround$ ./Namespaces Do you wish to enter combat with 'Creature'? 0 for no 1 for yes 1 You killed 'Creature'. You received 7 gold. You have 88 health remaining You now have 7 gold Do you wish to fight another creature? 0 for no 1 for yes 1 You killed 'Creature'. You received 7 gold. You have 76 health remaining You now have 14 gold Do you wish to fight another creature? 0 for no 1 for yes 1 You killed 'Creature'. You received 7 gold. You have 64 health remaining You now have 21 gold Do you wish to fight another creature? 0 for no 1 for yes 1 You killed 'Creature'. You received 7 gold. You have 52 health remaining You now have 28 gold Do you wish to fight another creature? 0 for no 1 for yes 1 You killed 'Creature'. You received 7 gold. You have 40 health remaining You now have 35 gold Do you wish to fight another creature? 0 for no 1 for yes 1 You killed 'Creature'. You received 7 gold. You have 28 health remaining You now have 42 gold Do you wish to fight another creature? 0 for no 1 for yes 1 You killed 'Creature'. You received 7 gold. You have 16 health remaining You now have 49 gold Do you wish to fight another creature? 0 for no 1 for yes 1 You killed 'Creature'. You received 7 gold. You have 4 health remaining You now have 56 gold Do you wish to fight another creature? 0 for no 1 for yes 1 You have died. lab46:~/src/cprog/messingaround$
Functions are basically blocks of code that are run when called, and can be given inputs (parameters). You can pass parameters by value (just give it the identifier), Address (using the & symbol), and by Reference (by pointers, for passing an array).
Functions can return values of different types, whether they be int, float, etc.
Recursion is when you call a function within a function, with a conditional break.
#include<stdio.h> #include<stdlib.h> int sum(int, int, int, int); //function prototype int main() { int a,b,c,d; a=b=c=d=0; printf("\nEnter four numbers\n"); scanf("%d%d%d%d", &a, &b, &c, &d); printf("The sum of %d, %d, %d, and %d is: %d\n", a,b,c,d, sum(a, b, c, d)); return (0); } int sum(int a, int b, int c, int d) { int SUM; SUM = a + b + c + d; return (SUM); }
Alternatively (or additionally), if you want to demonstrate something on the command-line, you can do so as follows:
#include <stdlib.h> #include <stdio.h> int main(int argc, char **argv) { unsigned char i; if(argc < 2) { printf("%8s must be run with 1 or \ more arguments, you only provided %hhu\n", *(argv+0),(argc-1)); exit(1); } printf("You ran this program with %hhu arguments, they are:\n", argc); for(i=0; i<argc; i++) { printf("argv[%hhu]: %s\n", i, *(argv+i)); } return(0); }
Templates are kind of like function overloading. Except, you do the SAME THING given different parameters.
The STL is basically a library just filled with tons of templates to do stuff.
#include <stdlib.h> #include <stdio.h> #include <cstdio> #include <iostream> using namespace std; template <class T> //The T will basically be replaced by whatever T larger (T x, T y) //data type is necessary { if (x >= y) { return x; } else { return y; } } int main() { int a = 1200, b = 12; float c = 3.1415, d = 143.24; char e = 65, f = 'B'; cout << larger(a,b) << endl; cout << larger(c,d) << endl; cout << larger(e,f) << endl; return 0; }
lab46:~/src/cprog/messingaround$ ./Template 1200 143.24 B
Classes are wonderful little things good for organizing larger scale programs.
Objects are the things in the class, functions or variables or constants or friends, etc. Constructor is what runs when the class is being set up for usage. Optionary. Destructor is what runs when the class is deleted. Optionary. Access Control refers to the Public Protect and Private deal going on.
Public - Anybody can access this part. Protected - Only children can access this part (children are other classes that inherit from this class). Private - Only this class can access these parts. Friends - Allow you to rip through Access control, and access private parts from outside the class they belong to.
“This” pointer - When you make a new class to call and define it as a pointer, you have to use → to refer to it instead of a period.
There's two class-based programs in
cd /home/smalik2/src/cprog/c++
Also, Project 3.
The compiler takes your source code and translates it to assembly language.
The preprocessor deals with taking care of stuff before the actual compiling begins.
Flags are the command line arguments to the compiler, such as -02.
Assembler takes the assembly code (step 1 of compiling) and converts it into true machine code.
The Linker takes care of making sure that stuff from other libraries and header files and stuff will work correctly and be there.
Multi-file programs are programs made over multiple files.
I'll compile a multi-file program here.
lab46:~/src/cprog/c++/today$ ls main.cc rectangle.cc rectangle.h shape.cc shape.h square.cc square.h triangle.cc triangle.h lab46:~/src/cprog/c++/today$ g++ -c *.cc lab46:~/src/cprog/c++/today$ ls main.cc rectangle.cc rectangle.o shape.h square.cc square.o triangle.h main.o rectangle.h shape.cc shape.o square.h triangle.cc triangle.o lab46:~/src/cprog/c++/today$ g++ -o Program *.o lab46:~/src/cprog/c++/today$ ./Program 1 for Rectangle 2 for Square 3 for Triangle 2 You chose square. Enter the width/length: 12 The perimeter is: 48 The area is: 144 Einen schönen Tag noch, Ruck. lab46:~/src/cprog/c++/today$
Type Casting is basically converting some type of data into another type. Const is a keyword that means that the type can not be changed. Volatile is a keyword that means you can modify using some tricks.
We didn't really go into this in class, except for when we used arrays.
When we used malloc to create an array, we were type casting it so that the memory we gave to the array would behave properly - according to the data type that we wanted for the array.
float *Array; Array = (float*)malloc(sizeof(float)*50); //(float*) is a type cast.
A typedef basically let's you take something, and create a shortcut for it. This shortcut now represents what you originally typedef, and the two can be used interchangeably. An enum is a data type that consists of named values. A union is kind of like a struct, where it holds a bunch of different types of data. The trick is, you can only have one type of data in it at a given time. Assigning new data, overwrites the old data.
There's a typedef in the EoCE. There's an enum and union in my cprog folder.
Structures are basically The C version of classes. They are heterogeneous data types, and can hold multiple things. Functions and data types. They are really good and useful for organization oriented stuff.
On the EoCE there is a lot of strcuture stuff on 0x6 and 0x7.
justify the use of various programming constructs within code solutions
This objective means being able to build a solution for a problem using some sensible approach. On top of that, you outta be able to come up with very sound reasons for your approach. (Why did I use classes to do this? For example).
I can judge how well I organize my code, and whether or not my methods make sense/ are good.
I normally take a very good approach in how I organize and construct my solutions to problems, so I figure I do a pretty decent job of it.
The compiler takes the code and translates it into assembly code.
The assembler takes the assembly code and translates it into machine code - the resulting file being an object file.
The linker looks at the object file (which is linked to other object files and libraries, like the stuff from stdlib etc) and figures out how it all comes together, and assign memory locations to everything.
When it comes to load time, the loader creates a process and basically sets everything up for your program to run, and then launches into the instructions of your program.
It's possible to do these steps one at a time instead of letting gcc / g++ do it all for you. But it's rather painful.
g++ -c *.cc → will give you .o object files. These are compiled and assembled, so they are in machine code.
g++ -o Program *.o → This will link those object files, and give you a running program. yay!
Source Code is the file that contains the code that you wrote.
Object Code is the file that contains the machine code, after the compiler and assembler are done with it.
Binary Code is the file that contains the machine code, and has been linked.
A library is a file that you can link to that contains many functions. There are math libraries, and then the standard libraries, etc.
We start with c source code files.
Then we translate them into object code files.
Then we finally link it all into a binary code file.
The last step also takes care of attaching the libraries I used and stuff.
lab46:~/src/cprog/projects/CProject2$ ls Arrays.c Functions.h Math.c Project2Monolithic.c lab46:~/src/cprog/projects/CProject2$ gcc -c *.c lab46:~/src/cprog/projects/CProject2$ ls Arrays.c Arrays.o Functions.h Math.c Math.o Project2Monolithic.c Project2Monolithic.o lab46:~/src/cprog/projects/CProject2$ gcc -o Program *.o lab46:~/src/cprog/projects/CProject2$ ls Arrays.c Arrays.o Functions.h Math.c Math.o Program Project2Monolithic.c Project2Monolithic.o lab46:~/src/cprog/projects/CProject2$
Pattern matching is the ability to find things that you're looking for, by using patterns to search for them.
Compiling a multifile program using patterns, instead of typing out a bunch of different file names.
lab46:~/src/cprog/c++/today$ ls main.cc rectangle.cc rectangle.h shape.cc shape.h square.cc square.h triangle.cc triangle.h lab46:~/src/cprog/c++/today$ g++ -c *.cc lab46:~/src/cprog/c++/today$ ls main.cc rectangle.cc rectangle.o shape.h square.cc square.o triangle.h main.o rectangle.h shape.cc shape.o square.h triangle.cc triangle.o lab46:~/src/cprog/c++/today$ g++ -o Program *.o lab46:~/src/cprog/c++/today$ ./Program 1 for Rectangle 2 for Square 3 for Triangle 2 You chose square. Enter the width/length: 12 The perimeter is: 48 The area is: 144 Einen schönen Tag noch, Ruck. lab46:~/src/cprog/c++/today$
Regular Expressions, or RegEx, are algorithms that will match something.
By using these, you can search for, let's say, any word in a txt file that contains the gerund 'ing'.
It's pretty powerful stuff.
I have a file with a bunch of courses. Let's say I only want the Shortcut version (like, BUSN 0003 and FYEX 1000).
I can pipe the output through egrep which uses RegEx to match up to what I want.
The hard part, is coming up with the RegExp.
lab46:~/src/unix/courselist$ cat test.file HIPAA - 77017 - BUSN 0003 - 001 Computer Keyboarding - 77015 - BUOT 1061 - 001 Word Processing for Non-Major - 77016 - BUOT 1062 - 001 Intro Graphical User Interface - 77002 - CSST 1031 - 001 OSHA Special Topics (30ct hr) - 77011 - ENVR 0030 - 001 Natural Gas Equipment Oper - 77014 - ENVR 0072 - 001 First Year Experience - 77005 - FYEX 1000 - 001 First Year Experience - 77004 - FYEX 1000 - 002 BasicLifeSupport-Prof. Rescuer - 77006 - HLTH 1010 - 001 BasicLifeSupport-Prof. Rescuer - 77007 - HLTH 1010 - 002 American History II - 77020 - HIST 1120 - 001 Achievement Motivation - 77021 - HUSR 1000 - 001 Care.&Aging Issue-Healthy Func - 77029 - HUSR 1411 - 001 Caregiving&Aging Issues-Common - 77030 - HUSR 1412 - 001 Lean Special Topic (24cnt) - 77012 - LEAN 0024 - 001 LEN Special Topic (57 cnt hr) - 77027 - LEN 0057 - 001 Excel Advanced Workshop - 77025 - EXCL 0004 - 001 Intro. to MasterCam Design - 77026 - MCAM 0113 - 001 Structures of Mathematics I - 77028 - MATH 1110 - 001 Medical Terminology - 77013 - MEDT 0030 - 001 Nurse Aide/Home Health Aide - 77022 - MDNC 0315 - 001 Child Abuse Recognition - 77023 - PDEV 0011 - 001 Child Abuse Recognition - 77024 - PDEV 0011 - 002 Child Psychology - 77010 - PSYC 2207 - 001 Abnormal Psychology - 77009 - PSYC 2215 - 001 Cross-Country Skiing (co-ed) - 77018 - RECC 1014 - 001 Wilderness Navigation - 77019 - RECC 1015 - 001 Introduction to Sociology - 77003 - SOCI 1010 - 001 The Vegetarian Adventure - 77008 - WELL 1011 - 001 lab46:~/src/unix/courselist$ cat test.file | egrep -o '[A-Z]?[A-Z]{3} [0-9]{4}' BUSN 0003 BUOT 1061 BUOT 1062 CSST 1031 ENVR 0030 ENVR 0072 FYEX 1000 FYEX 1000 HLTH 1010 HLTH 1010 HIST 1120 HUSR 1000 HUSR 1411 HUSR 1412 LEAN 0024 LEN 0057 EXCL 0004 MCAM 0113 MATH 1110 MEDT 0030 MDNC 0315 PDEV 0011 PDEV 0011 PSYC 2207 PSYC 2215 RECC 1014 RECC 1015 SOCI 1010 WELL 1011 lab46:~/src/unix/courselist$
Filtering is basically a program that gets data from standard input and then writes results to standard output. Like running grep on the cat from a file.
So, cat on a file outputs that files contents to standard output. If I pipe this to grep, grep will accept that standard input (that was output from cat) and then return it's answer to standard output.
Here we are printing a .html file to standard output, finding all the instances of CSCS, and then counting how many times that CSCS appears.
lab46:~$ cat fall2011-20110417.html | grep -o 'CSCS' | wc -l 51 lab46:~$
We never really went into networking with UNIX. It's such a broad topic that I don't really know how to get into it either.
In UNIX/Linux the way that the system is set up provides good security by itself.
Since all files have permissions, just setting up the system to provide the correct permissions to the correct users ensures that the wrong people can't get their hands on files they shouldn't.
Taking advantage of the root-group-owner permission system is a great way of providing security in a multi-user system.
On top of it all, UNIX/Linux systems don't really have many viruses to begin with. All the viruses created target Windows and occasionally OS X.
The X Window System is a software system that provides a GUI basically.
It has a very strong UNIX/Linux philosophy operating behind it.
It's designed to accept added functionality, and leaving it up to the user to determine what they want to do with it.
understanding and use of pattern matching
It's pretty straight forward. This means that we can use tools like grep, or even understand the syntax for searching for patterns instead of specifics using things like ls
How well I utilize regexp.
After struggling through the labs related to pattern matching and regexp and grep and all that good stuff, I feel pretty confident in my ability to use patterm matching.
If I have a double pointer, to pass a value to it from scanf do I have to dereference the double pointer only once? (That would make it 'referenced' by one layer, in my mind).
Don't really need resources, it's a straightforward test.
I think it will work because I ran into something similar doing project4. I had an array and was using scanf to fill it, so it was a single pointer. To use scanf, I just called the name. No dereference or anything.
I'm going to write a simple program. Make a double pointer and see if I can scanf and print the value the way I believe it will work.
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 int **numbers; 7 8 *numbers = (int*)malloc(sizeof(int)*1); 9 10 printf("HEY!!! Enter a number. Please? :)\n"); 11 12 scanf("%d", *numbers); 13 14 printf("\nHEY!!! The number you entered? Yeah. It should be %d.\n", **nu mbers); 15 16 return 0; 17 }
lab46:~/src/cprog/messingaround$ ./scanfdoublepointer Segmentation fault lab46:~/src/cprog/messingaround$
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.
Well, no matter what, I keep getting a segfault. I'm guessing that this would mean my hypothesis was incorrect.
I wonder what would happen if I tried to chmod using permissions like 888, or something like that.
Nothing was consulted.
I'm betting that it either doesn't work, or it defaults to 777 or something.
I am going to try it out and see what happens.
lab46:~/src/unix/scripts$ ls age.sh csd.sh firstforloop.sh guess1.sh mail.sh script2.sh botstart.sh files firstlist.sh histogram.sh script1.sh lab46:~/src/unix/scripts$ chmod 888 age.sh chmod: invalid mode: `888' Try `chmod --help' for more information. lab46:~/src/unix/scripts$ chmod 10292 guess1.sh chmod: invalid mode: `10292' Try `chmod --help' for more information. lab46:~/src/unix/scripts$ chmod 77 age.sh lab46:~/src/unix/scripts$ ls -lh age.sh ----rwxrwx 1 smalik2 lab46 120 Mar 8 11:45 age.sh lab46:~/src/unix/scripts$ chmod 777 age.sh lab46:~/src/unix/scripts$
Based on the data collected:
Chmod doesn't work if you provide something higher than a 7, or longer than 3 digits.
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: