2012-12-20 37 views
5

** Nếu bạn không quan tâm đến thông tin cơ bản, hãy giải thích lý do bỏ qua của tôi đến cuối cùng cho đến cuối câu hỏi của tôi.Kéo tập hợp các số từ dòng lệnh bằng argv []

Tôi có một tập hợp các phương trình đa thức tôi cần phải đọc vào chương trình của tôi để thực hiện kiểm tra đơn vị của đa thức như

  • bộ phận tổng hợp
  • Addition
  • Trừ
  • Scale
  • Phép nhân
  • Rễ

vì vậy tôi cần có khả năng nhập một loạt các số để kiểm tra các chức năng được sử dụng trong BRLCAD, mặc dù tôi đang gặp khó khăn khi đưa ra giải pháp hiệu quả để đọc bằng số. Cách tiếp cận hiện tại của tôi:

Với dòng lệnh:

./unit_test sd 2 3 4 8 1 4 5

  • sd - thực hiện tổng hợp bộ phận
  • 2 - mức độ của poly đầu tiên
  • 3,4,8 - 3x^2 + 4x + 8
  • 1 - mức độ của poly thứ hai

viết một thuật toán để đọc một tập hợp các số trong định dạng này là cồng kềnh và khá khó hiểu cho người khác để hiểu, cộng với tôi chưa thực hiện hai đa thức khác để được đọc như là câu trả lời để được so sánh. (Vì đây là một tệp nguồn mở, tôi muốn công việc của mình có tính minh bạch).

if(strcmp(argv[1],"sd") == 0){ 

    poly_eqn1.dgr = atoi(argv[2]); 
    /* start at argv[3], run degree count plus one times */ 
    for(counter = 0; counter < (eqn1.dgr + 1); counter++) 
     poly_eqn1.cf[counter] = atof(argv[counter+3]); 

    poly_eqn2.dgr = atoi(argv[4 + poly_eqn1.dgr]); 
    /* start at end of degree one counter */ 
    for(counter = 0; counter < (dgr2 + 1); counter++) 
     poly_eqn2.cf[counter] = atof(argv[counter+5+dgr]); 

    /* grab the answer from end of data */ 

    return test_synthetic(//input proper data...); 
} 

Sẽ sử dụng sscanf có nhiều efficent để đọc trong đa thức của tôi được đưa ra một mức độ tối đa được thiết lập? Sau khi viết phương pháp ban đầu tôi nghĩ về việc sử dụng sscanf, nhưng tôi không chắc chắn nếu sử dụng nó theo cách như vậy sẽ có giá trị nó như trái ngược với viết trong hai đa thức hơn đọc trong từ trên cao:

Với mức độ tối đa là bốn cho một đa thức

./unit_test sd 2,0,0,2,4,5 1,0,0,0,2,3

  • 2,0,0,2,4,5 - mức độ 2, 0x^4 + 0x^3 + 2x^2 + 4x + 5
+0

Tôi không hiểu điều gì đang xảy ra với cách bạn đang thực hiện ngay bây giờ. –

+0

@jim balter: nó cực kỳ lộn xộn và khó thực hiện, tôi hỏi nếu sử dụng sscanf sẽ là một lựa chọn tốt hơn để chuyển sang. –

+0

scanf sẽ không làm bất cứ điều gì cho bạn ở đây. –

Trả lời

3

Bạn thực sự không cần phải lo lắng về hiệu quả khi đơn giản xử lý các đối số dòng lệnh. Làm như vậy theo cách đơn giản, đơn giản nhất phù hợp với nhiệm vụ của bạn. Dành thời gian của bạn lo lắng về hiệu quả mà nó quan trọng - trong vòng lặp chặt chẽ với các thuật toán crunching số thực tế.

+0

theo ý kiến ​​của bạn (nếu bạn đọc bài đăng), phương pháp nhận số nào bạn nghĩ là 'dễ dàng hơn'? Đánh giá cao câu trả lời. –

5

Nếu tôi là bạn, tôi sẽ cố gắng hết sức để hỗ trợ các thông số của bạn ở định dạng có thể đọc được của con người.

Ví dụ, chúng ta có thể phân tích đầu vào trong hình thức sau đây:

./unit_test "(3*x^2+4*x+8)/(4*x+5)" 

Cấp, bạn có thể phải viết phân tích cú pháp từ vựng để hiểu đầu vào này, nhưng nó sẽ là dễ nhất để hiểu từ góc độ người dùng.

+0

Đây là một ý tưởng tuyệt vời, tuy nhiên các tập tin tôi đang viết này cho là một dự án mã nguồn mở (BRLCAD) mà có lẽ sẽ không hỗ trợ phương pháp này. Tất cả các bài kiểm tra đơn vị khác trong dự án khá đơn giản để chuyển các tham số vào (các phép thử đơn vị thực/phức) ngoại trừ các đa thức mà tôi dự kiến ​​sẽ viết chỉ bằng các khái niệm c. Vẫn upvoted mặc dù –

Các vấn đề liên quan