Selection Structures (if, case/switch)
A selection structure allows the program to respond differently depending on users input. For example if the user is prompted a question responds “yes” a certain action is taken. On the other hand if the user responds “no” the program then goes to a part of the code the exit. A common way to set up the program to respond to input is to use the IF, or and switch statements.
The IF statement
int main() { int num; printf("enter and number between -10 and 10: "); scanf("%d", &num); if (num > 0) printf("%d is a positive number\n", num); return (0); }
lab46:~/src/cprog/classproject$ ./ex15.out enter and number between -10 and 10: 10 10 is a positive number
The IF and Else statement
#include <stdio.h> int main() { int i = 6; if (i > 1) printf("We have\n"); if (i > 10) printf("nice amount\n"); else printf("not big enough\n"); if (i == 5 ) { printf("only got 5\n"); } else if(i == 6 ) { printf("just right\n"); } }
lab46:~/src/cprog/classproject$ ./ex17.out We have not big enough just right
Repetition/Iteration Structures (for, while, do while)
The Repetition/Iteration Structures, also known as loops, allow the program to go through a self check to determine if it should continue the executing the program.
#include <stdio.h> int main() { int loopCount; printf("enter loop count: "); scanf("%d", &loopCount); while(loopCount > 0) { loopCount = loopCount -1; printf("only %d loops to go\n", loopCount); } return (0); }
enter loop count: 12 only 11 loops to go only 10 loops to go only 9 loops to go only 8 loops to go only 7 loops to go only 6 loops to go only 5 loops to go only 4 loops to go only 3 loops to go only 2 loops to go only 1 loops to go only 0 loops to go
Arrays (standard notation, pointer arithmetic, single-dimensional, multi-dimensional)
An Array is setting up place holders for values. A good way to see this is if you picture an excel spreadsheet. You have a column and a row. The Array sets the number of columns and the number of rows. This allocates memory blocks to be used by the program. When you add more rows you are adding dimensions to the array.
That standard notation for an array is;
int array[SIZE] = {Column pointer,… ,…, etc..};
Single dimensional array
#include <stdio.h> #define SIZE 5 int main() { int array[SIZE] = {4, 5, 6, 7, 8}; int i; for (i= 0; i < SIZE; i++) { printf("%d\n", array[i]); } return 0; }
lab46:~/src/cprog/classproject$ ./ex19.out 4 5 6 7 8
File Access (Read, Write, Append)
File access is when the program gets information from a file or produces an output to a file. This can be helpful in many ways. For example. With our encoding program we took input from a file converted it and then output the results to a file.
Commands used fgetc fprintf
int main() { FILE *in; char *c, fname[] = "message.in"; int i; int *input[255]; printf("Do you want to encrypt the file: "); scanf("%d", input); if (*input == 'y' || *input == 'Y') { c = fgetc(in); while(c != EOF) { if((c >=65) && (c <= 'Z')) c++; else if((c >= 'a') && (c <= 'z')) c++; if((c == ('Z' + 1)) || (c == ('z' + 1))) c = c - 26; fprintf(stdout, "%c", c); c = fgetc(in); } } else if (*input == 'n' || *input == 'N') { c = fgetc(in); while(c != EOF) { if((c >=65) && (c <= 'Z')) c--; else if((c >= 'a') && (c <= 'z')) c--; if((c == ('Z' + 1)) || (c == ('z' + 1))) c = c - 26; fprintf(stdout, "%c", c); c = fgetc(in); } } fclose(in); return (0); }
Structures (Declaration, Accessing Elements, Pointers to)
Structures are a collection of variables. They are grouped together into a single thing and proved a way of keeping data and needed elements together.
Basic Syntax
Structure Declaration: struct struct-name{ type field-name; type field-name; … };
#include <stdio.h> struct color { int id; char *name; float percentage; } black, blue, red; int main() { struct color st; black.id=1; blue.name = "fav"; red.percentage = 90.5; printf(" Id is: %d \n", black.id); printf(" Name is: %s \n", blue.name); printf(" Percentage is: %f \n", red.percentage); return 0; }
lab46:~/src/cprog/classproject$ ./ex20.out Id is: 1 Name is: fav Percentage is: 90.500000
typedef, enum, union
typedef or type define allows you to declare one type of integer as another type. When you declare this definition the name is has been “enum”.
For example of the enum typedef enum x{1, 2} Value; int main() { Value data = 20; if (data == BLACK) { //etc. } } This example defines the integer aaa, bbb and ccc and sets them as arrays. typedef int aaa, bbb, ccc; typedef int aaa[15], bbb[9][6], ccc[2]; This example sets char to have a double place value. typedef int (*char)(double);
Functions
A function is a relation between inputs and outputs. It will return a value for use within the program. A function lists the statements that is executes.
For example the function
result = power(val, pow);
This calls the function powers and assigning the return value to variable results.
Syntax
return-type function-name ( argument) { local-declarations statements return return-value; }
void exchange(int a, int b) { int temp; temp = a; a = b; b = temp; printf(" From function exchange: "); printf("a = %d, b = %d\n", a, b); }
Compiler, Preprocessor, Flags, Assembler, Linker, Multi-file programs (how to structure, how to compile)
Compiler The compiler translate high-level languages programs into assembly language.
Assembler
The assembler converts assembly language into object files. These contain a combination of machine instructions. They also convert decimal numbers in to programmer binary.
Linker
The linker merges the object files and creates the executable file. It has basically three tasks; searched the program to find routines, determine memory locations and resolves reference among the files.
Loader
The loader is the part of the OS that takes the executable file and brings it out in the open and starts running it.
Source file => Assembler => Object File \ Source file => Assembler => Object File ---> Linker ---> Executable File Source file => Assembler => Object File / | library
Break down and look at the source code for a game.
Find the source code for any game that is written in C. In my own words explain what the code does and how it performs the desired tasks.
Completion comes from the written explanation.
There are many sources for code out there. I found a code for a battleship program written by Michael Margues.
URL: http://www.cprogramming.com/cgi-bin/source/source.cgi?action=Category&CID=2
The code is long enough to wrap around my house. So I will be taking some highlights and working through the general structure of the program.
(1) The code includes the conio.h file that is part of the DOS world. It allows the creation of text user interfaces. From this point it then declares three main voids. Mike takes and int's the lengths of the boats by allocating each part of the boat to declaration. He then uses chars to create and array that is used at the board. This serves as a very creative way to tie the required game play to the text output world.
#include <stdio.h> #include <conio.h> #include <stdlib.h> void checkShips(); void quitGame(); void targeting(); int check[128]; int target, hit = 0, i; int airpone, airptwo, airpthree, airpfour, airpfive; int destroypone, destroyptwo, destroypthree, destroypfour; int battlepone, battleptwo, battlepthree; int subpone, subptwo, subpthree; int patrolpone, patrolptwo; char rowone[50] = "11 12 13 14 15 16 17 18\n"; char rowtwo[50] = "21 22 23 24 25 26 27 28\n"; char rowthree[50] = "31 32 33 34 35 36 37 38\n"; char rowfour[50] = "41 42 43 44 45 46 47 48\n"; char rowfive[50] = "51 52 53 54 55 56 57 58\n"; char rowsix[50] = "61 62 63 64 65 66 67 68\n"; char rowseven[50] = "71 72 73 74 75 76 77 78\n"; char roweight[50] = "81 82 83 84 85 86 87 88\n"; char e; int airponetwo, airptwotwo, airpthreetwo, airpfourtwo, airpfivetwo; int destroyponetwo, destroyptwotwo, destroypthreetwo, destroypfourtwo; int battleponetwo, battleptwotwo, battlepthreetwo; int subponetwo, subptwotwo, subpthreetwo; int patrolponetwo, patrolptwotwo; char rowonetwo[50] = "11 12 13 14 15 16 17 18\n"; char rowtwotwo[50] = "21 22 23 24 25 26 27 28\n"; char rowthreetwo[50] = "31 32 33 34 35 36 37 38\n"; char rowfourtwo[50] = "41 42 43 44 45 46 47 48\n"; char rowfivetwo[50] = "51 52 53 54 55 56 57 58\n"; char rowsixtwo[50] = "61 62 63 64 65 66 67 68\n"; char rowseventwo[50] = "71 72 73 74 75 76 77 78\n"; char roweighttwo[50] = "81 82 83 84 85 86 87 88\n";
(2)With everything set up for play he outputs the game board and begins getting the users input to establish the set up. This is setting data into each allocated spot on the board.
printf("Battle Ship\nBy Michael Marques\n"); printf("These are the posible positions: \n"); printf("11 ,12 ,13 ,14 ,15 ,16 ,17 ,18\n"); /* Displays posible ship positions */ printf("21 ,22 ,23 ,24 ,25 ,26 ,27 ,28\n"); printf("31 ,32 ,33 ,34 ,35 ,36 ,37 ,38\n"); printf("41 ,42 ,43 ,44 ,45 ,46 ,47 ,48\n"); printf("51 ,52 ,53 ,54 ,55 ,56 ,57 ,58\n"); printf("61 ,62 ,63 ,64 ,65 ,66 ,67 ,68\n"); printf("71 ,72 ,73 ,74 ,75 ,76 ,77 ,78\n"); printf("81 ,82 ,83 ,84 ,85 ,86 ,87 ,88\n");
(3) The program prompts the user and allocates the selection as relevant to each ship. The program goes through this process with each piece of the game.
printf("(3 spaces)Player 1 enter your Battle ship's poition: \n"); printf("position1: "); scanf("%d", &battlepone); printf("position2: "); scanf("%d", &battleptwo); printf("position3: "); scanf("%d", &battlepthree);
(4)
Ready to play! The user is then prompted for their input of where the enemy boats are. It runs through a long list of switch case statements for any of space that is hit.
printf("Target: "); scanf("%d", &target); switch(target){ case 11: switch(destroyponetwo) { case 11: printf("Hit!!!\n"); hit = hit + 1; break; } switch(destroyptwotwo) { case 11: printf("Hit!!!\n"); hit = hit + 1; break;