| 
| 
 | Вопрос # 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 Здравствуйте, Жикльор!
 Мне понравилась ваша задача, поэтому, решил довести до конца ;)
 Если вы вдруг не разберетесь сами, мое решение в приложении =)
 Удачи вам.
 
|  | Ответ отправил: 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]:Спасибо Вадиму и Егору. Наброски уже просвечиваются) Теперь немного нужно подшлифовать код и еще немного подумать. ВСЕМ СПАСИБО, с праздником!! Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию. |  
|   | Жикльор (статус: 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) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |