Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2012, 02:02   #1
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
Вопрос Умножение в столбик. Паскаль. Работа с файлами

Доброй ночи, уважаемые профи, вообщем сразу к сути:
Нужно реализовать умножение двух натуральных чисел в столбик(кнч мы задаем их с клавиатуры), как мы делаем это вручную, в случае надобности, т.е.:
1356*135:
***********1356
************135
***********6780
**********4068
*********1356
******---------
********183060

Это выводится на экран и записывается в txt(в данном случае напихано звездочки ибо когда я ставлю просто пробелы мне их убирают автоматически)

С работай с файлами я еще не ознакомился, только буду разбираться, я думаю это не сложно, но помимо этого остается основное решение, вообщем вот что я уже сделал:
Код:
Program Lab9;
type mass=array[1..50]of integer;
Procedure sum(n,m:integer);
var
sm,sp:string;
i,j,tmp,f:integer;
Mmas,MMmas:mass;
begin
write('Vvedite pervoe chislo ');
readln(n);
write('Vvedite vtoroe chislo ');
readln(m);
if m>n then begin
tmp:=n;
n:=m;
m:=tmp;
end;
str(m,sm);
for i:=length(sm) downto 1 do begin
Mmas[i]:=(ord(sm[i])-48);
end;
for i:=length(sm) downto 1 do begin
for j:=1 to length(sm) do
MMmas[j]:=(Mmas[i]*n);
writeln(MMmas[j]);
end;


end;
var a,b:integer;
begin
sum(a,b);

end.
Далее нужно распределить это все как подобает умножению в столбик, там после каждого умножения идет смещения рядка, у меня есть идея, но она мне кажется громосткой: округлять числа до большого кол-во знаков например х(х=сonst) чтобы был сдвиг чисел, а дальше отталкиватся от этого первое число n сдвигаем на х, число m на х (числа n,m и есть наши числа, которые нужно перемножить, далее сдвигаем уже перемножаемые части) далее (x-1).... (x-2).....

Мб вы знаете более рациональное решение данной проблемы,без того бреда что я описал. Вообщем задачка кажется пустяковой, буду очень благодарен за помощ.
Carpe Diem

Последний раз редактировалось Heming; 29.01.2012 в 13:28.
Heming вне форума Ответить с цитированием
Старый 29.01.2012, 13:26   #2
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
По умолчанию

Почему когда я пытаюсь отдельно вывести новый массив, состоящий из чисел которые в итоге нужно сложить, то у меня выводится только одно и тоже число несколько раз:

for j:=1 to length(sm) do
writeln(Mmmas[j]);
end;

Для коректности работы выравнивания мне нужно вывод вывести вне цикла, который есть в коде....*ля какой-то бред выходит
Carpe Diem

Последний раз редактировалось Heming; 29.01.2012 в 13:36.
Heming вне форума Ответить с цитированием
Старый 29.01.2012, 19:16   #3
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Вообще реализовать проще всего так:
1) Забивать второй множитель в строку
2) Перевести его символы в массив integer
3) Перемножать первый множитель, на каждый элемент массива цифр числа второго множителя. Делать это с конца. Выводить результаты в промежутке.
4) Результат каждого умножения записывать в результирующий массив.
5) Сложить элементы результируюего массива и вывести конечный ответ.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 29.01.2012, 19:30   #4
zhan313
Пользователь
 
Регистрация: 09.12.2011
Сообщений: 44
По умолчанию

Попробуй так. Не идеал конечно.
Код:
for i:=length(sm) downto 1 do begin
Mmas[i]:=(ord(sm[i])-48);
end;
j:=1;
for i:=length(sm) downto 1 do begin
MMmas[j]:=(Mmas[i]*n);
inc(j);
end;
writeln(n:10); writeln(m:10);
writeln('----------');
f:=0;
for j:=1 to length(sm) do
begin
writeln(MMmas[j]:(11-j));
for i:=0 to j-1 do if i=0 then tmp:=1 else tmp:=tmp*10;
f:=f+MMmas[j]*tmp
end;
writeln('----------');
writeln(f:10);
end;
zhan313 вне форума Ответить с цитированием
Старый 29.01.2012, 19:50   #5
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
По умолчанию

Цитата:
Сообщение от zhan313 Посмотреть сообщение
Попробуй так. Не идеал конечно.
Код:
for i:=length(sm) downto 1 do begin
Mmas[i]:=(ord(sm[i])-48);
end;
j:=1;
for i:=length(sm) downto 1 do begin
MMmas[j]:=(Mmas[i]*n);
inc(j);
end;
writeln(n:10); writeln(m:10);
writeln('----------');
f:=0;
for j:=1 to length(sm) do
begin
writeln(MMmas[j]:(11-j));
for i:=0 to j-1 do if i=0 then tmp:=1 else tmp:=tmp*10;
f:=f+MMmas[j]*tmp
end;
writeln('----------');
writeln(f:10);
end;
Блин, точно)) спс большое, ед кнч можно просто втупую схитрить и финальное число бахнуть перемножение вводимых чисел, уравнивая его, ибо суть лабы в работе с файлами, но вы сделали "по-хорошему", спс еще раз, че-то я натупил конкретно, пытался вводить константу, еще счетчик на отнимание от неё, в том время как можно было использовать порядковые номера елементов полученного массива....

Сейчас сяду за Фарoнова, почитаю про файлы, что выйдет залью сюда, или мб какие-то вопросы появятся.
Carpe Diem

Последний раз редактировалось Heming; 29.01.2012 в 20:48.
Heming вне форума Ответить с цитированием
Старый 29.01.2012, 20:16   #6
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Еще вариант:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  mnozh=array of integer;
procedure st_mult(var m:mnozh; S1,S2:string);
var
  i,k,j,x:integer;
  res:integer;
begin
  x:=strtoint(S1);
  writeln('':length(S1)+1,S1);
  writeln('':length(S1)*2-length(S2)+1,S2);
  res:=0;
  setlength(m,length(S2));
  k:=0;
  for i:=high(m) downto 0 do
    begin
      m[i]:=strtoint(S2[i+1])*X;
      writeln(m[i]:(length(S1)*2-length(S2)+2+i));
      if k<>0 then
        for j:=1 to k do
          m[i]:=m[i]*10;
      inc(k);
      Res:=res+m[i];
    end;
  for i:=1 to length(S1)*2 do
    write('-');
  writeln;
  writeln(res);
end;

VAR
  x:integer;
  S1,s2:string;
  m:mnozh;
BEGIN
//  write('':5);
  readln(S1);
//  write('':5);
  readln(S2);
//сюда бы clrscr ...
  writeln('solution');
{S1:='1563';
S2:='9954';}
  st_mult(m,S1,S2);
  readln
END.
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 29.01.2012, 22:32   #7
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
По умолчанию Final version

Вот финальный вариант, всем большое спс за помощ:
Код:
Program Lab9;
type mass=array[1..50]of integer;

Procedure sum(n,m:integer);
var
sm,sp,name,nname:string;
fi:text;
i,j,tmp,f:integer;
Mmas,MMmas:mass;
begin
repeat
write('Vvedite nazvanie fayla v kotoriy sohranit rezultat ');
readln(name);
//{$I-}
//reset(fi);   //Эти директивы не работают на ABC pascal где я пишу, функция IORESULT не существует, пользуемся FileExists
//{$I+}
nname:=name+'.txt';
if FileExists(nname)=false then
writeln('Ukazannogo fayla netu') ;
until (FileExists(nname));
assign(fi,nname);
write('Vvedite pervoe chislo ');
readln(n);
write('Vvedite vtoroe chislo ');
readln(m);
if m>n then begin
tmp:=n;
n:=m;
m:=tmp;
end;
str(m,sm);
for i:=length(sm) downto 1 do begin
Mmas[i]:=(ord(sm[i])-48);
end;
j:=1;
for i:=length(sm) downto 1 do begin
MMmas[j]:=(Mmas[i]*n);
inc(j);
end;
append(fi);
writeln(fi,n:10);writeln(fi,m:10);
writeln(n:10); writeln(m:10);
writeln('----------');
writeln(fi,'----------');
f:=0;
for j:=1 to length(sm) do
begin
writeln(MMmas[j]:(11-j));
writeln(fi,MMmas[j]:(11-j));
for i:=0 to j-1 do if i=0 then tmp:=1 else tmp:=tmp*10;
f:=f+MMmas[j]*tmp
end;
writeln('----------');
writeln(fi,'----------');
writeln(f:10);writeln(fi,f:10);
writeln(fi,' ');
close(fi);
end;

var a,b:integer;
begin
sum(a,b);

end.
Малоли вдруг кому-то пригодится
Carpe Diem
Heming вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль, работа с файлами. Alexey_HvaranG Помощь студентам 5 07.12.2009 22:39
работа с файлами в паскаль... Оксаночка:) Помощь студентам 1 19.06.2009 09:59
работа с файлами(паскаль) WF7 Паскаль, Turbo Pascal, PascalABC.NET 2 03.06.2009 16:02