Punnett Squarer

Discussion in 'C++' started by Bjnix04, Mar 2, 2009.

  1. Bjnix04

    Bjnix04 New Member

    Joined:
    Apr 24, 2008
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    This week in my AP Biology class we are doing a thing on Drosophila Flies. The experiment involves making a BOATLOAD of Punnett Squares.

    After a few minutes of doing them, I got kind of bored :snore: and made a quick program to make punnett squares for me, as well as analyze the punnet square. Later I added more functions to make things easier for me.

    I just wanted to post it here to get a critique of my code, I'm kind of just starting out so I wanted to know how I'm doing. Don't take it easy on me though. :nice:
    Here's the code:
    Code:
    #include <iostream>
    
    using namespace std;
    
    void boxes(char a, char b, char c, char d);
    void analyze(char a2, char b2, char c2, char d2);
    
    
    int main()
    {
        char a1,a2,a3,a4,resp;
        resp = 'y';
        cout<<"Punnet Squarer\n V1.0"<<endl;
    while(resp == 'y'){
        cout<<"enter first letter for top row A/a"<<endl;
        cin>>a1;
        cout<<"enter second letter for top row A/a"<<endl;
        cin>>a2;
        cout<<"enter first letter for side column A/a"<<endl;
        cin>>a3;
        cout<<"enter second letter for side comumn A/a"<<endl;
        cin>>a4;
    
        boxes(a1,a2,a3,a4);
        analyze(a1,a2,a3,a4);
    
        cout<<"\n\n";
    
        cout<<"do another punnett square? y/n"<<endl;
        cin>>resp;
    }
    
        return 0;
    }
    
    void boxes(char a, char b, char c, char d) {
    
        if(a=='a' && c=='A'){
            a='A';
            c='a';
        }
        if(b=='a' && c=='A'){
            b='A';
            c='a';
        }
        if(a=='a' && d=='A'){
            a='A';
            d='a';
        }
        if(b=='a' && d=='A'){
            b='A';
            d='a';
        }
        cout<<"\n\n";
        cout<<"      ";
        cout<<a<<c;
        cout<<" ";
        cout<<"|";
        cout<<" ";
        cout<<b<<c;
        cout<<endl;
    
        cout<<"      ";
        cout<<"--------"<<endl;
    
        cout<<"      ";
        cout<<a<<d;
        cout<<" ";
        cout<<"|";
        cout<<" ";
        cout<<b<<d;
        cout<<endl;
    }
    
    void analyze(char a2, char b2, char c2, char d2){
     int count, homdcount, homrcount, hetrocount,homd,homr,hetro;
     count=0;
     homdcount=0;
     homrcount=0;
     hetrocount=0;
     homd=0;
     homr=0;
     hetro=0;
                     /*Analysis section START*/
                   /* Analyze top left corner */
        if(a2=='A' && c2=='A' || a2=='A' && c2=='a' || a2=='a' && c2=='A' ){
        ++count;
        }
                  /* Analyze top right corner */
        if(b2=='A' && c2=='A' || b2=='A' && c2=='a' || b2=='a' && c2=='A' ){
        ++count;
        }
                  /* Analyze bottom left corner */
        if(a2=='A' && d2=='A' || a2=='A' && d2=='a' || a2=='a' && d2=='A' ){
        ++count;
        }
                  /* Analyze bottom right corner */
        if(b2=='A' && d2=='A' || b2=='A' && d2=='a' || b2=='a' && d2=='A' ){
        ++count;
        }
         /*Analyze top left square*/
        if(a2=='A' && c2=='A'){
        ++homdcount;
        }
        else if(a2=='a' && c2=='a'){
        ++homrcount;
        }
        else{
        ++hetrocount;
        }
        /*Analyze top right square*/
        if(b2=='A' && c2=='A'){
        ++homdcount;
        }
        else if(b2=='a' && c2=='a'){
        ++homrcount;
        }
        else{
        ++hetrocount;
        }
    
        /*Analyze bottom left square*/
        if(a2=='A' && d2=='A'){
        ++homdcount;
        }
        else if(a2=='a' && d2=='a'){
        ++homrcount;
        }
        else{
        ++hetrocount;
        }
          /*Analyze bottom right square*/
        if(b2=='A' && d2=='A'){
        ++homdcount;
        }
        else if(b2=='a' && d2=='a'){
        ++homrcount;
        }
        else{
        ++hetrocount;
        }
     switch(hetrocount){
      case 1:
       hetro=25;
       break;
      case 2:
       hetro=50;
       break;
      case 3:
       hetro=75;
       break;
      case 4:
       hetro=100;
       break;
     }
     switch(homrcount){
      case 1:
       homr=25;
       break;
      case 2:
       homr=50;
       break;
      case 3:
       homr=75;
       break;
      case 4:
       homr=100;
       break;
     }
     switch(homdcount){
      case 1:
       homd=25;
       break;
      case 2:
       homd=50;
       break;
      case 3:
       homd=75;
       break;
      case 4:
       homd=100;
       break;
     }
     /*Analysis section END*/
     /*Show results of Analysis*/
     switch(count){
      case 1:
       cout<<"25% Dominant"<<endl;
       break;
      case 2:
       cout<<"50% Dominant"<<endl;
       break;
      case 3:
       cout<<"75% Dominant"<<endl;
       break;
      case 4:
       cout<<"100% Dominant"<<endl;
       break;
     }
       cout<<"analysis:"<<endl;
       cout<<"This Generation is "<<homd<<"% Homozygous Dominant"<<endl;
       cout<<"This Generation is "<<homr<<"% Homozygous recessive"<<endl;
       cout<<"This Generation is "<<hetro<<"% Heterozygous"<<endl;
     }
    Thanks guys.
     
  2. xpi0t0s

    xpi0t0s Mentor

    Joined:
    Aug 6, 2004
    Messages:
    3,009
    Likes Received:
    203
    Trophy Points:
    63
    Occupation:
    Senior Support Engineer
    Location:
    England
    Well done! Programming is all about making tools that make our lives easier. This takes me right back to the first useful program I wrote; my Mum was doing an Open University degree and was doing a load of chi-squares; each took about half n hour with a calculator and she'd got bored with it having done enough to understand them and still having loads left over; so she showed me how they worked and I knocked up a quick program on my trusty old Commodore 64 which took the numbers in and spat out a chi square almost instantly.

    I don't know anything about punnet squares (thought at first it was something to do with strawberries), but the code looks just fine to me and if it works I think you've got something there worth keeping. The only nit I would pick on the above code is that the indentation could be better; use 3 or 4 spaces per indent not just one, and code can sometimes look clearer if it's formatted into a tabular layout rather than following strict code layout rules, e.g.:
    Code:
         if (b2=='A' && c2=='A') { ++homdcount;  }
    else if (b2=='a' && c2=='a') { ++homrcount;  }
    else                         { ++hetrocount; }
    
     
  3. xpi0t0s

    xpi0t0s Mentor

    Joined:
    Aug 6, 2004
    Messages:
    3,009
    Likes Received:
    203
    Trophy Points:
    63
    Occupation:
    Senior Support Engineer
    Location:
    England
    Oh, and maybe:
    Code:
    switch(homdcount){
      case 1:
       homd=25;
       break;
      case 2:
       homd=50;
       break;
      case 3:
       homd=75;
       break;
      case 4:
       homd=100;
       break;
     }
    
    could be replaced with
    Code:
    homd=25*homdcount;
    
    assuming various things of course, can homdcount only be 1,2,3 or 4, and if not what if it isn't? Maybe if (homdcount>=1 && homdcount<=4) homd=25*homdcount; would work better.
     
  4. Bjnix04

    Bjnix04 New Member

    Joined:
    Apr 24, 2008
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    THANKS!
    I was looking for a way to get rid of those switch's. Never occurred to me simply use homd=25*homdcount;
    I really appreciate you pointing that out to me. :)
     
  5. LukaB

    LukaB New Member

    Joined:
    Mar 4, 2009
    Messages:
    51
    Likes Received:
    0
    Trophy Points:
    0
    This is some good information, thanks for posting :)
     
  6. ljlong

    ljlong New Member

    Joined:
    Dec 30, 2008
    Messages:
    10
    Likes Received:
    1
    Trophy Points:
    0
    Occupation:
    Software engineer, embedded, rtos, machine control
    Location:
    Santa Rosa, CA
    I had to look up Punnett on the web.
    and found it. Your software is an interesting problem so I played around with the idea a little.
    You have a nice beginning but it's not very general and would be hard to modify.

    One thing I always try and keep in mind is make it general and make it expandable. I've included a short program that would be easy to improve. It's currently hard-coded for a 4x4 dihybrid cross. Easy modification would be to make a generalized input. Do other types of cross than dihybrid. Make the structures classes. Create an output class for printing.... the list goes on. However, it's just a start and a simple demo... thanks for the problem I hope you find this program helpfull
    take care and happy computing.

    it's a win32 program comprised of three files doPair.h , doPair.cpp and punn.cpp
    Code:
    //include file doPair.h
    
    typedef struct {
        int mixed;
        int recessive;
        int dominant;
        int homogeneous;
    }stats;
    
    
    typedef struct {
        char g1[5];
    }gene;
    
    
    class doPair
    {
    public:
        doPair(char*, char*, char*, stats*);
        virtual ~doPair(void);
    };
    
    //class doPair.cpp
    #include "StdAfx.h"
    #include ".\dopair.h"
    
    
    #define ISLOWER(x)  ((x >='a' && x<='z') ? 1 : 0)
    #define ISUPPER(x)  ((x >='A' && x<='Z') ? 1 : 0)
    
    
    /*
        Pair member function
        takes advantage of the pairing of the genes
        makes some simple calculation and saves in a status struct 
        indexed by the gene index
    
    
    */
    doPair::doPair(char* g1, char* g2, char* r1, stats* s1)
    {
        int i;
        char temp;
        char* rs = r1;
    
    
        *r1++ = *g2++;
        *r1++ = *g1++;
        *r1++ = *g2;
        *r1++ = *g1;
        *r1   = 0;
        //correct for caps in front
        //do some simple summing... just place holders to demo the idea
        //
        for(i=0;i<2;i++)
        {
            if( rs[i] != rs[i+1] && rs[i] > rs[i+1])
            {//mixed
                temp = rs[i];
                rs[i] = rs[i+1];
                rs[i+1] = temp;
                s1->mixed++;
    
            }
            else if(rs[i] == rs[i+1])
            {
                s1->homogeneous++;  //homogen
                if( ISLOWER(rs[i]) )
                {
                    s1->recessive++; //recessive
                    
                }
                else
                {
    
                    s1->dominant++; //dom
                }
            }
        }
    
            
    
    
    }
    
    doPair::~doPair(void)
    {
    
    }
    
    //main function *********************************8
    
    // punn.cpp : Punnett Square
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <fstream>
    
    #include "doPair.h"
    
    
    using namespace std;
    
    //globals
    gene Gamates[16]; 
    stats geneInfo[16];
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int i,j;
        char gene1[] = "RYRyrYry";
        char gene2[] = "RYRyrYry";
        
        char *g1 = gene1;
        char *g2 = gene2;
        char* r1;
        stats* s1;
    
        
    
        //generate the 16 groups
        for(i=0; i<16; )
        {
            
            for(j=0; j<4; j++)    //number of gene groups
            {
                s1 = &geneInfo[i];
                r1 = &Gamates[i].g1[0];    
                ::doPair( g1, g2, r1, s1);
                g2++;
                g2++;
                i++;
            }
            
            g2 = gene2;
            g1++;
            g1++;
        }
        //do output
        for(i=0;i<16;i++)
        {
            s1 = &geneInfo[i];
            r1 = &Gamates[i].g1[0];    
            cout << r1;
            cout << "   info: ";
             
            cout << " mixed: ";
            cout << s1->mixed;
    
            cout << " recessive: ";
            cout << s1->recessive;
            cout << " dominant: ";
            cout << s1->dominant;
            cout << " homogeneous: ";
            cout << s1->homogeneous;
    
            cout << "\n";
    
        }
        
        return 0;
    }
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice