| | |
Counter help
Please support our C++ advertiser: Intel Parallel Studio Home
![]() |
•
•
Join Date: Jan 2008
Posts: 70
Reputation:
Solved Threads: 0
Hi guys,
I have an input file as below (it is a family tree):
1 0 0
2 0 0
3 0 0
4 1 2
5 1 2
6 0 0
7 3 4
8 5 6
9 7 8
10 7 8
where column 1 = individual number
column 2 = mother number
column 3 = father number
so for example, individual 7's mom is individual 3, and his father is individual 4.
A further 2 columns are added. The program places a 0 or 1 in there depending on probabilities I have set out myself. An example of the output is as follows:
1 0 0 0 1
2 0 0 1 1
3 0 0 1 0
4 1 2 0 1
5 1 2 0 1
6 0 0 0 0
7 3 4 0 0
8 5 6 1 0
9 7 8 0 0
10 7 8 0 0
What I want to do is set a counter on how many 00's there are, how many 01's there are, and how many 11's there are. So for the above example, it would say:
00 = 4
01 = 4
11 = 2
My code is as below.
Any ideas guys?
I have an input file as below (it is a family tree):
1 0 0
2 0 0
3 0 0
4 1 2
5 1 2
6 0 0
7 3 4
8 5 6
9 7 8
10 7 8
where column 1 = individual number
column 2 = mother number
column 3 = father number
so for example, individual 7's mom is individual 3, and his father is individual 4.
A further 2 columns are added. The program places a 0 or 1 in there depending on probabilities I have set out myself. An example of the output is as follows:
1 0 0 0 1
2 0 0 1 1
3 0 0 1 0
4 1 2 0 1
5 1 2 0 1
6 0 0 0 0
7 3 4 0 0
8 5 6 1 0
9 7 8 0 0
10 7 8 0 0
What I want to do is set a counter on how many 00's there are, how many 01's there are, and how many 11's there are. So for the above example, it would say:
00 = 4
01 = 4
11 = 2
My code is as below.
C++ Syntax (Toggle Plain Text)
#include <fstream.h> #include <stdlib.h> int i, j; int matrix[10000][5] = {0}; //Define a matrix with a maximum of 100 rows and 6 columns int counters[2][2] = {0}; // Define the genotype counter int repeats = 0; int norepeats; float p, q; float rand1, rand2, rand3, rand4; void SetSeed(); int main () { FILE *output_file = fopen("output.txt", "w"); printf("Enter the frequency of allele A: "); scanf("%f", &p); printf("\n"); printf("Frequency of allele A (p) is: %.3f\n", p); // States the frequency of the A allele q = 1 - p; // The value of q is 1 - (the probability entered for p) printf("Frequency of allele B (q) is: %.3f\n", q); // States the frequency of the B allele printf("\n"); printf("Please enter the desired number of repeats: "); scanf("%d", &norepeats); // Desired number of repeats of the program stored in 'norepeats' printf("\n"); while (repeats != norepeats){ // A while loop to loop the program 'norepeats' amount of times const float RANGE = 1.0; // Random number generated is below 1 SetSeed(); // Seed file for RNG set here //Open the input file// ifstream inFile; inFile.open("input.txt"); // Genealogy input file opened if (!inFile) { printf ("Unable to open input file"); // Error message reported if input.txt cannot be opened exit(1); } //Read the input file into the array while (inFile >> matrix[i][0]) { printf ("%d\t", matrix[i][0]); for (j = 1; j < 3; j++) { inFile >> matrix[i][j]; printf ("%d\t", matrix[i][j]); } int counter; if (matrix[i][1] == 0 && matrix[i][2] == 0){ // If the individual is a founder: rand1 = (float) rand() * RANGE / RAND_MAX; // Random number 1 generated rand2 = (float) rand() * RANGE / RAND_MAX; // Random number 2 generated if (rand1 < p){ // Place a 0 allele down in column 4 if random number 1 is below the set p value matrix[i][3] = 0; } else{ matrix[i][3] = 1; // Place a 1 allele down in column 4 if random number 1 is above the set p value } printf("\t%d", matrix[i][3]); if (rand2 < p){ // Place a 0 allele down in column 5 if random number 2 is below the set p value matrix[i][4] = 0; } else{ // Place a 1 allele down in column 5 if random number 2 is above the set p value matrix[i][4] = 1; } printf("\t%d", matrix[i][4]); } else{ int dad = matrix[i][1]; // 1 is "dad" column int mum = matrix[i][2]; // 2 is "mum" column int dadRowIndex = dad - 1; // The row of the father is 'dad - 1' as the first row is set at zero int mumRowIndex = mum -1; // The row of the mother is 'mum - 1' as the first row is set at zero for (counter = 1;counter <= 1;counter++){ rand3 = (float) rand() * RANGE / RAND_MAX; // Random number 3 generated rand4 = (float) rand() * RANGE / RAND_MAX; // Random number 4 generated } if (rand3 < 0.5){ // If random number 3 is less than a half, receive allele stored in column 4 from dad matrix[i][3] = matrix[dadRowIndex][3]; } else{ // If random number 3 is more than a half, receive allele stored in column 5 from dad matrix[i][3] = matrix[dadRowIndex][4]; } printf("\t%d", matrix[i][3]); if (rand4 < 0.5){ // If random number 4 is less than a half, receive allele stored in column 4 from mum matrix[i][4] = matrix[mumRowIndex][3]; } else{ // If random number 4 is more than a half, receive allele stored in column 5 from mum matrix[i][4] = matrix[mumRowIndex][4]; } printf("\t%d", matrix[i][4]); } i++; printf ("\n"); } inFile.close (); // Close the infile printf("\n"); repeats++; // End loop here } fclose(output_file); } void SetSeed() { // Determining the seed file FILE *seed_file; long int seed_value; seed_file = fopen("seed.txt","r"); // Open seed file fscanf(seed_file,"%d",&seed_value); // Exctract seed from file fclose(seed_file); // Close seed file srand(seed_value); // Randomise seed value seed_file = fopen("seed.txt","w"); // Create temporary output fprintf(seed_file,"%d",rand()); // Print random number to output fclose(seed_file); // Close temporary seed output file }
Any ideas guys?
Last edited by andyg55; Mar 27th, 2008 at 1:59 pm.
•
•
Join Date: Jan 2008
Posts: 70
Reputation:
Solved Threads: 0
ok guys... i attempted a counter of my own accord. Code as follows:
But the problem is, sometimes the counter works properly, and sometimes it doesn't.
I think it might have something to do with the number of repeats i do.
Does anyone see what I'm doing wrong?
C++ Syntax (Toggle Plain Text)
#include <fstream.h> #include <stdlib.h> int i, j; int matrix[10000][5] = {0}; //Define a matrix with a maximum of 100 rows and 6 columns int counters[2][2] = {0}; // Define the genotype counter int repeats = 0; int norepeats; float p, q; float rand1, rand2, rand3, rand4; void SetSeed(); int main () { FILE *output_file = fopen("output.txt", "w"); printf("Enter the frequency of allele A: "); scanf("%f", &p); printf("\n"); printf("Frequency of allele A (p) is: %.3f\n", p); // States the frequency of the A allele q = 1 - p; // The value of q is 1 - (the probability entered for p) printf("Frequency of allele B (q) is: %.3f\n", q); // States the frequency of the B allele printf("\n"); printf("Please enter the desired number of repeats: "); scanf("%d", &norepeats); // Desired number of repeats of the program stored in 'norepeats' printf("\n"); while (repeats != norepeats){ // A while loop to loop the program 'norepeats' amount of times const float RANGE = 1.0; // Random number generated is below 1 SetSeed(); // Seed file for RNG set here //Open the input file// ifstream inFile; inFile.open("input.txt"); // Genealogy input file opened if (!inFile) { printf ("Unable to open input file"); // Error message reported if input.txt cannot be opened exit(1); } //Read the input file into the array while (inFile >> matrix[i][0]) { printf ("%d\t", matrix[i][0]); for (j = 1; j < 3; j++) { inFile >> matrix[i][j]; printf ("%d\t", matrix[i][j]); } int counter; if (matrix[i][1] == 0 && matrix[i][2] == 0){ // If the individual is a founder: rand1 = (float) rand() * RANGE / RAND_MAX; // Random number 1 generated rand2 = (float) rand() * RANGE / RAND_MAX; // Random number 2 generated if (rand1 < p){ // Place a 0 allele down in column 4 if random number 1 is below the set p value matrix[i][3] = 0; } else{ matrix[i][3] = 1; // Place a 1 allele down in column 4 if random number 1 is above the set p value } printf("\t%d", matrix[i][3]); if (rand2 < p){ // Place a 0 allele down in column 5 if random number 2 is below the set p value matrix[i][4] = 0; } else{ // Place a 1 allele down in column 5 if random number 2 is above the set p value matrix[i][4] = 1; } printf("\t%d", matrix[i][4]); } else{ int dad = matrix[i][1]; // 1 is "dad" column int mum = matrix[i][2]; // 2 is "mum" column int dadRowIndex = dad - 1; // The row of the father is 'dad - 1' as the first row is set at zero int mumRowIndex = mum -1; // The row of the mother is 'mum - 1' as the first row is set at zero for (counter = 1;counter <= 1;counter++){ rand3 = (float) rand() * RANGE / RAND_MAX; // Random number 3 generated rand4 = (float) rand() * RANGE / RAND_MAX; // Random number 4 generated } if (rand3 < 0.5){ // If random number 3 is less than a half, receive allele stored in column 4 from dad matrix[i][3] = matrix[dadRowIndex][3]; } else{ // If random number 3 is more than a half, receive allele stored in column 5 from dad matrix[i][3] = matrix[dadRowIndex][4]; } printf("\t%d", matrix[i][3]); if (rand4 < 0.5){ // If random number 4 is less than a half, receive allele stored in column 4 from mum matrix[i][4] = matrix[mumRowIndex][3]; } else{ // If random number 4 is more than a half, receive allele stored in column 5 from mum matrix[i][4] = matrix[mumRowIndex][4]; } printf("\t%d", matrix[i][4]); } i++; printf ("\n"); } inFile.close (); // Close the infile for(i = 0; i < 10; i++) // Set the counter for the genotypes { if (matrix[i][3]==0 && matrix[i][4] ==0) // If alleles AA, increase counter [0][0] by 1 { counters[0][0]++; } else if (matrix[i][3]==0 && matrix[i][4] ==1 || matrix[i][3]==1 && matrix[i][4] ==0) // If allele is heterozygous, increase counter [0][1] by 1 { counters[0][1]++; } else if (matrix[i][3]==1 && matrix[i][4] ==1) // If alleles BB, increase counter [1][1] by 1 { counters[1][1]++; } } printf("\n"); printf("Cumulative genotype totals:\n"); printf("AA: %d\n", counters[0][0]); // Print total number of AA individuals printf("AB: %d\n", counters[0][1]); // Print total number of heterozygotes printf("BB: %d\n", counters[1][1]); // Print total number of BB individuals printf("\n"); printf("\n"); repeats++; // End loop here } fclose(output_file); } void SetSeed() { // Determining the seed file FILE *seed_file; long int seed_value; seed_file = fopen("seed.txt","r"); // Open seed file fscanf(seed_file,"%d",&seed_value); // Exctract seed from file fclose(seed_file); // Close seed file srand(seed_value); // Randomise seed value seed_file = fopen("seed.txt","w"); // Create temporary output fprintf(seed_file,"%d",rand()); // Print random number to output fclose(seed_file); // Close temporary seed output file }
But the problem is, sometimes the counter works properly, and sometimes it doesn't.
I think it might have something to do with the number of repeats i do.
Does anyone see what I'm doing wrong?
You are missing counting the 1-0 combination.
Your main matrix defiition does not agree with your comment about it:
is really 10,000 rows by 5 columns.
This is one of the problems with excess comments - they get out of sync as you modify a program. Comments should not state what is obvious from the code. Good variable names make many comments unnecessary.
Your main matrix defiition does not agree with your comment about it:
C++ Syntax (Toggle Plain Text)
int matrix[10000][5] = {0}; //Define a matrix with a maximum of 100 rows and 6 columns
This is one of the problems with excess comments - they get out of sync as you modify a program. Comments should not state what is obvious from the code. Good variable names make many comments unnecessary.
"We Americans got so tired of being thought of as dumb by the rest of the world that we went to the polls last November and removed all doubt."
~~~~~~~~~~~~~~~~~~
Looking for an exciting graduate degree? Robotics and Intelligent Autonomous Systems (RIAS) at SDSM&T See the program brochure here.
~~~~~~~~~~~~~~~~~~
Looking for an exciting graduate degree? Robotics and Intelligent Autonomous Systems (RIAS) at SDSM&T See the program brochure here.
•
•
Join Date: Jan 2008
Posts: 70
Reputation:
Solved Threads: 0
Ok, well forgetting that comment (I have to excess comment to submit it to my markers, they're really strict on it)...
I'm not missing the 1-0 count. It is there if you look again.
The counting is weird. It seems to double itself sometimes, when really the numbers havn't doubled at all. Other times it gives obsurd answers that are huge etc.
Something is majorly wrong?
I'm not missing the 1-0 count. It is there if you look again.
The counting is weird. It seems to double itself sometimes, when really the numbers havn't doubled at all. Other times it gives obsurd answers that are huge etc.
Something is majorly wrong?
OK, I didn't see the 10 01 combined test.
Can you give a sample of the data and the resulting counts? Assuming the data is read and stored correctly, the counting block looks good.
Can you give a sample of the data and the resulting counts? Assuming the data is read and stored correctly, the counting block looks good.
"We Americans got so tired of being thought of as dumb by the rest of the world that we went to the polls last November and removed all doubt."
~~~~~~~~~~~~~~~~~~
Looking for an exciting graduate degree? Robotics and Intelligent Autonomous Systems (RIAS) at SDSM&T See the program brochure here.
~~~~~~~~~~~~~~~~~~
Looking for an exciting graduate degree? Robotics and Intelligent Autonomous Systems (RIAS) at SDSM&T See the program brochure here.
•
•
Join Date: Jul 2005
Posts: 1,678
Reputation:
Solved Threads: 263
First thing I'd try is to make intent of this statement perferctly clear by adding additional ():
if (matrix[i][3]==0 && matrix[i][4] ==1 || matrix[i][3]==1 && matrix[i][4] ==0)
like this:
If that didn't work I'd try to localize the problem by starting to comment out sections of the code until I came up with the section that seemed to cause the problem OR I'd print out baseline values of counters after initialization to be sure they were intialized correctly and then add output statements whereever the value is changed to be sure the values are changed appropriately.
if (matrix[i][3]==0 && matrix[i][4] ==1 || matrix[i][3]==1 && matrix[i][4] ==0)
like this:
C++ Syntax (Toggle Plain Text)
if ((matrix[i][3]==0 && matrix[i][4] ==1) || (matrix[i][3]==1 && matrix[i][4] ==0))
If that didn't work I'd try to localize the problem by starting to comment out sections of the code until I came up with the section that seemed to cause the problem OR I'd print out baseline values of counters after initialization to be sure they were intialized correctly and then add output statements whereever the value is changed to be sure the values are changed appropriately.
•
•
Join Date: Jan 2008
Posts: 3,813
Reputation:
Solved Threads: 501
I don't see where the counters array is being used. Can you point to the line number?
C++ Syntax (Toggle Plain Text)
#include <fstream.h> #include <stdlib.h> int i, j; int matrix[10000][5] = {0}; //Define a matrix with a maximum of 100 rows and 6 columns int counters[2][2] = {0}; // Define the genotype counter int repeats = 0; int norepeats; float p, q; float rand1, rand2, rand3, rand4; void SetSeed(); int main () { FILE *output_file = fopen("output.txt", "w"); printf("Enter the frequency of allele A: "); scanf("%f", &p); printf("\n"); printf("Frequency of allele A (p) is: %.3f\n", p); // States the frequency of the A allele q = 1 - p; // The value of q is 1 - (the probability entered for p) printf("Frequency of allele B (q) is: %.3f\n", q); // States the frequency of the B allele printf("\n"); printf("Please enter the desired number of repeats: "); scanf("%d", &norepeats); // Desired number of repeats of the program stored in 'norepeats' printf("\n"); while (repeats != norepeats){ // A while loop to loop the program 'norepeats' amount of times const float RANGE = 1.0; // Random number generated is below 1 SetSeed(); // Seed file for RNG set here //Open the input file// ifstream inFile; inFile.open("input.txt"); // Genealogy input file opened if (!inFile) { printf ("Unable to open input file"); // Error message reported if input.txt cannot be opened exit(1); } //Read the input file into the array while (inFile >> matrix[i][0]) { printf ("%d\t", matrix[i][0]); for (j = 1; j < 3; j++) { inFile >> matrix[i][j]; printf ("%d\t", matrix[i][j]); } int counter; if (matrix[i][1] == 0 && matrix[i][2] == 0){ // If the individual is a founder: rand1 = (float) rand() * RANGE / RAND_MAX; // Random number 1 generated rand2 = (float) rand() * RANGE / RAND_MAX; // Random number 2 generated if (rand1 < p){ // Place a 0 allele down in column 4 if random number 1 is below the set p value matrix[i][3] = 0; } else{ matrix[i][3] = 1; // Place a 1 allele down in column 4 if random number 1 is above the set p value } printf("\t%d", matrix[i][3]); if (rand2 < p){ // Place a 0 allele down in column 5 if random number 2 is below the set p value matrix[i][4] = 0; } else{ // Place a 1 allele down in column 5 if random number 2 is above the set p value matrix[i][4] = 1; } printf("\t%d", matrix[i][4]); } else{ int dad = matrix[i][1]; // 1 is "dad" column int mum = matrix[i][2]; // 2 is "mum" column int dadRowIndex = dad - 1; // The row of the father is 'dad - 1' as the first row is set at zero int mumRowIndex = mum -1; // The row of the mother is 'mum - 1' as the first row is set at zero for (counter = 1;counter <= 1;counter++){ rand3 = (float) rand() * RANGE / RAND_MAX; // Random number 3 generated rand4 = (float) rand() * RANGE / RAND_MAX; // Random number 4 generated } if (rand3 < 0.5){ // If random number 3 is less than a half, receive allele stored in column 4 from dad matrix[i][3] = matrix[dadRowIndex][3]; } else{ // If random number 3 is more than a half, receive allele stored in column 5 from dad matrix[i][3] = matrix[dadRowIndex][4]; } printf("\t%d", matrix[i][3]); if (rand4 < 0.5){ // If random number 4 is less than a half, receive allele stored in column 4 from mum matrix[i][4] = matrix[mumRowIndex][3]; } else{ // If random number 4 is more than a half, receive allele stored in column 5 from mum matrix[i][4] = matrix[mumRowIndex][4]; } printf("\t%d", matrix[i][4]); } i++; printf ("\n"); } inFile.close (); // Close the infile printf("\n"); repeats++; // End loop here } fclose(output_file); } void SetSeed() { // Determining the seed file FILE *seed_file; long int seed_value; seed_file = fopen("seed.txt","r"); // Open seed file fscanf(seed_file,"%d",&seed_value); // Exctract seed from file fclose(seed_file); // Close seed file srand(seed_value); // Randomise seed value seed_file = fopen("seed.txt","w"); // Create temporary output fprintf(seed_file,"%d",rand()); // Print random number to output fclose(seed_file); // Close temporary seed output file }
•
•
Join Date: Jan 2008
Posts: 70
Reputation:
Solved Threads: 0
Hi. I tried that but it still didn't work. An example of the output:
Any ideas?
C++ Syntax (Toggle Plain Text)
Desired number of repeats = 3 1 0 0 0 1 2 0 0 1 1 3 0 0 0 1 4 1 2 1 1 5 1 2 1 1 6 0 0 1 0 7 3 4 0 1 8 5 6 1 1 9 7 8 1 1 10 7 8 0 1 Cumulative totals: 00 = 0 10 = 5 11 = 5 1 0 0 0 0 2 0 0 1 0 3 0 0 0 1 4 1 2 1 1 5 1 2 1 1 6 0 0 0 1 7 3 4 1 1 8 5 6 1 1 9 7 8 1 1 10 7 8 1 1 Cumulative totals: 00 = 0 10 = 10 11 = 10 1 0 0 0 0 2 0 0 0 1 3 0 0 0 1 4 1 2 1 1 5 1 2 0 1 6 0 0 1 1 7 3 4 0 1 8 5 6 1 0 9 7 8 0 1 10 7 8 1 1 Cumulative totals: 00 = 0 10 = 15 11 = 15
Any ideas?
•
•
Join Date: Dec 2006
Posts: 1,089
Reputation:
Solved Threads: 164
C++ Syntax (Toggle Plain Text)
int sum = matrix[i][3] + matrix[i][4] ; if( sum == 2 ) ++counters[1][1] ; else if( sum == 1 ) ++counters[0][1] ; else ++counters[0][0] ;
![]() |
Similar Threads
- ASP .NET hit counter? (ASP.NET)
- letter and word counter (C)
- I'm looking for a counter.. (HTML and CSS)
- Counter issues (C)
- ASP .NET database hit counter (ASP.NET)
- Counter Strike issue (Windows Software)
- Page counter print accounting (*nix Software)
Other Threads in the C++ Forum
- Previous Thread: Going insane, please help!
- Next Thread: memcmp help needed
| Thread Tools | Search this Thread |
api array beginner binary bitmap c++ c/c++ calculator char char* class classes coding compile compiler console conversion count data database delete desktop developer directshow dll download dynamic email encryption error file forms fstream function functions game getline google graph gui homeworkhelper iamthwee ifstream input int integer java lib linkedlist linker linux loop looping loops map math matrix memory multiple news node number numbertoword output parameter pointer problem program programming project proxy python random read recursion recursive reference return rpg sorting string strings struct template templates test text text-file tree unix url vector video visualstudio win32 windows winsock word wordfrequency wxwidgets






