Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Помогите реализовать передачу параметров ключами.  (Прочитано 2892 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн yaromir

  • Автор темы
  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Всем здравствуйте.
Есть такая программа на С++, считающая значение функции y=1/sin(x) по ряду Тейлора и сравнивающая это значение со значением, вычисленным с помощью библиотеки cmath.
(Нажмите, чтобы показать/скрыть)
Можно ли как-нибудь сделать ввод переменных eps, x1, x2, dx ключами, т.е.
lab4 -eps 0.0000001 -x1 1 -x2 10 -dx 0.2и чтобы порядок ввода ключей не имел значения.
lab4 -dx 0.2 -eps 0.0000001 -x1 1 -x2 10Unix-way.  :)
Пока представляю это только с использованием аргументов main argc и argv[]. Есть какой-нибудь другой способ, какие-нибудь библиотеки или что-то вроде этого?
Заранее спасибо за ответы.
« Последнее редактирование: 08 Февраля 2009, 03:12:34 от Oldwise »

Оффлайн Kwah

  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
boost :: program_options ?

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
1) нафига тебе С++ для такой программы? Перепиши на чистом С
2) Стрельба из пушки по воробьям
boost :: program_options ?
Пусть читает man 3 getopt

Оффлайн yaromir

  • Автор темы
  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Цитировать
1) нафига тебе С++ для такой программы? Перепиши на чистом С
2) Стрельба из пушки по воробьям
Для этого мне надо знать отличия от C.  :)
Спасибо, пойду читать ман и книгу Страустрапа.

Оффлайн yaromir

  • Автор темы
  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Узнав отличия C от C++, вынужден не согласиться с мнением, что я палю из пушки по воробьям.
Просто у меня сейчас костыльно реализована функция модуля - написана своя функция. Просто еще не осилил перегрузку операторов, поэтому не использую функцию abs из cmath. А перегрузки операторов, как понял, в C нет.
Всем Спасибо за наводки, буду учиться.  :D
« Последнее редактирование: 08 Февраля 2009, 03:17:03 от Oldwise »

Оффлайн Sova777

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
    • Несколько слов о NetBeans C/C++ Pack'е
Фраза "Из пушки по воробьям", я думаю, относится к предложению использовать Boost.
Пользователь OpenSolaris 2008.11, Ubuntu 8.10, Windows XP. Mac OS X не нравится, стараюсь не использовать.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
abs и cmath я еще понял.
при чем там перегрузка не понял. да. С89 её не поддерживает. (как С99 не знаю)

Да. из пушки по воробьям это про буст. рано пока еще буст прикручивать. почитай про ООП сначала, потренируся на простых классах, иерархиях в два три уровня, поизучай виртуальные функции, попробуй открть для себя мир шаблонов. а потом уже можно начинать изучать "Стандартную библиотеку С++" и вслед за ней boost.

Ну а пока ваш С++ наверняка не ушел от чистого Си дальше чем
1) использование С++ потоков ввода/вывода (хорошо если отказались от *printf/scanf-семейства)
2) использование конструкций вида for (int i = 0; ...
3) что-то еще? о_О

Оффлайн AlexH

  • Участник
  • *
  • Сообщений: 147
    • Просмотр профиля
Все правильно: main argc и argv[] , а потом разбор ручками. Остальное действительно пушкой по воробьям
arch x86_64

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Товарищ знает толк в извращениях =)

Оффлайн AlexH

  • Участник
  • *
  • Сообщений: 147
    • Просмотр профиля
   char* keys[]={"-x1","-x2","-dx"};
    char pars[3][64];
    for(int i=1;i<argc-1;i++)
        for(int j=0;j<3;j++){
            if(!strcmp(argv,keys[j])){
                strcpy(pars[j],argv[i+1]);
            }
        }
сорри, без проверки ключей на пустые значения. Строки в double перевести надеюсь сможете
arch x86_64

Оффлайн yaromir

  • Автор темы
  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Прочитал ман по getopt'у. На будущее буду знать, но в этой работе сделал через argc и argv[]
(Нажмите, чтобы показать/скрыть)
Здесь количество аргуметов фиксировано и наличие всех ключей обязательно. Потому извращатся с getopt'ом не стал. В данном случае проверка на пустые ключи не нужна, потому что это частный случай несоответствия argc заданному значению (9 или 11).
Всем спасибо за просвещение.
Yurror, не суди строго - только учусь.  ;) Лучше укажи на конкретные извращения. Как писал ранее, тут нужен именно C++. Сам вижу, что в следующей версии нужно будет заменить strncmp на strcmp, atof на strtod. Только нужна ли здесь точность double? Какие еще замечания?
AlekH,
Цитировать
for(int i=1;i<argc-1;i++)
почему argc-1? ИМХО тут просто argc, ну или (язнаю толк в извращениях  :) ) i<=argc-1 . Если argc=9, то выполнение цикла как раз заканчивается на i=9 при for(int i=1; i<argc; i++)
« Последнее редактирование: 15 Февраля 2009, 16:44:07 от Oldwise »

Оффлайн AlexH

  • Участник
  • *
  • Сообщений: 147
    • Просмотр профиля
В принципе можно и for(int i=0;i<argc;i++), просто последний параметр  argv[argc-1]  содержит не имя ключа, а значение, ну а argv[0]  содержит имя программы - следовательно при поиске пропускаем 1-й и последний аргумент. 
arch x86_64

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Oldwise, плохо учишься
double module (double input)   //Функция модуля.
{
   if (input<0) return -input;
   else return input;
}
надо заменить на использование стандартной функции fabs. читай man fabs

  Row+= pow(-1, n)*pow(x, 2*n+1)/fac(2*n+1);   //Прибавлять к ряду n-ный член.
Скорее всего задание было в другом. Надо было сравнить члены ряда друг с дургом и "догнать" что не надо каждую итерацию считать факториал. а просто домножать/делить предыдущее значение.

Опять же при расчете eps следует использовать предыдущее расчитаное значение.
Блин, этому же на первом курсе учат еще по курсу математики... Грустно...

P.S. кстати strncmp использовать предпочтительнее. Так что это не меняй.

Оффлайн digiwhite

  • Активист
  • *
  • Сообщений: 732
  • http://www.welinux.ru
    • Просмотр профиля
    • http://www.welinux.ru
...
2) использование конструкций вида for (int i = 0; ...
...

А чем порочна данная конструкция?
Социальная сеть не фанатично настроенных линуксойдов - http://www.welinux.ru

Оффлайн yaromir

  • Автор темы
  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Цитировать
надо заменить на использование стандартной функции fabs. читай man fabs
Об этом писал ранее. Буду читать.
Цитировать
Скорее всего задание было в другом. Надо было сравнить члены ряда друг с дургом и "догнать" что не надо каждую итерацию считать факториал. а просто домножать/делить предыдущее значение.
Условие остановки по заданию |MyFunc - Func| < eps . И при каждой итерации у меня меняется n. ИМХО лучше уж немного машинного времени, чем угадывать заканомерность изменения n.
Цитировать
Блин, этому же на первом курсе учат еще по курсу математики... Грустно...
Угадал, первый курс.  ;)

 

Страница сгенерирована за 0.064 секунд. Запросов: 21.