Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2009, 12:29   #1
MyaSnIKs
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 28
По умолчанию

1. Дан файл вещественных чисел, содержащий элементы трехдиагональной матрицы (по строкам). Создать новый файл, содержащий элементы ненулевой части данной матрицы (по строкам).

Вот первая задача, и как бы у меня глупой вопрос, но я задания не могу до конца понять.
что значит трёхдиагональной? 2х2 или как это?

2. Дан текстовый файл, представляющий собой таблицу, состоящую из трех столбцов с целыми числами. В начале и в конце каждой строки таблицы, а также между ее столбцами располагается символ-разделитель. Ширина столбцов таблицы и способ их выравнивания являются произвольными. Создать файл целых чисел, содержащий сумму чисел из каждой строки исходной таблицы.

и вот вторая, тоже понять ничего не могу, что за "символ-разделитель", даже не знаю с чего начать, дайте подсказку пожалуйста.

Народ у меня есть программа делающая следующее.

1. Дан файл вещественных чисел, содержащий ненулевую часть верхней треугольной матрицы (по строкам). Создать новый файл, содержащий все элементы данной матрицы (по строкам).

если я её скину, сможет ли кто переделать её под мою?

выручайте мне завтра сдавать, я просидел пол дня, ничё не могу сделать.

подскажите как сделать так, чтобы из файл программа считывала только цифры, а пробелы пропускала?(2 задача)

Последний раз редактировалось Stilet; 23.04.2009 в 09:57.
MyaSnIKs вне форума Ответить с цитированием
Старый 19.04.2009, 14:44   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да.. тема просто "насыщена" подсказками/решениями/ответами...
MyaSnIKs, а на каком языке программирования надо то?
Да и на будущее, если хотите получить реальную помощь, то попытайтесь сделать самостоятельно. Тогда, выкладывайте то, что наработали — тогда вероятнсть того, что помогут гораздо больше! Да и Вам разобраться будет проще...

Ну да ладно. В честь Светлого праздника Пасхи, и в качестве "моральной компенсации" - решение второй задачи на Pascal'е (предполагаю, что Вам нужен именно Паскаль):
Код:
const
  {символ разделитель столбцов висходном текстовом файле}
  DelimeterChar = '|';
var f : text;
  fOut : file of Integer;
  s, sTmp    : string;
  iSum, iCurrent, i, ErrCode : integer;
begin
  Assign(f,'table.txt');
  Reset(f);
  Assign(fOut,'digits.dat');
  Rewrite(fOut);
  while Not Eof(f) do
  begin
    ReadLn(f,s);
    {меньше 7 не может быть - три стобца + разделители}
    if Length(s)>6 then
      if Pos(DelimeterChar,s) = 1 then
      begin
        iSum := 0;
        Delete(s,1,1); {удалим первый разделитель}
        {цикл - три стобца чисел}
        for i:=1 to 3 do begin
            sTmp := '0';
          if Pos(DelimeterChar,s)>=2 then begin
            sTmp := Copy(s,1,Pos(DelimeterChar,s)-1);
            Delete(s,1,Pos(DelimeterChar,s))
          end;
          Val(sTmp,iCurrent,ErrCode);
          iSum := iSum + iCurrent;
        end;
        WriteLn(iSum:1); {эту строчку можно убрать -
                  просто для отладки выводим сумму строки на экран...}

        {запишем вычисленную сумму в файл целых чисел}
        Write(fOut, iSum);
      end;
  end;
  Close(fOut);
  Close(f);  
end.
пример файла table.txt:
Код:
|12|23|455|
|1|2|3|
|10|10|10|
|20|30|950|
p.s. только учтите, что получаемый файл DIGITS.DAT — НЕ ТЕКСТОВЫЙ! Просто так, без программы, его не посмотришь!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.04.2009, 11:10   #3
MyaSnIKs
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 28
По умолчанию

программа для Delphi)
Всё как раз то...блин, ты прям не представляешь, как ты меня выручил, мне сдавать эту вторую задачу надо, теперь есть шанс без задолжности дальше учиться)!
а он в файле одержит сумму чисел из каждой строки исходной таблицы?

