01/10/2018, 08:18

Gặp vấn đề với in kết quả ra màn hình và file trong C++

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;
}
Nguyễn Duy Hùng viết 10:29 ngày 01/10/2018

chương trình này yêu cầu viết cái gì vậy bạn? Thuật toán và đầu vào ra nó như thế nào

Trần Đức Hiếu viết 10:30 ngày 01/10/2018

Chào bạn!
Chương trình của mình mô mô phỏng lăng kính tam giác ABC bằng thủy tinh có các cạnh phản xạ toàn phần phía trong. Ở chính giữ đáy BC có cửa sổ quang tam giác DEF với F là đỉnh, độ dài đáy bằng 2l. Chương trình giúp mình tìm ra điểm thoát của tia laser đi vào cửa sổ quang DEF ở tọa độ 5mm cách trung điểm của DE có thể ra khỏi lăng kính sau khúc xạ có phương gần song song với mặt phẳng nằm ngang, giới hạn lệch 30 độ. Và cũng tìm đc số điểm phản xạ toàn phần m -1 khi có góc beta và alpha thỏa mãn. Đầu vào mình chọn L=150 và l=15.

Trần Đức Hiếu viết 10:18 ngày 01/10/2018

Thông số của lăng kính phụ thuộc vào góc beta và cửa sổ quang phụ thuộc góc alpha.
Cảm ơn bạn!

Nguyễn Duy Hùng viết 10:21 ngày 01/10/2018

Bạn xem lại logic của bài toán xem đã đúng chưa nhé. mình sửa lại dòng 117 if (ktra == false) continue; Tại vì mình cũng không giỏi vật lý đâu Bạn học phổ thông hay đại học mà tìm hiểu thuật toán này vậy.

Trần Đức Hiếu viết 10:30 ngày 01/10/2018

Lệnh if(ktra = true) continue;
Là bỏ qua các câu lệnh in giá trị beta và alpha, bắt đầu với vòng lặp mới. Theo mình hiểu thì là vậy phải không. Nó giúp chỉ in những giá trị thỏa mãn yêu cầu của mình. Mình chỉ hỏi vấn đề về lập trình, tại sao ở vòng lặp for đầu tiên, thay beta bắt đầu từ (PI/2)*4.4/9 chẳng hạn. Nó cho kết quả khi beta = nó tương ứng 44 độ.
:). Mình học đại học nhưng ko có được đào tạo C++ cơ bản. Chủ yếu tự học thôi.

Nguyễn Duy Hùng viết 10:32 ngày 01/10/2018

Cái đấy mình không biết nữa vì mình chỉ sửa cho nó chạy thôi 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.

Trần Đức Hiếu viết 10:25 ngày 01/10/2018

Thì ý mình là vậy, bỏ qua giá trị alpha và ko thực hiện những câu lệnh sau nó trong vòng lặp. Mình đã kiểm tra lại bằng tính toán toán học, thì kết quả cho chính xác. Mình thắc mắc tại sao vòng lặp đầu tiên lại không chạy hết. Và kết quả in ra màn hình không đầy đủ.

Bài liên quan
0