|
Вопрос # 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|