НАсчёт работать самостоятельно, я всё время выкладывал по остальным темам свои проги,первую прогу написал на паре сам(с трудом), а тут что-то вообще,как в копанный, не знаю с чего начать.
Код:
  if Pos(DelimeterChar,s) = 1 then
  DelimeterChar = '|';
вот эти две команды не понял

Код:
f : text;
так-с, всё работает,всё замечательно, нельзя мне помочь с одной вещью:
чтобы созданный файл открывался программой, а значения(сумм) записывались в стринг грид?

и можно объяснить мне эти команды:
Код:
 if Pos(DelimeterChar,s)>=2 then begin
            sTmp := Copy(s,1,Pos(DelimeterChar,s)-1);
            Delete(s,1,Pos(DelimeterChar,s))
и
Код:
const
  {символ разделитель столбцов висходном текстовом файле}
  DelimeterChar = '|'
а то я раньше с ними не сталкивался и не знаю, что они обозначают и делаю.

Последний раз редактировалось Stilet; 23.04.2009 в 09:59.
MyaSnIKs вне форума Ответить с цитированием
Старый 22.04.2009, 12:45   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
const
{символ разделитель столбцов висходном текстовом файле}
DelimeterChar = '|'
просто задаём константу (т.е. фиксированное, неизменное в течении работы программы значение). Константы используются для НАГЛЯДНОСТИ кода и для удобства последующей модификации.
можно было бы обойтись и без неё, но тогда поиск вхождения разделителя в строке мы бы искали так:
Pos('|', s)...
Цитата:
if Pos(DelimeterChar,s)>=2 then begin
если найденная позиция разделителя в строке больше двух, тогда....
>=2 - это означает, что до разделителя ещё есть, как минимум, один символ (ожидаем, что там цифра)...
Цитата:
sTmp := Copy(s,1,Pos(DelimeterChar,s)-1);
скопируем во временную подстроку часть строки S с первого символа до позиции разделителя 'I' в данной строке, причём сам разделитель в эту подстроку не выделяем (для этого и делаем -1 )
Цитата:
Delete(s,1,Pos(DelimeterChar,s))
удалим из строки s всё, начиная с первого символа и до позиции разделителя '|' (включая и сам разделитель). Это мы делаем для того, чтобы можно было обрабатывать оставшуюся часть строки в цикле.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.04.2009, 16:22   #5
MyaSnIKs
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 28
По умолчанию

так-с, всё работает,всё замечательно, нельзя мне помочь с одной вещью(написать небольшой алгоритм для кнопки2):
чтобы созданный файл открывался и суммы строк записывались в матрицу.
MyaSnIKs вне форума Ответить с цитированием
Старый 22.04.2009, 17:09   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

MyaSnIKs, да не вопрос!
Но я всё таки хочу заставить Вас хотя бы немножко и самому поработать
Давайте Ваш пример кода, как можно занести в stringgrid, например, 10 строчек в цикле...
даже начало подскажу :
Код:
for i:=1 to 10 do begin ....
p.s. ещё подсказки, если Вы и остальное захотите сделать самостоятельно:
Код:
  Reset(fOut); {Открыть файл с данными }
...
  i := 0;
  while Not Eof(fOut) do {цикл пока файл не закончится}
  begin
    Read(fOut, iCurrent);
    {а тут мы уже умеем писать число в StringGrid :)}
    inc(i);
  end;
  CloseFile(fOut);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.04.2009, 09:54   #7
MyaSnIKs
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 28
По умолчанию

решил все проблемы вот так, теперь всё работает=)
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
fOut : file of Integer;
a:array [0..100] of real;
n,i,j,iSum,iCurrent:integer;
omg:string;
begin
if opendialog1.Execute then
omg:=opendialog1.FileName;
if omg=''then
exit;
assignfile(fOut,omg);
reset(fOut);
n:=filesize(fOut);
StringGrid1.colCount:=n;

 i := 0;
 j := 0;
 while Not Eof(fOut) do
  begin
    Read(fOut, iSum);
    a[j]:=ISum;
    j:=j+1;
    inc(i);
  end;
  for j:=0 to n-1 do
  begin
  StringGrid1.Cells[j,0]:=floattostr(a[j]);
  end;
  closeFile(fOut);
