#include
#include // для файлов
#include //для atof
#include //srtcpy и прочие по строкам
using namespace std;
/* преобразует float в строку, разделённую запятой на целую и дробную части и возвращает эту строку (статическая переменная!)
требует:
#include
возможно #include
знаков после запятой 4
максимальная длинна числа (вместе с дробной частью) - 19
ВИМАНИЕ! Не использовать для передачи на печать в качестве аргумента, если она будет фигурировать в этой ередаче 2 раза - выдаст одни и те же данные 2 раза.
В таких случаях нужно вызвать её до начала вывода и СКОПИРОВАТЬ её результат в буфер, из которого будет происходить чтение для вывода.
*/
char* fToStrWithComma(float f)
{
static char res[20] = ""; // сюда запишется результат
strcpy(res, ""); // после каждого вызова нужно обнулить, так как переменная статическая
int pointPos = 0; // позиция запятой в числе
int sign = 0; // под знак (+ / -)
char tmp[20] = ""; // под необработанное число в виде строки
strcpy(tmp, ecvt(f, 19, &pointPos, &sign)); // перевод в строку
if(sign)//если надо - дописываем знак "-"
strcat(res, "-");
// записать в результат целую часть (если нужно "вручную вставить" 0)
if(pointPos > 0)
strncat(res, tmp, pointPos);
else
strcat(res, "0");
//
strcat(res, ","); // добавить ","
// добавить дробную часть (если позиция запятой больше или равна нулю - по обычным правилам, если меньше - то нужно дописать столько нулей, чему равно число "позиция")
if(pointPos >= 0)
strncat(res, tmp+pointPos, 4);
else
{
for(int i = 0; i < (pointPos * (-1)); i++)
strcat(res, "0");
strncat(res, tmp, 4);
}
//cout << endl << "f=" << f << "res=" << res << "pointPos=" << pointPos << "tmp=" << tmp; // можно включить для отладки
return res;
}
int main(int argc, char** argv) {
setlocale(LC_ALL, "Russian");
cout << "+++++++ +++++++ +++++++ +++++++\n";
cout << "+ разработчик: inFlowia Lab. +\n";
cout << "+ сайт: inFlowia.ru +\n";
cout << "+++++++ +++++++ +++++++ +++++++\n\n";
cout << "введите необходимые данные \n";
cout << "ЦЕЛОЕ число с котороого начать перебор: ";
short int beg = 0;
cin >> beg;
cout << "ЦЕЛОЕ число, до которого продолжать перебор: ";
short int end = 0;
cin >> end;
if (beg >= end)
{
cout << "начальное число не может быть больше либо равным конечному";
system("pause");
return 0;
}
cout << "шаг перебора (разделитель дробной части - ТОЧКА а не запятая!): ";
float step = 1;
cin >> step;
if(step <= (float)0)
{
cout << "шаг перебора не может быть меньше либо равным нулю";
system("pause");
return 0;
}
unsigned short int BUF_SZ = 500; // макс. длинна строки
char buf[BUF_SZ] = ""; // под строку из файла
struct V // объём заправки
{
float f; // по чеку (фактически)
float g; // по ГЛОНАСС
};
V v[5];
cout << "начала чтение входного файла...";
ifstream in("in.txt");
if(!in)
{
cout << "\nНЕ НАЙДЕН ФАЙЛ ДАННЫХ О ЗАПРАВКАХ in.txt! Аварийно завершаюсь.";
system("pause");
return 0;
}
unsigned short int i = 0;
while(!in.eof() and (i < 5)) // чтение объёма заправок по чеку
{
in.getline(buf, sizeof(buf));
v[i].f = atof(buf);
i++;
}
i = 0;
while(!in.eof() and (i < 5))// чтение объёма заправок по ДУТ
{
in.getline(buf, sizeof(buf));
v[i].g = atof(buf);
i++;
}
cout << "\nчтение входного файла закончила";
in.close();
float curStep = beg;
ofstream of("out.txt");
while(curStep <= end)
{
float sumRaznAfterCorr = 0; // сумма расхождений после корректировки
for(i = 0; i < 5; i++)
sumRaznAfterCorr += v[i].f - (v[i].g + (v[i].g * curStep / 100)); // вычисление расхождения после корректировки и добавление его к сумме)
char tmpRes[20];
strcpy(tmpRes, fToStrWithComma(sumRaznAfterCorr / 5)); // Вычисление среднего расхождения. Нужно СКОПИРОВАТЬ результат в буфер, иначе при выводе через cout будет выведен предыдущий результат
of << fToStrWithComma(curStep) << "\t" << tmpRes << endl; // запись в файл значений корректировки и среднего расхождения
curStep += step;
};
of.close();
cout << "\nподсчёт завершила без видимых проблем\n";
system("pause");
return 0;
}
О программе
Помогло? :)
Черкани Инфловии пару строк если нашёл здесь помощь. Можешь писать под любым постом в группе VK или по старинке на почту: inFlowia@netc.it :)
inFlowia Lab. не делает добро за деньги, но знать, что её труды кому-то помогают очень классно. Если тебе помогли - не поленись, всего пара слов: "Спасибо! Помогло :)" сделают дни инфловии светлее. ^^