Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 29 kết quả

Đề tài: Code tính toán bộ bánh răng vi sai

  1. #1
    Ngày gia nhập
    12 2016
    Bài viết
    8

    Question Code tính toán bộ bánh răng vi sai

    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();
    	
    }

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    745

    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?
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #3
    Ngày gia nhập
    12 2016
    Bài viết
    8

    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.

  4. #4
    Ngày gia nhập
    08 2017
    Bài viết
    4,085

    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 ?

  5. #5
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    745

    Trích dẫn Nguyên bản được gửi bởi minhtuan2403 Xem bài viết
    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.
    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:
    1. #include <stdio.h>
    2. #include <math.h>
    3. #define pi 3.14159
    4. #define error 1E-3
    5. int main(int argc, char *argv[])
    6. {
    7.     // khai bao bien
    8.     // m: modul
    9.     // b: goc nghieng banh rang
    10.     // z: so rang
    11.     // i: ti so vi sai
    12.     // A, B, C, D la cac banh rang thay the ( ket qua la so rang)
    13.     float b,m,i;        // Bien tinh ti so vi sai
    14.     int z, A, B, C, D;  // Bien tinh banh rang thay the
    15.     int count = 0;
    16.  
    17.     scanf("%f %f %d",&m,&b,&z);
    18.     i = 120*sin(b*pi/180)/(m*z*pi);
    19.     printf("Modul=%f Goc_nghieng=%f So_rang=%d\nTi_so_vi_sai = %f\n\n", m,b,z,i);
    20.     for(A=20; A<100;A++ ) {
    21.         for(B=20; B<100;B++ ) {
    22.             for(C = 20; C<100; C++){
    23.                 for(D=20; D<100 ; D++){
    24.                     if( fabs((double)C*A / (B*D*i) - 1.0) <= error ){
    25.                         printf("A=%d B=%d C=%d D=%d\n",A,B,C,D);
    26.                         count++;
    27.                     }
    28.                 }
    29.             }
    30.         }
    31.     }
    32.     printf("\n%d solutions found.\n",count);
    33. }

    Nội dung tệp input.txt:
    Code:
    0.8 15 45
    Nội dung trích đoạn đầu và cuối tệp output.txt:
    Code:
    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.
    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ệnh
    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.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  6. #6
    Ngày gia nhập
    08 2017
    Bài viết
    4,085

    Mặc định Code tính toán bộ bánh răng vi sai

    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:
    1. @echo off
    2. echo using :
    3. echo ViSai2.exe "Modul" "Goc nghieng" "So reng"
    4. echo.
    5. 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

  7. #7
    Ngày gia nhập
    12 2016
    Bài viết
    8

    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.
    Attached Thumbnails Attached Thumbnails bien dich.JPG   2.JPG  
    Đã được chỉnh sửa lần cuối bởi minhtuan2403 : 26-11-2017 lúc 09:38 PM.

  8. #8
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    745

    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.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  9. #9
    Ngày gia nhập
    08 2017
    Bài viết
    4,085

    Trích dẫn Nguyên bản được gửi bởi minhtuan2403 Xem bài viết
    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.
    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

  10. #10
    Ngày gia nhập
    12 2016
    Bài viết
    8

    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.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn