С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
 Аватар для no1imits
0 / 0 / 0
Регистрация: 23.01.2014
Сообщений: 24

Перестал создаваться поток для вывода в файл

20.03.2015, 05:42. Показов 754. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не пойму в чем проблема: была ошибка в расчетах, но вывод работал. пока я ковырялся в void L_spline, а именно менял начальные значения для a и b, и внутреннего цикла, то теперь считается правильно, а выводить в файл не хочет, вернее программа не идет после ofstream. Подскажите плз, как руки из задницы на место прикрутить?
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
 
long double *f,*l;
double *x;
int n;
///=== точное решение ===============================
void exact()
{
    f=new long double[n];//массив точных решений
    for(int i=0;i<n;i++)
        f[i]=exp(x[i]+sin(x[i]));
}///=== интервал интерполяции =======================
void intervals(double a,double h)
{
    x=new double[n];//массив точек
    h=h/10;//шаг
    for(int i=0;i<n;i++,a+=h)
        x[i]=a;
}///=== линейный сплайн =============================
void L_spline()
{
    l=new long double[n];
    long double s;
    l[0]=f[0];//частн случай, вынес из цикла
    for(int b=10,a=0;a<=n;a+=10,b=a+10){//интервал между узловыми точками
        s=(f[a]-f[b])/(x[b]-x[a]);
        for(int i=a+1;i<=b;i++)
            l[i]=f[b]+(x[b]-x[i])*s;
    }
}
///= вывод =
void fileout()
{cout<<"test1\n";
    ofstream ffout("out.txt");cout<<"test2\n";
    ffout<<"x F(x) L2 R\n";
    for(int i=0;i<n;i++)
        ffout<<x[i]<<" "<<f[i]<<" "<<l[i]<<" "<<fabs(f[i]-l[i])<<endl;
    ffout.close();
}
void out()
{
    cout.setf(ios::left);
    cout<<"x      F(x)      L2\n";
    for(int i=0;i<n;i++){
        cout.width(7);  cout.precision(2);  cout<<x[i];
        cout.width(10); cout.precision(4);  cout<<f[i];
        cout.width(10);                     cout<<l[i];
        cout<<endl;
    }
    cout<<endl;
}
 
int main()
{
    int a,h;
    cout<<"a,h\n";
//    cin>>a>>b>>n;
    a=-4;h=1;n=4;
 
    n=(n+1)*10+1;
 
    intervals(a,h);
    exact();
    L_spline();
 
    out();
    fileout();
    cout<<"Finish";
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.03.2015, 05:42
Ответы с готовыми решениями:

Перестал создаваться отчёт
Снова приветствую. Тот код, что представлен ниже, до недавнего времени работал, сейчас перестал почему-то, выдаёт ошибку &quot;параметр не...

Поток вывода в html файл
Доброго времени суток. Вот у меня есть задача, просуммировать два многочлена. А результат я хочу вывести в html-файл.Каким образом это...

Как направить поток вывода в файл?
Никак не могу вывести поток в файл, поток направляю, файл создает, а при просмотре командой cat, файл пустой. Пишу в виртуальной консоли ...

5
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
20.03.2015, 18:40
no1imits, В вашем коде наблюдаются множественные проблемы и плохие практики. Изначально, проблема из-за которой Ваша программа не работала была в строке:
C++
1
  l[i]=f[b]+(x[b]-x[i])*s;
Индекс i тут достигал значения 60, при том, что память выделялась под массивы длиной 51 элемент.
Фактически происходили некорректные обращения к памяти, не принадлежащей программе.

Я попробовал несколько модифицировать Ваш код, чтобы убрать проблему. Поскольку я не знаком с доменом решаемой проблемы - не могу ручаться за корректность кода с точки зрения решения поставленной задачи, и тем не менее, слегка преобразованный код - большинство имен специально оставлены в старом виде для более легкого восприятия:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <fstream>
#include <cmath>
 
using std::cout;
using std::endl;
using std::ofstream;
using std::ios;
 
long double *Exact(double *x, const int size) {
  long double *f = new long double[size];
  for (int i = 0; i < size; ++i) {
    f[i] = exp(x[i] + sin(x[i]));
  }
  return f;
}
 
double *Intervals(double a, double h, const int size) {
  double *x = new double[size];
  h /= 10;
  for (int i = 0; i < size; ++i) {
    a += h;
    x[i] = a;
  }
  return x;
}
 
long double *LSpline(double *x, long double *f, const int size) {
  long double *l = new long double[size];
  l[0] = f[0];
  for (int a = 0; a < size - 1; a += 10) {
    int b = a + 10;
    long double denominator = x[b] - x[a];
    if (denominator != 0) {
      long double s = (f[a] - f[b]) / denominator;
      for (int i = a; i <= b; ++i) {
        l[i] = f[b] + (x[b] - x[i]) * s;
      }
    }
  }
  return l;
}
 
void Out(long double *l, double *x, long double *f, const int size) {
  cout.setf(ios::left);
  cout << "x      F(x)      L2\n";
  for (int i = 0; i < size; i++) {
    cout.width(7);
    cout.precision(2);
    cout << x[i];
    cout.width(10);
    cout.precision(4);
    cout << f[i];
    cout.width(10);
    cout << l[i];
    cout << endl;
  }
  cout << endl;
}
 
void FileOut(long double *l, double *x, long double *f, const int size) {
  cout << "test1\n";
  ofstream ffout("out.txt");
  cout << "test2\n";
  ffout << "x F(x) L2 R\n";
  for (int i = 0; i < size; i++) {
    ffout << x[i] << " " << f[i] << " " << l[i] << " " << fabs(f[i] - l[i])
          << endl;
  }
  ffout.close();
}
 
int main() {
  std::cout << "a,h\n";
  const int a = -4;
  const int h = 1;
  const int size = 51;
 
  double *x = Intervals(a, h, size);
  long double *f = Exact(x, size);
  long double *l = LSpline(x, f, size);
 
  Out(l, x, f, size);
  FileOut(l, x, f, size);
  delete[] l;
  delete[] x;
  delete[] f;
  cout << "Finish";
}
Пруф работоспособности:
http://ideone.com/fvbCyS

По поводу Вашего кода, более подробно:
1) Код плохо структурирован/форматирован
2) Присутствуют глобальные переменные
3) Память, выделяемая в функциях под массивы не очищается
4) Добавлена директива #include <math.h> на прямую подключающая загловочный файл библиотеки си, вместо #include <cmath> - каноничного в с++ коде
5) using namespace std; - плохая практика
6) ненужные комментарии в коде
7) не выразительные имена функций, названия переменных,
8) множественные действия внутри циклов for
9) закомментированный код
10) использование постфиксного инкремента вместо префиксного
11) использование сырых массивов, выделение памяти через new вместо векторов
12) вызов ostream::close при выходе из скоупа, когда ofstream сам закрывает открытые файлы в при уничтожении
13) отсутствие проверок деления на ноль
1
20.03.2015, 18:44

