Mình đang viết chương trình bằng ngôn ngữ C++, vì chưa thạo class nên mình sử dụng struct. Nhưng chương trình khi chạy thì không in tất cả các giá trị của vòng lặp for đầu tiên ra màn hình và vào file. Mọi người có thể chỉ giúp mình cách giải quyết không ạ!
#include <iostream>
#include <cmath>
#include <fstream>
#define PI 3.14159
using namespace std;
struct Point{
double x = 0.0;
double y = 0.0;
} A, B, C, D, E, F, G, H;
struct Line{
double a = 0.0;
double b = 0.0;
double c = 0.0;
} AB, BC, AC, EF, DF, BD, EC, DE;
struct Normal{
double xn = 0.0;
double yn = 0.0;
} n, n1;
void Equa(Line& t, Point X, Point Y);
void EquaIn(Point H, Point G, Line& t, Line k, double& gamma);
void PofInters(Line t, Line k);
void Prisma(double L, double l, double beta, double alpha);
bool Middle (Point X, Point Y, Point G);
double Length(Point A, Point B);
bool Trung(Point G, Point H);
double Distan(Point G);
void Normal1(double Angle1, Line t);
void equaNorm(Line& t, Normal n1, Point G);
bool KiemTra(Line t, Line k, Point G);
int main(){
int r;
ofstream outfile;
outfile.open("tranhieu1.txt");
double L, l;
double gamma = 0.0;
int j =0;
bool ktra = false ;
cout <<"Aaiaeoa cia?aiea L: ";
cin >> L;
cout << endl;
cout <<"Aaiaeoa cia?aiea l: ";
cin >> l;
cout << endl;
int m= 0;
for (double beta = (PI/2)*2/9; beta < (PI/2)*6/9; beta += PI/180){
for(double alpha = 0; alpha <= (PI/2)*7/9; alpha += PI/180){
Prisma(L, l, beta, alpha);
Equa(AB, A, B);
Equa(BC, B, C);
Equa(AC, A, C);
Equa(EF, E, F);
Equa(DF, D, F);
Equa(BD, B, D);
Equa(EC, E, C);
Line t;
t.a = 1.0;
t.b = 0;
t.c = -5.0;
int m= 0;
PofInters(t, EF);
H = G;
Line k, q;
double r = asin(sin(alpha)/1.5);
double alpha1 = r - alpha;
Normal1(alpha1, t);
equaNorm(t, n1, G);
PofInters(t, AC);
if (Middle(A, C, G) == true){
k = AC;
q = t;
m++;
EquaIn(H, G, t, AC, gamma);
}
while(KiemTra(q, k, G) == false || abs(asin(1.5*sin(gamma)) - (PI/2 - beta))> 0.16 || (gamma >= asin(1/1.5))|| (G.y == 0)) {
H = G;
PofInters(t, AB);
if (Middle(A, B, G) == true && Trung(G, H) == false){
k = AB;
q = t;
m++;
EquaIn(H, G, t, AB, gamma);
}
else {
PofInters(t, DF);
Point G1 = G;
PofInters(t, EF);
if ((Middle(F, D, G1) == true && Trung(G,H) == false) || (Middle(E, F, G) == true && Trung(G, H) == false )){
ktra = true;
}
else{
PofInters(t, BC);
if(Middle(B, C, G) == true && Trung(G, H) == false){
k = BC;
q = t;
m++;
EquaIn(H, G, t, BC, gamma);
}
else{
PofInters(t, AC);
if(Middle(A, C, G) == true && Trung(G, H) == false){
k = AC;
q = t;
m++;
EquaIn(H, G, t, AC, gamma);
}
}
}
}
if (ktra == true) break;
}
if (ktra == true) continue;
cout << "Goc: " << (abs(asin(1.5*sin(gamma)) - (PI/2 - beta))/PI)*180 << endl;
// if (abs(asin(1.5*sin(gamma)) - (PI/2 - beta) <= 0.16)) {
++j;
outfile << G.x <<" "<< G.y << endl;
outfile << "m: " << m << endl;
outfile << "D: " << Distan(G) << endl;
outfile << "H: " << A.y << endl;
outfile << "beta: " << (beta/PI)*180;
outfile << " alpha: " << (alpha/PI)*180 << endl;
outfile <<"----------------------------" << endl;
cout << G.x <<" "<< G.y << endl;
cout << H.x <<" "<< H.y << endl;
cout <<"m: " << m << endl;
cout << "D: " << Distan(G) << endl;
cout << "H: " << A.y << endl;
cout << " beta: " << (beta/PI)*180;
cout << " alpha: " << (alpha/PI)*180 << endl;
cout <<"-------------------------------" << endl;
// }
}
}
cout << j;
outfile << j;
return 0;
}
void Prisma(double L, double l, double beta, double alpha){ // xac dinh toa do cac diem chinh cua prisma
A.x = 0.0;
A.y = L*tan(beta);
B.x = -L;
B.y = 0.0;
C.x = L;
C.y = 0.0;
E.x = l;
E.y = 0.0;
D.x = -l;
D.y = 0;
F.x = 0.0;
F.y = l*tan(alpha);
return;
}
void Equa(Line& t, Point X, Point Y){ //Viet phuong trinh cua mot duong thang khi biet hai diem
n.xn = -(Y.y - X.y);
n.yn = Y.x - X.x;
t.a = n.xn;
t.b = n.yn;
t.c = -(n.xn*X.x + n.yn*X.y);
return;
}
void EquaIn(Point X, Point Y, Line& t, Line k, double& gamma){
Point H0, H1;
H0.x = (k.a*k.a*X.x + k.b*k.b*Y.x + k.a*k.b*(X.y - Y.y))/(k.a*k.a + k.b*k.b);
H0.y = (k.a*X.x + k.b*X.y)/k.b - H0.x*k.a/k.b;
H1.x = 2*H0.x - X.x;
H1.y = 2*H0.y - X.y;
gamma = asin(Length(H1, H0)/Length(H1, Y));
Equa(t, H1, G);
return;
}
void PofInters(Line t, Line k){ //Tim toa do diem giao giua hai duong thang
double d, dx, dy;
d = t.a*k.b - k.a*t.b;
dx = -t.c*k.b + k.c*t.b;
dy = -t.a*k.c + k.a*t.c;
G.x = dx/d;
G.y = dy/d;
return;
}
bool Middle (Point X, Point Y, Point G){ // Xac dinh diem giao nam o giua doan thang gioi han boi hai diem hay khong
if (abs(Length(X, G)+Length(Y, G) - Length(X, Y)) < 0.00001)
return true;
}
double Length(Point A, Point B){ //Tinh do dai giua doan thang gioi han boi hai diem A, B
return sqrt(pow(A.x-B.x,2)+pow(A.y-B.y,2));
}
bool Trung(Point G, Point H){
if (abs( H.x - G.x) < 0.00001 && abs(H.y - G.y) < 0.00001)
return true;
}
double Distan(Point G){
return abs(BC.a*G.x +BC.b*G.y + BC.c)/sqrt(BC.a*BC.a + BC.b*BC.b);
}
void Normal1(double Angle1, Line t){ //Tim phap tuyen cua duong thang phan xa
n1.xn = t.a*cos(Angle1) - t.b*sin(Angle1);
n1.yn = t.a*sin(Angle1) + t.b*cos(Angle1);
return;
}
void equaNorm(Line& t, Normal n1, Point G){ //Viet phuong trinh cua mot duong thang khi biet mot diem va phap tuyen
t.a = n1.xn;
t.b = n1.yn;
t.c = -(n1.xn*G.x + n1.yn*G.y);
return;
}
bool KiemTra(Line t, Line k, Point G){
if (/*((-t.c/t.b) < G.y) &&*/ ((-t.c/t.b) > (k.a*G.y - k.b*G.x)/k.a))
return true;
}

Bạn học phổ thông hay đại học mà tìm hiểu thuật toán này vậy.
còn cái tính đúng sai của chương trình như thế nào thì mình không rõ nên không sửa được cái này chắc bạn phải kiểm tra thôi, cứ dò bằng debug . Câu lệnh continue thì nó bỏ qua giá trị của biến chạy hiện tại thôi ở đây là alpha, nó sẽ tiếp tục cho đến khi kiểm tra điều kiện kết thúc cái vòng lặp ở trong có alpha ấy.
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?