Прочитал ман по getopt'у. На будущее буду знать, но в этой работе сделал через argc и argv[]
/*
lab4v3 - calculation of function y=1/sin(x) using Taylor row.
Copyright (C) 2009 Yaromir Shpilevskii yaromir@hotbox.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
double fac (double n) //Функция факториала.
{
double a, b=1;
if (n==0) return 1;
for (a=1; a<=n; a++) b *=a;
return b;
}
double module (double input) //Функция модуля.
{
if (input<0) return -input;
else return input;
}
int main(int argc, char* argv[])
{
/* if (argc!=9 || argc!=11) {
printf ("Использование:\nСинтаксис:\nlab4 -mode 1 -eps [значение] -x1 [значение] -x2 [значение] -dx [значение]\nlab4 -mode 2 -eps1 [значение] -eps2 [значение] -x [значение]\nMode 1: счет в диапазоне значений x от x1 до x2 с шагом dx с фиксированной точностью eps.\nMode 2: счет с фиксированным x в диапазоне точности от eps1 до eps2 с шагом 0.1.");
return -30;
}*/
int mode=0;
for (int index=1; index<argc; index++) {
if ( strncmp(argv[index], "-mode", 5) == 0 ) mode = atoi(argv[index+1]);
}
if (mode==0) {
printf("Использование:\nСинтаксис:\nlab4 -mode 1 -eps [значение] -x1 [значение] -x2 [значение] -dx [значение]\nlab4 -mode 2 -eps1 [значение] -eps2 [значение] -x [значение]\nMode 1: счет в диапазоне значений x от x1 до x2 с шагом dx с фиксированной точностью eps.\nMode 2: счет с фиксированным x в диапазоне точности от eps1 до eps2 с шагом 0.1.");
return -30;
}
double eps, eps1, eps2, x, x1, x2, dx, n=0, Row=0, MyFunc, Func;
/* if (mode!=1 || mode!=2) {
printf("Код режима неверен.\nИспользуйте -mode 1 для счета в диапазоне значений x от x1 до x2 с шагом dx с фиксированной точностью eps.\nИспользуйте -mode 2 для счета с фиксированным x в диапазоне точности от eps1 до eps2 с шагом 0.1.");
return -31;
}*/
if (mode==1) {
if (argc!=11) {
printf ("Использование:\nСинтаксис:\nlab4 -mode 1 -eps [значение] -x1 [значение] -x2 [значение] -dx [значение]\nlab4 -mode 2 -eps1 [значение] -eps2 [значение] -x [значение]\nMode 1: счет в диапазоне значений x от x1 до x2 с шагом dx с фиксированной точностью eps.\nMode 2: счет с фиксированным x в диапазоне точности от eps1 до eps2 с шагом 0.1.");
return -31;
}
for (int index=1; index<argc; index++) {
if ( strncmp(argv[index], "-eps", 4) == 0 ) eps = atof(argv[index+1]);
}
if (eps<=0) {
printf ("Точность должна быть положительным числом. Код ошибки -11.\n");
return -11;
}
for (int index=1; index<argc; index++) {
if ( strncmp(argv[index], "-x1", 3) == 0 ) x1 = atof(argv[index+1]);
}
for (int index=1; index<argc; index++) {
if ( strncmp(argv[index], "-x2", 3) == 0 ) x2 = atof(argv[index+1]);
}
if (x1>x2) {
printf ("Начальное x должно быть меньше конечного. Код ошибки -12.\n");
return -12;
}
for (int index=1; index<argc; index++) {
if ( strncmp(argv[index], "-dx", 3) == 0 ) dx = atof(argv[index+1]);
}
if (dx<=0) {
printf ("Шаг должен быть положительным числом. Код ошибки -13.\n");
return -13;
}
printf ("________________________________________________________\n");
printf ("| X | MyFunc(x) | Function(x) | Невязка |\n");
printf ("________________________________________________________\n");
for (x=x1; x<=x2; x+=dx) { //Диапазон иксов.
while ( module ( pow(-1, n+1)*pow(x, 2*(n+1)+1)/fac(2*(n+1)+1) - pow(-1, n)*pow(x, 2*n+1)/fac(2*n+1) ) > eps ) { //Пока разность n+1-ого и n-ого членов меньше заданного значения точности.
Row+= pow(-1, n)*pow(x, 2*n+1)/fac(2*n+1); //Прибавлять к ряду n-ный член.
n+=1; //Увеличивать номер члена.
}
MyFunc = 1/Row; //Функция, вычисленная с помощью ряда.
Func = 1/sin(x); //Функция, вычисленная с помощью math.h .
printf ("| %7.3f | %12.7f | %12.7f | %12.7f |\n", x, MyFunc*MyFunc, Func*Func, sqrt ( module ( MyFunc*MyFunc - Func*Func ) ) );
Row=0; n=0; //Обнуление переменных.
}
printf ("________________________________________________________\n");
return 0;
}
if (mode==2) {
if (argc!=9) {
printf ("Использование:\nСинтаксис:\nlab4 -mode 1 -eps [значение] -x1 [значение] -x2 [значение] -dx [значение]\nlab4 -mode 2 -eps1 [значение] -eps2 [значение] -x [значение]\nMode 1: счет в диапазоне значений x от x1 до x2 с шагом dx с фиксированной точностью eps.\nMode 2: счет с фиксированным x в диапазоне точности от eps1 до eps2 с шагом 0.1.");
return -32;
}
for (int index=1; index<argc; index++) {
if ( strncmp(argv[index], "-eps1", 5) == 0 ) eps1 = atof(argv[index+1]);
}
for (int index=1; index<argc; index++) {
if ( strncmp(argv[index], "-eps2", 5) == 0 ) eps2 = atof(argv[index+1]);
}
if (eps1<eps2) {
printf("Начальное eps должно быть больше конечного. Код ошибки -21.\n");
return -21;
}
for (int index=1; index<argc; index++) {
if ( strncmp(argv[index], "-x", 2) == 0 ) x = atof(argv[index+1]);
}
printf ("__________________________________________________________\n");
printf ("| eps | MyFunc(x) | Function(x) | Невязка |\n");
printf ("__________________________________________________________\n");
for (eps=eps1; eps>=eps2; eps *= 0.1) { //Диапазон точности.
while ( module ( pow(-1, n+1)*pow(x, 2*(n+1)+1)/fac(2*(n+1)+1) - pow(-1, n)*pow(x, 2*n+1)/fac(2*n+1) ) > eps ) { //Пока разность n+1-ого и n-ого членов меньше заданного значения точности.
Row+= pow(-1, n)*pow(x, 2*n+1)/fac(2*n+1); //Прибавлять к ряду n-ный член.
n+=1; //Увеличивать номер члена.
}
MyFunc = 1/Row; //Функция, вычисленная с помощью ряда.
Func = 1/sin(x); //Функция, вычисленная с помощью math.h .
printf ("| %8.7f | %12.7f | %12.7f | %12.7f |\n", eps, MyFunc*MyFunc, Func*Func, sqrt ( module ( MyFunc*MyFunc - Func*Func ) ) );
Row=0; n=0; //Обнуление переменных.
}
printf ("________________________________________________________\n");
return 0;
}
else {
printf("Код режима неверен.\nИспользуйте -mode 1 для счета в диапазоне значений x от x1 до x2 с шагом dx с фиксированной точностью eps.\nИспользуйте -mode 2 для счета с фиксированным x в диапазоне точности от eps1 до eps2 с шагом 0.1.");
return -31;
}
}
Здесь количество аргуметов фиксировано и наличие всех ключей обязательно. Потому извращатся с getopt'ом не стал. В данном случае проверка на пустые ключи не нужна, потому что это частный случай несоответствия argc заданному значению (9 или 11).
Всем спасибо за просвещение.
Лучше укажи на конкретные извращения. Как писал ранее, тут нужен именно C++. Сам вижу, что в следующей версии нужно будет заменить strncmp на strcmp, atof на strtod. Только нужна ли здесь точность double? Какие еще замечания?
) i<=argc-1 . Если argc=9, то выполнение цикла как раз заканчивается на i=9 при for(int i=1; i<argc; i++)