First of all, I added some indents and spaces to your code to make it readable. (I also used this forum's fantastic highlight tag.)
C++ Code:
Original
 C++ Code 


#include <iostream>
using namespace std;
int start_num; //starting number
int divisor; //number used to find prime numbers
int prime_num = 1; //accumulator for prime numbers
int nonprime_num = 1; //accumulator for non prime numbers
int end_num = 50; //ending number
int main()
{
for(start_num = 1; start_num <= end_num; start_num++)
{
for(divisor = 2; divisor <= start_num / 2; divisor++)
{
if( (start_num % divisor == 0) && (start_num != divisor) )
{
nonprime_num = nonprime_num + 1;
break;
}
else
{
prime_num = prime_num + 1;
cout << start_num <<
"\n";
}
}
}
cout <<
"Number of prime numbers: " << prime_num <<
"\n";
cout <<
"Number of nonprime numbers: " << nonprime_num <<
"\n";
return 0;
}
Now, the logic problem. Let's dissect the inner for loop:
Loop maybedivisors from 2 to half the maybeprime number. Each time, check whether the maybedivisor is actually a divisor. If it is, increment the nonprime counter and move on. Otherwise, increment the prime counter and print out the provedtobeprime number. Wait, what? Each time we find an invalid divisor, decide we have another prime number? That doesn't sound right to me. Choose a number for start_num and walk through the loop in your head if that didn't make sense to you.
To fix this, I changed around your loop a little bit. Basically, now it checks whether the divisor really is one. If it isn't, it skips the loop body and checks the next divisor. When it finds a divisor, it increment the nonprime counter and moves on. So if the number is prime, none of the divisors will work and the loop body (which increments the nonprime counter) will never execute. I removed the prime counter because it was hard to implement with my approach and also unnecessary  you know end_num and nonprime_num, so prime_num is however many numbers are left over.
C++ Code:
Original
 C++ Code 


#include <iostream>
using namespace std;
int start_num; //starting number
int divisor; //number used to find prime numbers
int nonprime_num = 1; //accumulator for non prime numbers
int end_num = 50; //ending number
int main()
{
for(start_num = 1; start_num <= end_num; start_num++)
{
for(divisor = 2; divisor <= start_num / 2; divisor++)
{
if (start_num % divisor != 0) continue;
nonprime_num = nonprime_num + 1;
cout <<
"not prime: " << start_num <<
"\n";
break;
}
}
cout <<
"Number of prime numbers: " <<
(end_num  nonprime_num
) <<
"\n";
cout <<
"Number of nonprime numbers: " << nonprime_num <<
"\n";
cin.get();
return 0;
}
By the way, two comments on your programming style:
1. Why use global variables? As a general rule, globals are evil, and in this case there is no need. You only have one function, main, so declare the variables as local variables inside main.
2. Usually you should use endl at the end of the cout statement as opposed to "\n", because cin/cout is buffered and so you want to make sure the buffer is flushed to the screen. (This one is very minor.)