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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 3 804

/ вопрос решён /

Здравствуйте, уважаемые эксперты!

Есть такое условие задачи:
"Создать программу генерирования текстового файла, где содержатся символы, которые изображают умножение "в столбец" двух данных натуральных чисел". Попросту говоря, создать программу, которая при введенных двух числах будет умножать их в столбец.

Я просто не могу представить всю эту систему. Мне хоть подсказками какими-то, ПЛЗ!!!! Это вопрос жизни и смерти. Пример программы в прикрепленном файле.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Жикльор Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Жикльор (статус: 5-ый класс)
Вопрос отправлен: 23 февраля 2010, 14:55
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Егор

Здравствуйте, Жикльор!
Ну, если в общих словах, то алгоритм такой:

имеем переменные: а и b - начальные, c - результат

c:=a*b;
вычисляем длину чисел b и c:
lenc:=length(IntToStr(c));
lenb:=length(IntToStr(b));
далее выводим первые два числа с выравниванием с заданной шириной поля - по ширине числа с (f - это файл для вывода):
writeln(f,a:lenc);
writeln(f,'x',b:(lenc-1));  // х - знак умножения
выводим линию:
for i:=1 to lenc do write(f,'-');
  writeln(f);
выводим результаты умножения на каждое из чисел:
for i:=1 to lenb do
  writeln(f, (a*StrToInt(IntToStr(b)[lenb-i+1])):(lenc-i+1));
затем снова выводим линию (см. выше) и результат умножения (переменную с).

Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 23 февраля 2010, 15:58
Оценка за ответ: 5

Комментарий к оценке: Подсказал)

Ответ #2. Отвечает эксперт: IlluminatI

Здравствуйте, Жикльор!

Мне понравилась ваша задача, поэтому, решил довести до конца ;)
Если вы вдруг не разберетесь сами, мое решение в приложении =)
Удачи вам.

Приложение:
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7.  
  8. var
  9. X, Y, F, S, rez: int64;
  10. Offset, CurMn: int64;
  11. Sdvig: byte = 0;
  12. Tmp, v: int64;
  13. i: byte;
  14. strv, z: string;
  15.  
  16. procedure OutputSampl;
  17. begin
  18.  
  19. rewrite(Output);
  20. Offset:=Length(IntToStr(X*Y));
  21. if Length(IntToStr(X)) > Length(IntToStr(Y)) then
  22. begin
  23. F:=X;
  24. S:=Y;
  25. end
  26. else
  27. begin
  28. F:=Y;
  29. S:=X;
  30. end;
  31. for i:=1 to (Offset-Length(IntToStr(F))) do
  32. write(' ');
  33. writeln(F);
  34. for i:=1 to (Offset-Length(IntToStr(F))-1) do
  35. write(' ');
  36. write('x ');
  37. for i:=1 to ((Length(IntToStr(F)) - Length(IntToStr(S))) - 1) do
  38. write(' ');
  39. writeln(S);
  40. for i:=1 to Offset do
  41. write('-');
  42. writeln;
  43. end;
  44.  
  45.  
  46.  
  47. begin
  48. Result:='';
  49. for i:=Length(S) downto 1 do
  50. Result := Result + S[i];
  51. end;
  52.  
  53. begin
  54. readln(x, y);
  55.  
  56. rez:=x*y;
  57. Sdvig := Offset;
  58. z:=IntToStr(F);
  59.  
  60. begin
  61.  
  62. S := S div 10;
  63. //----------------
  64. Tmp := -1;
  65. strv:='';
  66. for i:=Length(IntToStr(F)) downto 1 do
  67. begin
  68. v:=CurMn * StrToInt(z[i]);
  69. if tmp >0 then
  70. v:=v + tmp;
  71. if i = 1 then
  72. begin
  73. strv := strv + (ReverseString(IntToStr(v)));
  74. end
  75. else
  76. if (v > 9) then
  77. begin
  78. strv := strv + (IntToStr(v mod 10));
  79. Tmp := v div 10;
  80. end
  81. else
  82. begin
  83. tmp := -1;
  84. strv:= strv + (IntToStr(v));
  85. end;
  86. end;
  87. strv:=ReverseString(strv);
  88. if (StrToInt(strv) <> 0) then
  89. begin
  90. for i:=1 to Sdvig-Length(strv) do
  91. write(' ');
  92. writeln(strv);
  93. end;
  94. dec(Sdvig);
  95. end;
  96. for i:=1 to Offset do write('-');
  97. writeln('');
  98. writeln(x*y);
  99. Close(Output);
  100. end.
  101.  


Ответ отправил: IlluminatI (статус: 2-ой класс)
Время отправки: 23 февраля 2010, 17:05
Оценка за ответ: 5


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

Всего сообщений: 17; последнее сообщение — 26 февраля 2010, 16:47; участников в обсуждении: 4.
Егор

Егор (статус: 10-ый класс), 23 февраля 2010, 15:24 [#1]:

в чём сделать-то надо? в оконном приложении или консольном?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 23 февраля 2010, 15:24 [#2]:

а, понял
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Жикльор

Жикльор (статус: 5-ый класс), 23 февраля 2010, 15:32 [#3]:

Вообще-то нужно сделать в консольном, так препод сказал. Но я его уговорил на использование 2-ух методов. А вот в оконном или консольном, это уже как легче будет.

P/S/ Кстати, всех с ПРАЗДНИКОМ!!!
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Вадим К

Вадим К (статус: Академик), 23 февраля 2010, 16:00 [#4]:

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

Единственная проблема, которая здесь есть - это вписать перед числами нужное кол-во пробелов. попробуйте вначале решить задачу без начальных пробелов.

для выделения цифр используем div и mod. Так как нам нужны цифры с конца числа, то это ещё проще
вот набросок
m1, m2:integer;//множители
d, os:integer;
begin
  d := m2 div 10;
  os := m2 mod 10;
  repeat
    writeln(os*m1);
    os := d mod 10;
    d := d div 10;
  until os = 0;
end;
Галочка "подтверждения прочтения" - вселенское зло.
Егор

Егор (статус: 10-ый класс), 23 февраля 2010, 16:01 [#5]:

или всю программу надо?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Жикльор

Жикльор (статус: 5-ый класс), 23 февраля 2010, 16:02 [#6]:

Спасибо Вадиму и Егору. Наброски уже просвечиваются) Теперь немного нужно подшлифовать код и еще немного подумать. ВСЕМ СПАСИБО, с праздником!!
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Ерёмин А.А.

Ерёмин А.А. (статус: *Администратор), 23 февраля 2010, 16:03 [#7]:

Для поздравлений есть тема на форуме :-) Не пробовали туда заглядывать? ;-)
Жикльор

Жикльор (статус: 5-ый класс), 23 февраля 2010, 16:04 [#8]:

Цитата (Егор):

или всю программу надо?

Нет, спасибо. Вы и так очень помогли. Попробую пока сам, нужно же разобраться, а то препод завалит.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Жикльор

Жикльор (статус: 5-ый класс), 23 февраля 2010, 16:04 [#9]:

Цитата (Ерёмин А.А.):

Для поздравлений есть тема на форуме :-) Не пробовали туда заглядывать? ;-)


У нас есть ФОРУМ?!! Я и не знал))
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Жикльор

Жикльор (статус: 5-ый класс), 23 февраля 2010, 16:05 [#10]:

Точно есть. А как давно?
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Егор

Егор (статус: 10-ый класс), 26 февраля 2010, 10:56 [#11]:

не, я понимаю, что считать количество пробелов, это, типа, круто. но зачем? во writeln можно задавать ширину поля вывода - writeln(x:7) - вывод числа так, чтобы оно занимало не менее 7 позиций. почему бы не воспользоваться этим?

вместо
k := длина_самого_длинного_числа - количество_цифр_в_числе_х ;
for i:=1 to k do write(' ');
writeln(x);

написать
writeln(x:длина_самого_длинного_числа);
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 26 февраля 2010, 11:19 [#12]:

тссс! :)
Но этот способ не панацея. Если я конечно правильно помню, что формат нельзя задавать переменной.
Или все таки можно записать так
var a, b:integer;
begin
a := 1;
b := 4;
writeln(a:b);
end.
?

Но если только захочется вывести в мемо напрямую, то тут конечно можно воспользоваться функцией format (нет, она диск не трогает!).
Галочка "подтверждения прочтения" - вселенское зло.
Егор

Егор (статус: 10-ый класс), 26 февраля 2010, 11:47 [#13]:

Цитата (Вадим К):

Или все таки можно записать так
...
writeln(a:b);

можно - я проверял
дельфи 7 спокойно воспринял. и паскаль тоже.

а вот и вся практически готовая программа:
...
var
  f : textfile;
  a, b, c : int64;
  lenc, lenb, i : integer;
...
  c:=a*b;
  lenc:=length(IntToStr(c));
  lenb:=length(IntToStr(b));
  AssignFile(f,'res.txt');
  rewrite(f);
  writeln(f,a:lenc);          // <--- вот оно
  writeln(f,'x',b:(lenc-1));  // <--- вот оно
  for i:=1 to lenc do write(f,'-');
  writeln(f);
  for i:=1 to lenb do
    writeln(f, (a*StrToInt(IntToStr(b)[lenb-i+1])):(lenc-i+1));  // <--- а тут вообще страшно :)))
                                                                 // Си всё-таки сильно меняет человека :)))
  for i:=1 to lenc do write(f,'-');
  writeln(f);
  writeln(f,c);
  closeFile(f);
...

с мемо согласен. но в задании было сказано - в файл :)
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 26 февраля 2010, 12:00 [#14]:

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

Егор (статус: 10-ый класс), 26 февраля 2010, 12:13 [#15]:

ну да, конкретно ЭТОТ код на паскале не тестировался, а вот
begin
a := 1;
b := 4;
writeln(a:b);
end.
это проверял - работает.

в моём коде не только Int64, но и AssignFile, TextFile, CloseFile, StrToInt и IntToStr...

а если поставить паскалевские аналоги, то всё будет работать.
только вот Integer-а будет не хватать - числа большие.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 26 февраля 2010, 12:25 [#16]:

Не все знают, что в тубропаскале есть тип LongInt (он и сейчас есть в делфи) который имеет размерность 32 бита, знаковый. А Integer там 16 битный:)))
Галочка "подтверждения прочтения" - вселенское зло.
Жикльор

Жикльор (статус: 5-ый класс), 26 февраля 2010, 16:47 [#17]:

Вы так активно все обсуждаете))) Я уже сделал задачу, правда с небольшой сыростью, но для препода потянуло.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.

31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

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

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