Saturday, October 17, 2015

Pascal: Суммирование больших чисел


Исходный код:
  1. function Product(s: string): LongInt;
  2. var
  3.   i,e: word;
  4.   v: LongInt;
  5. begin
  6.   if s='' then Product:= 1  // если строки нет, то Продукт = 1;
  7.   else begin
  8.     i:= Length(s);  // Запоминаем длину строки
  9.    
  10.     while (i>0) and not (s[i] in ['*','/']) do dec(i);
  11. //  Пока длина больше 0 и    нет s[i] в (*,/) (строка не содержит в себе * и /)
  12. //  делаем декриз i
  13.  
  14.     Val(Copy(s,i+1,Length(s)-i),v,e);
  15. // преобрзуем число в строку
  16. {
  17.  Val(S, x, kod) преобразует строку символов S в число x.
  18. Здесь S – строковое выражение, x – числовая переменная
  19. (именно туда будет помещен результат),
  20. kod – целочисленная переменная (типа integer),
  21. которая равна номеру позиции в строке S,
  22. начиная с которой произошла ошибка преобразования,
  23. если преобразование прошло без ошибок, то переменная kod равна 0.
  24. }
  25. // Берем из строки s начиная с позиции i+1, количестко s-i,
  26. // результат преобразования заносим в переменную v,  e - это когда ошибка возникает
  27.  
  28.     if s[i]='*' then Product:= Product(Copy(s,1,i-1))*v
  29. // в строке - * тогда Продукт= Продукт (Из строки s, начиная с 1 позиции, i-1 символов)
  30. // умножаем на v
  31.    
  32.     else Product:= Product(Copy(s,1,i-1)) div v
  33. // иначе Продукт = Продукт(Из строки s, с 1ой позиции и до i-1) делем на v
  34.   end
  35. end;
  36.  
  37.  
  38. function Sum(s: string): LongInt;
  39. var
  40.   i,e: word;
  41. begin
  42.   if s='' then Sum:= 0  // если ничего нет в строке, то сумма равна 0
  43.   else begin
  44.     i:= Length(s);  // i:= длина строки s
  45.     while (i>0) and not (s[i] in ['+','-']) do dec(i);
  46. // Пока длина строки больше 0 и  нет  s[i] в [+,-]  делаем вычитание единицы из i
  47.     Sum:= Sum(Copy(s,1,i-1))+Product('*'+Copy(s,i,Length(s)-i+1))
  48. // Sum:= Sum(Выделяем из строки s , начиная с 1 позиции, i-1 символов) +
  49. // + Product ('*'+Copy(s,i,Length(s)-i+1))
  50.   end
  51. end;
  52.  
  53.  
  54. var
  55.   s,t: string;
  56.   i,j: word;
  57.  
  58. begin
  59.   readln(s);
  60.   while Pos(' ',s)>0 do Delete(s,Pos(' ',s),1);
  61.  {
  62.   Pos(Substr : String; S : String)
  63.  Ищет подстроку в строке.
  64.  Параметры Substr и S - строковые выражения.
  65.  Pos ищет первое вхождение строки Substr в строку S
  66.  и возвращает целочисленное значение,
  67.  которое является индексом первого символа Substr внутри S.
  68.  Если строка Substr не найдена, то Pos возвращает нуль.
  69.  
  70.   Delete(S:String; Index:Integer; Count:Integer);
  71.  Delete(S, Index, Count) -
  72.  Удаляет из строки S подстроку длинной Count начиная с позиции Index.
  73.  Параметр S - переменная со строковым типом.
  74.  Index и Count - целочисленные выражения.
  75.  Если значение Index больше, чем длина S,
  76.  то никакие символы не удаляются.
  77.  Если Count определяет большее количество символов,
  78.  чем остается в строке с позиции Index до конца строки,
  79.  то удаляется остаток строки.
  80.  }
  81.   while Pos(')',s)>0 do begin // если есть закрывающая скобка
  82.     i:= Pos(')',s);  // i:= позицию (целочисленное значение) закрывающей скобки
  83.     j:= i-1;  // j:= (целочисленное значение) позицию перед этой скобкой
  84.     while s[j]<>'(' do dec(j);  // пока не нашлась в строке открывающая скобка
  85. // то делаем вычитание единицы из j
  86.  
  87.     Str(Sum(Copy(s,j+1,i-j-1)),t);
  88. //  Str (процедура) Преобразовывает число в строку.
  89. //  STR (X, ST), где «X» - это число, а ST – его строковое представление.
  90. {
  91. Функцие Sum передаем два значения:
  92. 1. Copy (S, poz, n) выделяет из строки S, начиная с позиции poz,
  93. подстроку из n символов. Здесь S – любое строковое выражение,
  94. poz, n – целочисленные выражения.
  95.   С позиции j+1, количество i-j-1 символов.
  96. 2. t - еще нигде не появлялось.
  97. }
  98.     Delete(s,j,i-j+1);  
  99. //  Удаляем из строки s, начиная с j и до i-j+1
  100.    
  101.     Insert(t,s,j)
  102. {
  103. Insert(t,s,j) вставляет в строку S,
  104. начиная с позиции j, подстроку t.
  105. Здесь t – любое строковое выражение,
  106. S – строковая переменная (именно ей будет присвоен результат выполнения процедуры),
  107. j – целочисленное выражение.
  108. }    
  109.   end;
  110.   writeln(Sum(s));
  111.  end.
  112.  
  113.  
  114. Процедуры и функции для работы с символами и строками
  115. function Chr(a: byte): char;
  116.          Преобразует код в символ в кодировке Windows
  117.  
  118. function ChrUnicode(a: word): char;
  119.          Преобразует код в символ в кодировке Unicode
  120.  
  121. function OrdUnicode(a: char): word;
  122.          Преобразует символ в код в кодировке Unicode
  123.  
  124. function UpperCase(ch: char): char;
  125.          Преобразует символ в верхний регистр
  126.  
  127. function LowerCase(ch: char): char;
  128.          Преобразует символ в нижний регистр
  129.  
  130. function UpCase(ch: char): char;
  131.          Преобразует символ в верхний регистр
  132.  
  133. function LowCase(ch: char): char;
  134.          Преобразует символ в нижний регистр
  135.  
  136. function Pos(subs,s: string): integer;
  137.          Возвращает позицию подстроки subs в строке s. Если не найдена, возвращает 0
  138.  
  139. function PosEx(subs,s: string; from: integer := 1): integer;
  140.          Возвращает позицию подстроки subs в строке s начиная с позиции from. Если не найдена, возвращает 0
  141.  
  142. function Length(s: string): integer;
  143.          Возвращает длину строки
  144.  
  145. procedure SetLength(var s: string; n: integer);
  146.          Устанавливает длину строки s равной n
  147.  
  148. procedure Insert(source: string; var s: string; index: integer);
  149.          Вставляет подстроку source в строку s с позиции index
  150.  
  151. procedure Delete(var s: string; index,count: integer);
  152.          Удаляет из строки s count символов с позиции index
  153.  
  154. function Copy(s: string; index,count: integer): string;
  155.          Возвращает подстроку строки s длины count с позиции index
  156.  
  157. function Concat(s1,s2,...: string): string;
  158.          Возвращает строку, являющуюся результатом слияния строк s1,s2,...
  159.  
  160. function Concat(s1,s2: string): string;
  161.          Возвращает строку, являющуюся результатом слияния строк s1 и s2
  162.  
  163. function LowerCase(s: string): string;
  164.          Возвращает строку в нижнем регистре
  165.  
  166. function UpperCase(s: string): string;
  167.          Возвращает строку в верхнем регистре
  168.  
  169. function StringOfChar(ch: char; count: integer): string;
  170.          Возвращает строку, состоящую из count символов ch
  171.  
  172. function ReverseString(s: string): string;
  173.          Возвращает инвертированную строку
  174.  
  175. function CompareStr(s1,s2: string): integer;
  176.          Сравнивает строки. Возвращает значение < 0 если s1 0 если s1>s2 и = 0 если s1=s2
  177.  
  178. function LeftStr(s: string; count: integer): string;
  179.          Возвращает первые count символов строки s
  180.  
  181. function RightStr(s: string; count: integer): string;
  182.          Возвращает последние count символов строки s
  183.  
  184. function Trim(s: string): string;
  185.          Возвращает строку с удаленными начальными и конечными пробелами
  186.  
  187. function TrimLeft(s: string): string;
  188.          Возвращает строку с удаленными начальными пробелами
  189.  
  190. function TrimRight(s: string): string;
  191.          Возвращает строку с удаленными конечными пробелами
  192.  
  193. function Format(fmtstr: string; params pars: array of object): string;
  194.          Возвращает отформатированную строку, построенную по форматной строке fmtstr и списку форматиуемых параметров pars
  195.  
  196. function StrToInt(s: string): integer;
  197.          Преобразует строковое представление целого числа к числовому значению
  198.  
  199. function StrToInt64(s: string): int64;
  200.          Преобразует строковое представление целого числа к числовому значению
  201.  
  202. function StrToFloat(s: string): real;
  203.          Преобразует строковое представление вещественного числа к числовому значению
  204.  
  205. function TryStrToInt(s: string; var value: integer): boolean;
  206.          Преобразует строковое представление s целого числа к числовому значению и записывает его в value. При невозможности преобразования возвращается False
  207.  
  208. function TryStrToInt64(s: string; var value: int64): boolean;
  209.          Преобразует строковое представление s целого числа к числовому значению и записывает его в value. При невозможности преобразования возвращается False
  210.  
  211. function TryStrToFloat(s: string; var value: real): boolean;
  212.          Преобразует строковое представление s вещественного числа к числовому значению и записывает его в value. При невозможности преобразования возвращается False
  213.  
  214. function TryStrToFloat(s: string; var value: single): boolean;
  215.          Преобразует строковое представление s вещественного числа к числовому значению и записывает его в value. При невозможности преобразования возвращается False
  216.  
  217. procedure Val(s: string; var value: integer; var err: integer);
  218.          Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0
  219.  
  220. procedure Val(s: string; var value: shortint; var err: integer);
  221.          Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0
  222.  
  223. procedure Val(s: string; var value: smallint; var err: integer);
  224.          Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0
  225.  
  226. procedure Val(s: string; var value: int64; var err: integer);
  227.          Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0
  228.  
  229. procedure Val(s: string; var value: byte; var err: integer);
  230.          Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0
  231.  
  232. procedure Val(s: string; var value: word; var err: integer);
  233.          Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0
  234.  
  235. procedure Val(s: string; var value: longword; var err: integer);
  236.          Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0
  237.  
  238. procedure Val(s: string; var value: uint64; var err: integer);
  239.          Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0
  240.  
  241. procedure Val(s: string; var value: real; var err: integer);
  242.          Преобразует строковое представление s вещественного числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0
  243.  
  244. procedure Val(s: string; var value: single; var err: integer);
  245.          Преобразует строковое представление s вещественного числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0
  246.  
  247. procedure Str(i: integer; var s: string);
  248.          Преобразует целое значение i к строковому представлению и записывает результат в s
  249.  
  250. procedure Str(r: real; var s: string);
  251.          Преобразует вещественное значение r к строковому представлению и записывает результат в s
  252.  
  253. function IntToStr(a: integer): string;
  254.          Преобразует целое число к строковому представлению
  255.  
  256. function IntToStr(a: int64): string;
  257.          Преобразует целое число к строковому представлению
  258.  
  259. function FloatToStr(a: real): string;
  260.          Преобразует вещественное число к строковому представлению

No comments:

Post a Comment