end;

end.
У меня осталась последняя задача по программированию

Процедуры и функции.
N 18.
Даны два целых числа m и k. Если в строке с номером m матрицы С есть отрицательные элементы, а в строке с номером k матрицы Т есть положительные элементы, то найти А = -С+ Т*С, иначе найти В = -Т + CТ.


я написал процедуру для умножения
Код:
type
tm=array [0..100,0..100] of real;

procedure Y1(var g,d,Y:tm);
var
i,j,k:integer;
s:real;
begin
for i:=0 to n-1 do
for j:=0 to n-1 do
begin
s:=0;
for k:=0 to n-1 do
begin
s:=D[i,k]*G[k,j]+s ;
Y[i,j]:=s;
end;
end;
end;
Процедуру для отрицательной матрицы:
Код:
procedure R1(var g,d,R:tm);
var
i,j:integer;
begin
for i:=0 to n-1 do
for j:=0 to n-1 do
R[i,j]:=G[i,j]*(-1)
end;
Процедуру для создания рандомной матрицы(матрица "С" в условии):

Код:
procedure A3(var G:tm);
var
i,j:integer;
begin
randomize;
n:=strtoint(form1.edit4.Text);
l:=strtofloat(form1.edit3.Text);
for i:=0 to n-1 do
for j:=0 to n-1 do
G[i,j]:=random(30)-15;
end;
процедуру вывода матриц:
Код:
procedure A1(var G:tm;SG:tstringgrid);
var
i,j:integer;
begin
n:=strtoint(form1.edit4.Text);
SG.ColCount:=n;
SG.RowCount:=n;
for i:=0 to n-1 do
for j:=0 to n-1 do
SG.Cells[i,j]:=floattostr(G[i,j]);
end;
И вот у меня не получается написать функцию или (процедуру) по которой потом нужно будет использовать условие(Если в строке с номером m матрицы С есть отрицательные элементы, а в строке с номером k матрицы Т есть положительные элементы, то )

и не могу генерировать матрицы T(они должны генерироваться следующим образом...тоесть я пищу в едите первую цифру, а по этому закону он должен заполнять все остальные поля матрицы,и это тоже должна быть процедура)
2 4 6 8
3 5 7 9
4 6 8 10
5 7 9 11

Последний раз редактировалось Stilet; 29.04.2009 в 08:14.
MyaSnIKs вне форума Ответить с цитированием
Старый 23.04.2009, 10:15   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Если в строке с номером m матрицы С есть отрицательные элементы, а в строке с номером k матрицы Т есть положительные элементы, то
Например так:
Код:
Function Aga3(index:integer;var G:tm):boolean;
var
i,j:integer;
begin result:=false;
for i:=0 to 100 do
 if G[index,i]<0 then begin 
  result:=true;
  exit;
 end;
end;
Функа вернет True если отрицательный элемент в матрице tm в строке index есть.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.04.2009, 17:55   #9
MyaSnIKs
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 28
По умолчанию

чё то я не могу эту функцию срастить со всем остальным, и у меня так и не получилось придумать алгоритм по которому создавалась подобная матрица :
2 4 6 8
3 5 7 9
4 6 8 10
5 7 9 11
Если мы знаем первое значения.
MyaSnIKs вне форума Ответить с цитированием
Старый 25.04.2009, 14:24   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так что тут сложного? имхо, очевидно...
вот, для матрицы A: array[1..N,1..M] of integer;
Код:
A[1,1] := 2; {любое число на Выбор!}
for i:=1 to N do begin
  if i>1 then A[i,1] := A[i-1,1] + 1;
  for j:=2 to M do
    A[i,j] := A[i,j-1] + 2;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачи с входными и выходными файлами Zinder Помощь студентам 3 05.03.2009 22:15
Работа с файлами МартинИ Паскаль, Turbo Pascal, PascalABC.NET 3 23.12.2008 21:36
Работа с файлами.Строки в записях. Ozerich Общие вопросы Delphi 12 20.07.2008 23:13