Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 579

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Прошу вашей помощи. Программированием только начинаю заниматься, поэтому практически ничего и не умею. Нужно создать программу сложения двух матриц, элементы которых случайные целые числа, не превышающие по модулю 20. Порядок матрицы должен быть задан пользователем через Edit. Он не должен превышать 10. Сформированные рандомные матрицы и результат сложения должны выводиться в компонент Memo - это для меня самое непонятное.
Помогите, пожалуйста.
Заранее благодарен.
Денис.

Noobas Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Noobas (статус: Посетитель)
Вопрос отправлен: 24 декабря 2009, 10:20
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: webkent

Здравствуйте, Noobas!
Вот код: https://www.delphi-int.ru/code/8cc6fc05
В мемо конечно добавляется не супер ровно, но различить можно. Если нужно чисто ровное добавление, это надо мозги ******* (по крайней мере я себе это так представляю). Если очень надо, пиши в асю 3945550

Ответ отправил: webkent (статус: 2-ой класс)
Время отправки: 24 декабря 2009, 16:00
Оценка за ответ: 5

Комментарий к оценке: Все по теме. Все верно. Все работает. Очень помог.

Мини-форум вопроса

Всего сообщений: 27; последнее сообщение — 26 декабря 2009, 13:22; участников в обсуждении: 4.

Страницы: [1] [2] [Следующая »]

min@y™

