Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 8
1

СЛАУ по Гауссу, чтение массива из файла

10.12.2016, 00:51. Показов 1200. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста, исправить. Выдаёт ошибку External:SIGFTP, никак не понимаю, что он просит и как исправить.
Pascal
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
var
 
a: array[1..4, 1..4] of real;
b: array[1..4] of real;
arr: array [1..4, 1..5] of real;
x: array[1..5] of real;
n, i, j, k: integer; r, g: real;
f1,f2:text;
 
begin
assignfile(f1,'input.txt');
reset(f1);
assignfile(f2,'data.txt');
rewrite(f2);
n:=4;
 i := 0;
 while not Eof(f1) do begin
   j := 0;
   while not Eoln(f1) do begin
     Read(f1, arr[i,j]);
     Inc(j);
   end;
   ReadLn(f1);
   Inc(i);
 end;
 {for i:=1 to n do begin
   for j:=1 to n+1 do begin
A[i,j] :=arr[i,j+1] ;
B[i]:=arr[i,1];
end;end;
 for i:=1 to n do
 x[i]:=0;}
A[1,1]:=arr[1,2];  A[1, 2] := arr[1,3]; A[1, 3] := arr[1,4];A[1, 4] := arr[1,5];
A[2,1]:= arr[2,2]; A[2, 2] := arr[4,3]; A[2, 3] := arr[2,4];A[2, 4] := arr[2,5];
A[3,1]:= arr[3,2]; A[3, 2] := arr[4,3]; A[3, 3] := arr[3,4];A[3, 4] := arr[3,5];
A[4,1]:= arr[4,2]; A[4, 2] := arr[4,3]; A[4, 3] := arr[4,4];A[4, 4] := arr[4,5];
b[1] := arr[1,1]; b[2] := arr[2,1]; b[3] := arr[3,1];b[4] := arr[4,1];
 
{writeln('Матрица A: ');
for i := 1 to n do
begin
for j := 1 to n do
begin
write(a[i,j]:5:2);
a1[i,j]:=a[i,j];
end;
writeln;
end;
writeln;
Writeln('Матрица B: ');
for i:=1 to n do
writeln(b[i]);}
for k := 1 to n do { прямой ход Гаусса }
begin
for j := k + 1 to n do
begin
r := a[j, k] / a[k, k];
for i := k to n do
begin
a[j, i] := a[j, i] - r * a[k, i];
end;
b[j] := b[j] - r * b[k];
end;
end;
for k := n downto 1 do { обратный ход Гаусса }
begin
r := 0;
for j := k + 1 to n do
begin
g := a[k, j] * x[j];
r := r + g;
end;
if a[k,k]<>0 then
x[k] := (b[k]-r)/a[k,k]
//else  writeln(f2,'0!');
end;
//writeln('Корни системы:');
for i := 1 to n do
write(f2,'w[', i, ']=', x[i]:0:2, ' ');
close(f1);close(f2);
end.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2016, 00:51
Ответы с готовыми решениями:

Чтение элементов массива из файла, запись в листбокс и сортировка массива
Здравствуйте, помогите решить проблему..шарп только начали изучать, пояснений толковых никаких не...

Чтение из текстового файла и запись в массив. Разбиение массива строк на 4 массива. Split
Необходимо считать данные из файла в 4 массива. внутри файла текст такого типа...

Организовать чтение массива из файла, и запись массива в файл
Доброго времени суток! Как организовать чтение массива из файла и вывести массив в файл?

Сохранение массива в файл и чтение массива из файла
Имеется массив: int region_coordinates; Надо его записать в файл(неважно, в каком формате,...

11
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
10.12.2016, 12:59 2
В строке 20 при чтении самого первого числа из файла чему будут равны индексы i и j? А какой диапазон индексов у переменной arr?
1
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 8
11.12.2016, 14:27  [ТС] 3
Точно, спасибо!

Добавлено через 17 часов 18 минут
Простите ещё раз, но не могу заставить его правильно считать. При вводе матрицы
25 1 1 1 1
20 4 3 2 1
25 4 1 1 4
22 4 1 4 1
должны быть ответы -14 12 13 14, а получаются 11,-4.67, -3.67, - 2.67.
что не так, скажите, пожалуйста?
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
11.12.2016, 15:02 4
Вечером вернусь и, если не забуду, посмотрю. Но вы не теряйте время - проверьте прямой и обратный ходы.
0
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 8
11.12.2016, 18:02  [ТС] 5
Проверил сами ходы. Отлично считает, ответы правильные. Но только если вводить с клавиатуры. Что-то не так с чтением из файла, но не понимаю что, пробовал делать другой цикл - всё поломал.
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
11.12.2016, 20:17 6
Приведите последний вариант, который считает правильно из констант, но неправильно и файла.
0
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 8
11.12.2016, 20:40  [ТС] 7
Pascal
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
var
 
a: array[1..4, 1..4] of real;
b: array[1..4] of real;
//arr: array [1..4, 1..5] of real;
x: array[1..4] of real;
n, i, j, k: integer; r, g: real;
//f1,f2:text;
 
begin
{assign(f1,'input.txt');
reset(f1);
assign(f2,'data.txt');
rewrite(f2);}
n:=4;
 {i := 1;
 while not Eof(f1) do begin
   j := 1;
   while not Eoln(f1) do begin
     Read(f1, arr[i,j]);
     Inc(j);
   end;
   ReadLn(f1);
   Inc(i);
 end;
 for i:=1 to n do
 for j:=1 to n+1 do
 writeln(f2,arr[i,j]);
 for i:=1 to n do begin
   for j:=1 to n+1 do begin
A[i,j] :=arr[i,j+1] ;
B[i]:=arr[i,1];
end;end;
 }
A[1,1]:=1;//arr[1,2];
A[1, 2] := 1;//arr[1,3];
A[1, 3] := 1;//arr[1,4];
A[1, 4] := 1;//arr[1,5];
A[2,1]:= 4;//arr[2,2];
A[2, 2] := 3;//arr[4,3];
A[2, 3] := 2;//arr[2,4];
A[2, 4] := 1;//arr[2,5];
A[3,1]:= 4;//arr[3,2];
A[3, 2] := 1;//arr[4,3];
A[3, 3] := 1;//arr[3,4];
A[3, 4] := 4;//arr[3,5];
A[4,1]:= 4;//arr[4,2];
A[4, 2] := 1;//arr[4,3];
A[4, 3] := 4;//arr[4,4];
A[4, 4] := 1;//arr[4,5];
b[1] := 25;//arr[1,1];
b[2] := 20;//arr[2,1];
b[3] := 25;//arr[3,1];
b[4] := 22;//arr[4,1];
 
 
for k := 1 to n do { прямой ход Гаусса }
begin
for j := k + 1 to n do
begin
r := a[j, k] / a[k, k];
for i := k to n do
begin
a[j, i] := a[j, i] - r * a[k, i];
end;
b[j] := b[j] - r * b[k];
end;
end;
for k := n downto 1 do { обратный ход Гаусса }
begin
r := 0;
for j := k + 1 to n do
begin
g := a[k, j] * x[j];
r := r + g;
end;
x[k] := (b[k]-r)/a[k,k]
 
end;
 
for i := 1 to n do
write(x[i]:0:2,' ');
readln;readln;
//write(f2,'w[', i, ']=', x[i]:0:2, ' ');
//close(f1);close(f2);}
end.
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
11.12.2016, 21:06 8
Лучший ответ Сообщение было отмечено xfqrf как решение

Решение

Сделайте формат файла следующим:
Код
4
1.00 1.00 1.00 1.00 25.00
4.00 3.00 2.00 1.00 20.00
4.00 1.00 1.00 4.00 25.00
4.00 1.00 4.00 1.00 22.00
Первой строкой - количество строк в системе
Далее - расширенная матрица - последний столбец - b.
Pascal
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
{.$define NoFile}
program SLAU;
 
type
  TMatrix = array[1..4, 1..4] of real;
  TArray  = array[1..4] of real;
var
{$ifdef NoFile}
  a: TMatrix = ((1, 1, 1, 1), (4, 3, 2, 1), (4, 1, 1, 4), (4, 1, 4, 1));
  b: TArray = (25, 20, 25, 22);
  n: integer = 4;
{$else}
  a: TMatrix;
  b: TArray;
  n: integer;
{$endif}
  x: TArray;
  i, j, k: integer;
  r, g: real;
  f1, f2: Text;
 
begin
{$ifndef NoFile}
  Assign(f1, 'input.txt');
  reset(f1);
  readln(f1, n);
  for i := 1 to n do
  begin
    for j := 1 to n do
      Read(f1, a[i, j]);
    readln(f1, b[i]);
  end;
  Close(f1);
{$endif}
 
  Assign(f2, 'data.txt');
  rewrite(f2);
 
  for i := 1 to n do
  begin
    for j := 1 to n do
      Write(f2, a[i, j]: 0: 2, ' ');
    writeln(f2, b[i]: 0: 2);
  end;
 
  for k := 1 to n do { прямой ход Гаусса }
  begin
    for j := k + 1 to n do
    begin
      r := a[j, k] / a[k, k];
      for i := k to n do
      begin
        a[j, i] := a[j, i] - r * a[k, i];
      end;
      b[j] := b[j] - r * b[k];
    end;
  end;
  for k := n downto 1 do { обратный ход Гаусса }
  begin
    r := 0;
    for j := k + 1 to n do
    begin
      g := a[k, j] * x[j];
      r := r + g;
    end;
    x[k] := (b[k] - r) / a[k, k];
 
  end;
 
  for i := 1 to n do
    Write(f2, x[i]: 0: 2, ' ');
  readln;
  //write(f2,'w[', i, ']=', x[i]:0:2, ' ');
  Close(f2);
end.
1
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 8
11.12.2016, 21:43  [ТС] 9
Спасибо огромное! всё работает! и гораздо лучше, чем часы!
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
11.12.2016, 21:48 10
Смотрите - там используется условная компиляция - когда куски кода или попадают или исключаются из компиляции.
Это, если будет преподаватель спрашивать.
В зависимости от того, определен символ NoFile (строка 1) параметры для вычислений будут взяты из констант или из файла.
0
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 8
11.12.2016, 22:19  [ТС] 11
Да, я понимаю. Спасибо. А без них можно? и тогда я удалю лишнее из var.
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
11.12.2016, 22:24 12
Конечно, можно. Это же только для отладки.
1
11.12.2016, 22:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2016, 22:24
Помогаю со студенческими работами здесь

Чтение массива из файла
Здравствуйте! Возникла проблема со считыванием матрицы... for(int i=0;i&lt;y;i++){ for(int...

Чтение массива из файла
Имеется такой код: &lt;? $stop_ips_masks = array( &quot;66\.249\.\.+&quot;, ...

Чтение массива из файла
Всем здравствуйте! Помогите, пожалуйста, чайнику. В программе надо сделать, чтобы массив читался из...

Чтение массива из файла
Здравствуйте, Помогите разобраться почему массив не читается : Вот ключевая часть моего кода:...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru