Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с матрицами и файлами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Iren
Надо к завтрашнему дню сдать две задачи (крайний срок), сама виновата, дотянула донельзя.
Очень прошу, помогите решить:
1.
Описать функцию sum(A, S1, S2), вычисляющую сумму тех элементов матрицы А, номера строк и столбцов которых принадлежат соответственно непустым множествам S1 и S2 типа ном.
const n=10; type номер=1..n; матрица=array [номер, номер] of real; ном = set of номер
2.
В данном файле целых чисел с элементами A1, A2, …, AN (N — количество элементов в файле). Заменить исходное расположение его элементов на следующее: A1, AN, A2, AN–1, A3, … .

Очень прошу помогите...
volvo
Насчет первой - все просто:
const
size = 10;
type
number = 1 .. size;
matrix = array[number, number] of integer;

byteset = set of number;

function sum(var a: matrix; s1, s2: byteset): integer;
var
i, j, s: integer;
begin
s := 0;
for i := 1 to size do
for j := 1 to size do
if (i in s1) and (j in s2) then s := s + a[i, j];
sum := s;
end;

var
arr: matrix;
i, j: number;

begin
for i := 1 to size do
for j := 1 to size do
arr[i, j] := random(20);

for i := 1 to size do begin
for j := 1 to size do
write(arr[i, j]:4);
writeln;
end;

writeln('sum = ', sum(arr, [1, 3], [2]));
end.
volvo
Вторая (предполагая, что файл F: File Of Integer уже имеется на диске):
var
arr: array[1 .. 100] of integer;

var
i, n: integer;
f: file of integer;

begin
assign(f, 'f_in.dat');
reset(f); n := 0;
while not eof(f) do begin
inc(n); read(f, arr[n]);
end;

rewrite(f);
for i := 1 to n div 2 + n mod 2 do begin
write(f, arr[i]);
if i <> (n - i + 1) then
write(f, arr[n - i + 1]);
end;
close(f);
end.
Iren
ГИГАНТСКОЕ Вам спасибо To: volvo , вторую программу я еще не смотрела, а вот по первой возникло несколько вопросов:
1. На экран у меня почему-то выводятся две абсолютно одинаковые матрицы.
2. Наверное лучше сделать ввод матрицы вручную (тоесть убрать RANDOM), но как это сделать. Или оставить ввод случайных чисел
volvo
Цитата
1. На экран у меня почему-то выводятся две абсолютно одинаковые матрицы.

blink.gif Откуда выводятся 2 матрицы? Там же только одна должна выводиться, и потом подсчитывается нужная сумма... Может, ты запустила ее 2 раза по ошибке?
Цитата
2. Наверное лучше сделать ввод матрицы вручную

  for i := 1 to size do
for j := 1 to size do begin
write('a[', i:3, j:3, '] = '); readln(arr[i, j]);
{
arr[i, j] := random(20);
}
end;
Iren
Извините, но ведь в задаче сказано матрица=array [номер, номер] of real, а у вас написано of integer???
volvo
Iren, извините, а что, так трудно поменять? Или Вы предпочитаете писать остальные программы самостоятельно? dry.gif Удачи !
Guest
Да нет, вы меня неправильно поняли, извините если я Вас обидела.
Просто если я изменяю тип массива на real, появляется ошибка несоответствия типов, а если я меняю на real еще и оставшиеся типы, то появляется ошибка "Недопустимая управляющая переменная оператора for'...
Еще раз простите...
volvo
no1.gif Никаких ошибок. Надо было просто изменить тип функции Sum и переменной S внутри нее... Вот так:
const
size = 10;
type
number = 1 .. size;
matrix = array[number, number] of real;

byteset = set of number;

function sum(var a: matrix; s1, s2: byteset): real;
var
i, j: integer;
s: real;
begin
s := 0;
for i := 1 to size do
for j := 1 to size do
if (i in s1) and (j in s2) then s := s + a[i, j];
sum := s;
end;

var
arr: matrix;
i, j: number;

begin
for i := 1 to size do
for j := 1 to size do
arr[i, j] := random(20);

for i := 1 to size do begin
for j := 1 to size do
write(arr[i, j]:4);
writeln;
end;

writeln('sum = ', sum(arr, [1, 3], [2]));
end.
Iren
Еще раз спасибо Вам большое за помощь ...
Iren
С первой задачкой все супер, большое вам спасибо...
Но вот со второй разобраться никак не получается, не могу понять принципа ее работы: создаю файл f_in.dat с числами, пытаюсь запустить программу, но появляется ошибка disk read error, может быть лучше сделать создание файла, а не использование готового (как я поняла, для этого достаточно изменить rewrite на write???)...
klem4
приведи пожалуйста текст того, то ты запускаешь, + как ты можешь сама создать типизированный файл ? Это только программно можно сделать ...
volvo
Цитата
как я поняла, для этого достаточно изменить rewrite на write

no1.gif Для этого достаточно сделать так:
Assign(f, 'f_in.dat'); Rewrite(f);
Write('Количество элементов: '); ReadLn(n);
for i := 1 to n do begin
write('a[', i:2, '] = '); readln(arr[1]);
write(f, arr[1]); { именно 1 а не i }
end;
close(f);
и вставить этот фрагмент перед открытием файла для чтения (т.е. сразу после первого Begin) в моей программе...
Guest
Вставила, но получается просто пустой файл создается mega_chok.gif
Iren
Вставила, но получается просто пустой файл создается mega_chok.gif
Iren
Цитата
приведи пожалуйста текст того, то ты запускаешь, + как ты можешь сама создать типизированный файл ? Это только программно можно сделать ...

Код

var
 arr: array[1 .. 100] of integer;
 i, n: integer;
 f: file of integer;
begin
Assign(f, 'f_in.dat'); Rewrite(f);
Write('Количество элементов: '); ReadLn(n);
for i := 1 to n do begin
 write('a[', i:2, '] = '); readln(arr[1]);
 write(f, arr[1]); { именно 1 а не i }
end;
close(f);
 assign(f, 'f_in.dat');
 reset(f); n := 0;
 while not eof(f) do begin
 inc(n); read(f, arr[n]);
 end;
 rewrite(f);
 for i := 1 to n div 2 + n mod 2 do begin
   write(f, arr[i]);
   if i <> (n - i + 1) then
     write(f, arr[n - i + 1]);
 end;
 close(f);
end.
volvo
Ozzя, я для кого написал в комментариях { именно 1 а не i } ??? Внимательно читать будем или будем все по-диагонали?

Iren, все должно работать... Сейчас проверю...
volvo
Iren, все прекрасно работает... Какой "пустой" файл? Ты размер его видела? То, что этот файл НЕ просматривается обычным редактором - это не значит, что он пустой. Внимательно перечитай задание:
Цитата
В данном файле целых чисел с элементами A1, A2, …, AN (N — количество элементов в файле). Заменить исходное расположение его элементов на следующее: A1, AN, A2, AN–1, A3, … .

Это файл НЕ текстовый, а типизированный... Его надо не только создавать, но и просматривать программно...
Iren
Цитата
Это файл НЕ текстовый, а типизированный... Его надо не только создавать, но и просматривать программно...

А как это реализовать: надо что-то добавить в эту программу или писать отдельную???
Iren
И еще: как я поняла данная программа создает новый типизированный файл, затем в него вводятся целые числа (в порядке A1, A2 ... AN), затем программа изменяет порядок этик целых чисел ( A1, AN, A2, AN–1, A3, … ).
Но мне непонятен один момент: в программе вводится только число элементов, но не они сами. Ведь так ???
volvo
Можно добавить:
reset(f);
while not eof(f) do begin
read(f, arr[1]);
write(arr[1]);
end;
можно отдельно написать...

А вообще-то, пора бы думать начать уже, это же все совершенно однотипное !!!

P.S.
Цитата
в программе вводится только число элементов, но не они сами

Правда? Особенно вот тут:
write('a[', i:2, '] = '); readln(arr[1]);
что это делается?

ПО ЗАДАНИЮ не должно вводиться вообще ничего. Но должен быть готовый файл ЦЕЛЫХ, которого у тебя почему-то не оказалось...
Guest
Я все поняла, БОЛЬШОЕ спасибо kiss2.gif
Iren
cray.gif Не правильно у меня сделана сказали вторая программа надо было еще, что в наборе исходных данных указано имя данного файла (текстовая строка). Все исходные файлы в заданиях данной группы считаются существующими (при чем предполагается, что в файле не менее двух строк), но необходимо предусмотреть возможность изменения в них данных.
В качестве результатов работы программы необходимо вывести на экран содержание исходного и полученного файлов.
Помогите пожалуста, а то я уже окончательно запуталась и совсем ничего не понимаю...
Guest
Ну хотя бы намекните, что надо сделать...
Iren
Вот попыталась переделать, не знаю правильно ли (возникают вопросы насчет добавления файлов):
Код

program test;
uses crt;

label 1;
var
  arr: array[1 .. 100] of integer;
  i, n: integer;
  f: file of integer;
  s: string;
begin
  clrscr;
  assign(f, 'f_in.dat');
1:writeln('view file -  v / edit file - e / exit - x : ' );
  readln(s);
  if s = 'v' then
  begin
  reset(f);
  writeln('View file:');
  while not eof(f) do
    begin
      read(f, arr[n]);
      write(arr[n], ' ');
    end;
  readln;
  goto 1;
  end;
  if s = 'e' then
  begin
  reset(f);
  writeln('Enter number of elements: ');
  readln(n);
  writeln;
  writeln('Enter elements: ');
  for i := 1 to n do
    begin
      write('A[',i,'] : ');
      readln(arr[1]);
      write(f, arr[1]);
    end;
  close(f);

  assign(f, 'f_in.dat');
  reset(f);
  n := 0;
  while not eof(f) do
    begin
      inc(n); read(f, arr[n]);
    end;

  reset(f);
  for i := 1 to n div 2 + n mod 2 do
    begin
      write(f, arr[i]);
      if i <> (n - i + 1) then
      write(f, arr[n - i + 1]);
    end;
close(f);
goto 1;
end;
if s = 'x' then
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.