min@y™ (статус: Доктор наук), 24 декабря 2009, 10:33 [#1]:

У TMemo есть свойство Lines: TStrings, у когорого есть метод Add(const S: string).
Формируешь в цикле строки матрицы и последовательно добавляешь их в мемо с помощью Memo.Lines.Add(<строка с цифрами>).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
webkent

webkent (статус: 2-ой класс), 24 декабря 2009, 16:03 [#2]:

а вообще такие вещи удобнее в таблицу выводить
Вадим К

Вадим К (статус: Академик), 24 декабря 2009, 16:06 [#3]:

А точно без некрасивых слов невозможно было написать ответ, webkent ?
Галочка "подтверждения прочтения" - вселенское зло.
webkent

webkent (статус: 2-ой класс), 24 декабря 2009, 16:08 [#4]:

По поводу некрасивых слов прошу прощения, больше не буду.
Нет сорри, затупил, забыл про Tab. Вот готовый код с ровными столбцами:
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b: array[0..9, 0..9] of integer;
  i, j, num: byte;
begin
  try
    num := StrToInt(Edit1.Text) - 1;
 
    for i := 0 to num do
      for j := 0 to num do begin
        a[i, j] := Random(41) - 20;
        b[i, j] := Random(41) - 20;
        a[i, j] := b[i, j] + a[i, j];
      end;
 
    for i := 0 to num do begin
      memo1.Lines.add('');
      for j := 0 to num do
              memo1.Lines[i] := memo1.Lines[i] + IntToStr(a[i, j]) + chr(9);
    end;
  except
    Messagebox(mb_ok, 'Нужно ввести целое число от 1 до 10', 'Ошибка', mb_ok);
  end;
end;
Noobas

Noobas (статус: Посетитель), 24 декабря 2009, 19:45 [#5]:

Webken, спасибо огромное. Красота получилась.
Но возник еще вопрос: а с помощью какого оператора можно полученную матрицу перенести в другую подпрограмму (именно с теми значениями, которые были получены)?
min@y™

min@y™ (статус: Доктор наук), 24 декабря 2009, 20:03 [#6]:

Может быть всё-таки не перенести, а передать?
Если да, то могу научить как.

Говорили мне: иди преподавать программизьм в родной институт. Вижу, я не зря отказался. Меня б оттуда очень быстро в кащенку увезли...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Noobas

Noobas (статус: Посетитель), 24 декабря 2009, 20:35 [#7]:

min@y™, да, передать. Буду признателен.

procedure TForm1.Button1Click(Sender: TObject);
var
a, b : array[0..9, 0..9] of integer;
c : array[0..9, 0..9] of integer;
i, j, n: byte;
begin
n := StrToInt(Edit1.Text) - 1;
for i := 0 to n do
for j := 0 to n do begin
a[i, j] := Random(41) - 20;
b[i, j] := Random(41) - 20;
Как передать полученные матрицы в другую подпрограмму для вычисления:
c[i, j] := a[i, j] + b[i, j];
?
min@y™

min@y™ (статус: Доктор наук), 24 декабря 2009, 20:58 [#8]:

Короче, я спать пошёл. Устал чото... Завтра утром стукани мне в аську. Разберёмся.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
webkent

webkent (статус: 2-ой класс), 24 декабря 2009, 21:08 [#9]:

Если что мне лучше тоже в Асю писать 3945550

Попробуй такой вариант:
Вызов функции:
Memo1.Lines:=Summa(StrToInt(Edit1.Text ));


Сама функция
function Summa(Poryadok:Byte): TStringList;
var
SL:TStringList;
a,b,c: array[0..9,0..9] of integer;
i, j, n: byte;
begin
SL:=TStringList.Create;
n := Poryadok - 1;
for i := 0 to n do
for j := 0 to n do begin
a[i,j] := Random(41) - 20;
b[i,j] := Random(41) - 20;
end;
 
for I := 0 to n do begin
  SL.Add('');
  for j := 0 to n do begin
    c[i,j]:=a[i,j]+b[i,j];
    SL[i]:=SL[i]+inttostr(c[i,j])+chr(9);
  end;
end;
Result:=SL;
end;
Вадим К

Вадим К (статус: Академик), 25 декабря 2009, 00:39 [#10]:

Цитата:

Memo1.Lines:=Summa(StrToInt(Edit1.Text ));

Это что такое??? за такой код надо пальчики отрывать. что бы не писали такое. Я уже несколько вопросов назад разбирал этот код. Это тут не Java и не .NET. Тут такие фокусы как минимум повлекут за собой утечку ресурсов. А обычно приведут к сложно вылавливаемым багам.
Галочка "подтверждения прочтения" - вселенское зло.
webkent

webkent (статус: 2-ой класс), 25 декабря 2009, 01:53 [#11]:

разве не логично порядок передавать в числовом типе?
min@y™

min@y™ (статус: Доктор наук), 25 декабря 2009, 08:11 [#12]:

Цитата (webkent):

Memo1.Lines:=Summa(StrToInt(Edit1.Text ));

Я ж тебе говорил "учи матчасть", а ты вместо этого учишь нубов писать тухлый код!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 25 декабря 2009, 11:01 [#13]:

to webkent:

а где там "порядок" в числовом типе?
Галочка "подтверждения прочтения" - вселенское зло.
webkent

webkent (статус: 2-ой класс), 25 декабря 2009, 15:39 [#14]:

Ладно забейте короче, я сюда не спорить пришел, к тому же не врубаюсь что не так. Если не нравится, лучше бы переписали и дали человеку нормальный вариант, а не ворчали "Учи матчасть учи матчасть".

Порядок вводится в Edit1.Text чем вам не нравится StrToInt(Edit1.Text)? Или что мне свою функцию перевода в число писать? Не врубаюсь что вам не так... Какая часть не нравится левая или правая и почему?
Вадим К

Вадим К (статус: Академик), 25 декабря 2009, 15:46 [#15]:

Неверно само присваивание. а преобразования строки в число вполне обычное.
"лучше переписали" - это медвежья услуга. к тому же у меня, да и у многих экспертов тут, мало свободного времени. подправить - это мы можем быстро, а вот переписывать чужой код - увольте, лучше свое написать.
К тому же, не у всех есть устанновленный делфи:)
Галочка "подтверждения прочтения" - вселенское зло.
webkent

webkent (статус: 2-ой класс), 25 декабря 2009, 15:50 [#16]:

То есть "Memo1.Lines:="? Можете сказать почему, вот я бы никогда не подумал, что из-за такого присвоения могут быть проблемы.

Да даже не переписывать, а указать поконкретней, а не "Учи матчасть" или "Пальцы пообрывать".
webkent

webkent (статус: 2-ой класс), 25 декабря 2009, 15:55 [#17]:

кажется я допёр. Мемо1.Лайнс начинает ссылаться на область памяти, где хранится SL, в то время как старый диапозон никто не очищает, я прав?
Если да, то можно ли так:

Memo1.Lines.Free;
Memo1.Lines:=Summa(StrToInt(Edit1.Text ));

>???
Вадим К

Вадим К (статус: Академик), 25 декабря 2009, 16:02 [#18]:

Я вообще то указал. просто я помню, что неделю назад я такой случай разбирал.

Но, если я бы просто написал где, то думаю, уже через десять минут и не помнили бы об этом.

При таком присваивании происходит копирование ссылки. и имеем такое:
- старая память теряется - явная утечка.
- Memo.Lines на самом деле имеет тип не TStringList, а TStrings, который является абстракным классом. У мемо своя реализация абстрактного класса, у TStringList своя, у TListBox.Items - своя. Она подобная, но различается в мелочах. И как только мемо надумает вызвать какой то свой приватный метод... вот тут и приехали. либо получим исключение в чистом виде, либо просто красивый расстрел памяти (методы ведь вызываются не по имени, а "по номеру в теблице", который преобразуется в адрес.
А обычно получают трудно вылавливаемый баг.


В целом, это очень интересная тема и если есть желание, можно разобраться во всем этом. Но для начала надо поднять свой уровень, разобраться в многих базовых понятиях.
Галочка "подтверждения прочтения" - вселенское зло.
Вадим К

Вадим К (статус: Академик), 25 декабря 2009, 16:07 [#19]:

Memo1.Lines.Free;
Ну откуда в голове роятся такие плохие идеи? кто учил?

правильно так (применимо к данному коду)
var sl:TStringList;
begin
  memo1.lines.clear;
  sl := Summa(StrToInt(Edit1.Text ));
  memo1.lines.addstrings(sl);
  sl.free;
end;
Но как заметят многие, это же "некрасиво" и не "по феншую".:)
я бы лично писал чуточку по другому.
procedure Summa(s:string, sl:TStrings);
begin
  sl.clear;
  //теперь тут можно писать так
  sl.add('string');
end;
//вызов
Summa(StrToInt(Edit1.Text ), memo1.lines);
Галочка "подтверждения прочтения" - вселенское зло.
webkent

webkent (статус: 2-ой класс), 25 декабря 2009, 16:36 [#20]:

мм понятно, спасибо за разъяснение!! Не подскажете, а почему

sl := Summa(StrToInt(Edit1.Text ));
  memo1.lines.addstrings(sl);
лучше, чем
Memo1.Lines:=Summa(StrToInt(Edit1.Text ));
разве при передачи из sl:TStringList в Memo.Lines не возникнет той же ситуации с некоторыми приватными методами?

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:42
Выполнено за 0.03 сек.