Не по теме:

Цитата Сообщение от no1imits Посмотреть сообщение
Подскажите плз, как руки из задницы на место прикрутить?
Эт тебе проктолог и хирург нужны.:senor:

0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
20.03.2015, 18:46
Подскажите плз, как руки из задницы на место прикрутить?
Советую Вам на досуге заняться прочтением таких книг как:
С. Макконел Совершенный код.
Д. Босуэлл, Т. Фаучер - Читаемый код или программирование как искусство
Мартин Р. - Чистый код
Мартин Фаулер - Рефакторинг.
Стенли Липпман, Жози Лажойе - Язык программирования С++
Прата С. - Язык программирования С++
Страуструп Б. - Язык программирования С++
1
 Аватар для no1imits
0 / 0 / 0
Регистрация: 23.01.2014
Сообщений: 24
20.03.2015, 19:43  [ТС]
На счет рукожопости понял, но не понятно почему программа не крашилась, при i выходящем за пределы массива, а только не создавала поток после?
0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
20.03.2015, 19:48
no1imits, потому-что обращение к элементу массива, по невалидному индексу приводит к неопределенному поведению, оно может вести себя именно так, как Вы хотели, а может удалять Вам все на жестком диске, запускать ядерные боеголовки и изобретать лекарство от рака одновременно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.03.2015, 19:48
Помогаю со студенческими работами здесь

Как перегрузить оператор вывода в поток для вектора?
Стало интересно реализовать подобный функционал, и конечно же ничего не работает. При этом коде: template&lt;class T&gt; ...

Перегрузить операторы ввода/вывода в поток (>>, <<) для класса
Помогите, перегрузить операции ввода/вывода в поток (&gt;&gt;, &lt;&lt;) для класса A. Для объекта класса A должны работать инструкции: A a;...

Реализовать перегрузку операторов << и >> для вывода вектора в поток
Дана программа: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;iostream&gt; using namespace std; template &lt;class T&gt; ...

Почему не хочет создаваться файл?
Если в тексте программы указать путь и имя файла, то файл создаваться не хочет, char destination=&quot;d:\aaa.txt&quot;; ...

Разработать шаблон класса для вывода вектора данных в поток
Разработать шаблон соответствующего класса, где поля могут иметь различные типы данных. Предусмотреть наличие в классе указанных методов и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru