название для официального сайта inFlowia Lab
  • помощь 4 free! :)
  • делаем добро :)
  • делаю сайты, скрипты и хорошее настроение :)
  • всё поправимо! :)
  • Свобода и OPENsource!
  • Linux - это любовь!
  • Linux - это Lюбовь
  • творим добро с 2019/03/22 :)

inFlowia Lab. :: FuelCorrectHelper :: Исходный код

О программе
язык: C++
#include <iostream> #include <fstream> // для файлов #include <stdlib.h> //для atof #include <string.h> //srtcpy и прочие по строкам using namespace std; /* преобразует float в строку, разделённую запятой на целую и дробную части и возвращает эту строку (статическая переменная!) требует: #include <string.h> возможно #include <stdlib.h> знаков после запятой 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. не делает добро за деньги, но знать, что её труды кому-то помогают очень классно. Если тебе помогли - не поленись, всего пара слов: "Спасибо! Помогло :)" сделают дни инфловии светлее. ^^

Количество откликнувшихся: 8