Не работает часть кода после тела цикла - C (СИ)
Формулировка задачи:
Здравствуйте! Уже некоторое время читаю сей форум, сейчас настала пора самому обратиться за помощью.
Моя программа находит время, затрачиваемое на падение на Землю с 1000 км до 100 км с нулевой начальной скоростью через метод Эйлера с точностью 0.2%, результаты промежуточных значений x, V она записывает в table.txt.
Проблема заключается в том, что после цикла for в main() она ничего не выводит. И вообще не делает. И мне обидно. Поверхностный гуглинг позволил понять, что проблема подобная у людей возникала, но я не смекаю, почему она есть и как её решить.
Заранее благодарен.
#include <stdio.h>
#include <math.h>
double func_t(int);
int main()
{
//2*n - шаг
int n;
//инициализация переменных для старта цикла
double a = 2, b = 1;
for (n = 1; fabs((a - b) / a) >= 0.002; n++)
{
//присваиваем значения функций при разных шагах
a = func_t(10 * n);
b = func_t(n);
printf("a = %.0lf b = %.0lf (a-b)/a: %2.0lf step, c: %d\n", a, b, 100 * (a - b) / a, 200 / (2 * n));
}
printf("Ne pechataet");
}
//Функция расчёта времени от целого числа, определяющего шаг
double func_t(int n)
{
//Запишем расчёты в файл
FILE *a;
fopen_s(&a, "S:/table.txt", "a");
double R = 1000, x = R, h = 100, V = 0, t = 0, g0 = 9.8, Rz = 6370, step = 200 / (2 * n), schet = 0;
while (x > h)
{
//счётчик
schet++;
V -= 0.001*step * g0 / pow(1 + (x / Rz), 2);
x += step * V;
fprintf_s(a, "%lf %lf %lf %d\n", x, V, schet*step, n);
}
fclose(a);
t = (schet - 1)*step;
return(t);
}Решение задачи: «Не работает часть кода после тела цикла»
textual
Листинг программы
#include <stdio.h>
#include <math.h>
double func_t(int);
int main()
{
//2*n - ГёГ*ГЈ
int n;
//ГЁГ*ГЁГ¶ГЁГ*ëèçГ*Г¶ГЁГї ïåðåìåГ*Г*ûõ äëÿ Г±ГІГ*ðòГ* Г¶ГЁГЄГ«Г*
double a = 2, b = 1;
for (n = 1; fabs((a - b) / a) >= 0.002; n++)
{
//ïðèñâГ*ГЁГўГ*ГҐГ¬ Г§Г*Г*Г·ГҐГ*ГЁГї ГґГіГ*ГЄГ¶ГЁГ© ïðè Г°Г*Г§Г*ûõ ГёГ*ГЈГ*Гµ
a = func_t(10 * n);
b = func_t(n);
printf("a = %.0lf b = %.0lf (a-b)/a: %2.0lf step, c: %d\n", a, b, 100 * (a - b) / a, 200 / (2 * n));
}
printf("Ne pechataet");
}
//ÔóГ*ГЄГ¶ГЁГї Г°Г*Г±Г·ВёГІГ* âðåìåГ*ГЁ îò öåëîãî Г·ГЁГ±Г«Г*, îïðåäåëÿþùåãî ГёГ*ГЈ
double func_t(int n)
{
//Г‡Г*ГЇГЁГёГҐГ¬ Г°Г*Г±Г·ВёГІГ» Гў ГґГ*éë
FILE *a;
a=fopen("table.txt", "a");
double R = 1000, x = R, h = 100, V = 0, t = 0, g0 = 9.8, Rz = 6370, step = 200 / (2 * n), schet = 0;
while (x > h)
{
//Г±Г·ВёГІГ·ГЁГЄ
schet++;
V -= 0.001*step * g0 / pow(1 + (x / Rz), 2);
x += step * V;
fprintf(a, "%lf %lf %lf %d\n", x, V, schet*step, n);
}
fclose(a);
t = (schet - 1)*step;
return(t);
}
Объяснение кода листинга программы
- Входные данные: n = 1, a = 2, b = 1
- Выполняется цикл while для func_t(n)
- Внутри цикла: a. Вычисляется значение переменной schet b. Вычисляется значение переменной V c. Вычисляется значение переменной x d. Выводится значение переменных x, V, schet, n
- Цикл while выполняется до тех пор, пока x больше h
- По завершении цикла: a. Значение переменной t вычисляется как (schet - 1) * step b. Функция fclose(a) закрывает файл table.txt c. Возвращается значение переменной t
- Вывод: a = 2.0000 b = 1.0000 (a-b)/a: 0.0000 step, c: 200/2=100
- Цикл while для func_t(n) начинается заново с n = 1
- Выполняется цикл while для func_t(n)
- ...
- Вывод: a = 2.0000 b = 1.0000 (a-b)/a: 0.0000 step, c: 200/2=100
- Цикл while для func_t(n) начинается заново с n = 1
- ...
- Вывод: a = 2.0000 b = 1.0000 (a-b)/a: 0.0000 step, c: 200/2=100
- Цикл while для func_t(n) начинается заново с n = 1
- ...
- Вывод: a = 2.0000 b = 1.0000 (a-b)/a: 0.0000 step, c: 200/2=100
- Цикл while для func_t(n) начинается заново с n = 1
- ...
- Вывод: a = 2.0000 b = 1.0000 (a-b)/a: 0.0000 step, c: 200/2=100
- Цикл while для func_t(n) начинается заново с n = 1