Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 28.11.2012, 19:12
Аватар для MarlboroRed
MarlboroRed MarlboroRed вне форума
Прохожий
 
Регистрация: 24.11.2012
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Guneska
Так как Вы предлаете не получается, видимо я полная идиотка, но разбираться с этим приходится, и я вышла до дакого кода, но почему выводятся только нули и только по нажатию Enter?
program Project2;

Код:
{$APPTYPE CONSOLE}

uses
  SysUtils;
const
n=2;
m=2;
p=2;
var
//Matrica А(n,m)
//Matrica B(m,p)
//Matrica C(n,p)
A : array [1..n, 1..m] of Integer;
B : array [1..m, 1..p] of Integer;
C : array [1..n, 1..p] of Integer;
k,j,v : Integer;
begin
  for k := 1 to n do
begin
  for j := 1 to m do
begin
  for v := 1 to p do
begin
  C[k,j] := A[k,v]*B[v,j];
  write (C[k,j]);
end;
writeln;
readln;
end;
end;
end.

Нули получаются потому, что матрицы А и В пустые. Их нужно заполнить исходными данными. В этом коде вы просто объявили матрицы А и Б и попытались получить матрицу С, которая является их произведением. Соответственно 0*0=0.

Еще хочу Вам подсказать, что в цикле "for to do" блок "begin end" используется только в случае, если в цикле выполняется 2 и более операций. Новый цикл - это одна операция.

пример:

Код:
for i:=1 to 2 do
  for j:=1 to 2 do
    begin
       writeln(i);
       writeln(j);
    end;

У Вас есть все возможности найти всю информацию в интернете.
Циклы: for, while, repeat
Двумерные массивы
Умножение матриц

Последний раз редактировалось MarlboroRed, 28.11.2012 в 19:29.
Ответить с цитированием
  #17  
Старый 28.11.2012, 21:10
Guneska Guneska вне форума
Прохожий
 
Регистрация: 15.11.2012
Сообщения: 24
Репутация: 10
По умолчанию

Цитата:
Сообщение от MarlboroRed
Нули получаются потому, что матрицы А и В пустые. Их нужно заполнить исходными данными. В этом коде вы просто объявили матрицы А и Б и попытались получить матрицу С, которая является их произведением. Соответственно 0*0=0.

Еще хочу Вам подсказать, что в цикле "for to do" блок "begin end" используется только в случае, если в цикле выполняется 2 и более операций. Новый цикл - это одна операция.

пример:

Код:
for i:=1 to 2 do
  for j:=1 to 2 do
    begin
       writeln(i);
       writeln(j);
    end;

У Вас есть все возможности найти всю информацию в интернете.
Циклы: for, while, repeat
Двумерные массивы
Умножение матриц

Буду Вам весьма признательна! И это не первый курс, а третий, просто я перевелась, и вот так попала - на программирование. Всю ту информацию, которую Вы предложили я уже почти перелопатила. Но первые две ссылки, - этот сайт я ещё не встречала, спасибо!
Если я убираю begin после каждого цикла, то все цифры просто выстраиваются в вертикальный ряд. "матрицы А и В пустые. Их нужно заполнить исходными данными" --- а куда, в какое место в коде вводить эти данные?

Последний раз редактировалось Guneska, 28.11.2012 в 23:07.
Ответить с цитированием
  #18  
Старый 29.11.2012, 11:01
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 297
Репутация: -1806
По умолчанию

Цитата:
Сообщение от MarlboroRed
в цикле "for to do" блок "begin end" используется только в случае, если в цикле выполняется 2 и более операций.
не ври, его использование ничем не ограничено и может использоваться тупо для улучшения читаемости кода

Цитата:
Сообщение от Guneska
Если я убираю begin после каждого цикла, то все цифры просто выстраиваются в вертикальный ряд. "матрицы А и В пустые. Их нужно заполнить исходными данными" --- а куда, в какое место в коде вводить эти данные?
ибо Write и WriteLn немного различаются
вводить хоть сразу в описании переменной в круглых скобках если они фиксированы
Код:
arr:array[1..4, 1..3] of integer = ((1,-1,3), (0,0,0), (1,4,0), (4,-1,-1));
либо так же в цикле через Read и\или Readln
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо robt за это полезное сообщение:
Guneska (01.12.2012), OTVET2 (29.11.2012)
  #19  
Старый 01.12.2012, 23:51
Guneska Guneska вне форума
Прохожий
 
Регистрация: 15.11.2012
Сообщения: 24
Репутация: 10
По умолчанию

Цитата:
Сообщение от robt
не ври, его использование ничем не ограничено и может использоваться тупо для улучшения читаемости кода


