2012-12-20 9 views
5

** Jeśli nie interesuje Cię podstawowa informacja wyjaśniająca moje rozumowanie, przejdź do samego dołu pod koniec mojego pytania.Ciągnięcie zestawów liczb z wiersza poleceń przy użyciu argv []

Mam zestaw równań wielomianowych muszę czytać w moim programie do wykonywania testów jednostkowych wielomianów takich jak

  • podział syntetyczny
  • Dodatek
  • odejmowanie
  • Skala
  • Mnożenie
  • Korzenie

, więc muszę mieć możliwość wprowadzania szerokiego zakresu liczb, aby przetestować funkcje używane w BRLCAD, chociaż mam problem wymyślanie skutecznego rozwiązania do czytania liczb. My obecnego podejścia:

względu na linii polecenia:

./unit_test sd 2 3 4 8 1 4 5

  • sd - przeprowadza podział syntetyczny
  • 2 - stopień pierwszy poli
  • 3,4,8 - 3 x^2 + 4x + 8
  • 1 - stopień drugiego poli

Pisanie algorytmu do odczytu zestawu liczb w tym formacie jest uciążliwe i dość mylące dla innych do zrozumienia, a ponadto muszę jeszcze wdrożyć dwa inne wielomiany do odczytywania jako odpowiedzi do porównania. (Ponieważ jest to plik open source, chciałbym, aby moja praca miała pewną przejrzystość).

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

Czy używając sscanf być bardziej skuteczny, aby przeczytać w moim wielomianu danego maksymalny stopień jest ustawiony? Po napisaniu pierwszej metody myślałem o używaniu sscanf, ale nie jestem pewien, czy używanie go w taki sposób byłoby tego warte, w przeciwieństwie do pisania w dwóch więcej wielomianowych odczytach od góry:

Biorąc pod uwagę maksymalny stopień piec do wielomianu

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

  • 2,0,0,2,4,5 - stopień 2, 0 x^4 + 0 x^3^2 + 2x + 4x + 5
+0

Nie rozumiem, co jest nie tak ze sposobem, w jaki teraz to robisz. –

+0

@jim balter: jest strasznie niechlujny i trudny w implementacji, pytam, czy użycie sscanf byłoby lepszym rozwiązaniem. –

+0

scanf nie zrobi nic dla ciebie tutaj. –

Odpowiedz

3

Naprawdę nie musisz martwić się o wydajność, gdy tylko przetwarzanie argumentów wiersza poleceń. Zrób to w najprostszy, najprostszy sposób, odpowiedni do Twojego zadania. Poświęć swój czas na martwienie się wydajnością tam, gdzie ma to znaczenie - w ciasnych pętlach z rzeczywistymi algorytmami zgrywania liczb.

+0

Twoim zdaniem (jeśli czytasz wpis), która metoda pobierania liczb byłaby "łatwiejsza"? Doceń odpowiedź. –

5

Gdybym był tobą, starałbym się wesprzeć twoje parametry w formacie czytelnym dla człowieka.

Na przykład, powinno być możliwe do analizowania wejście w następującej formie:

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

prawda, być może trzeba będzie napisać leksykalny parser zrozumieć to wejście, ale byłoby najłatwiej zrozumieć z punktu widzenia użytkownika.

+0

To jest świetny pomysł, jednak plik, o którym piszę, to projekt open source (BRLCAD), który prawdopodobnie nie wspierałby tego podejścia. Wszystkie inne testy jednostkowe w projekcie są dość proste do przekazania parametrów do (złożonych/rzeczywistych testów jednostkowych) z wyjątkiem wielomianów, które mam napisać przy użyciu tylko c koncepcji. Wciąż jednak przegłosowano –

Powiązane problemy