User Tools

Site Tools


software_carpentary2

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
software_carpentary2 [2011/06/20 03:45]
medhamsh
software_carpentary2 [2018/03/24 11:13] (current)
Line 1: Line 1:
 +=== Additional Exercises ===
 +
 +0) Create a simple project with three files: file1.c file2.c and main.c. Define func1() in file1.c and func2 in file2.c. Declare the func1() in file1.h and func2() in file2.h. Include file1.h and file2.h in main.c and call the two functions. Write a makefile for this project. Extra: Make changes in file1.h and file2.h in such a manner that including twice inside main.c will not give compilation errors.
 +
 +1) Download wget source code, compile and install it on the system
 +
 +2) Understand what configure, automake and autoconf are for
 +
 +3) Download and compile the linux kernel
 +
 +4) Understand phony targets inside a makefile
 +
 +5) Browse mozilla firefox source code using mxr.mozilla.org.
 + - Access search functions
 + - Browse for variables declarations and function declarations
 + - Browse for variable and function usages
 +
 +6) Download, read and understand the source of a small and simple free software project as much as possible for some time (such as wget).
 +
 +7) Read the GNU coding standards document and try to analyze the importance of each guideline there.
 +
 +Puzzle:
 +What does the following function do:
 +
 + 
 +  int what_do_i_do(int a)
 +  {
 + a = ((a & 0xAAAAAAAA) >> 1) + (a & 0x55555555);​
 + a = ((a & 0xCCCCCCCC) >> 2) + (a & 0x33333333);​
 + a = ((a & 0xF0F0F0F0) >> 4) + (a & 0x0F0F0F0F);​
 + a = ((a & 0xFF00FF00) >> 8) + (a & 0x00FF00FF);​
 + a = ((a & 0xFFFF0000) >> 16) + (a & 0x0000FFFF);​
 + return a;
 +  }
 +
 +
 +
 ====== Quality Assurance ====== ====== Quality Assurance ======
  
Line 20: Line 57:
     * If they'​re 7-character alphabetic strings, it's 254 years     * If they'​re 7-character alphabetic strings, it's 254 years
           o Then you move on to the second function...           o Then you move on to the second function...