ибо Write и WriteLn немного различаются
вводить хоть сразу в описании переменной в круглых скобках если они фиксированы
Код:
arr:array[1..4, 1..3] of integer = ((1,-1,3), (0,0,0), (1,4,0), (4,-1,-1));
либо так же в цикле через Read и\или Readln


Большое спасибо!
Ответить с цитированием
  #20  
Старый 02.12.2012, 16:59
Guneska Guneska вне форума
Прохожий
 
Регистрация: 15.11.2012
Сообщения: 24
Репутация: 10
По умолчанию

нашла на этом сайте (http://devels.ru/index.php?what=art&p=106), кажется элементарное объяснение перемножения матриц, но началась вот такая лобуда, как на скриншотах. С чем это может быть связано и как решить эту проблему?
Да, и чёрное окно с результатом не закрывается ни по энтеру, ни нажатием на крестик (справа сверху).


Нашла ошибку - исправила.
УРА! Третья лабораторная сделана! Но впереди ещё 4,5,6,7,8
Надеюсь поможете, если снова обращусь!
Спасибо всем огромнейшее!
Изображения
Тип файла: png ошибка.png (285.9 Кбайт, 4 просмотров)
Тип файла: png ошибка1.png (299.3 Кбайт, 4 просмотров)

Последний раз редактировалось Guneska, 02.12.2012 в 18:03.
Ответить с цитированием
  #21  
Старый 05.12.2012, 20:44
Guneska Guneska вне форума
Прохожий
 
Регистрация: 15.11.2012
Сообщения: 24
Репутация: 10
Вопрос Перестановка или сортировка элементов?

Доброго времени суток, уважаемые форумчане.
Помогите, пожалуйста, перерыла кучу информации, и теперь уже запуталась - моё задание на перестановку или сортировку элементов: "Имеется строка, содержащая буквы и цифры. Преобразуйте эту строку так, чтобы сначала в ней шли все цифры, а потом - все буквы исходной строки. Допустимые символы - цифры, прописные и строчные латинские буквы. Пример: исходная строка - ad2e57b6; результат - 2576adeb".
Написать нужно в консольном приложении.
Ответить с цитированием
  #22  
Старый 05.12.2012, 22:25
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 297
Репутация: -1806
По умолчанию

находишь любой готовый алгоритм сортировки например массива и прикручиваеш его к символам в строке
Ответить с цитированием
Этот пользователь сказал Спасибо robt за это полезное сообщение:
Guneska (05.12.2012)
  #23  
Старый 05.12.2012, 22:26
Аватар для MarlboroRed
MarlboroRed MarlboroRed вне форума
Прохожий
 
Регистрация: 24.11.2012
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Guneska
Доброго времени суток, уважаемые форумчане.
Помогите, пожалуйста, перерыла кучу информации, и теперь уже запуталась - моё задание на перестановку или сортировку элементов: "Имеется строка, содержащая буквы и цифры. Преобразуйте эту строку так, чтобы сначала в ней шли все цифры, а потом - все буквы исходной строки. Допустимые символы - цифры, прописные и строчные латинские буквы. Пример: исходная строка - ad2e57b6; результат - 2576adeb".
Написать нужно в консольном приложении.

Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  str, numbers, letters, res1,res2: string;
  len,i,j: integer;
begin

  numbers:='1234567890';
  letters:='qwertyuiopasdfghjklzxcvbnm';

  write('Vvedite stroku: ');
  readln(str);  // записываем исходную строку в переменную str
  len:=length(str);  //Записываем в переменную len длинну строки


  for i:=1 to len do   // Цикл от 1 до конца строки
    for j:=1 to 10 do  //Цил от 1 до 10 (количество цифр)

      { Если символ i строки str равен символу j строки numbers тогда записываем
      в res1 по принципу: старая информация в res1 + символ строки}
      if str[i]=numbers[j] then
        begin
          res1:=res1+str[i];
          break;  //Прерывание цикла
        end;

  for i:=1 to len do  // Цикл от 1 до конца строки
    for j:=1 to 26 do  // Цил от 1 до 26 (количество букв в алфавите)

    { Если символ i строки str равен символу j строки letters тогда записываем
      в res2 по принципу: старая информация в res2 + символ строки}
      if str[i]=letters[j] then
        begin
          res2:=res2+str[i];
          break; //Прерывание цикла
        end;

  writeln('Resultat: ', res1,res2);   //Выводим результат

  readln;

end.

Первый блок циклов "анализирует" и записывает в одну строку res1 все цифры из исходной строки. Второй блок циклов записывает в res2 все буквы строки.

В качестве благодарности произнеси тост за мое здоровье

Последний раз редактировалось MarlboroRed, 05.12.2012 в 22:31.
Ответить с цитированием
Этот пользователь сказал Спасибо MarlboroRed за это полезное сообщение:
Guneska (05.12.2012)
  #24  
Старый 05.12.2012, 22:42
Guneska Guneska вне форума
Прохожий
 
Регистрация: 15.11.2012
Сообщения: 24
Репутация: 10
По умолчанию

Цитата:
Сообщение от MarlboroRed

Первый блок циклов "анализирует" и записывает в одну строку res1 все цифры из исходной строки. Второй блок циклов записывает в res2 все буквы строки.

В качестве благодарности произнеси тост за мое здоровье

Огромнейшее Вам спасибо! Тост был произнесён за чашкой чёрного чая, теперь Вы будете жить долго и счастливо
Буду сидеть разбирать код, чтобы как можно меньше тратить ваше время на такую мелочь, как я)))
Ответить с цитированием
  #25  
Старый 07.12.2012, 23:03
Guneska Guneska вне форума
Прохожий
 
Регистрация: 15.11.2012
Сообщения: 24
Репутация: 10
По умолчанию

Цитата:
Сообщение от MarlboroRed
Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  str, numbers, letters, res1,res2: string;
  len,i,j: integer;
begin

  numbers:='1234567890';
  letters:='qwertyuiopasdfghjklzxcvbnm';

  write('Vvedite stroku: ');
  readln(str);  // записываем исходную строку в переменную str
  len:=length(str);  //Записываем в переменную len длинну строки


  for i:=1 to len do   // Цикл от 1 до конца строки
    for j:=1 to 10 do  //Цил от 1 до 10 (количество цифр)

      { Если символ i строки str равен символу j строки numbers тогда записываем
      в res1 по принципу: старая информация в res1 + символ строки}
      if str[i]=numbers[j] then
        begin
          res1:=res1+str[i];
          break;  //Прерывание цикла
        end;

  for i:=1 to len do  // Цикл от 1 до конца строки
    for j:=1 to 26 do  // Цил от 1 до 26 (количество букв в алфавите)

    { Если символ i строки str равен символу j строки letters тогда записываем
      в res2 по принципу: старая информация в res2 + символ строки}
      if str[i]=letters[j] then
        begin
          res2:=res2+str[i];
          break; //Прерывание цикла
        end;

  writeln('Resultat: ', res1,res2);   //Выводим результат

  readln;

end.


Простите, а почему вы использовали "break"? Вы закомментировали это как прерывание цикла, но почему Вы его здесь использовали? Зачем?

Последний раз редактировалось Guneska, 07.12.2012 в 23:05.
Ответить с цитированием
  #26  
Старый 07.12.2012, 23:33
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Guneska
Простите, а почему вы использовали "break"? Вы закомментировали это как прерывание цикла, но почему Вы его здесь использовали? Зачем?
Процедуру "Break" можно использовать только для прерывания цикла и ни для чего больше. В данном случае внешний цикл (по переменной i) проходится по всем символам строки, а внутренний цикл (по переменной j) ищет очередной символ в строке цифр в первом случае и в строке латинских символов во втором случае, если символ найден он добавляется в соответствующую результирующую строку и внутренний цикл прерывается так как символ найден и нет смысла дальше его искать.
По моему объяснение получилось более запутанным, чем сам исходный код.

Кстати код очень не оптимальный и я не могу на него спокойно смотреть. Кроме того он не будет работать с прописными латинскими буквами, а по условию должен.
Тот "кусок" программы в котором циклы можно сократить как минимум к такому виду, с единственным циклом:
Код:
  for i := 1 to len do
  begin
    case str[i] of
      '0'..'9': res1 := res1 + str[i];
      'a'..'z', 'A'..'Z': res2 := res2 + str[i];
    end;
  end;
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо poli-smen за это полезное сообщение:
Guneska (08.12.2012), MarlboroRed (08.12.2012)
  #27  
Старый 08.12.2012, 00:07
Guneska Guneska вне форума
Прохожий
 
Регистрация: 15.11.2012
Сообщения: 24
Репутация: 10
Хорошо

Цитата:
Сообщение от poli-smen
Код:
  for i := 1 to len do
  begin
    case str[i] of
      '0'..'9': res1 := res1 + str[i];
      'a'..'z', 'A'..'Z': res2 := res2 + str[i];
    end;
  end;

Да, Вы правы, прописные буквы игнорируются. Подставила Ваше творение - и всё получилось, спасибо!
Только чуть-чуть начала разбираться с "for .. to .. do", как теперь снова нужно бежать искать что такое "case" и с чем его едят
Спасибо, что не даёте расслабиться!
Ответить с цитированием
  #28  
Старый 08.12.2012, 03:44
Аватар для MarlboroRed
MarlboroRed MarlboroRed вне форума
Прохожий
 
Регистрация: 24.11.2012
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

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


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:54.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025