Bạn có thể mô tả hiện tượng rõ hơn không. Ví dụ, cho m,b,z bằng mấy, bạn mong muốn kết quả như thế nào, kết quả thực tế khác kết quả mong muốn ở chỗ nào?
Chào mọi người! Mình đang làm 1 đoạn code để tính chọn bánh răng thay thế cho bộ vi sai ở máy lăn răng. Các biến gồm có :
- Modul m: ( float) ( khoảng nhập từ 0.2-2)
- Số răng cần phay z:(float) ( nó là số nguyên nhưng chẳng hiểu sao mình báo int thì nó ko chạy.
- Góc nghiêng răng b (float), công thức chuyển sang radial: b*pi/180
- Tỉ số truyền bộ vi sai: i (float), công thức tính i = 120*sin(b*pi/180) / (m*z*pi)
- Bộ bánh răng thay thế gồm có 4 biến A, B, C, D (int) thỏa mãn điều kiện A*C / B*D = i ( có thể rút ngắn 3 số thập phân để máy tính không lặp nhiều). Số bánh răng này đã có sẵn trong hộp từ khoảng 20-100 răng. Mình cần tính ra 4 biến A, B, C, D để chọn bánh răng thay vào máy.
Ở đây mình dùng lệnh for (A=1; A<110;A++) lặp bao trùm B và D, C = B*D*i/A. Mình cho nó chạy thì khi chạy xong nó chỉ có kết quả phần cuối cùng A lặp đến 99, các số liệu phía trước đều không có! Mong mọi người giúp đỡ ạ! Và có cách nào để tùy chỉnh giới hạn kết quả in ra không ạ?
Đây là code mình làm ở C free 5.0
Code:#include <stdio.h>#include <math.h> #define pi 3.14159 void main(int argc, char *argv[]) { // khai bao bien // m: modul // b: goc nghieng banh rang // z: so rang // i: ti so vi sai // A, B, C, D la cac banh rang thay the ( ket qua la so rang) float b,m,z,i; // Bien tinh ti so vi sai int A, B, C, D; // Bien tinh banh rang thay the printf("Nhap Modul = ",m); scanf("%f",&m); printf("Nhap goc nghieng = ",b); scanf("%f",&b); printf("Nhap so rang = ",z); scanf("%f",&z); i = 120*sin(b*pi/180)/(m*z*pi); printf("ti so vi sai = %f",i); for(A=20; A<100;A++ ) {for(B=20; B<100;B++ ) {for(D=20; D<100 ; D++) { C = B*D*i/A; printf("\nA=%d, B=%d, C=%d, D=%d",A,B,C,D); } } } getch(); }
Bạn có thể mô tả hiện tượng rõ hơn không. Ví dụ, cho m,b,z bằng mấy, bạn mong muốn kết quả như thế nào, kết quả thực tế khác kết quả mong muốn ở chỗ nào?
-...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.
Bạn dùng code của mình cho chạy thử thì thấy là nó gán A từ 1 đến 100, nhưng khi chạy xong thì chỉ còn phần A =99 thôi, phần A nhỏ hơn nó bị mất hết.
Các thông số để gán
- m = 0.8
- b =15
- z = 45
Kết quả mình muốn là nó ra tất cả các nghiệm của A, B, C, D để mình có thể chọn thay bánh răng ( nghiệm nó sẽ rất nhiều, mình chỉ cần chọn 1 trong số những nghiệm này để so sánh với những bánh răng mà trong kho có để thay thế)
Hiện tại mình muốn nó sẽ ra bảng kết quả đầy đủ thôi, sau này mình học hỏi thêm thì mình sẽ nâng cao thêm để tiện dụng nhất.
Lưu vào file !
Đây là code, biên dịch và chạy thử:
Tôi chuyển z là int
Góc nghiêng là độ (degrees) hay Radians / Grads ?
Công thức của bạn có z*pi, với z là số răng, thật kỳ lạ. Nhưng thôi, đó là việc của bạn.
Code chưa ổn về thuật toán, vì theo cách ấy, phần lớn các giá trị C mà bạn tính ra sẽ không nguyên.
Màn hình kết quả khá dài. Để tiện xử lý kết quả, bạn nên lưu màn hình vào file.
Đây là code của bạn, mình đã chữa:
C Code:
#include <stdio.h> #include <math.h> #define pi 3.14159 #define error 1E-3 int main(int argc, char *argv[]) { // khai bao bien // m: modul // b: goc nghieng banh rang // z: so rang // i: ti so vi sai // A, B, C, D la cac banh rang thay the ( ket qua la so rang) float b,m,i; // Bien tinh ti so vi sai int z, A, B, C, D; // Bien tinh banh rang thay the int count = 0; for(A=20; A<100;A++ ) { for(B=20; B<100;B++ ) { for(C = 20; C<100; C++){ for(D=20; D<100 ; D++){ count++; } } } } } }
Nội dung tệp input.txt:
Nội dung trích đoạn đầu và cuối tệp output.txt:Code:0.8 15 45
Cách dùng: Đặt tên chương trình là bobanhrang.exe,chuẩn bị sẵn tệp input.txt với nội dung như trên, và khẳng định không tồn tại tệp nào tên là output.txt. Từ command prompt, gõ dòng lệnhCode:Modul=0.800000 Goc_nghieng=15.000000 So_rang=45 Ti_so_vi_sai = 0.274616 A=20 B=20 C=25 D=91 A=20 B=22 C=26 D=86 A=20 B=22 C=29 D=96 A=20 B=23 C=24 D=76 ... A=99 B=97 C=25 D=93 A=99 B=98 C=22 D=81 A=99 B=98 C=25 D=92 A=99 B=99 C=25 D=91 13035 solutions found.
Code:bobanhrang < input.txt > output.txt
Đã được chỉnh sửa lần cuối bởi Ada : 27-11-2017 lúc 09:17 AM.
-...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.
Với parameters (main(int argc, char *argv[])), bạn có thể dùng thêm các hàm atoi, atof để chuyển tham số từ chuỗi sang số, dùng cmd hay script để lưu tất cả kết quả vào file
Batch Code:
@echo off echo using : echo ViSai2.exe "Modul" "Goc nghieng" "So reng" echo. ViSai2.exe 0.8 15 45 > path\Output.txt
Trong đó > là tune chuyển hướng; không cần phải lập trình mở - viết - đóng file đối với vấn đề đang nói đến.
Rảnh thì xem Script and Interpret
Mình cám ơn các bạn đã góp ý và sửa code cho mình, công thức có liên quan đến z và pi vì nó là chuyển động bù vi sai ( cái này thuộc về phần cơ khí của máy và công thức thì hoàn toàn không có vấn đề gì ^^). Góc nghiêng nhập vào là degree và mình đã chuyển sang radial trong công thức tính i rồi. Nói chung là với file các bạn post kết quả lên là đã đúng với những thứ mà mình mong muốn rồi.
Đã được chỉnh sửa lần cuối bởi minhtuan2403 : 26-11-2017 lúc 09:38 PM.
Mình vừa cập nhật code ở post #5. Thêm biến count để đếm nghiệm, và thêm hằng error để giới hạn sai số tương đối của AC/BD.
Ví dụ. Với error = 1E-3 hiện thời, chương trình tìm được 13035 nghiệm. Nếu lấy error = 0.5E-4, chỉ còn 626 nghiệm.
-...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.
Theo cách tính của bạn, 3 vòng for lồng nhau, mỗi vòng for lặp 80 lần
File chứa (output.txt) là rất lớn: 80^3 = 512000 dòng, 11.5 MB
Nên làm theo cách của Ada.
Nếu bạn muốn tìm hiểu về script theo cách của tôi, bạn xem link này
Script and Interpret
Mình vừa đến công ty để chạy thử theo cách của bạn Ada và chọn nghiệm, nhưng số nghiệm quá nhiều vì hôm qua mình tưởng trong kho có đầy đủ bánh răng từ 1-100,nhưng nay kiểm tra trong kho của mình chỉ thì A, B, C, D giới hạn trong khoảng số răng có sẵn là :
24
25
26
28
30
35
36
40
42
45
50
52
55
60
62
65
72
75
80
82
85
90
92
95
100
102
105
110
112
115
120
125
130
132
135
140
142
145
150
Giờ có cách nào ràng buộc cho A, B, C ,D chạy trong côt dữ liệu này không nhỉ? Mình xin lỗi vì dữ liệu lúc đầu không đầy đủ ^^. Nếu cho A, B, C, D nằm trong khoảng này thì mình sẽ tiết kiệm được việc lọc kết quả rất nhiều.