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
//include file doPair.h

typedef struct {
    int mixed;
    int recessive;
    int dominant;
    int homogeneous;

typedef struct {
    char g1[5];

class doPair
    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
        if( rs[i] != rs[i+1] && rs[i] > rs[i+1])
            temp = rs[i];
            rs[i] = rs[i+1];
            rs[i+1] = temp;

        else if(rs[i] == rs[i+1])
            s1->homogeneous++;  //homogen
            if( ISLOWER(rs[i]) )
                s1->recessive++; //recessive

                s1->dominant++; //dom





//main function *********************************8

// punn.cpp : Punnett Square

#include "stdafx.h"
#include <iostream>
#include <fstream>

#include "doPair.h"

using namespace std;

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 = gene2;
    //do output
        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;