-    ​* And how do you know that your tests are correct?+             * And how do you know that your tests are correct?
     * All a test can do is show that there may be a bug     * All a test can do is show that there may be a bug
  
 +===== Nomenclature =====
 +
 +A unit test exercises one component in isolation
 +
 +    * Developer-oriented:​ tests the program'​s internals
 +
 +An integration test exercises the whole system
 +
 +    * User-oriented:​ tests the software'​s overall behavior
 +
 +Regression testing is the practice of rerunning tests to check that the code still works
 +
 +    * I.e., make sure that today'​s changes haven'​t broken things that were working yesterday
 +    * Programs that don't have regression tests are difficult (sometimes impossible) to maintain
 +
 +===== Test results specifications =====
 +
 +Any test can have one of three outcomes:
 +
 +    * Pass: the actual outcome matches the expected outcome
 +    * Fail: the actual outcome is different from what was expected
 +    * Error: something went wrong inside the test (i.e., the test contains a bug)
 +          o Don't know anything about the system being tested
 +
 +A specification is something that tells you how to classify a test's result
 +
 +    * You can't test without some sort of specification
 +
 +
 +===== Writing Tests =====
 +How to write tests so that:
 +   * It's easy to add or change tests
 +  *  It's easy to see what's been tested, and what hasn't
 +
 +A test consists of a fixture, an action, and an expected result
 +          o A fixture is something that a test is run on
 +          o Can be as simple as a single value, or as complex as a networked database
 +Every test should be independent
 +          o I.e., the outcome of one test shouldn'​t depend on what happened in another test
 +          o Otherwise, faults in early tests can distort the results of later ones
 +So each test:
 +          o Creates a fresh instance of the fixture
 +          o Performs the operation
 +          o Checks and records the result
 +
 +Find the exercises at http://​software-carpentry.org/​3_0/​qa.html
 +
 +====== Reading Code ======
 +
 +Read the following code and test!
 +
 +<​code>​
 +void main()
 +{
 +char str[40];
 +int i,​flag=0,​len;​
 +clrscr();
 +printf("​\n Enter A string : ");
 +gets(str);
 +len=strlen(str);​
 +for(i=0;​i<​(len/​2);​i++)
 +{
 +if(str[i]!=str[len-1-i])
 +{
 +flag=1;
 +break;
 +}
 +}
 +if(flag==1)
 +{
 +printf("​ \n The string is not palindrome"​);​
 +}
 +if(flag==0)
 +printf("​\n String is palindrome"​);​
 +getch();
 +
 +</​code>​
 +
 +<​code>​
 +void main()
 +{
 +char main_str[40],​str[40];​
 +int i,​j,​len1,​len2;​
 +clrscr();
 +printf("​\n Enter the main String :");
 +gets(main_str);​
 +printf("​\n enter the String you wanna search : ");
 +gets(str);
 +len1=strlen(main_str);​
 +len2=strlen(str);​
 +i=0;
 +j=0;
 +while(str[i]!='​\0'​)
 +{
 +while(main_str[j]!='​\0'​)
 +{
 +if(str[i]==main_str[j])
 +{
 +i++;
 +if(len2==i)
 +{
 +j=j-len2+2;
 +printf("​\n found at %d location",​j);​
 +break;
 +}
 +
 +}//if
 +else
 +j++;
 +
 +}//inner while
 +if(j==len1)
 +{
 +printf("​\n not Found"​);​
 +break;
 +}//if
 +
 +}//outer while
 +getch();
 +}
 +</​code>​
 +
 +<​code>​
 +void main()
 +{
 +int a,b;
 +clrscr();
 +printf("​\n enter First Number :");
 +scanf("​%d",&​a);​
 +printf("​\n enter Second Number :");
 +scanf("​%d",&​b);​
 +swap(&​a,&​b);​
 +printf("​\n first Number is : %d",​a);​
 +printf("​\n second Number is : %d",​b);​
 +getch();
 +}
 +
 +swap(int *a,int *b)
 +{
 +*a=*a-*b;
 +*b=*a+*b;
 +*a=*b-*a;
 +
 +}
 +
 +</​code>​
 +
 +<​code>​
 +main()
 +{
 +int temps[31];
 +int index,​total;​
 +float average,​celsius;​
 +total=0.0;
 +for(index=0;​index<​31;​index++)
 +{
 +printf("​enter temperature #​%d:",​index);​
 +scanf("​%d",&​temps[index]);​
 +}
 +for(index=0;​index<​31;​index++)
 +total+=temps[index];​
 +average=total/​31.0
 +printf("​average is:​%f\n\n",​ average);
 +puts9"​fahrenheit\tcelsius\n"​);​
 +for(index=0;​index<​31;​index++)
 +{
 +celsius=(5.0/​9.0)*(temps[index]-32);​
 +printf("​%d\t\t%6.2f\n",​temps[index],​celsius);​
 +}
 +}
 +</​code>​
 +
 +<​code>​
 +#include "​stdio.h"​
 +main()
 +{
 +FILE*fp;
 +int letter;
 +if((fp=fopen("​MYFILE","​r"​))==NULL)
 +{
 +puts("​Cannot oepn the file"​);​
 +exit();
 +}
 +while((letter=fgetc(fp)) !=eof)
 +printf("​%c",​letter);​
 +fclose(fp);
 +}
 +</​code>​
 +
 +====== Make: Automated Builds ======
 +
 +The make utility
 +
 +If you run
 +
 +<​code>​
 +make
 +</​code>​
 +
 +this program will look for a file named makefile in your directory, and then execute it.
 +If you have several makefiles, then you can execute them with the command:
 +
 +<​code>​
 +make -f MyMakefile
 +</​code>​
 +
 +There are several other switches to the make utility. For more info, man make.
 +
 +===== Build Process =====
 +
 +
 +   1. Compiler takes the source files and outputs object files
 +   2. Linker takes the object files and creates an executable
 +
 +==== Compiling by hand ====
 +
 +
 +The trivial way to compile the files and obtain an executable, is by running the command:
 +<​code>​
 +g++ main.cpp hello.cpp factorial.cpp -o hello
 +</​code>​
 +
 +==== The basic Makefile ====
 +
 +
 +The basic makefile is composed of:
 +
 +<​code>​
 +target: dependencies
 +[tab] system command
 +</​code>​
 +
 +This syntax applied to our example would look like:
 +
 +<​code>​
 +all:
 + g++ main.cpp hello.cpp factorial.cpp -o hello
 +</​code>​
 +
 +==== Using variables and comments ====
 +
 +You can also use variables when writing Makefiles. It comes in handy in situations where you want to change the compiler, or the compiler options.
 +<​code>​
 +# I am a comment, and I want to say that the variable CC will be
 +# the compiler to use.
 +CC=g++
 +# Hey!, I am comment number 2. I want to say that CFLAGS will be the
 +# options I'll pass to the compiler.
 +CFLAGS=-c -Wall
 +
 +all: hello
 +
 +hello: main.o factorial.o hello.o
 + $(CC) main.o factorial.o hello.o -o hello
 +
 +main.o: main.cpp
 + $(CC) $(CFLAGS) main.cpp
 +
 +factorial.o:​ factorial.cpp
 + $(CC) $(CFLAGS) factorial.cpp
 +
 +hello.o: hello.cpp
 + $(CC) $(CFLAGS) hello.cpp
 +
 +clean:
 + rm -rf *o hello
 +</​code>​
software_carpentary2.1308541532.txt.gz ยท Last modified: 2018/03/24 11:13 (external edit)