На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
  
    > Мастер-класс виртуозного программирования, откровения потомственного хакера
      Этот блог я посвящаю светлой памяти своего научного руководителя Зацепина П.М., одного из самых выдающихся IT-специалистов современности, глубоко осведомлённого во всех IT-вопросах и прежде всего, в вопросах программирования.
      user posted image

      Доброго времени суток, уважаемые форумчане! Я, как бы это громко ни звучало – потомственный хакер. В этом смысле мне в жизни повезло, как с родственниками, так и с учителями. Виртуозное программирование – это одна из составляющих моего хакерского бытия.

      В 2007-м году я закончил обучение в Алтайском государственном университете на физико-техническом факультете. Специальность: вычислительные машины, комплексы, системы и сети. Кафедра вычислительной техники и электроники. Специализация: защита информации в компьютерных системах. Квалификация: инженер-программист.

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

      На панацею конечно не претендую, т.к. могут существовать разные стили программирования, вместе с тем, мой подход к программингу, объективно весьма интересен. Вот им я и собираюсь делиться в этом блоге. Больше всего внимания будет уделено:
      - вопросам математической модели, алгоритмам и блок-схемам,
      - философским и культурным аспектам программирования,
      - модульности и повторному использованию кода.

      Ну вот, довольно много громких слов сказал в свой адрес, теперь их надо как-то подтвердить. Лично для меня знакомство с программистом начинается со знакомства с его типичной программы: «Покажи мне свою программу, и я скажу, кто ты», – поэтому приведу пример своей. Так и хочется сказать, что написана special for sources.ru, но нет, её я написал в далёком 2002-м году.

      При написании этой программы я преследовал несколько образовательных целей, которые проиллюстрированы на её примере:
      - важность математической модели, алгоритма и блок-схем,
      - подробная иллюстрация языковых возможностей,
      - интуитивно понятные идентификаторы,
      - грамотная разбивка на модули,
      - хорошее документирование,
      - хорошая структура,
      - и ряд других.
      Насколько мне это удалось – судить вам.

      Чаще всего в своих мини-статьях я для иллюстрации разных концепций буду ссылаться на эту программу. Если администрация форума милостиво предоставит мне доступ к редактированию этого первого поста, то я по мере добавления новых статей, буду вставлять в него ссылки на них – для более удобной навигации по теме.

      ExpandedWrap disabled
                      {*********************************************}
                      {**           Программа Graph.pas           **}
                      {**      Эта программа рисует графики       **}
                      {**Составлена Серохвостовым Антоном 10.03.02**}
                      {**       Последняя доработка 22.05.02      **}
                      {*********************************************}
         
        {Краткое описание программы:
          Данная программа рисует график введеной в строковом
          виде функции, при вводе используются оператры такие
          же  как  и  в паскале. Вместо переменного параметра
          следует вводить z}
         
        Program MatLab;
        {*************}
         
        Uses Crt, Graph;
        {*************}
         
        Const Mode: Integer = 4;   {Графический режим 1024x780}
              Way  = 'c:\Bp\Bgi';  {Путь к графическому драйверу}
              Author: String = 'Серохвостов Антон Анатольевич';
        {*************}
         
        Var Result: Boolean;       {Флаг коректности операции}
        {*********************Подпрограммы*********************}
         
        Function Mark(S: String): String;
         {Коректирует дублирующиеся знаки}
          var i: Integer; {Позиция очередных дублирующихся знаков}
              b: Boolean; {Флаг наличия дублирующихся знаков}
         
          begin
            b := True;
            while b do
              if Pos('*-', S) or Pos('/-', S) <> 0
                then begin
                       if Pos('*-', S) <> 0
                         then begin
                                i :=  Pos('*-', S);
                                Delete(S, Pos('*-', S)+1, 1)
                              end {if Pos('*- ...}
                         else begin
                                i :=  Pos('/-', S);
                                Delete(S, Pos('/-', S)+1, 1)
                              end; {else ...}
                       while (s[i] <> '+') and (s[i] <> '-') and (i >= 1) do
                         Dec(i);
                       Insert('-', S, i+1)
                     end {if Pos('*-' ...}
                else if Pos('+-', S) <> 0
                       then Delete(S, Pos('+-', S), 1)
                       else if Pos('--', S) <> 0
                              then begin
                                     Insert('+', S, Pos('--', S));
                                     Delete(S, Pos('--', S), 2)
                                   end {if Pos('--' ...}
                              else b := False;
            Mark := S
          end; {Mark}
        {************}
         
        Function ElFunc(S: String): Real;
         {Вычисляет линейные функции, т.е. самые внутренний скобки}
          label 1;
         
          var Rez,             {Значение выражения}
              x   : Real;      {Строка S1 в числовом виде}
              s1  : String;    {Очередное   число  строки}
              Oper: Char;      {Очередной  знак  операции}
              o,               {Позиция операции в строке}
              j,               {Определение первого вхождения в условие}
              i,               {Счетчик}
              Code: Integer;   {Номер   ошибочного   символа  в  строке}
         
          begin
           {***Выделение умножения и деления***}
            S := Mark(S);                  {Корекция  дублирующихся  знаков}
            while (Pos('/', S) <> 0) or (Pos('*', S) <> 0) do
              begin
                if ((Pos('/', S) < Pos('*', S))) and (Pos('/', S) <> 0)
                                                       or (Pos('*', S) = 0)
                  then begin
                         Oper := '/'; o := Pos('/', S)
                       end {if ((Pos('/' ...}
                  else if Pos('*', S) <> 0
                         then begin
                                Oper := '*'; o := Pos('*', S)
                              end; {else if Pos('*' ...}
           {---Выделение числа после знака---}
                s1 := ''; i := o+1;
                while (Pos(S[i], '+-*/)') = 0) and (i <> Length(S)+1) do
                  begin
                    s1 := s1+S[i]; Inc(i)
                  end; {while (Pos(S[ ...}
                Val(s1, Rez, Code);
           {---Удаление этого числа из строки---}
                Delete(S, o+1, Length(s1));
           {---Выделение числа до знака---}
                s1 := ''; i := o-1;
                while (Pos(S[i], '+-*/') = 0) and (i <> 0) do
                  begin
                    s1 := S[i]+s1; Dec(i)
                  end; {while (S[ ...}
                Val(s1, x, Code);
           {---Удаление этого числа из строки---}
                Delete(S, i+1, Length(s1)+1);
           {---Умножение и деление чисел---}
                case Oper of
                  '/': if Rez <> 0 then Rez := x/Rez
                                   else Result := False;
                  '*': Rez := x*Rez
                end; {case}
           {---Запись числа в строку S---}
                Str(Rez: 5: 3, s1);
                Insert(s1, S, i+1); if S[i+1] = ' ' then Delete(S, i+1, 1)
              end; {while (Pos('/' ...}
           {***Вычисление операций сложения и вычитания***}
            j := 1; s1 := '';
            S := Mark(S);                  {Корекция  дублирующихся  знаков}
            for i := 1 to Length(S) do
           {---Выделение операции---}
              if Pos(S[i], '+-') <> 0
                then begin
                       1:                       {Метка   безусловного   перехода}
                       Val(S1, x, Code);        {Преобразование строки  в  число}
                       if j = 1                 {Если в условие входили один раз}
                         then begin             {то    идти   в   это    условие}
                                Rez := x; j := 0;
                                Oper := S[i]; s1 := ''
                              end {if j = 1 ...}
                         else begin
                 {---Выбор операции над числом---}
                                case Oper OF
                                  '+': Rez := Rez+x;  {Сложение  чисел}
                                  '-': Rez := Rez-x   {Вычитание чисел}
                                end; {case ...}
                                Oper := S[i]; s1 := ''{Выделение очередной операции}
                              end  {else ...}
                     end {if (S[i] = '*') ...}
                else begin                 {Если очередной символ строки}
                       s1 := s1+S[i];      {не равен знаку операции, то }
                       if i = Length(S)    {изменить   числовую   строку}
                         then Goto 1
                     end; {else ...}
            ElFunc := Rez
          end; {ElFunc}
        {************************Объекты***********************}
         
        Type
         {---Меню---}
          TMenu = object
            Num: Byte;            {Номер текущего пункта меню}
            e, ex: Boolean;    {Флаги <F1>, <Enter> и <Esc> соответственно}
            x, y  : Integer;      {Координаты верхнего левого угла}
            Kol   : Integer;      {Количество пунктов меню}
            txt   : array [1..50] of String; {Текст в пункте меню}
            rColor: Word;         {Цвет пунктов меню}
            function Menu: Byte;  {Осуществляет работу с меню}
             {Возвращает номер выбраного пункта}
          end; {TMenu}
         
         {---Оформдение меню---}
          TForm = object (TMenu)
            Title : String;       {Заголовок меню}
            tColor: WORD;         {Цвет текста}
            procedure Form;       {Рисует меню}
            procedure Standart;   {Ставит установки по умолчанию}
          end; {TForm}
         
         {---Вычисление функции---}
          TFunc = object
            XMax, YMax: Real;     {Максимальные значения переменных по осям}
            dx, dy: Real;         {Размер единицы по осям}
            Fun: String;          {Функция в строковом виде}
         
            function Translate(S: String; var a: Real): Boolean;
             {Вычисляет функцию представленую в строковом виде}
            function WithFunc(S: String): Real;
             {Вычисляет выражения со сложными функциями}
            procedure Param(var S: String; a: Real);
             {Заменяет параметр в строке числом}
            Function EnterFunc(x, y: Integer): Boolean;
              {Вводит функцию в графическом режиме в заданном месте}
          end; {TFunc}
         
         {---Построитель графика---}
          TGraph = object (TFunc)
            procedure GraphInit;
             {Инициализирует графику с адаптером SVGA}
            procedure Fon;
             {Рисует заставку}
            procedure SysKoord;
             {Рисует систему координат}
            procedure Go;     {0 - 500, 380}
             {Строит график}  {960 = 480*2, 700 = 350*2- количество пикселов на осях}
            function SetY(y: Real): Real;
             {Устанавливают стандартную систему координат}
            function SetX(x: Real): Real;
             {Устанавливает сиандартную систему координат}
          end; {TGraph}
        {************************TForm*************************}
         
        Procedure TForm.Form;
          var i: Integer;
         
          begin
            SetColor(tColor); SetFillStyle(1, rColor);
            i := 1;
           {---Вывод заголовка меню---}
            SetTextStyle(4, 0, 10);
            OutTextXY(x-Length(Title)*20+170, y-100, Title);
           {---Вывод заголовков пунктов меню---}
            SetTextStyle(2, 0, 10);
            repeat
              Bar(x-3, i*60+y-4, x+563, i*60+y+42);
              OutTextXY(x+10, i*60+y-1, txt[i]);
              Inc(i)
            until i > Kol
          end; {TForm.Form}
        {************}
         
        Procedure TForm.Standart;
          begin
             x := (GetMaxX-500) div 2;
             y := (GetMaxY-Round(60*(Kol+1))) div 2;
             Title := 'MENU'; Num := 1;
             rColor := Blue; tColor := Yellow
          end; {TForm.Standart}
        {************************TMenu*************************}
         
        Function TMenu.Menu;
          var Ch: Char;
         
          begin
            repeat
             {---Прорисовка курсора---}
              SetFillStyle(1, Green);
              Bar(x, Num*60+y-1, x+560, Num*60+y+39);
              OutTextXY(x+10, Num*60+y-1, txt[Num]);
             {---Ожидание нажатия клавиши---}
              Ch := ReadKey;
              if Ch = #0 then Ch := ReadKey;
             {---Стирание курсора---}
              SetFillStyle(1, rColor);
              Bar(x, Num*60+y-1, x+560, Num*60+y+39);
              OutTextXY(x+10, Num*60+y-1, txt[Num]);
             {---Проверка нажатой клавиши---}
              e := False; ex := False;
              case Ch of
                #72: {Код клавиши <Стрелка вверх>}
                  if Num > 1 then Dec(Num);
                #80: {Код клавиши <Стрелка вниз>}
                  if Num < Kol then Inc(Num);
                #13: {Код клавиши <Enter>}
                  e := True;
                #27: {Код клавиши <Esc>}
                  ex := True
              end {case ...}
            until Pos(Ch, #13#27#59) <> 0;
           {---Если не нажата отмена, то выбрать пункт меню---}
            if Ch <> #27 then Menu := Num
                         else Menu := 0
          end; {TMenu.Menu}
        {*************************TFunc************************}
         
        Function TFunc.Translate(S: String; var a: Real): Boolean;
         {Вычисляет функцию представленую в строковом виде}
          var i: Byte;
         
          begin
            Translate := True;
            for i := 1 to Length(S) do
              S[i] := UpCase(S[i]);
            if S = 'SIN'
              then a := sin(a)         else
            if S = 'COS'
              then a := cos(a)         else
            if (S = 'TAN') and (cos(a) <> 0)
              then a := sin(a)/cos(a)  else
            if (S = 'TAN') and (cos(a) = 0)
              then Result := False     else
            if (S = 'CTAN') and (sin(a) <> 0)
              then a := cos(a)/sin(a)  else
            if (S = 'CTAN') and (sin(a) = 0)
              then Result := False     else
            if (S = 'LN') and (a > 0)
              then a := ln(a)          else
            if (S = 'LN') and (a <= 0)
              then Result := False     else
            if (S = 'EXP') and (abs(a) >= 88)
              then Result := False     else
            if (S = 'EXP') and (abs(a) < 88)
              then a := exp(a)         else
            if S = 'SQR'
              then a := sqr(a)         else
            if (S = 'SQRT') and (a >= 0)
              then a := sqrt(a)        else
            if (S = 'SQRT') and (a < 0)
              then Result := False     else
            if S = 'ABS'
              then a := abs(a)         else
            if S = 'T'
              then a := a              else
            if S = 'ARCTAN'
              then a := arctan(a)      else
            if S = 'FRAC'
              then a := frac(a)        else
            if S = 'INT'
              then a := int(a)         else
            if S = 'ROUND'
              then a :=  Round(a)
              else Translate := False
          end; {Translate}
        {************}
         
        Function TFunc.WithFunc(S: String): Real;
         {Вычисляет выражения со сложными функциями}
          var i: Byte;           {Счетчик}
              Func,              {Очередная функция}
              Sr: String;        {Результат в строковом виде}
              Rez: Real;         {Результат вычислений}
         
          begin
            while Pos(')', S) <> 0 do
              begin
           {---Выделение очередных скобок---}
                i := Pos(')', S); Sr := '';
                while S[i-1] <> '(' do
                  begin
                    Dec(i); Sr := S[i]+Sr
                  end; {while S[ ...}
           {---Вычисление скобок---}
                while S[i] <> ')' do Delete(S, i, 1);
                Rez := ElFunc(Sr); Str(Rez: 5: 3, Sr);
                Insert(Sr, S, i);
           {---Проверка наличия функции---}
                Func := '';
                while (Pos(S[i-2], '+-/*(') = 0) and (i > 2) do
                  begin
                    Func := S[i-2]+Func; Dec(i)
                  end; {while (S[i-1 ...}
           {---Вычисление функции---}
                if Translate(Func, Rez) {Если перед скобкой функция,}
                  then begin            {то выполнить ее}
                         Str(Rez: 5: 3, Sr);
                         while S[i-1] <> ')' DO Delete(S, i-1, 1);
                         Delete(S, i-1, 1); Insert(Sr, S, i-1);
                       end {Translate( ...}
                  else begin            {иначе удалить скобки}
                         Delete(S, i-1, 1); Delete(S, i+Length(Sr)-1, 1)
                       end {else ...}
              end; {while Pos ...}
            WithFunc := ElFunc(S)
          end; {WithFunc}
        {************}
         
        Procedure TFunc.Param(var S: String; a: Real);
         {Заменяет параметр в строке числом}
          var i: Byte;    {Позиция параметра в строке}
              Sa: String; {Значение параметра в строковом виде}
         
          begin
           {---Преобразование строчных букв в прописные---}
            for i := 1 to Length(S) do
              S[i] := UpCase(S[i]);
           {---Замена переменной на число---}
            i := Pos('Z', S); Str(a: 5: 2, Sa);
            while i <> 0 do
              begin
                Delete(S, i, 1);
                Insert(Sa, S, i);
                i := Pos('Z', S)
              end {while i ...}
          end; {TFunc.Param}
        {************}
         
        Function TFunc.EnterFunc(x, y: Integer): Boolean;
         {Вводит функцию в графическом режиме в заданном месте}
          var Ch: Char;  {Очередной введеный символ}
         
          begin
            Fun := '';
            repeat
           {---Сканирование нажатой клавиши---}
              Ch := ReadKey;
              if Ch = #0 then Ch := ReadKey;
           {---Выбор действия---}
              case Ch of
                '0'..'9', 'a'..'z', 'A'..'Z', '.',
                '(', ')', '+', '-', '*', '/': if Length(Fun) < 70
                                                then begin
                                                       Fun := Fun+Ch;
                                                       Bar(x, y, x+810, y+20);
                                                       OutTextXY(x, y, Fun)
                                                     end; {if Length ...}
                #8: begin               {Код клавиши <BackSpace>}
                      Delete(Fun, Length(Fun), 1);
                      Bar(x, y, x+810, y+20);
                      OutTextXY(x, y, Fun)
                    end; {#8 ...}
                #13: EnterFunc := True; {Код клавиши <Enter>}
                #27: EnterFunc := False {Код клавиши <Esc>}
              end {case Ch ...}
            until (Ch = #13) or (Ch = #27)
          end; {EnterFunc}
        {***********************TGraph************************}
         
        Procedure TGraph.GraphInit;
         {Инициализирует графику с адаптером SVGA}
          var Driver: Integer;
         
          begin
           {$F+}
            ChDir(Way);
            Driver := InstallUserDriver('SVGA256', nil);
           {$F-}
            InitGraph(Driver, Mode, Way)
          end; {TGraph.GraphInit}
        {************}
         
        Procedure TGraph.Fon;
         {Рисует заставку}
          var i, j: Integer; {Счетчики}
         
          begin
            Randomize;
            SetColor(White);
            SetTextStyle(1, 0, 10);
            OutTextXY(310, 260, 'МатЛаб');
         {***************}
            SetTextStyle(1, 0, 2);
            OutTextXY(630, 700, 'Автор: ');
            i := 1;
           {---Рисование падающих букв---}
            repeat
              j := 600;
              repeat
                SetColor(Black);  OutTextXY(700+i*10, j-1, Author[i]);
                SetColor(Yellow); OutTextXY(700+i*10, j, Author[i]);
                Delay(2); Inc(j)
              until (j = 700) or KeyPressed;
              Sound(800); Delay(2);
              NoSound; Inc(i)
            until (i = 30) or KeyPressed;
           {---Рисование элипса меняющего цвет---}
            repeat
              SetColor(Random(256));
              for i := 1 to 30 do
                Ellipse(520, 325, 0, 360, 300+i*2, 100+i*3)
            until KeyPressed;
            ReadKey
          end; {TGraph.Fon}
        {************}
         
        Procedure TGraph.SysKoord;
         {Рисует систему координат}
          var i: Integer; {Счетчик}
              s: String;  {Очередная координата в строковом виде}
         
          begin
            SetTextStyle(0, 0, 0); SetColor(Green);
           {---Координатные оси---}
            Line(500, 20, 500, 747);   Line(0, 380, 1003, 380);
           {---Стрелки---}
            Line(1003, 380, 995, 382); Line(1003, 380, 995, 378);
            Line(500, 20, 502, 28);    Line(500, 20, 498, 28);
           {---Деления на оси абсцисс---}
            i := -480;
            repeat
              SetColor(Green);
              if abs(SetX(i*dx/2)) < 1024
                then if Odd(i)
                       then Line(Round(SetX(i*dx/2)), 380,
                                 Round(SetX(i*dx/2)), 375)
                       else begin
                              Line(Round(SetX(i*dx/2)), 380,
                                   Round(SetX(i*dx/2)), 370);
                              Str(i/2: 1: 0, s); SetColor(White);
                              OutTextXY(Round(SetX(i*dx/2))-10, 385, s)
                            end;
              Inc(i)
            until i*dx/2 > 480;
           {---Деления на оси ординат---}
            i := -350;
            repeat
              SetColor(Green);
              if abs(SetY(i*dy/2)) < 780
                then if Odd(i)
                       then Line(500, Round(SetY(i*dy/2)),
                                 505, Round(SetY(i*dy/2)))
                       else begin
                              Line(500, Round(SetY(i*dy/2)),
                                   510,Round(SetY(i*dy/2)));
                              Str(i/2: 1: 0, s); SetColor(White);
                              OutTextXY(470, Round(SetY(i*dy/2)), s)
                            end;
              Inc(i); if i = 0 then Inc(i)
            until i*dy/2 > 350;
          end; {TGraph.SysKoord}
        {************}
         
        Procedure TGraph.Go;
          var z,                       {Очередное значение аргумента}
              OldX, OldY, x, y: Real;  {Старые и новые координаты точки}
              b: Boolean;              {Флаг первого вхождения в цикл}
              s: String;               {Функция с вставленными параметрами}
              Ch: Char;                {Детектор нажатой клавиши}
         
          begin
            SetFillStyle(1, Black); SetColor(White);
            repeat
           {---Очистка экрана от старого графика---}
              Bar(0, 0, GetMaxX, GetMaxY);
           {---Рисование сетки---}
              SetColor(DarkGray); z := -480;
              repeat
                if abs(SetX(z*dx)) < 1024
                  then Line(Round(SetX(z*dx)), 0, Round(SetX(z*dx)), 780);
                if abs(SetY(z*dx)) < 780
                  then Line(0, Round(SetY(z*dx)), 1024, Round(SetY(z*dx)));
                z := z+1
              until z > 480;
           {---Рисование осей координат---}
              SysKoord; b := False;
              SetColor(Green);
           {---Рисование нового графика---}
              z := -480/dx;
              while z < 480/dx do
                begin
                  Result := True;
                  s := Fun; Param(s, z); {Вставка в функцию очередного значения}
                  x := SetX(z*dx); y := SetY(WithFunc(s)*dy);
                  if Result and b and (abs(x) < 1024) and (abs(y) < 780)
                    then Line(Round(x), Round(y), Round(OldX), Round(OldY))
                    else if Result and not b
                           then b := True          {Разрешение рисование линии}
                           else if not Result
                                  then b := False; {Запрет рисования линии}
                  OldX := x; OldY := y;            {Сохранение старых координат}
                  z := z+1/dx
                end; {while z ...}
           {---Изменение масштаба---}
              Ch := ReadKey;     {Чтение нажатой клавиши}
              if Ch = #0 then Ch := ReadKey;
              case Ch of
                #43: begin       {Увеличение масштаба при нажатии <+>}
                       dx := dx*2;
                       dy := dy*2
                     end; {#43 ...}
                #45: begin       {Уменьшение масштаба при нажатии <->}
                       dx := dx/2;
                       dy := dy/2
                     end {#45 ...}
              end {case Ch ...}
            until Ch = #27
          end; {TGraph.Go}
        {************}
         
        Function TGraph.SetY(y: Real): Real;
         {Устанавливает привычную систему координат}
          begin
            SetY := GetMaxY-387-y
          end; {TGraph.SetY}
        {************}
         
        Function TGraph.SetX(x: Real): Real;
         {Устанавливает привычную систему координат}
          begin
            SetX := GetMaxX-523+x
          end; {TGraph.SetX}
        {************}
         
        Var s : String;
            Gr: TGraph;
            MainMenu, Men: TForm;
        {*******************Главная программа*****************}
         
        Begin
          Gr.GraphInit; Gr.Fon;
         {---Установка опций главного меню---}
          with MainMenu do Begin
                             Standart;   {Установка стандартного состояния}
                             Kol := 3;   {Установка количества пунктов}
                             txt[1] := '         Меню';
                             txt[2] := '         Автор';
                             txt[3] := '         Выход'
                           End; {with MainMenu ...}
         {---Установка опций меню---}
          with Men do Begin
                        Standart;        {Установка стандартного состояния}
                        Kol := 4;        {Установка количества пунктов}
                        txt[1] := '  Построение графиков';
                        txt[2] := 'Вычисление производных';
                        txt[3] := ' Вычисление интегралов';
                        txt[4] := '         Выход'
                      End; {with Men ...}
         {---Работа с меню---}
          repeat
            SetFillStyle(1, Black);
            Bar(0, 0, GetMaxX, GetMaxY);
            MainMenu.Form; MainMenu.Menu;{Рисование меню и работа с ним}
            SetFillStyle(1, Black);
            Bar(0, 0, GetMaxX, GetMaxY); {Очистка экрана}
            if MainMenu.e
              then case MainMenu.Num of
                     1: Begin
                          repeat
                            SetFillStyle(1, Bl
                            Bar(0, 0, GetMaxX, GetMaxY);
                            Men.Form; Men.Menu;    {Рисование меню и работа с ним}
                            SetFillStyle(1, Black);
                            Bar(0, 0, GetMaxX, GetMaxY);          {Очистка экрана}
                            if Men.e
                              then case Men.Num of
                                     1: Begin
                                         {---Ввод закона---}
                                          Gr.dx := 10; Gr.dy := 10;
                                          Result := True;
                                          SetTextStyle(2, 0, 7); SetColor(White);
                                          OutTextXY(10, 100, 'Введите функцию: ');
                                          if Gr.EnterFunc(220, 100)
                                         {------}
                                            then Gr.Go {построение графика}
                                        End; {1 ...}
                                     2, 3: Begin
                                            SetTextStyle(3, 0, 10);
                                            OutTextXY(150, 100, 'Эта функция');
                                            OutTextXY(300, 250, 'пока не');
                                            OutTextXY(260, 400, 'доступна');
                                            ReadKey
                                           End {2, ...}
                                   End {case Men ...}
                          until (Men.Num = 4) or Men.ex
                        End; {1 ...}
                     2: Begin
                          Gr.Fon
                        End {2 ...}
                   End {case MainMenu ...}
          until (MainMenu.Num = 3) or MainMenu.ex;
         {------}
          TextMode(1)
        End. {of program}
        {ТЕСТОВЫЕ ДАННЫЕ:
          вход                       выход
          sin(z)                  |  синусоида
          sqr(sin(z))+sqr(cos(z)) |  прямая параллельная оси Ox
          1                       |  прямая параллельная оси Ox
          z                       |  прямая наклоненная под 45 градусов
          1/z                     |  гипербола
          sqr(cos(z))-cos(z)      |  периодическая функция
          sqr(cos(sin(z))+cos(z)  |  косинусоида
         
        АЛГОРИТМ:
        ****************Главная программа****************
          1. Ввод функции.
          2. Установка масштаба по умолчанию (с игнорированием ошибочных мест).
            1.1. Вычисление функции начиная с самой
                 внтуренней для очередного аргумента.
            1.2. Рисование сетки.
            1.3. Рисование осей координат.
            1.4. Рисование графика.
        ****************Функция Mark****************
        Эта функция корректирует дублирующиеся знаки
         
        ****************ElFunc****************
        Эта функция вычисляет выражение без скобок
          1.
        ****************Объект TMenu****************
        Этот объект осуществляет работу с меню
        ---------Процедура Menu---------
         Эта процедура осуществляет перемещение по меню
          1. Прорисовка курсора.
          2. Ожидание нажатия клавиши.
          3. Стирание курсора.
          4. Проверка нажатой клавиши и выбор соответствующего пункта меню
         
        ****************Объект TForm****************
        Этот объект оформляет меню
        ---------Процедура Form---------
         Эта процедура оформляет меню
          1. Вывод заголовка меню
          2. Вывод заголовков пунктов меню
        ---------Процедура Standart-----
        Эта процедура устанавливает опции меню по умолчанию
          1. Поиск умножения или деления.
          2. Если не найдены умножение и деление, то искать сложение и вычитание.
          3. Выделение чисел до и после операции и их удаление.
          4. Выполнение операции и записть результата в строку.
          5. Повторять, пока не будут выполнены все операции.
        ****************Объект TFunc****************
        Этот бъект вычисляет функцию в строковом виде
        ---------Функция Translate---------
        Эта функция вычисляет сложную функцию.
          1. Проверка переданной строки на функциональность
          2. Если строка является функцией и передаваемое значение есть
             в области определения функции, то вычислить эту функцию.
          3. Иначе возвратить признак ошибки.
        ---------Функция WithFunc---------
        Эта функция вычисляет строку со сложными функциями.
          1. Поиск очередной закрывающей скобки.
          2. Взятие содержимого этих скобок и вычисление его.
          3. Если перед открывающей скобка стоит сложная функция,
             то вычислить ее и повторить пункты 1 и 2.
          4. Иначе если перед открывающей скобкой нет сложной
             функции, то повторить 1 и 2.
          5. Повторять все действия, пока не будут выполнены все операции.
        ---------Процедура Param---------
        Эта процедура заменяет параметр в функции конкретным числом.
          1. Поиск параметра в функции.
          2. Если параметр найден, то заменить его на число.
        ---------Функция EnterFunc---------
        Эта процедцра осуществляет ввод функции.
          1. Сканирование нажатой клавиши.
          2. Если символ правильный, то вывести его.
        ****************Объект TGraph****************
        Этот объект рисует график.
        ---------Процедура GraphInit---------
        Эта процедура инициализирует графику с адаптером SVGA.
        ---------Процедура Fon---------
        Эта процедура рисует заставку.
        ---------Процедура SysKoord---------
        Эта процедура рисует систему координат.
          1. Прорисовка осей.
          2. Нанесение делений с учетом масштаба.
        ---------Процедура Go---------
        Эта процедура рисует график.
          1. Рисование сетки с учетом масштаба.
          2. Рисование осей координат.
          3. Рисование графика.
          3.1. Вычисление функции от очередного аргумента.
          3.2. Рисование отрезка от предыдущей координаты до текущей.
          3.3. Повторение пунктов 3.1 и 3.2 требуемое число раз.
          4. Изменение масштаба и повтор всех действий или выход
        ---------Функции SetX и SetY---------
        Эти функции устанавливают привычную систему координат


      PS. Если я слишком громким пинком ворвался в ваше дружное Сообщество, прошу прощения за это. Если никто не против, в скором времени напишу сюда что-нибудь ещё. Конструктивная обратная связь приветствуется.

      Прикреплённый файлПрикреплённый файлGrapher.pas (26 Кбайт, скачиваний: 183)
      Сообщение отредактировано: Серохвостов Антон -
      Подпись выключена.
        Потомственный компьютерщик знает, что такое блог?

        Имхо, тему надо из алгоритмов в блоги перенеси.
        Мои религиозные убеждения не позволяют мне комментировать код.
        Моё мировоззренье таково: в программе комментария ни одного!
          О, а тут разве есть раздел блогов? Не нашёл. Переносу не возражаю.
          Подпись выключена.
            Цитата Серохвостов Антон @
            Конструктивная обратная связь приветствуется

            - А turbo pascal на современных ОС вообще запускается? Насколько я помню, при попытке подключения Crt на Windows XP (в 2002 г. она уже была ведь?) весь процесс сыпался с Access Denied.
            - интуитивно понятные идентификаторы. Вместо того, чтобы писать рядом с объявлениями переменных комментарии в стиле Капитана Очевидность, лучше дать переменным нормальные имена (имена: b, x, s1, o и т.п. к нормальным не относятся).
            - грамотная разбивка на модули. Что-то модулей не видно :-?
            - хорошее документирование. Обычно "главный" комментарий помещают в начале файла, а не в конце. Описания функций я бы перенес поближе к самим функциям.
            - хорошая структура. Использование goto даже в 2002 г. считалось моветоном. Вложенные case тоже не производят хорошего впечатления. Я бы разбил код на кучу небольших функций со значимыми именами, чтение и понимание кода от этого только улучшится.

            Мелочи:
            Английский:
            ExpandedWrap disabled
              Way  = 'c:\Bp\Bgi';

            может все-таки Path?

            "Волшебные" числа:
            ExpandedWrap disabled
              case Ch of
                      #72: {Код клавиши <Стрелка вверх>}
                        if Num > 1 then Dec(Num);
                      #80: {Код клавиши <Стрелка вниз>}
                        if Num < Kol then Inc(Num);
                      #13: {Код клавиши <Enter>}
                        e := True;
                      #27: {Код клавиши <Esc>}
                        ex := True
              end {case ...}

            почему бы не создать константы со значащими именами?
              прекрасная тема, замер в ожидании продолжения
              Цитата usrjava @
              Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                ПОЧЕМУ ПРОГРАММЕРЫ НЕ ПИШУТ ВИРТУОЗНЫХ ПРОГРАММ

                user posted image

                Сейчас есть столько разных способов сделать всё что угодно, но куда меньше времени уделяется вопросу «зачем». Программирование – не исключение. Поэтому когда новичок или продвинутый программист сталкивается с широким ассортиментом инструментария, то испытывает с его стороны информационную агрессию. Потому как инструментов так много, а жизнь так коротка, – что все их изучить просто невозможно. А ведь хочется! И от осознания невозможности этого, человек впадает в депрессию.

                Причём продвинутый программист в куда более плачевном состоянии находится в этом смысле, потому как он, в отличие от новичка, «знает, что ничего не знает». Я например, когда загорелся стать хакером, – а это было аж ещё в прошлом тысячелетии, – имел свои представления о том, что должен уметь хакер. Думал: «Вот стану хакером и заживу!» Ан нет! Сейчас я знаю и умею как минимум в 50 раз больше тех своих первоначальных представлений о хакерстве, но зуд к познанию чего-то нового до сих пор не унят. Мой круг непознанного с тех пор как я загорелся стать хакером, стал как минимум в 500 раз больше. И похоже, он будет только расширяться.


                Цивилизация методов

                Нужно признать, что наша цивилизация – это цивилизация методов, а не целей. В нашей цивилизации люди, когда они видят какую-нибудь цель, они очень хорошо знают методы каким образом этой цели достичь. Проблема в том, что они не знают, ЗАЧЕМ в конце концов всё это нужно. В программинге это в частности выражается в том, что даже кулхацкеры, начиная писать программу, редко задумываются о «постановке задачи». Спроси сейчас любого студента-программиста об этом термине, и он вряд ли что-то вразумительное про него скажет. В лучшем случае, он подумает пару-тройку минут о математической модели и алгоритме, – но скорее всего это будет не от осознания практичной полезности данного действа, а в качестве дани почтения религиозным традициям, установленным родоначальниками программирования.

                Какие-то локальные, промежуточные цели мы научились хорошо достигать и наша цивилизация, продуктами которой мы все являемся, вернее жертвами которой мы все являемся, объясняет именно это: я вижу какую-то непосредственную глупую цель, и цивилизация объясняет мне каким образом мне этой цели достичь. Построить самолет или машину, которая будет быстро ездить; написать парсер или синтаксический анализатор, который будет есть поменьше памяти; или еще что-нибудь. Но в конце концов, конечной-то цели нет. Постановки задачи нет.

                И часто, даже уважаемые люди и академики, говорят, что нужно просто признать, что цели высшей в принципе нет, поэтому нужно просто это признать и не париться. Это фундамент или основание всей нашей цивилизации, и все её проблемы – именно из-за этого. В том числе неудовлетворённость, порождающая у программиста неуёмный и нездоровый дух к излишнему погружению в различные технологии.


                Романтика программирования

                Тогда как программирование – это процесс, который должен удовольствие прежде всего приносить. Наверняка же, каждый из нас, на заре своей программерской карьеры рисовал романтические картины будущего. Но очень часто эти романтические картины размываются повседневной рутиной. Это происходит только потому, что зачастую мы считаем вопрос «зачем» не практичным, но вот вопросы «как» задаём на каждом шагу. Это выражается например в том, что я думаю:
                - «О! Паскаль хороший язык – надо его выучить».
                - «О! Руткиты это круто – надо научиться делать их».
                - «О! Вебсторительство это модно – надо обязательно реализоваться в этой области».
                - «О! Компиляторы это мощно, надо обязательно сделать свой».
                Этот список можно продолжать до бесконечности. Но курьёз в том, что если у нас нет внутри удовлетворённости, то даже изучив весь этот список, – автор статьи, например знает больше 10 языков программирования, – мы не сможем на практике пользоваться полученным знанием. Потому что нездоровый зуд информационного обжорства будет подсовывать нам всё новые и новые технологии, и мы так всю жизнь их и произучаем, не создав ничего сколь-нибудь стоящего в своей жизни. Поэтому и говорится, что «лучшее – враг хорошего».


                Лучшее – враг хорошего

                Да, предела совершенству нет, – в том числе и в программинге, – но если мы, стремясь к утопическому совершенству, не делаем реальных дел, то грош цена всем нашим знаниям. Да, образование это непрерывный процесс, но чтобы на дереве нашего знания появлялись плоды, – а не просто разрастались ветки, как у баньяна, – нужно знать, ЗАЧЕМ нам всё это. Имея ответ на этот вопрос, живя в соответствии с этим ответом и понимая, как те программы, которые мы пишем, связаны с этим ответом, мы будем спокойны и удовлетворены, потому как будем знать, что наша работа – это не бессмысленный ослиный труд, а нечто полезное, прежде всего для меня самого. Поэтому мы будем вкладываться в неё, и поэтому каждая наша программа будет по-настоящему выдающейся. Такой, что на неё даже самим приятно смотреть будет.

                Без этого, без внятного ответа на вопрос ЗАЧЕМ, у нас просто не будет времени на то, чтобы наслаждаться процессом программирования. Единственная наша цель при написании программ будет состоять в том, чтобы поскорее закончить эту программу и начать что-то другое. При таких обстоятельствах о виртуозном программировании не может быть и речи. В таком случае программирование для нас очень быстро превратится либо в ненавистную работу, либо мы вообще забросим его.

                Поэтому давайте поставим в своём сознании брейкпоинт на модуль отвечающий за наши цели – цели жизни вообще и цели программинга в частности – и в пошаговом режиме оттрассируем свои жизненные ценности. Ведь у каждого из нас есть какие-то свои понятия об Абсолютной Истине, поэтому если нам удастся увязать всю свою жизнь с этими понятиями, то она станет более наполненной. Так, пройдя науку самосознания, мы сможем получать больше удовольствия от жизни и от программирования. И тогда наши первоначальные романтические надежды о программинге – оправдаются. Для меня например таким брейкпоинтом стала книга «Наука самосознания». Может она поможет и вам. Почитайте!


                Благодарность Крэю

                Вышеприведённые размышления – это часть мыслей, навеянных ответом пользователя Kray74. Вот небольшой комментарий непосредственно к его посту. 1) Что касается запуска Turbo Pascal на современных ОС, то тут дело даже не столько в ОС, сколько в современных компьютерах. На моём старом компе Pascal в XP работал без проблем. Но на той же XP, но уже на новом железе, действительно ошибка выдаётся. Вместе с тем, при наличии желания и бубна в руках, можно всё что угодно сделать. В сети можно найти патч для turbo.tpl, который хоть и имеет свои побочные эффекты, позволяет паскалевским программам работать и сейчас. Но я согласен, что это весомый аргумент в пользу того, чтобы воздержаться от использования Паскаля, поэтому ниже приведу пример уже на Си. Вместе с тем, мне Pascal очень нравится, поэтому я очень часто буду иллюстрировать свои мысли – именно им. 2) Что касается интуитивно понятных идентификаторов и стандартных имён переменных – критика принимается; не зря говорится, «предела совершенству нет». 3) Что касается документирования, разбивки на функции и использования оператора goto, то это вещи в значительно степени субъективные. Ваш подход имеет столько же прав на существование, сколько и мой. Поэтому давайте позволим нашим подходам просто быть, воздержавшись от священных войн.

                Вместе с тем, отдавая дань почтения интересности вопроса о goto, приведу несколько ссылок на связанные с этим обсуждения: 1 и 2 (эти беседы были инициированы мной в 2007 году). Дискуссии о правомерности использования оператора goto ведутся ещё с 1968 года, но т.к. однозначного вердикта по этому вопросу нет до сих пор, данный оператор имеет место быть даже в современных компиляторах.

                На самом деле, goto – это не единственный объект священных войн и не единственная дань поговорке «если нельзя, но очень хочется, то можно». Взять например СИшные friend-функции, ассемблерные вставки или трюки с созданием самомодифицирующегося кода. Это происходит потому, что реальные задачи часто не вписываются в общепринятые лаконичные парадигмы. Да, когда мы решаем какую-то рафинированную школьную задачку, её можно сделать «по всем правилам», но при решении реальных задача бывает нужно учитывать много нюансов. Мне это известно не понаслышке, потому как в своей программерской жизни довелось участвовать в разработке одного из компиляторов (см. сюда).

                Помню на 5-м курсе универа, когда я уже мнил себя величайшим программистом, преподы начали ломать мои стереотипы. В частности и стереотипы относительно goto. Это они делали, чтобы я не был религиозным фанатиком, пренебрегающим оператором goto даже в тех местах, где это оправдано. Преподы давали мне ряд противоречивых заданий, от которых у меня просто взрывался мозг. Эти задания можно сравнить с армейскими приколами, когда тебя заставляют красить траву в зелёный цвет. Я не понимал, зачем преподы заставляли меня делать те глупые вещи, за которые на начальных курсах – ругали. Но сейчас я благодарен им за это, потому что это даёт мне возможность находить эффективные решения в соответствии со временем, местом и обстоятельствами.


                Вместо заключения

                Как уже говорилось в начале статьи, зачастую мы сосредотачиваемся на вопросах «как», пренебрегая вопросом «зачем». Одна из мыслей пользователя Kray74 заключалась в том, что хорошо бы разбить вложенные операторы case на несколько функций. Вполне разумное замечание, можно воспользоваться. А напоследок я приведу ещё один вариант реализации меню. Правда он – ну уже для самых извращенцев. Кстати, если кто-то сможет найти в этом решении баг, то от меня – бездонные респект и уважуха. Потому как данную программу тестировал человек, который для меня является большим авторитетом в программировании, и который просто виртуозно ошибки искать умеет. Бывало, что я тестирую программу по всем классическим канонам тестирования в течении недели, и не нахожу ошибок, но он с первого раза обваливает её. Вот эта программа – одна из немногих, где он не смог найти баг, поэтому если вы сможете здесь найти баг, то вы действительно ОЧЕНЬ КРУТОЙ специалист. Но только учтите, что я для лаконичности вырезал блок «защиты от дурака», поэтому в скрипте не должно быть ошибок.

                ExpandedWrap disabled
                            //Программа Popup.cpp
                            //Эта программа создает меню
                            //с неограниченным числом подпунктов
                   
                            //Составлена Серохвостовым Антоном 5.11.04
                            //Последняя доработка 18.11.04
                   
                  #include <conio.h>
                  #include <stdio.h>
                  #include <stdlib.h>
                  #include <string.h>
                  #include <iostream.h>
                  #define Exit 4                    //Хэндл пункта для выхода из меню
                   
                  char Figures[] = "0123456789",    //Допустимые цифры
                       fMnu[]    = "c:\\menu.mnu";  //Файл с меню//
                   
                  typedef enum BOOL {FALSE = 0, TRUE = 1};
                  //******Структура меню******/
                  typedef struct TMenu
                  {
                    struct TMenu *pFirst, //Указатель на первый элемент
                             *pLast,  //Указатель на последний элемент
                             *pNext,  //Указатель на следующий пункт
                             *pNxtL,  //Указатель на подменю
                             *pPrev,  //Указатель на предыдущий пункт
                             *pPrvL;  //Указатель на родительское меню
                    int  idItem;      //Хэндл пункта
                    char nmItem[20];  //Имя пункта
                    int  n;       //Номер попорядку
                  } PMenu;
                   
                  //******Информация о текущем элементе******//
                  typedef struct TItem
                  {
                    int  idItem;      //Хэндл пункта
                    char nmItem[20];  //Имя пункта
                  } ;
                  /*******************************/
                   
                  FILE *tMnu;     //Файл с меню
                  TItem Item;     //Очередной элемент файла
                  PMenu *pMnu;        //Меню в памяти
                  /*******************************/
                   
                  char* ReadStrFromFile(FILE *tMnu)
                  {
                    int  ch;
                    char s[80];
                    strcpy(s, "");
                    ch = fgetc(tMnu);
                    while (ch != 0xD && ch != 0xA && !feof(tMnu))
                    {
                      s[strlen(s)+1] = 0;
                      s[strlen(s)] = ch;
                      ch = fgetc(tMnu);
                    }
                    return s;
                  }
                   
                  void ReadNextItem(TItem &Item)
                   /*Читает очередной элемент меню из файла*/
                  {
                    char *s = new char,   //Очередная строка файла
                         id[10],      //Хэндл очередного пункта в строковом виде
                         tmp[1];      //Для совместимости символов и строк
                    unsigned char i;  //Номер символа в s
                   
                    s = ReadStrFromFile(tMnu);
                    strcpy(id, ""); strcpy(Item.nmItem, ""); i = 0;
                   /***Пропустить пробелы перед началом имени***/
                    while (s[i] == ' ') i++;
                   /***Выделить имя пункта***/
                    while (s[i] != ',' && i < strlen(s))
                    {
                      tmp[0] = s[i]; tmp[1] = 0;
                      strcat(Item.nmItem, tmp);
                      i++;
                    } //while s[i] ...
                   /***Удалить пробелы из конца имени***/
                    while (Item.nmItem[strlen(Item.nmItem)-1] == ' ')
                      Item.nmItem[strlen(Item.nmItem)-1] = 0;
                    if (Item.nmItem[strlen(Item.nmItem)-1] == '>')
                      Item.idItem = 0;
                    else
                    {
                   /***Пропустить пробелы перед хэндлом***/
                      i++;
                      while (s[i] == ' ') i++;
                   /***Выделить хэндл***/
                      while (strchr(Figures, s[i]) && i < strlen(s))
                      {
                        tmp[0] = s[i];
                        strcat(id, tmp);
                        i++;
                      } //while Pos( ...
                   /***Удалить пробелы из конца хэндла***/
                      while (id[strlen(id)-1] == ' ')
                        id[strlen(id)-1] = 0;
                   /***Сохранить хэндл в числовом виде***/
                        Item.idItem = atoi(id);
                    } //else ...
                  } //ReadNextItem
                  /*******************************/
                   
                  void CreateMenu(PMenu* &pMnu)
                   /*Создает меню (место для первого элемента)*/
                  {
                    pMnu =     new PMenu;
                    pMnu->pPrvL = NULL;
                    pMnu->pFirst = pMnu;
                  } //CreateMenu
                  /*******************************/
                   
                  void AddSub(PMenu* &pMnu)
                   /*Добавляет подменю*/
                  {
                    pMnu->pNxtL = new PMenu;
                    pMnu->pNxtL->pPrvL = pMnu;
                    pMnu = pMnu->pNxtL;
                    pMnu->pFirst = pMnu;
                    pMnu->pNxtL = NULL;
                  } //AddSub
                  /*******************************/
                   
                  void AddItm(PMenu* &pMnu)
                   /*Добавляет пункт*/
                  {
                    pMnu->pNext = new PMenu;
                    pMnu->pNext->pPrev = pMnu;
                    pMnu = pMnu->pNext;
                    pMnu->pPrvL = pMnu->pPrev->pPrvL;
                    pMnu->pFirst = pMnu->pPrev->pFirst;
                    pMnu->pNxtL = NULL;
                  } //AddItm
                  /*******************************/
                   
                  void MakeKolco(PMenu* &pMnu)
                   /*Обработка '<'*/
                  {
                    pMnu->pLast = pMnu;
                   /***Заполнить указатели на конец***/
                    while (pMnu != pMnu->pFirst)
                    {
                      pMnu = pMnu->pPrev;
                      pMnu->pLast = pMnu->pNext->pLast;
                    }
                   /***Сформировать "кольцо"***/
                    pMnu->pLast->pNext = pMnu->pFirst;
                    pMnu->pFirst->pPrev = pMnu->pLast;
                  } //MakeKolco
                  /*******************************/
                   
                  void AddItem(PMenu* &pMnu, TItem Item)
                   /*Добавляет элемент меню Item в позицию pMnu*/
                  {
                    if (pMnu == NULL && strcmp(Item.nmItem, "<"))
                    {
                      CreateMenu(pMnu);
                      strcpy(pMnu->nmItem, Item.nmItem);
                      pMnu->idItem = Item.idItem;
                      pMnu->pNxtL = NULL;
                      pMnu->n = 1;
                    } //if pMnu ...
                    else
                   /***Обработать служебные символы***/
                    if (!strcmp(Item.nmItem, "<")) //Стоит переход на верхний уровень?
                    {                              //Да - скоректировать меню и перейти на него
                      MakeKolco(pMnu);
                      pMnu = pMnu->pPrvL;
                    } //if pMnu-> ...
                    else if (!strcmp(Item.nmItem, "!"))
                       MakeKolco(pMnu);
                         else
                   /***Создать элемент меню***/
                         {
                       if (pMnu->idItem == 0 && pMnu->pNxtL == NULL)
                       {
                         AddSub(pMnu);        //Да - добавляем подменю
                         pMnu->n = 1;
                       } //if (pMnu-> ...
                       else
                       {
                         AddItm(pMnu);        //Нет - добавляем пункт
                         pMnu->n = pMnu->pPrev->n+1;
                       } //else ...
                       strcpy(pMnu->nmItem, Item.nmItem);
                       pMnu->idItem = Item.idItem;
                         } //else ...
                  } //AddItem
                  /*******************************/
                   
                  void BuildMenuInMemory(char* fMnu, PMenu* &pMnu)
                   /*Загружает меню из файла в память*/
                  {
                    tMnu = fopen(fMnu, "rt");
                    pMnu = NULL;
                    do {
                         ReadNextItem(Item);
                         AddItem(pMnu, Item);
                       } while (strcmp(Item.nmItem, "!"));
                    fclose(tMnu);
                  } //BuildMenuInMemory
                  /*******************************/
                   
                  void ShowMenu(PMenu* pMnu)
                   /*Отображает меню*/
                  {
                    pMnu = pMnu->pFirst;
                    do {
                         cout<<" "<<pMnu->nmItem<<"\n";
                         pMnu = pMnu->pNext;
                       } while (pMnu != pMnu->pFirst);
                  } //ShowMenu
                  /*******************************/
                   
                  void ReadItem(PMenu* &pMnu, TItem &Item, BOOL &UpLevel)
                   /*Позволяет выбрать пункт меню
                     UpLevel = TRUE - верхний уровень отсутствует*/
                  {
                    char ch;      //Для выбора пункта меню
                    unsigned char curPos; //Номер текущей строки меню
                    BOOL Selected;        //Флаг выбора пункта
                   
                    clrscr();
                    Selected = FALSE; UpLevel = FALSE;
                    curPos = 1;
                    ShowMenu(pMnu);
                    gotoxy(1, pMnu->n); cout<<"*";
                    do {
                        clrscr();
                        ShowMenu(pMnu);
                        gotoxy(1, curPos);  cout<<" ";
                        gotoxy(1, pMnu->n); cout<<"*";
                        curPos = pMnu->n;
                        ch = getch();
                        switch (ch)
                        {
                      case 71:     //Home, PgUp, Left
                      case 73:
                      case 75:
                        pMnu = pMnu->pFirst;
                        break;
                      case 77:     //Right, End, PgDn
                      case 79:
                      case 81:
                        pMnu = pMnu->pLast;
                        break;
                      case 72:     //Up
                        pMnu = pMnu->pPrev;
                        break;
                      case 80:     //Down
                        pMnu = pMnu->pNext;
                        break;
                      case 13:     //Enter
                        if (!pMnu->idItem)
                          pMnu = pMnu->pNxtL;
                        else
                        {
                          strcpy(Item.nmItem, pMnu->nmItem);
                          Item.idItem = pMnu->idItem;
                          Selected = TRUE;
                        } //else ...
                        break;
                      case 27:     //Esc
                        if (pMnu->pPrvL != NULL)
                          pMnu = pMnu->pPrvL;
                        else
                          UpLevel = TRUE;
                        break;
                        } //case ch ...
                       } while (!Selected && !UpLevel);
                  } //ReadItem
                  /*******************************/
                   
                  void main()
                  {
                    BOOL ex;  //Флаг отсутствия верхнего уровня
                    BuildMenuInMemory(fMnu, pMnu);
                    do {
                         clrscr();
                         ReadItem(pMnu, Item, ex);
                         clrscr();
                         if (!ex) //Есть верхний уровень?
                         {    //Да - перейти на него
                       cout<<"idItem = "<<Item.idItem<<"\n";
                       cout<<"Нажмите любую клавишу...\n";
                       getch();
                         }
                       } while (Item.idItem != Exit && !ex);
                  } //PopupMenu
                   
                  /*
                  Инструкция к скриптовому языку меню. Каждая строка - это
                  1) либо пункт меню, 2) либо подменю, 3) либо спецсимвол.
                  В каждой строке должно быть только одно имя - не больше и не меньше.
                  В качестве разделителей используются только пробелы.
                  Их для удобства можно ставить хоть где.
                   
                  СИНТАКСИС "ПУНКТА МЕНЮ": "nnn, ddd", где nnn - имя пункта меню
                  без пробелов и без служебных символов,
                  ddd - уникальный числовой идентификатор пункта меню.
                   
                  СИНТАКСИС "ПОДМЕНЮ": "nnn> : <". Nnn - уникальный числовой идентификатор
                  пункта меню. Символ ">" - указание на то, что это не пункт меню,
                  а подменю. ":" - это, расположенные в отдельных строках, элементы подменю.
                  "<" - указатель на конец подменю.
                   
                  СИНТАКСИС "СПЕЦСИМВОЛОВ". Один спецсимвол (конец подменю) уже был рассмотрен.
                  Остался последний - "!". Это символ конца меню, который обязательно
                  должен быть в конце файла.
                   
                  ПРИМЕР файйла menu.mnu - прилагается.
                  */


                Но опять же, без грамотного «зачем», даже такой красивый код и яйца выеденного не стоит.

                Прикреплённый файлПрикреплённый файлpopup.zip (3,42 Кбайт, скачиваний: 127)
                Подпись выключена.
                  Цитата Серохвостов Антон @
                  ExpandedWrap disabled
                    char fMnu[]    = "c:\\menu.mnu";  //Файл с меню//

                  высочайший профессионализм топикстартера виден в этой строчке
                  Цитата usrjava @
                  Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                    Мне больше понравилось MakeKolco.
                    Сюда бы еще того методолога, помешанного на scrum и ООП, и много попкорна.
                      Цитата Kray74 @
                      Мне больше понравилось MakeKolco.

                      да много прекрасного, например
                      Цитата
                      СИНТАКСИС "ПУНКТА МЕНЮ": "nnn, ddd", где nnn - имя пункта меню
                      без пробелов и без служебных символов,
                      ddd - уникальный числовой идентификатор пункта меню.

                      с такими входными данными постановка задачи восхищает.

                      Добавлено
                      кстати, а в с++ нет naming conversion с указанием по формированию названий методов? дескать с строчной буквы и все такое
                      Цитата usrjava @
                      Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                        Цитата Серохвостов Антон @
                        ExpandedWrap disabled
                          while (ch != 0xD && ch != 0xA && !feof(tMnu))
                            {
                              s[strlen(s)+1] = 0;
                              s[strlen(s)] = ch;
                              ch = fgetc(tMnu);
                            }

                        Спасибо, но такого виртуозного программирования нам не надо :hunter:
                          Скока раз ходил по роще и не знал, что это - баньяновый лес. Thanks for the tip!
                          Мои религиозные убеждения не позволяют мне комментировать код.
                          Моё мировоззренье таково: в программе комментария ни одного!
                            я догадался, программа приведена с целью показать, что программеры не пишут виртуозных программ.
                            так что если бы, не дай бог, мы приняли автора за программера, то приложенная программа как раз послужила бы отличным подтверждением. увы, план не сработал.
                            Цитата usrjava @
                            Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                              Детские выпады, продиктованные завистью и неподтверждённые более красивыми решениями, чем предложенные мной, я воспринимаю – банальным ламерством. Если вы крутые профи – покажите себя в деле. Раскритиковать можно любой код. И если это делается в конструктивном ключе – честь и хвала. Я с радостью перейму ваш опыт. Но если вам жалко им делиться или вам интересно только плеваться, тогда попрошу вас больше не спамить в моём блоге.

                              PS. Данное сообщение относится не ко всем участникам, отписавшимся в моём блоге, но пальцем я тыкать не буду – пусть каждый разговаривает со своей совестью сам.
                              Подпись выключена.
                                Этот тред - не блог и не подчиняется блоговым правилам.
                                Мои религиозные убеждения не позволяют мне комментировать код.
                                Моё мировоззренье таково: в программе комментария ни одного!
                                  конечно мы просто завидуем, это же очевидно. но на всякий случай уточно, а почему ветер дует вы не в курсе, случаем?
                                  зы а вообще это же прекрасно, навалить кучу и требовать критики в конструктивном ключе. хотя даже при этом мой конкруктивный комментарий про захардкоженые пути вы проигнорировали.
                                  Цитата usrjava @
                                  Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                    user posted image

                                    MIF, Zera, пока вы не дали повода уважать вас. Рейтинг вашего аккаунта конечно впечатляет, но всё это – внешние вещи. Решите лучше задачку: «Пусть имеется 12 шаров (пронумерованных от 1 до 12) среди которых 11 шаров имеют одинаковые веса, а один шар – легче или тяжелее остальных. Определите этот отличающийся по весу шар, применяя не более трех взвешиваний на коромысловых весах».

                                    У меня на решение этой задачки ушло 5 часов – на 19 часов быстрее, чем у одного из ключевых моих наставников в программинге. Сможете быстрее? Или хотя бы за неделю? К остальным критикам деструктивной направленности это предложение также относится. Не желаете ли себя показать в деле?

                                    В качестве подсказки, если она требуется, – исходный код на языке Forth, решающий эту задачу. Надеюсь, вы слышали о таком?

                                    ExpandedWrap disabled
                                      \   Программа sph.f
                                      \   Составлена Серохвостовым Антоном 13.09.04
                                      \   Последняя доработка 13.09.04
                                      \ --------------------------------------------------------------------------
                                      \ Задача: Дано 12 шаров, один из которых имеет дефектную массу. Определить
                                      \         максимум за 3 измерения на коромысловых весах номер этого шара.
                                      \ Использование:
                                      \   1. Загрузка шаров. Функции:
                                      \       ЗАДАТЬ (вес, # -- )- задать вес одного шара
                                      \       ЗАДАТЬ-ВСЕ ( вес -- )- задать вес всех шаров
                                      \   2. Определение дефектного шара. Функция:
                                      \       ОПРЕДЕЛИТЬ ( -- # )
                                      \ --------------------------------------------------------------------------
                                      -1 CONSTANT Z
                                       
                                      VARIABLE ПЕРВОЕ
                                      VARIABLE ВТОРОЕ
                                      VARIABLE ТРЕТЬЕ
                                       
                                      CREATE ШАРЫ    48 ALLOT
                                      CREATE ЛЕВУЮ   16 ALLOT
                                      CREATE ПРАВУЮ  16 ALLOT
                                       
                                      : на ; : и ;
                                      : ИЗМЕРЕНИЕ ( a -- n )  @ ;
                                       
                                      : РАВНО  @ 0= ;
                                      : МЕНЬШЕ @ 0< ;
                                      : БОЛЬШЕ   DUP РАВНО SWAP МЕНЬШЕ OR INVERT ;
                                      : НЕРАВНО  РАВНО INVERT ;
                                       
                                      : ШАР ( # -- a )  4 *  ШАРЫ + ;
                                      : ЗАДАТЬ ( вес, # -- )  ШАР ! ;
                                      : ЗАДАТЬ-ВСЕ ( вес -- )  12 0 DO  DUP I ЗАДАТЬ  LOOP  DROP ;
                                       
                                      : ПОЗИЦИЯ  ( # в чаше , чаша -- a )  SWAP  4 * + ;
                                      : НОМЕР ( # в чаше,  чаша -- # )  ПОЗИЦИЯ @ ;
                                      : ПОЛОЖИТЬ ( n, n, n, n, чаша --  )  
                                          4 0 DO I SWAP DUP >R  ПОЗИЦИЯ !  R> LOOP DROP ;
                                       
                                      : ?ВЕС ( # -- вес )  ШАР @ ;
                                      : ДОБАВИТЬ ( сумма, # в чаше, чаша -- сумма )  НОМЕР ?ВЕС + ;
                                      : МАССУ ( чаша -- вес )  0  4 0 DO OVER I SWAP ДОБАВИТЬ LOOP SWAP DROP ;
                                      : СРАВНИТЬ ( масса1, масса2 -- признак )
                                          OVER OVER = IF DROP DROP 0 ELSE
                                          < IF -1 ELSE 1 THEN THEN ;
                                      : ВЗВЕСИТЬ ( -- признак )  ЛЕВУЮ МАССУ и ПРАВУЮ МАССУ  СРАВНИТЬ ;
                                       
                                      : ПРОИЗВЕСТИ-ИЗМЕРЕНИЯ ( -- )
                                       
                                         0 1 2 3 на ЛЕВУЮ ПОЛОЖИТЬ
                                         4 5 6 7 на ПРАВУЮ ПОЛОЖИТЬ
                                         ВЗВЕСИТЬ ПЕРВОЕ !
                                       
                                         ПЕРВОЕ РАВНО IF
                                           Z Z 2 3 на ЛЕВУЮ ПОЛОЖИТЬ
                                           Z Z 8 9 на ПРАВУЮ ПОЛОЖИТЬ
                                         ELSE
                                           4 1 8 9 на ЛЕВУЮ ПОЛОЖИТЬ
                                           0 5 6 10 на ПРАВУЮ ПОЛОЖИТЬ
                                         THEN ВЗВЕСИТЬ ВТОРОЕ !
                                       
                                         ПЕРВОЕ РАВНО  ВТОРОЕ РАВНО  AND IF
                                           Z Z Z 0 на ЛЕВУЮ ПОЛОЖИТЬ
                                           Z Z Z 10 на ПРАВУЮ ПОЛОЖИТЬ
                                         ELSE ПЕРВОЕ РАВНО  ВТОРОЕ НЕРАВНО  AND IF
                                           Z Z Z 0 на ЛЕВУЮ ПОЛОЖИТЬ
                                           Z Z Z 8 на ПРАВУЮ ПОЛОЖИТЬ
                                         ELSE ПЕРВОЕ НЕРАВНО  ВТОРОЕ РАВНО  AND IF
                                           Z Z Z 2 на ЛЕВУЮ ПОЛОЖИТЬ
                                           Z Z Z 3 на ПРАВУЮ ПОЛОЖИТЬ
                                         ELSE ПЕРВОЕ НЕРАВНО  ВТОРОЕ НЕРАВНО  AND IF
                                           ПЕРВОЕ ИЗМЕРЕНИЕ  ВТОРОЕ ИЗМЕРЕНИЕ  = IF
                                             Z Z Z 5 на ЛЕВУЮ ПОЛОЖИТЬ
                                             Z Z Z 6 на ПРАВУЮ ПОЛОЖИТЬ
                                           ELSE
                                             Z Z Z 1 на ЛЕВУЮ ПОЛОЖИТЬ
                                             Z Z Z 4 на ПРАВУЮ ПОЛОЖИТЬ
                                           THEN
                                         THEN THEN THEN THEN ВЗВЕСИТЬ ТРЕТЬЕ ! ;
                                       
                                      : ОПРЕДЕЛИТЬ ( -- # )
                                         ПРОИЗВЕСТИ-ИЗМЕРЕНИЯ
                                         ПЕРВОЕ НЕРАВНО  ВТОРОЕ НЕРАВНО  ТРЕТЬЕ РАВНО  AND AND IF
                                           ПЕРВОЕ ИЗМЕРЕНИЕ  ВТОРОЕ ИЗМЕРЕНИЕ  = IF 1 ELSE 0 THEN
                                         ELSE ПЕРВОЕ НЕРАВНО  ВТОРОЕ НЕРАВНО  ТРЕТЬЕ НЕРАВНО  AND AND IF
                                           ПЕРВОЕ ИЗМЕРЕНИЕ  ВТОРОЕ ИЗМЕРЕНИЕ  = IF
                                             ВТОРОЕ ИЗМЕРЕНИЕ  ТРЕТЬЕ ИЗМЕРЕНИЕ  = IF 6 ELSE 5 THEN
                                           ELSE 4 THEN
                                         ELSE ПЕРВОЕ НЕРАВНО  ВТОРОЕ РАВНО  ТРЕТЬЕ НЕРАВНО AND AND IF
                                           ПЕРВОЕ ИЗМЕРЕНИЕ  ТРЕТЬЕ ИЗМЕРЕНИЕ  = IF 2 ELSE 3 THEN
                                         ELSE ПЕРВОЕ НЕРАВНО  ВТОРОЕ РАВНО  ТРЕТЬЕ РАВНО  AND AND IF 7
                                         ELSE ПЕРВОЕ РАВНО  ВТОРОЕ НЕРАВНО  ТРЕТЬЕ РАВНО  AND AND IF 9
                                         ELSE ПЕРВОЕ РАВНО  ВТОРОЕ НЕРАВНО  ТРЕТЬЕ НЕРАВНО  AND AND IF 8
                                         ELSE ПЕРВОЕ РАВНО  ВТОРОЕ РАВНО  ТРЕТЬЕ РАВНО  AND AND IF 11
                                         ELSE ПЕРВОЕ РАВНО  ВТОРОЕ РАВНО  ТРЕТЬЕ НЕРАВНО  AND AND IF 10
                                         ELSE 2 THEN THEN THEN THEN THEN THEN THEN THEN ;


                                    PS. Я пришёл сюда не за критикой, а чтобы поделиться своим опытом. Но если уж вы берётесь за критику, то делайте это добросовестно. Пока же, как я уже сказал, у меня нет оснований относиться серьёзно к вашей критике. Решите задачку, а там посмотрим.
                                    Подпись выключена.
                                      Серохвостов Антон
                                      Ну я даже не знаю с чего начать, в твоем коде баг на баге сидит и багом погоняет. В одной ReadStrFromFile я насчитал 2 серьезных бага:
                                      1) Возвращается указатель на локальную переменную s - undefined behavior
                                      2) Затирается 0 в конце строки внутри цикла - скорее всего упадет

                                      Ну и плюс там, где она вызывается, есть такой код:
                                      ExpandedWrap disabled
                                        char *s = new char
                                        ...
                                        s = ReadStrFromFile(tMnu);

                                      Что есть банальное незнание того, как нужно работать с памятью и указателями в C++.

                                      P.S. Утащу эту прогу, буду давать на собеседованиях с заданием "найди как можно больше багов" 8-)
                                        Цитата Серохвостов Антон @
                                        MIF, Zera, пока вы не дали повода уважать вас.

                                        да я как-то переживу, спасибо, дожны же понимать, что для абсолютной истины такая мелочь, как ваше уважение нафиг не нужно.
                                        тем более
                                        Цитата Серохвостов Антон @
                                        У меня на решение этой задачки ушло 5 часов – на 19 часов быстрее, чем у одного из ключевых моих наставников в программинге.

                                        это, простите, вообще клиника. пять часов на три взвешивания? задача решается в уме еще на этапе прочтения, вы что там такое ведическое курите?
                                        я уж не говорю о очередном нагромождении ифов.
                                        Цитата usrjava @
                                        Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                          Цитата zera @
                                          это, простите, вообще клиника. пять часов на три взвешивания? задача решается в уме еще на этапе прочтения, вы что там такое ведическое курите?
                                          я уж не говорю о очередном нагромождении ифов.

                                          Так покажите же решение?
                                          Подпись выключена.
                                            Я все понять не могу: ТС нас пытается троллить или что? Продемонстрированный "мегакрутой" код является не то, что примером для подражания, он даже работать не должен.
                                            Цитата TheMachine @
                                            т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                              Цитата zera @
                                              задача решается в уме еще на этапе прочтения, вы что там такое ведическое курите?

                                              Ну, справедливости ради, это не столь простая задача, если решение не знать :)
                                              Но в целом, разумеется, согласен - такие баги и такой стиль именования методов себе не позволял даже я, будучи ещё в школе :D
                                              Подпись была включена в связи с окончанием срока наказания
                                                Цитата Pacific @
                                                Ну я даже не знаю с чего начать, в твоем коде баг на баге сидит и багом погоняет. В одной ReadStrFromFile я насчитал 2 серьезных бага

                                                Вы наверно удивитесь, но программа работает, и никуда падать не собирается. На то есть свои причины... Конечно не без эвристики (о ней – тут), но тем не менее. Для таких манёвров нужно хорошо знать подсистему памяти, в частности, где как и когда, что выделяется и удаляется. В данном случае – как себя ведёт стек. Но за вашу наблюдательность - респект.

                                                shm, не должен работать? А вы попробуйте ))) Что касается троллинга, то по крайней мере цели у меня такой не было. Если наблюдаются его элементы, прошу прощения. Я «крутые» кода привёл только чтобы показать, что за моими словами и внешними регалиями действительно что-то есть. Если сделал это в слишком гордой форме, ещё раз приношу свои извинения. Цель моя – поделиться своим опытом. И коды я привёл – в подтверждение своей компетенции всего лишь. Чтобы старожилы не напрягались, что какой-то дилетант пытается новичков уму разуму учить, и новички видели, к чему можно стремиться.
                                                Подпись выключена.
                                                  Цитата Серохвостов Антон @
                                                  И коды я привёл – в подтверждение своей компетенции всего лишь.

                                                  А получился прямо противоположный эффект :D
                                                  Подпись была включена в связи с окончанием срока наказания
                                                    Цитата OpenGL @
                                                    Ну, справедливости ради, это не столь простая задача, если решение не знать

                                                    эта задача была на олимпиаде по математике за, дай бог памяти, пятый класс. причем как пример для проверки алгоритмического решения она мало годится.
                                                    то ли дело задача про тысячу бутылок с вином.
                                                    Цитата Серохвостов Антон @
                                                    Так покажите же решение?

                                                    господи, вы вообще в курсе, что вокруг интернет и всякий гугель, знаете такой? возьмите решение там.
                                                    Цитата Серохвостов Антон @
                                                    Чтобы старожилы не напрягались, что какой-то дилетант пытается новичков уму разуму учить, и новички видели, к чему можно стремиться.
                                                    браво, я поражен.
                                                    Цитата usrjava @
                                                    Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                      Цитата Серохвостов Антон @
                                                      Вы наверно удивитесь, но программа работает, и никуда падать не собирается.

                                                      Другой компилятор, другие параметры компиляции, и упадет как миленькая. После вызова ReadStrFromFile вызывается strcpy и strlen, и если она затрет больше стека, чем обычно (например, какая-нибудь хитрая реализация common runtime), все упадет. Не надо писать такой код. Затирание конечного нуля в строке внутри ReadStrFromFile делает эту функцию лотереей, которая зависит от содержимого стека.
                                                        Цитата zera @
                                                        эта задача была на олимпиаде по математике за, дай бог памяти, пятый класс. причем как пример для проверки алгоритмического решения она мало годится.

                                                        Ну может быть - раньше олимпиады по математике, имхо, сложнее были. Лично мне эта задача (только там 13 монет было) с трудом далась. В любом случае, решена она была далеко не "на этапе прочтения". Да и сейчас вряд-ли решится :)
                                                        Подпись была включена в связи с окончанием срока наказания
                                                          Цитата Серохвостов Антон @
                                                          Детские выпады, продиктованные завистью и неподтверждённые более красивыми решениями, чем предложенные мной, я воспринимаю – банальным ламерством. Если вы крутые профи – покажите себя в деле. Раскритиковать можно любой код. И если это делается в конструктивном ключе – честь и хвала. Я с радостью перейму ваш опыт. Но если вам жалко им делиться или вам интересно только плеваться, тогда попрошу вас больше не спамить в моём блоге

                                                          Почему ты пишешь на С++ используя какие то базовые вещи? Почему не оформить класс и не заюзать STL?
                                                            Серохвостов Антон, а где вы работаете?
                                                              Цитата Серохвостов Антон @
                                                              Я, как бы это громко ни звучало – потомственный хакер.

                                                              таких тут еще не было 8-) :D

                                                              Добавлено
                                                              Цитата KILLER @
                                                              Почему ты пишешь на С++ используя какие то базовые вещи?

                                                              видать нашел свои институцкие контрольные/курсовые, решил тут с них бложик сделать :unsure:

                                                              студентам легче теперь будет :rolleyes: гугловская база пополнилась на несколько готовых решений :yes:
                                                              Сообщение отредактировано: Besha -
                                                              user posted image
                                                                Цитата Серохвостов Антон @
                                                                MIF, Zera, пока вы не дали повода уважать вас.

                                                                А я в эту тему не за уважением пришёл, а картинки посмотреть. Я б плюс за фотку баньяна поставил,если б она была во флеймовом рейтинге.
                                                                Мои религиозные убеждения не позволяют мне комментировать код.
                                                                Моё мировоззренье таково: в программе комментария ни одного!
                                                                  Цитата Серохвостов Антон @
                                                                  блок-схем,

                                                                  устаревшая фигня, ща UML юзают :)
                                                                  user posted image
                                                                    Цитата Серохвостов Антон @
                                                                    shm, не должен работать? А вы попробуйте )))

                                                                    Чего, возвращать указатель на локальный массив - это нормально? Ну где-то это может и прокатит, но даже если банально взять другой компилятор, то уже может и не прокатить. Я уж не говорю, что если что-нить дописать после вызова данной "мегакрутой" функции.

                                                                    Добавлено
                                                                    Цитата Серохвостов Антон @
                                                                    И коды я привёл – в подтверждение своей компетенции всего лишь.

                                                                    Признаться, до изучения этого кода я был лучшего мнения.
                                                                    Сообщение отредактировано: shm -
                                                                    Цитата TheMachine @
                                                                    т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                      На англицком форум просто тупо отладили бы программу, как того и хотел автор, который не иначе чем из скромности выразил своё желание весьма издалека. Теперь я понимаю, откуда растут ноги у анекдотов про русские форумы. Нашим так просто лапшу на уши не навешать.
                                                                      Одни с годами умнеют, другие становятся старше.
                                                                        Qraizer, :lol: :good:
                                                                        Цитата TheMachine @
                                                                        т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                          Qraizer, умно.
                                                                          Цитата usrjava @
                                                                          Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                            Цитата zera @
                                                                            господи, вы вообще в курсе, что вокруг интернет и всякий гугель, знаете такой? возьмите решение там.

                                                                            В Интернете вы вряд ли решение этой задачки найдёте, потому как она весьма сложная. Я вам дам фору по времени. Если через неделю не найдёте его - выложу ответ.
                                                                            Подпись выключена.
                                                                              Серохвостов Антон
                                                                              Вторая ссылка в гугле по запросу "12 шаров три взвешивания" :facepalm:
                                                                                Цитата Серохвостов Антон @
                                                                                В Интернете вы вряд ли решение этой задачки найдёте

                                                                                тык
                                                                                Цитата Серохвостов Антон @
                                                                                потому как она весьма сложная

                                                                                Ну да. Мне на школьной олимпиаде попадалась похожая, и вроде даже не решил за отведенные 2 часа на несколько задач... :lol:
                                                                                Сообщение отредактировано: shm -
                                                                                Цитата TheMachine @
                                                                                т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                  Цитата Серохвостов Антон @
                                                                                  Вот эта программа – одна из немногих, где он не смог найти баг, поэтому если вы сможете здесь найти баг, то вы действительно ОЧЕНЬ КРУТОЙ специалист.


                                                                                  Цитата

                                                                                  1>c:\users\admin\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp(227): error C3861: 'clrscr': identifier not found
                                                                                  1>c:\users\admin\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp(231): error C3861: 'gotoxy': identifier not found
                                                                                  1>c:\users\admin\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp(233): error C3861: 'clrscr': identifier not found
                                                                                  1>c:\users\admin\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp(235): error C3861: 'gotoxy': identifier not found
                                                                                  1>c:\users\admin\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp(236): error C3861: 'gotoxy': identifier not found
                                                                                  1>c:\users\admin\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp(283): error C3861: 'clrscr': identifier not found
                                                                                  1>c:\users\admin\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\source.cpp(285): error C3861: 'clrscr': identifier not found

                                                                                  Это баг ? Или нет?
                                                                                    В принципе взрослый человек до этого решения должен сам додуматься. Ну пусть не сразу, как zera утверждает, но и не через несколько часов.
                                                                                    Сообщение отредактировано: shm -
                                                                                    Цитата TheMachine @
                                                                                    т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                      а вот и решение :D
                                                                                      Скрытый текст
                                                                                        А вообще - ты там память по new выделяешь, и не освобождаешь ее - это твоя фирменная фишка?
                                                                                          Цитата KILLER @
                                                                                          ты там память по new выделяешь, и не освобождаешь ее

                                                                                          Ты не понимаешь. У потомственных хакеров не принято освобождать память.
                                                                                          Цитата TheMachine @
                                                                                          т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                            Цитата KILLER @
                                                                                            ты там память по new выделяешь, и не освобождаешь ее - это твоя фирменная фишка?

                                                                                            Это непонятно только тем, кто не постиг суть виртуозного программирования :crazy: Тут тебе и фирменный утекший байт в памяти, и возврат параметров через неиспользуемый стек, и другие вещи, о которых можно только догадываться...
                                                                                              Серохвостов Антон, а чё за хрень белая у вас на насу?
                                                                                              Скрытый текст
                                                                                              user posted image
                                                                                                Цитата Серохвостов Антон @
                                                                                                В Интернете вы вряд ли решение этой задачки найдёте, потому как она весьма сложная.

                                                                                                Да неужели? :D
                                                                                                Подпись была включена в связи с окончанием срока наказания
                                                                                                  Риску предположить, что и компилятор у ТС особенный: он сам заботится об освобождении памяти, гарантирует, что освобожденный стековый кадр не будет вновь использован (для этого рекомендуется перед вызовом функции проинициализировать любой указатель с помощью new), сам дописывает в строки лишние нули, ... <впишите нужное> Простым смертным, увы, такой компилятор Си недоступен. :(
                                                                                                  Сообщение отредактировано: shm -
                                                                                                  Цитата TheMachine @
                                                                                                  т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                    Цитата Суровый @
                                                                                                    Серохвостов Антон, а чё за хрень белая у вас на насу?

                                                                                                    Хотя ладно не отвечай, я понял
                                                                                                    http://www.vast-intl.org/
                                                                                                    Сообщение отредактировано: Суровый -
                                                                                                      Что-то ушел от нас Гуру. Сожалеем об этом.
                                                                                                      Цитата TheMachine @
                                                                                                      т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                        Цитата Серохвостов Антон @
                                                                                                        В программинге это в частности выражается в том, что даже кулхацкеры, начиная писать программу, редко задумываются о «постановке задачи»

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

                                                                                                        Цитата Серохвостов Антон @
                                                                                                        Если никто не против, в скором времени напишу сюда что-нибудь ещё. Конструктивная обратная связь приветствуется.

                                                                                                        Конечно, конечно. Нам очень интересно.
                                                                                                          Цитата KILLER @
                                                                                                          Это баг ? Или нет?
                                                                                                          Это ваше невежество. Если хотите без изменений кода программу посмотреть - используйте Borland C++ 3.1 for Windows, DOS

                                                                                                          Цитата KILLER @
                                                                                                          А вообще - ты там память по new выделяешь, и не освобождаешь ее - это твоя фирменная фишка?
                                                                                                          А это действительно касяк - признаю.

                                                                                                          PS. Что касается задачи о 12 шарах - молодцы. Поиском умеете пользоваться лучше меня. Но самому решение найти - куда приятней.
                                                                                                          Подпись выключена.
                                                                                                            Цитата KILLER @
                                                                                                            А вообще - ты там память по new выделяешь, и не освобождаешь ее - это твоя фирменная фишка?

                                                                                                            Ну он же пишет:
                                                                                                            Цитата Серохвостов Антон @
                                                                                                            «О! Компиляторы это мощно, надо обязательно сделать свой».

                                                                                                            Читал, что при программировании компиляторов часто для скорости не освобождают память - система всё равно всё подчистит. Может он так тренировался для этой задачи :D
                                                                                                            Подпись была включена в связи с окончанием срока наказания
                                                                                                              Цитата Серохвостов Антон @
                                                                                                              Это ваше невежество.

                                                                                                              Почему это мое невежество? Вы привели текст программы, и попросили найти в ней баги, я закинул ее в компиль, и если вашу багу с #include <iostream.h> я еще фиг с ним поправил, то дальше мне стало лень исправлять в этой гирлянде говнокода все ваши ошибки, коими пестрит ваше поделие.

                                                                                                              Цитата Серохвостов Антон @
                                                                                                              А это действительно касяк - признаю.

                                                                                                              Почему вы пишите на С++ и не используете STL ? Почему не обернуть все это в класс? Яб такой код в жизни никому не показал, хотя у меня такой есть - оставшийся со студенческих времен. Мне банально стыдно было бы.

                                                                                                              Добавлено
                                                                                                              А смешивать С и С++ в одно - не пойми чего, это вообще фишка исключительно кулхацкеров? Ты или писал бы уже на чистом С, или пользовался бы С++'ом. А так программа - обычно поделие студента 2-го курса. Что в ней такого примечательного, я не понимаю. Да и вас кстати так же судят по:
                                                                                                              Цитата Серохвостов Антон @
                                                                                                              «Покажи мне свою программу, и я скажу, кто ты»


                                                                                                              Все вот эти вот enum BOOL, #Define exit, magic numbers, вырвиглазный код, отсуствие лаконичных конструкций, неинициализированные переменные, танцы с бубном при занулении массивов, выделение памяти без последующего освобождения - очень хорошо говорят о вашем уровне.

                                                                                                              Добавлено
                                                                                                              Цитата Серохвостов Антон @
                                                                                                              Это ваше невежество. Если хотите без изменений кода программу посмотреть - используйте Borland C++ 3.1 for Windows, DOS

                                                                                                              И где мне все это взять по вашему? Технологии на месте не стоят, и мое невежество заключается в том, что у меня ваша программа нескомпилилась? ИМХО - это ваше невежество, вы так пафосно начали свою речь, и в итоге все это не иначе как пук в лужу, потому как даже приведенная вами программа не компилируется на современном компиляторе.
                                                                                                              Сообщение отредактировано: KILLER -
                                                                                                                Цитата OpenGL @
                                                                                                                Читал, что при программировании компиляторов часто для скорости не освобождают память - система всё равно всё подчистит. Может он так тренировался для этой задачи

                                                                                                                Адекватные программисты стараются свести операции выделения/освобождении памяти к минимуму. А не забить на ее освобождение. Если бы это было на самом деле так, то при компиляции больших исходников вываливалось бы "Not enough memory".

                                                                                                                Добавлено
                                                                                                                Цитата Серохвостов Антон @
                                                                                                                Это ваше невежество.

                                                                                                                Вообще-то не совсем. Данный код использует непереносимые Borland'овские функции.
                                                                                                                Цитата TheMachine @
                                                                                                                т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                  Цитата Суровый @
                                                                                                                  Серохвостов Антон, а чё за хрень белая у вас на насу?

                                                                                                                  ;)
                                                                                                                  user posted image
                                                                                                                    Цитата Серохвостов Антон @
                                                                                                                    используйте Borland C++ 3.1 for Windows, DOS

                                                                                                                    Зашибись совет. Вы ведь, я так понимаю, под DOS'ом сидите?
                                                                                                                    Цитата TheMachine @
                                                                                                                    т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                      Ребята, по-мягче, не вспугните потомственного хакера. Без него же на форуме будет скучно. Впрочем, если он настоящий кришнаит, то должен держаться.
                                                                                                                      Мой сайт - prografix.github.io
                                                                                                                        Цитата shm @
                                                                                                                        Адекватные программисты стараются свести операции выделения/освобождении памяти к минимуму. А не забить на ее освобождение.

                                                                                                                        Всё хорошо к месту. В случае компиляторов наверняка основные структуры создаются один раз до конца работы программы. Поэтому освобождение памяти, ими занимаемой, будет потерей времени и такой вот, в обычных условиях говнокод, оказывается к месту.
                                                                                                                        Подпись была включена в связи с окончанием срока наказания
                                                                                                                          Цитата OpenGL @
                                                                                                                          В случае компиляторов наверняка основные структуры создаются один раз до конца работы программы. Поэтому освобождение памяти, ими занимаемой, будет потерей времени и такой вот, в обычных условиях говнокод, оказывается к месту.

                                                                                                                          Да да. Освобождение памяти перед завершением программы неимоверно снизит скорость ее работы. Насмешил. Кстати, ОС при заверении процесса делает тоже самое. Вот только использовать данную возможность не принято в этикете программистов. Другое дело, что юзание аллокатора по миллиону раз в цикле достаточно накладно по времени.

                                                                                                                          Добавлено
                                                                                                                          Цитата prografix @
                                                                                                                          Без него же на форуме будет скучно

                                                                                                                          Да и с ним-то стало не особо весело. Сюда бы Никонова с Мастеровым пригласить ему в помощь.
                                                                                                                          Сообщение отредактировано: shm -
                                                                                                                          Цитата TheMachine @
                                                                                                                          т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                            Цитата OpenGL @
                                                                                                                            Всё хорошо к месту.

                                                                                                                            угу. на лицо void функция, которая выделяет память и не освобождает её. функция может вызываться нцать раз - делаем выводы. сама память тоже выделяется неправильно, посему UB - делаем выводы. функция, возвращающая указатель на массив тоже не есть стиль хорошего кодинга, обычно в функцию передают указатель на буфер - делаем выводы :)

                                                                                                                            Добавлено
                                                                                                                            Цитата _lcf_ @
                                                                                                                            на лицо void функция

                                                                                                                            ну я имею ввиду, что после вызова функции эта область памяти никак не используется/никуда не передается.
                                                                                                                              Цитата shm @
                                                                                                                              Другое дело, что юзание аллокатора по миллиону раз в цикле достаточно накладно по времени.

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

                                                                                                                              Добавлено
                                                                                                                              _lcf_, с сабжевой-то программой всё и так понятно :D
                                                                                                                              Подпись была включена в связи с окончанием срока наказания
                                                                                                                                Цитата OpenGL @
                                                                                                                                Ну а я о чём?

                                                                                                                                Я вот так и не понял, если честно о чем. Обычно данные хранят таким образом, чтобы не выделять/освобождать эту память при каждом чихе. Т.е. предусмотреть механизм ее повторного пользования без аллокатора. Ну и освободить все в конце работы - это профессиональный подход. Но тупа вызвать new, не сохраняя указатель и не освобождая память за собой - это быдлокод.
                                                                                                                                Сообщение отредактировано: shm -
                                                                                                                                Цитата TheMachine @
                                                                                                                                т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                  OpenGL, дык, с этого все и начинается ;) стиль надо прививать сызмальства, а не "использовать особенности компилятора/ос/итд/итп". ибо чревато, ой как чревато :yes:
                                                                                                                                    Цитата shm @
                                                                                                                                    Обычно данные хранят таким образом, чтобы не выделять/освобождать эту память при каждом чихе. Т.е. предусмотреть механизм ее повторного пользования без аллокатора.

                                                                                                                                    Обычно - да. Но это чревато ошибками, и в данном случае лично я не вижу криминала в том, чтобы отступить от хорошего тона и сделать проще и не менее эффективно.
                                                                                                                                    Подпись была включена в связи с окончанием срока наказания
                                                                                                                                      Цитата OpenGL @
                                                                                                                                      Но это чревато ошибками

                                                                                                                                      Это какими?
                                                                                                                                      Цитата OpenGL @
                                                                                                                                      чтобы отступить от хорошего тона и сделать проще и не менее эффективно.

                                                                                                                                      А в чем эффективность? Ну если блок данных выделяется 1 раз, то от него неосвобождения выигрыша не будет никакого, о чем я и писал выше. С другой стороны, если память выделяет миллион раз и не освобождается, то есть большой риск остаться вообще без памяти ну или по крайней мере такой код будет потенциально опасен.
                                                                                                                                      Сообщение отредактировано: shm -
                                                                                                                                      Цитата TheMachine @
                                                                                                                                      т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                        Цитата shm @
                                                                                                                                        Это какими?

                                                                                                                                        Да банальными багами а-ля "начал записывать по этому адресу, а он ещё в другом месте нужен". В С++, конечно, будет проще - там можно будет просто запилить свой аллокатор, в котором и сделать всё по-человечкски. Но не всё на нём пишется.
                                                                                                                                        Цитата shm @
                                                                                                                                        С другой стороны, если память выделяет миллион раз и не освобождается, то есть большой риск остаться вообще без памяти.

                                                                                                                                        Если не хватило памяти под структуры компилятора? Тогда её в любом случае не хватит, очевидно же.
                                                                                                                                        Подпись была включена в связи с окончанием срока наказания
                                                                                                                                          Цитата OpenGL @
                                                                                                                                          Если не хватило памяти под структуры компилятора? Тогда её в любом случае не хватит, очевидно же.

                                                                                                                                          Нет, в том то и дело с освобождением хватит. Очевидности не вижу никакой.

                                                                                                                                          Добавлено
                                                                                                                                          Цитата OpenGL @
                                                                                                                                          а банальными багами а-ля "начал записывать по этому адресу, а он ещё в другом месте нужен"

                                                                                                                                          Так это баг в чистом виде. А не освобождение памяти с целью его "исправления" - огромный костыль.
                                                                                                                                          Сообщение отредактировано: shm -
                                                                                                                                          Цитата TheMachine @
                                                                                                                                          т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                            О ФОРУМНЫХ ПЕРЕПАЛКАХ
                                                                                                                                            user posted image
                                                                                                                                            В виду того, что не все собеседники соглашаются перевести беседу в позитивный ключ, я буду отвечать только на те сообщения, на которые считаю нужным. Если какой-то спорный или вызывающий пост остался без ответа, это не значит, что я с ним согласен, или мне нечего ответить – я просто не хочу вести бессмысленный спор. Если вам кажется, что я это необоснованно сделал – напишите в личку со ссылкой на пост, и я по возможности отвечу на него. А чтобы полезные сообщения не затерялись под толщей флейма, я периодически буду резюмирующие посты размещать, в которых буду приводить ссылки на полезные сообщения. Вместе с тем, хотелось бы, чтобы всё-таки все в культурный режим общения перешли. Можно конечно примитивно отстраниться от каких-то собеседников, но в этом случае всё равно осадок остаётся, что есть недопонимание и взаимопретензии. Поэтому если я кого-то чем-то задел, ещё раз приношу свои извинения, и предлагаю переключиться в культурный конструктив.
                                                                                                                                            Подпись выключена.
                                                                                                                                              Цитата shm @
                                                                                                                                              Нет, в том то и дело с освобождением хватит. Очевидности не вижу никакой.

                                                                                                                                              С чего бы? Я говорю о структурах, которые нужны на весь цикл работы компилятора.
                                                                                                                                              Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                эээ, народ, поаккуратнее. во-первых хакер собирается окуклиться, а во-вторых я его первый нашел.
                                                                                                                                                используйте проверенный алгоритм: на один комментарий разоблачений два комментария восхищения. иначе спугнете
                                                                                                                                                Цитата usrjava @
                                                                                                                                                Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                    Цитата Аэтерос @
                                                                                                                                                    Серохвостов Антон, а где вы работаете?
                                                                                                                                                    user posted image
                                                                                                                                                    В плане работы я пиранья пера – PRоизвожу PRыщаво-кRUчковатые тексты, немилосердно вгрызаясь при этом в рекламные бюджеты своих заказчиков. Кроме того, лабораторные и курсовые по программированию для студентов делаю (мне это даже больше нравится, чем какие-то крупные проекты реализовывать). Благо, что спрос на этот вид деятельности есть всегда. Кроме того, репетиторством ещё занимаюсь – провожу ускоренные курсы по обучению программированию (для нежелающих глубоко погружаться в программирование студентов). А вообще – я рыбалку люблю... Мои дядя и отец были рыбаками, а потом также и меня к рыбалке приобщили.
                                                                                                                                                    Подпись выключена.
                                                                                                                                                      Серохвостов Антон, ответьте на вопрос:
                                                                                                                                                      Цитата KILLER @
                                                                                                                                                      Почему вы пишите на С++ и не используете STL ? Почему не обернуть все это в класс?
                                                                                                                                                        а у нас на форуме есть кто-нибудь обучавшийся в алтайском государственном университете? хотелось бы услышать побольше об этих титанах алгоритмов, мастеров методик и прочая-прочая

                                                                                                                                                        Добавлено
                                                                                                                                                        Цитата Серохвостов Антон @
                                                                                                                                                        - «О! Вебсторительство это модно – надо обязательно реализоваться в этой области».

                                                                                                                                                        а дайте ссылку на полюбоваться
                                                                                                                                                        Цитата usrjava @
                                                                                                                                                        Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                          Ладно, что мы все о C++. Посмотрел я Grapher.pas, парсер там какой-то... сделанный на коленке, но вроде как должен работать.

                                                                                                                                                          Серохвостов Антон
                                                                                                                                                          Вы в курсе, что такое "формальная грамматика" (в данном случае контекстно-свободная грамматика) и как на ее основе просто и логично делается рекурсивный парсер?
                                                                                                                                                            Цитата zera @
                                                                                                                                                            а у нас на форуме есть кто-нибудь обучавшийся в алтайском государственном университете?

                                                                                                                                                            Есть знакомые. В целом всё типично - выпускаются как хорошие специалисты, так и неучи. О потомственных хакерах не рассказывал никто :D
                                                                                                                                                            Цитата Pacific @
                                                                                                                                                            Посмотрел я Grapher.pas, парсер там какой-то... сделанный на коленке, но вроде как должен работать.

                                                                                                                                                            Я в 10 классе писал рисовалку трёхмерных графиков со вводом произвольной функции. Тоже писал свой наколеночный парсер. Жаль, код не сохранился - было бы интересно сравнить их :(
                                                                                                                                                            Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                              РЫБАЦКИЕ БАЙКИ АВТОБИОГРАФИЧЕСКОГО ХАРАКТЕРА

                                                                                                                                                              «Да здравствуют отечественные микросхемы! С 14-ю ножками и 4-мя ручками»
                                                                                                                                                              user posted image

                                                                                                                                                              Рыбалка моего дяди

                                                                                                                                                              Вообще – я рыбалку люблю… Мои дядя и отец были рыбаками, а потом также и меня к рыбалке приобщили. Мой дядя – виртуозный рыбак со стажем, окончивший ТУСУР. Он начинал рыбачить на военном приборостроительном заводе РОТОР (Алтайский край, Барнаул), участвуя в разработке подводных ракет спирального наведения на «объекты-невидимки» (не помню, как это по-умному называется). А желание пойти в ТУСУР у дяди возникло, когда, он в очередной раз отправляясь копать червей, в специально приготовленную для этого консервную банку, наткнулся на своего гения-знакомого, который не долго думая сделал из этой консервной банки радио. Это так впечатлило дядю, что он захотел стать электронщиком.

                                                                                                                                                              После рыбалки на РОТОРе, дядя переквалифицировался на производство электроудочек, которые даже патентовать не надо было, поскольку дядя использовал в них мало кому доступные запчасти-обломки ЭВМ (тех самых многокомнатных ЭВМ прошлого тысячелетия); у него был доступ к этой технике, т.к. он после РОТОРа что-то инженерил околоЭВМное. У меня до сих пор на веранде ещё какие-то запчасти этих динозавров остались, хотя я и прореживаю регулярно эти завалы. В прошлом году наконец-то выкинул ведро давно протухшего винегрета из микросхем (ЛА3, Триггеры, мультиплексоры, таймеры, буфера и т.д.).

                                                                                                                                                              После электроудочек мой дядя переквалифицировался в обычного рыбака. Просто стал ходить на рыбалку. Вот на этих рыбалках он меня и начал приобщать к полезным делам за компьютером. Потому как на тот момент (то были 90-е года прошлого тысячелетия), мы с братом к нему на работу ходили «как на работу», но не работать, а играть. «Башня», «Doom II», «Dune II», «Wolf», «Warkraft» – на эти игрушки мы убивали с братом всё своё свободное время.

                                                                                                                                                              В своё время мой дядя даже на коленках компьютер ZX Spectrum спаял, обломки которого до сих пор иногда попадаются мне на глаза. А сейчас он – самым крутой специалист в России и Казахстане по ремонту кассовых аппаратов. Один из магических трюков в его арсенале – перепрошивка PROM-микросхем, которые по определению не перепрошиваемые. В числе прочего занимается исследованием уязвимостей защиты кассовых аппаратов. В том числе ЭКЛЗ. Исключительно в научных целях, конечно же. Знай о моём дяде американцы – уже давно переманили бы, потому как он может такие задачи решать, с которыми даже целые институты не справляются. В общем моя дядя – тот ещё кадр.


                                                                                                                                                              Моя личная рыбалка

                                                                                                                                                              Для этих исследований дядя меня в своё время как-то даже попросил написать подпрограммы для быстрой работы со сверхбольшими числами (400000 шестнадцатеричных знаков и больше). Вот несколько подпрограмм из того богатства:

                                                                                                                                                              ExpandedWrap disabled
                                                                                                                                                                ;----------------------------------------------------------------------------
                                                                                                                                                                ;Сложение двух чисел
                                                                                                                                                                ;
                                                                                                                                                                ; ВХОД: a - указатель на первое число
                                                                                                                                                                ;       b - указатель на второе число
                                                                                                                                                                ; ВЫХОД: сумма в a
                                                                                                                                                                ;----------------------------------------------------------------------------
                                                                                                                                                                xAdd    proc
                                                                                                                                                                    arg @@a: DWORD, @@b: DWORD
                                                                                                                                                                    mov edi, @@a
                                                                                                                                                                    mov esi, @@b
                                                                                                                                                                    xor ebx, ebx    ; Перенос
                                                                                                                                                                     ;----------Выделение очередных групп разрядов
                                                                                                                                                                @@next: mov eax, [edi]
                                                                                                                                                                    mov edx, [esi]
                                                                                                                                                                    cmp eax, 0f0000000h
                                                                                                                                                                    jz  @@skpA
                                                                                                                                                                    cmp edx, 0f0000000h
                                                                                                                                                                    jz  @@skpB
                                                                                                                                                                    add esi, 4
                                                                                                                                                                     ;----------Сложение очередных разрядов (есть обе цифры)
                                                                                                                                                                    add eax, edx    ; Добавление цифры
                                                                                                                                                                    add eax, ebx    ; Добавление переноса
                                                                                                                                                                    btr eax, 28     ; Корректировка суммы и выделение переноса
                                                                                                                                                                    setc    bl      ; Перенос - в ebx
                                                                                                                                                                    mov [edi], eax
                                                                                                                                                                    add edi, 4
                                                                                                                                                                    jmp @@next
                                                                                                                                                                     ;----------Сложение очередных разрядов (нет цифры a)
                                                                                                                                                                @@skpA: cmp eax, edx    ; Оба числа пройдены?
                                                                                                                                                                    jz  @@cmlt      ; Да - обрабатываем перенос
                                                                                                                                                                    add esi, 4
                                                                                                                                                                    add edx, ebx
                                                                                                                                                                    btr edx, 28
                                                                                                                                                                    setc    bl
                                                                                                                                                                    mov [edi], edx
                                                                                                                                                                    add edi, 4
                                                                                                                                                                    mov [edi], 0f0000000h
                                                                                                                                                                    jmp @@next
                                                                                                                                                                     ;----------Сложение очередных разрядов (нет цифры b)
                                                                                                                                                                @@skpB: test    bl, bl      ; Есть перенос?
                                                                                                                                                                    jz  @@exit      ; Нет - сумма найдена
                                                                                                                                                                    add eax, ebx
                                                                                                                                                                    btr eax, 28
                                                                                                                                                                    setc    bl
                                                                                                                                                                    mov [edi], eax
                                                                                                                                                                    add edi, 4
                                                                                                                                                                    jmp @@next
                                                                                                                                                                @@cmlt: test    bl, bl      ; Есть перенос?
                                                                                                                                                                    jz  @@fEnd      ; Нет - завершаем число
                                                                                                                                                                    mov [edi], ebx  ; Да - записываем его и завершаем число
                                                                                                                                                                    mov [edi+4], 0f0000000h
                                                                                                                                                                @@exit: ret
                                                                                                                                                                @@fEnd: mov [edi], 0f0000000h
                                                                                                                                                                    ret
                                                                                                                                                                xAdd    endp
                                                                                                                                                                ;----------------------------------------------------------------------------
                                                                                                                                                                ;Вычитание двух чисел
                                                                                                                                                                ;
                                                                                                                                                                ; ВХОД: a - указатель на первое число
                                                                                                                                                                ;       b - указатель на второе число
                                                                                                                                                                ; ВЫХОД: разность в a
                                                                                                                                                                ;    eax - знак (0 - положительный, 1 - отрицательный)
                                                                                                                                                                ; Если результат отрицательный - число в дополнительном коде
                                                                                                                                                                ;----------------------------------------------------------------------------
                                                                                                                                                                xSub    proc
                                                                                                                                                                    arg @@a:DWORD, @@b:DWORD
                                                                                                                                                                    mov edi, @@a
                                                                                                                                                                    mov esi, @@b
                                                                                                                                                                    xor ebx, ebx    ; Перенос
                                                                                                                                                                     ;----------Выделение очередных групп разрядов
                                                                                                                                                                @@next: mov eax, [edi]
                                                                                                                                                                    mov edx, [esi]
                                                                                                                                                                    cmp eax, 0f0000000h ; Число a исчерпано?
                                                                                                                                                                    jz  @@skpA      ; Да - пропускаем его
                                                                                                                                                                    cmp edx, 0f0000000h ; Число b исчерпано?
                                                                                                                                                                    jz  @@skpB      ; Да - пропускаем его
                                                                                                                                                                    add esi, 4
                                                                                                                                                                     ;----------Есть обе группы
                                                                                                                                                                    sub eax, edx
                                                                                                                                                                    sub eax, ebx
                                                                                                                                                                    bt  eax, 31     ; Заем - в флаг переноса
                                                                                                                                                                    setc    bl      ; Выделение переноса
                                                                                                                                                                    and eax, 0fffffffh  ; Коррекция разности
                                                                                                                                                                    mov [edi], eax
                                                                                                                                                                    add edi, 4
                                                                                                                                                                    jmp @@next
                                                                                                                                                                     ;----------Нет группы a
                                                                                                                                                                @@skpA: cmp eax, edx    ; Оба числа исчерпаны?
                                                                                                                                                                    jz  @@cmlt      ; Да - учитываем заем и заканчиваем
                                                                                                                                                                    sub edx, ebx
                                                                                                                                                                    bt  edx, 31
                                                                                                                                                                    setc    bl
                                                                                                                                                                    and edx, 0fffffffh
                                                                                                                                                                    mov [edi], edx
                                                                                                                                                                    add esi, 4
                                                                                                                                                                    add edi, 4
                                                                                                                                                                    mov [edi], 0f0000000h
                                                                                                                                                                    jmp @@next
                                                                                                                                                                     ;----------Нет группы b
                                                                                                                                                                @@skpB: test    bl, bl      ; Есть заем?
                                                                                                                                                                    jz  @@exit      ; Нет - число сформировано
                                                                                                                                                                    sub eax, ebx
                                                                                                                                                                    bt  eax, 31     ; Заем - в флаг переноса
                                                                                                                                                                    setc    bl      ; Выделение переноса
                                                                                                                                                                    and eax, 0fffffffh  ; Коррекция разности
                                                                                                                                                                    mov [edi], eax
                                                                                                                                                                    add edi, 4
                                                                                                                                                                    jmp @@next
                                                                                                                                                                @@exit: xor eax, eax
                                                                                                                                                                    ret
                                                                                                                                                                     ;----------Обработка последнего заема
                                                                                                                                                                @@cmlt: test    bl, bl      ; Есть заем?
                                                                                                                                                                    jz  @@exit      ; Нет - на выход
                                                                                                                                                                    mov eax, 01
                                                                                                                                                                    ret
                                                                                                                                                                xSub    endp
                                                                                                                                                                ;----------------------------------------------------------------------------
                                                                                                                                                                ;Умножение двух чисел
                                                                                                                                                                ;
                                                                                                                                                                ; ВХОД: a - указатель на первое число
                                                                                                                                                                ;       b - указатель на второе число
                                                                                                                                                                ;   c - указатель на результат
                                                                                                                                                                ; ВЫХОД: произведение в c
                                                                                                                                                                ;----------------------------------------------------------------------------
                                                                                                                                                                xMul    proc
                                                                                                                                                                    arg @@a:DWORD, @@b:DWORD, @@c:DWORD
                                                                                                                                                                    mov sESP, esp
                                                                                                                                                                    mov edi, @@b
                                                                                                                                                                @@next: mov ebx, [edi]
                                                                                                                                                                    cmp ebx, 0f0000000h     ; Пройдены все блоки числа b?
                                                                                                                                                                    jz  @@exit          ; Да - число сформировано
                                                                                                                                                                    mov esi, @@a
                                                                                                                                                                    mov esp, @@c
                                                                                                                                                                    xor edx, edx        ; Остаток предыдущей итерации
                                                                                                                                                                @@nxtA: mov eax, [esi]      ; Очередной блок a
                                                                                                                                                                    mov ecx, [esp]      ; Очередной блок c
                                                                                                                                                                    cmp ecx, 0f0000000h     ; В с еще есть место?
                                                                                                                                                                    jz  @@notC          ; Нет - выделяем еще блок
                                                                                                                                                                    add ecx, edx
                                                                                                                                                                    jmp @@skip
                                                                                                                                                                @@notC: mov ecx, edx
                                                                                                                                                                    mov [esp+4], 0f0000000h
                                                                                                                                                                @@skip: cmp eax, 0f0000000h     ; Проийдены все блоки числа a?
                                                                                                                                                                    jz  @@nxtB          ; Да - к следующей цифре b
                                                                                                                                                                     ;----------Умножение очередных групп цифр
                                                                                                                                                                    mul ebx
                                                                                                                                                                    shld    edx, eax, 4     ; Корректировка старшей части
                                                                                                                                                                    and eax, 0fffffffh      ; Корректировка младшей части
                                                                                                                                                                    add ecx, eax
                                                                                                                                                                    mov eax, ecx
                                                                                                                                                                    and ecx, 0fffffffh      ; Корректировка суммы
                                                                                                                                                                    shr eax, 28         ; Выделение переноса
                                                                                                                                                                    add edx, eax        ; Остаток к следующей итерации
                                                                                                                                                                    mov [esp], ecx
                                                                                                                                                                     ;----------Переход к очередному блоку a
                                                                                                                                                                    add esi, 4
                                                                                                                                                                    add esp, 4
                                                                                                                                                                    jmp @@nxtA
                                                                                                                                                                     ;----------Переход к очередному блоку b
                                                                                                                                                                @@nxtB: mov [esp], ecx
                                                                                                                                                                    add edi, 4
                                                                                                                                                                    add @@c, 4
                                                                                                                                                                    jmp @@next
                                                                                                                                                                @@exit: mov esp, sESP
                                                                                                                                                                    ret
                                                                                                                                                                xMul    endp


                                                                                                                                                              Под впечатлением от разговоров об этих исследованиях, – уже в контексте нейросетей, – я выступал на одной из научных конференций с докладом о своём «Хэш-анализаторе на многослойном персептроне» (ломалка пин-кодов, по-русски говоря). За него меня чуть не выгнали с университета (помню эту мою работу даже публиковали в каком-то универском научном сборнике).

                                                                                                                                                              Одна из самых запоминающихся рыбалок для меня – это разработка программно-аппаратного комплекса для невидимой рыбалки в онлайн-покер-румах (бот для покера, в простонародии). А в покер-румах, как известно, самый чуткий рыбнадзор, поэтому просто программная эмуляция, даже на уровне драйверов, может быть отслежена – со всеми вытекающими. Поэтому невидимый покер-бот – это довольно-таки дорогая игрушка, но с помощью неё в покер-румах очень много рыбы наловить можно.

                                                                                                                                                              Наиболее интересная часть этого комплекса заключается в обеспечении невидимости: 1) принтскрина экрана и 2) эмуляции мыши и клавиатуры. Невидимость первого пункта достигается путём снятия изображения через аналоговый TV-выход видеокарты (посредством TV-тюнера другой машины). А невидимость второго – путём подключения к разъёмам мыши и клавиатуры программно-аппаратной примочки, которая на входе получает эмулируемые команды клавиатуры и мыши, а на выходе – выдаёт соответствующий этим данным поток сигналов. Возможно чуть позже я подробнее расскажу об этой «программно-аппаратной удочке».

                                                                                                                                                              Чуть ранее этого покерного монстра, я рыбачил на живца в шахматных просторах Маил.ру, запустив туда «Немецкую Рыбку» посредством программы XChessBot – широко известного в узких кругах моего творения. С этой программой-ботом можно легко всплыть в ТОП100 звёздно-шахматного рейтинга «маил.ру». И хотя практической пользы от этого конечно никакой, но когда тебя считают гроссмейстером – это приятно.


                                                                                                                                                              Рыбалка отца и наставника

                                                                                                                                                              Мой папа – электронщик-самоучка, который одно время работал на Радиозаводе в Барнауле (Алтайский край), и будучи самоучкой воспитал другого такого же, который под его началом выкурил Хорвица Хилла и ряд другой схожей литературы. В результате этот его «студент» собрал торсионный генератор, после включения которого, у него вся электроника дома сгорела, даже та, которая не была к сети подключена. Но так или иначе генератор заработал, и он иногда с ним игрался. Например, – он сам мне по секрету от отца рассказывал, – «Захочу чтобы твой отец в гости приехал, завожу свою шарманку. Он приезжает и говорит: что-то вот я ни с того ни с сего к тебе приехать захотел». Вот так ученик моего отца рыбачил на самого же отца.

                                                                                                                                                              А мой духовный наставник, – который как в последствии оказалось, в своё время работал с моим отцом на радиозаводе, – работает в Ростелекоме, занимаясь там разными интересными вещами.

                                                                                                                                                              PS. Сам же я, хоть и иду по стопам дяди, отца и духовного наставника, больше в программном направлении развиваюсь, хотя и аппаратная часть имеет место быть в моей жизни (см. анонс программно-аппаратной удочки для покера). А что касается образования, то на моём дипломе много чего написано (см. первый пост этого блога). За время обучения много чему интересному научился, а после выпуска много чем интересным занимался. Чем и собираюсь делиться в этом блоге. Спасибо вам за внимание.
                                                                                                                                                              Подпись выключена.
                                                                                                                                                                Цитата zera @
                                                                                                                                                                а у нас на форуме есть кто-нибудь обучавшийся в алтайском государственном университете?

                                                                                                                                                                Есть знакомые. В целом всё типично - выпускаются как хорошие специалисты, так и неучи. О потомственных хакерах не рассказывал никто :D
                                                                                                                                                                Цитата Pacific @
                                                                                                                                                                Посмотрел я Grapher.pas, парсер там какой-то... сделанный на коленке, но вроде как должен работать.

                                                                                                                                                                Я в 10 классе писал рисовалку трёхмерных графиков со вводом произвольной функции. Тоже писал свой наколеночный парсер. Жаль, код не сохранился - было бы интересно сравнить их :(
                                                                                                                                                                Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                    Цитата Pacific @
                                                                                                                                                                    Вы в курсе, что такое "формальная грамматика" (в данном случае контекстно-свободная грамматика) и как на ее основе просто и логично делается рекурсивный парсер?

                                                                                                                                                                    Это задача синтаксического анализа. Для её грамотного воплощения, не плохо бы почитать книги про компиляторы. Также вам пригодится теория графов и теория конечных автоматов, а также навыки работы с линейными списками. Выбранная вами задача – не такая уж и тривиальная, но если планомерно изучать необходимые отрасли (лучше в ВУЗе), то вы придёте к её решению. ©
                                                                                                                                                                    Цитата usrjava @
                                                                                                                                                                    Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                      Серохвостов Антон, ответьте на вопрос:
                                                                                                                                                                      Цитата KILLER @
                                                                                                                                                                      Почему вы пишите на С++ и не используете STL ? Почему не обернуть все это в класс?
                                                                                                                                                                        Цитата OpenGL @
                                                                                                                                                                        Есть знакомые. В целом всё типично - выпускаются как хорошие специалисты, так и неучи. О потомственных хакерах не рассказывал никто

                                                                                                                                                                        Теперь если учесть, что я был одним из лучших программистов выпуска 2006-2007-го годов (о чём вам подтвердят ваши знакомые, если таковые действительно есть), то можно сделать два взаимоисключающих вывода:
                                                                                                                                                                        - эти два года были для университета провальными;
                                                                                                                                                                        - бурная критика моих программ – чрезмерна.
                                                                                                                                                                        Подпись выключена.
                                                                                                                                                                          zera
                                                                                                                                                                          Ой, не надо пугать ежа голой жопой. Достаточно пары лекций по грамматикам, чтобы все понять и написать правильный парсер.

                                                                                                                                                                          Добавлено
                                                                                                                                                                          Цитата Серохвостов Антон @
                                                                                                                                                                          я был одним из лучших программистов выпуска 2006-2007-го годов

                                                                                                                                                                          В студенческих чемпионатах ACM участвовали? Хотя бы до полуфинала в Питере доходили? Если нет, то у меня для вас плохие новости.
                                                                                                                                                                            Цитата Pacific @
                                                                                                                                                                            В студенческих чемпионатах ACM участвовали? Хотя бы до полуфинала в Питере доходили? Если нет, то у меня для вас плохие новости.

                                                                                                                                                                            acm-щики обычно таких ляпов, что у него в коде, не допускают :)
                                                                                                                                                                            Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                              Антошка, Антошка, пойдём копать картошку?

                                                                                                                                                                              Добавлено
                                                                                                                                                                              Цитата Серохвостов Антон @
                                                                                                                                                                              широко известного в узких кругах

                                                                                                                                                                              :good:
                                                                                                                                                                                Цитата Серохвостов Антон @
                                                                                                                                                                                XChessBot – широко известного в узких кругах моего творения.

                                                                                                                                                                                Единственное, что гугл находит о нём - это сообщение :D
                                                                                                                                                                                Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                  Цитата Pacific @
                                                                                                                                                                                  Ой, не надо пугать ежа голой жопой. Достаточно пары лекций по грамматикам, чтобы все понять и написать правильный парсер.
                                                                                                                                                                                  осмелился спорить с широко известным в узких кругах гуру?
                                                                                                                                                                                  Цитата Серохвостов Антон @
                                                                                                                                                                                  Теперь если учесть, что я был одним из лучших программистов выпуска 2006-2007-го годов (о чём вам подтвердят ваши знакомые, если таковые действительно есть), то можно сделать два взаимоисключающих вывода:
                                                                                                                                                                                  - эти два года были для университета провальными;
                                                                                                                                                                                  - бурная критика моих программ – чрезмерна.

                                                                                                                                                                                  объясните как вот эти два пункта противоречат (взаимоисключают) друг друга?
                                                                                                                                                                                  да и почему только два года? я думаю что обучают там плохо всегда, как следствие и критика поделок, которые вы именуете программами.
                                                                                                                                                                                  отличным показателем является то, что за семь лет кроме как бумажки перекладывать работы вам не нашлось
                                                                                                                                                                                  Цитата usrjava @
                                                                                                                                                                                  Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                                    Цитата Серохвостов Антон @
                                                                                                                                                                                    За время обучения много чему интересному научился, а после выпуска много чем интересным занимался

                                                                                                                                                                                    И что неужели вас там не научили пользоваться STL и классами? Подозрительно как то. Обычно студенты уже 3-его курса, более менее используют STL + классы.
                                                                                                                                                                                      Цитата KILLER @
                                                                                                                                                                                      И что неужели вас там не научили пользоваться STL и классами? Подозрительно как то. Обычно студенты уже 3-его курса, более менее используют STL + классы.

                                                                                                                                                                                      Их и нам не преподавали - был только Си. Примеры ООП были на Паскале. А вот параллельной группе читали и С++. STL у них не помню - мне хватило #include <iostream.h> :D
                                                                                                                                                                                      Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                        Цитата OpenGL @
                                                                                                                                                                                        Их и нам не преподавали - был только Си. Примеры ООП были на Паскале. А вот параллельной группе читали и С++. STL у них не помню - мне хватило #include <iostream.h> :D

                                                                                                                                                                                        Ну незнаю, мне казалось что любой уважающий себя виртуозный потомственный кулхацкер, пишуший на С++, просто обязан знать STL, ну хотя бы на примитивном уровне. Про классы - и говорить нечего.
                                                                                                                                                                                        Вообще поциент чем то напоминает Леху Никонова. Тот тоже бильды свои писал и сюда выкладывал. Судя по всему этот по его стопам пойдет.
                                                                                                                                                                                        Сообщение отредактировано: KILLER -
                                                                                                                                                                                          Цитата OpenGL @
                                                                                                                                                                                          Я говорю о структурах, которые нужны на весь цикл работы компилятора.

                                                                                                                                                                                          Еще раз: если память под структуры выделяется 1 раз, то никакого выигрыша от ее неосвобождения не будет. Если память выделяется много раз, то ее неосвобождение чревато проблемами. Обсуждать нечего.
                                                                                                                                                                                          Цитата TheMachine @
                                                                                                                                                                                          т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                            Что то глюк какой то. Вроде читаю сообщение 91 от shm, но при этом на 6 странице его нет и 7 - страницы нет. :scratch:
                                                                                                                                                                                              Цитата Pacific @
                                                                                                                                                                                              Достаточно пары лекций по грамматикам, чтобы все понять и написать правильный парсер.

                                                                                                                                                                                              В принипе мне было достаточно почить про LL-парсер.
                                                                                                                                                                                              Цитата TheMachine @
                                                                                                                                                                                              т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                Во, а щас появилось.
                                                                                                                                                                                                  Цитата shm @
                                                                                                                                                                                                  Еще раз: если память под структуры выделяется 1 раз, то никакого выигрыша от ее неосвобождения не будет.

                                                                                                                                                                                                  Один, естественно. Будет или нет - смотря как всё будет написано. Вообще, разработка компиляторов - отдельная и очень большая область, и лично я вполне допускаю, что в ней запросто могут быть ситуации, когда корректное и быстрое освобождение всей памяти будет требовать неоправданно сложных решений.

                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                  Цитата KILLER @
                                                                                                                                                                                                  Что то глюк какой то. Вроде читаю сообщение 91 от shm, но при этом на 6 странице его нет и 7 - страницы нет.

                                                                                                                                                                                                  Такое на прошлой странице с моим сообщением тоже было
                                                                                                                                                                                                  Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                      О! Скрамер в теме.
                                                                                                                                                                                                      Цитата TheMachine @
                                                                                                                                                                                                      т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                        О. Запасаюсь попкорном :D
                                                                                                                                                                                                        Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                          Цитата OpenGL @
                                                                                                                                                                                                          быть ситуации, когда корректное и быстрое освобождение всей памяти будет требовать неоправданно сложных решений.

                                                                                                                                                                                                          Ну вот я бы хотел посмотреть на такой пример.
                                                                                                                                                                                                          Цитата TheMachine @
                                                                                                                                                                                                          т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                            Цитата shm @
                                                                                                                                                                                                            Ну вот я бы хотел посмотреть на такой пример.

                                                                                                                                                                                                            Да я бы тоже не против. Я только слышал это давным-давно где-то. Даже конкретные компиляторы, где это используется, там называли. Самому уже хочется найти эту ссылку :)
                                                                                                                                                                                                            Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                              Ага, я теперь внезапно понял, почему сразу несколько древних алгоритмистов внезапно набрали по 500 тематических постов... :D
                                                                                                                                                                                                              M

                                                                                                                                                                                                              Подскажите, куда тему перенести?  Так-то у нас открытого раздела для блогов не предусмотрено, но и сюда она не совсем вписывается.  :-?
                                                                                                                                                                                                              Над нами - правила форума, внутри нас - нравственный закон!
                                                                                                                                                                                                              (Девиз начинающего модератора.)
                                                                                                                                                                                                                вот прикрыли корзину, теперь некуда переносить. пусть тут будет, иной раздел автором может быть расценен как оскорбление и может привести к обидам и последующему уходу с форума. и так зашел уже два раза, а комментариев не пишет
                                                                                                                                                                                                                Цитата usrjava @
                                                                                                                                                                                                                Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                                                                  Цитата Dark_Sup @
                                                                                                                                                                                                                  иной раздел автором может быть расценен как оскорбление и может привести к обидам и

                                                                                                                                                                                                                  ...и взлому форума, ибо он потомственный хакер. :ph34r: Нет, такого развития событий я допустить не могу. Давай оставим здесь. :yes:

                                                                                                                                                                                                                  Впрочем... zera, я раньше не замечал от тебя столь добрых постов. Это всё ещё ты, или уже из-под твоего взломанного аккаунта топикстартер пытается меня утихомирить? :scratch:
                                                                                                                                                                                                                  Над нами - правила форума, внутри нас - нравственный закон!
                                                                                                                                                                                                                  (Девиз начинающего модератора.)
                                                                                                                                                                                                                    Куда ТС пропал-то? С нетерпением ждем новых откровений из области виртуозного программирования.

                                                                                                                                                                                                                    Добавлено
                                                                                                                                                                                                                    Цитата Dark_Sup @
                                                                                                                                                                                                                    Подскажите, куда тему перенести?

                                                                                                                                                                                                                    Так-то можно этому товарищу доступ в МШ открыть, да туда и двинуть. Хотя, с другой стороны, там Кролег его спугнет, наверное. Так что пусть лучше тут.
                                                                                                                                                                                                                    Сообщение отредактировано: shm -
                                                                                                                                                                                                                    Цитата TheMachine @
                                                                                                                                                                                                                    т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                      shm, не спугнет, не успеет.... ;)
                                                                                                                                                                                                                        Цитата shm @
                                                                                                                                                                                                                        Куда ТС пропал-то?

                                                                                                                                                                                                                        Славы не выдержал... слабак.
                                                                                                                                                                                                                          Цитата shm @
                                                                                                                                                                                                                          Так-то можно этому товарищу доступ в МШ открыть, да туда и двинуть.

                                                                                                                                                                                                                          Не не не, туда не нужно, там неадекватный модератор, у которого извращеная логика. Уж лучше тогда в холивары двиньте.
                                                                                                                                                                                                                            Понятно... МногоШум отпадает. :scratch:

                                                                                                                                                                                                                            Может в FAQ какой-нибудь? У нас есть по "виртуозному программированию"? :unsure:
                                                                                                                                                                                                                            Над нами - правила форума, внутри нас - нравственный закон!
                                                                                                                                                                                                                            (Девиз начинающего модератора.)
                                                                                                                                                                                                                              Цитата Dark_Sup @
                                                                                                                                                                                                                              Может в FAQ какой-нибудь?

                                                                                                                                                                                                                              :lol:

                                                                                                                                                                                                                              Цитата Dark_Sup @
                                                                                                                                                                                                                              У нас есть по "виртуозному программированию"? :unsure:

                                                                                                                                                                                                                              В принципе если ТС и будет продолжать в том же русле, то можно в смехогрех отправить...
                                                                                                                                                                                                                              Сообщение отредактировано: KILLER -
                                                                                                                                                                                                                                КУЛЬТУРА ОТНОШЕНИЙ

                                                                                                                                                                                                                                «Пока ты говоришь совсем не то, что думаешь, пока слушаешь совсем не то, во что веришь и делаешь совсем не то, к чему расположен – всё это время живёшь совсем не ты» (Сян Цзы)
                                                                                                                                                                                                                                user posted image
                                                                                                                                                                                                                                Культурная презентация ошибок

                                                                                                                                                                                                                                Здорово! Нашли – ошибки, молодцы. Но ведь можно же их презентовать и в более культурном виде, например, как это делают Pacific или Kray74. Иначе какая польза от критики? Вам что мама в детстве мало любви дала, что вы пытаетесь самоутвердиться за счёт опускания других? Это второсортная радость, ведущая к деградации, и никуда больше. А недочёты – их можно найти везде, даже в компиляторе C++. Вы бы лучше какой-нибудь красивый код привели, который в сравнении с приведёнными мной кодами, по какому-то параметру качественно выделялся, и я бы вместе с вами порадовался его красивости. Но только будьте готовы, что на ваш красивый код налетит стая чаек и разнесёт его в пух и прах. Потому что недостатки есть – везде. Увидеть их не проблема. Проблема – увидеть достоинства. А на это способны только по-настоящему взрослые люди. А чтобы ещё и оценить эти достоинства, а не просто хмыкнуть снисходительно – это вообще высший пилотаж.

                                                                                                                                                                                                                                Предела к совершенству нет – всегда будут появляться всё более и более красивые решения. Но если эти красивые решения приводят только к гордости, то грош им цена. Я бы например никогда не пошёл учиться к человеку, который надменно низвергает «более глупых, чем он» людей, будь даже он семи пядей во лбу. Чему он сможет научить меня? – Только вражде между людьми. Ну и что, что вместе с этой враждой я буду писать безупречные программы – что толку от этого? Главная ценность – это отношения, если их нет, счастья не будет. Мне в этом отношении повезло с учителями. Они были действительно хорошими людьми. Более того, я сейчас глубоко общаюсь с людьми, которые с точки зрения программирования, вообще – полные ламеры, но вместе с тем, у них есть такие качества характера, которые стоят того, чтобы перенять их. Прежде всего это – смирение.

                                                                                                                                                                                                                                С другой стороны, следование стандартам установленным – это тоже не панацея. Например, PASCAL наверняка был по всем правилам написан, но вот в будущем (то бишь сейчас) возникло такое новое железо, что выявились ошибки – пришлось патч для turbo.tpl делать.


                                                                                                                                                                                                                                Нужно ли соблюдать правила

                                                                                                                                                                                                                                Но я согласен, поиск универсальных решений и стандартизация – стоит свеч. В действительности, такой поиск – это проявление нашего стремления к абсолютному счастью. И этому следовало бы придерживаться не только в программировании, но и в жизни. Например, есть 10 заповедей, которые весьма практичны. Но их сейчас практически никто не знает, не говоря уже о том, чтобы следовать им. А они действительно очень практичны (см. видео-лекцию «10 заповедей на пути процветания и счастья»). Тогда как в реальной жизни мы довольствуемся какими-то полумерами, которые в конце концов горем оборачиваются. И эти полумеры – куда более коряво выглядят, чем незначительные огрехи в программах. Если мы закрываем глаза на корявую структуру своей жизни, но вместе с тем кичимся выверенной структурой своих программ, то мы живём где-то в районе поговорки: «Пока ты говоришь совсем не то, что думаешь, пока слушаешь совсем не то, во что веришь и делаешь совсем не то, к чему расположен – всё это время живёшь совсем не ты» (Сян Цзы).

                                                                                                                                                                                                                                Если уж касяки разбирать, то главный касяк – это дурной характер и блуждание ума, которые здесь проявили и я, и значительная часть собеседников. Для меня именно этот фактор был бы определяющим, соберись я искать себе наставника. На мой взгляд, главное качество любого человека – это смирение. Это единственное качество, которое не подделаешь и не спрячешь. Сам я им не обладаю, но стремлюсь к общению с людьми, обладающими этим качеством. Потому что не будучи смиренным, невозможно быть счастливым. И мои учителя, к счастью, обладали этими качествами.


                                                                                                                                                                                                                                Воспоминания об учебном процессе

                                                                                                                                                                                                                                Мои преподаватели учебный процесс выстраивали интересным образом. Они были нам одновременно и друзьями, и старшими. Они часто бросали нам вызов, но даже если мы принимали его и побеждали их, – всё равно субординация сохранялась. Мы уважали друг друга, но не без элементов «дружественного троллинга».

                                                                                                                                                                                                                                Например, то что я за 5 часов ту задачу решил – это был своеобразный троллинг – я это сделал только чтобы уесть преподавателя. Но в позитивном ключе. Предложив более быстрое решение, я всё равно чётко ощущал, что он по-прежнему выше меня. Если бы у меня не было смиренного уважения к преподавателю, я бы не смог так быстро найти это решение. Но в контексте взаимоуважения, это была просто увлекательная игра.

                                                                                                                                                                                                                                Тот прикол с возвращением локальной переменной из подпрограммы, который обнаружил г-н Pacific , – это тоже своеобразный дружественный троллинг был. Но к моему сожалению, препод этого «недочёта» не заметил, а то бы у нас интересная дискуссия по компиляторам развернулась. Поэтому без тени сарказма, ещё раз, Pacific – респект вам. Что касается разных компиляторов, то да, такие игры без хорошего знакомства с компилятором чреваты. Почитайте статью про самомодифицирующийся код, там ещё более изощрённые извращения, правда они более обоснованы с практической точки зрения.

                                                                                                                                                                                                                                Что касается задачи про шары, то она в принципе не очень подходит для того, чтобы её ложить на алгоритмический язык. Но это с одной стороны просто стёб наших преподавателей был, а с другой – им просто хотелось куда-нибудь включить эту задачу, потому как задача интересная; а более лучшего места, чем «Теория и технология программирования» – не нашлось. Ещё один их стёб: задачи давать от сложных – к простым, а не наоборот, как это обычно принято.

                                                                                                                                                                                                                                Ещё одна интересная вещь связана с подходом в обучении. Нас очень часто (особенно на старших курсах) не учили каким-то конкретным технологиям, а учили учиться – как осваивать новые технологии в короткие сроки самостоятельно. Например, на лабораторных надо было выполнять задания на языках Ассемблер, Форт, и на куче разных микроконтроллерных ассемблерах, но на лекциях информация о них не давалась – надо было искать её самим. Т.е. по сути изучать языки самим. И благодаря этому в памяти так называемых «остаточных знаний» больше осело. Вот несколько примеров сего «поделия»:

                                                                                                                                                                                                                                PIC16
                                                                                                                                                                                                                                ExpandedWrap disabled
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  ; Программа ogni.asm
                                                                                                                                                                                                                                  ;
                                                                                                                                                                                                                                  ;
                                                                                                                                                                                                                                  ;
                                                                                                                                                                                                                                  ; Составлена Серохвостовым Антоном 10.04.06
                                                                                                                                                                                                                                  ; Последняя доработка 29.04.06
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  LIST    p = p16C7
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                  #include "p16f84.inc"
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                  __CONFIG _XT_OSC & _PWRTE_ON & _CP_OFF & _WDT_ON
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                  COUNTER EQU H'20'   ; Счётчик переполнений таймера
                                                                                                                                                                                                                                  EFFECT  EQU H'21'   ; Номер эфекта
                                                                                                                                                                                                                                  SPEED   EQU H'22'   ; Скорость эффектов
                                                                                                                                                                                                                                  CSPEED  EQU H'23'   ; Счетчик ожидания для текущей скорости
                                                                                                                                                                                                                                  CURKEY  EQU H'24'   ; Текущая нажатая клавиша
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                  PATTERN EQU PORTB   ; Выводимый слайд
                                                                                                                                                                                                                                  KEYS    EQU PORTA
                                                                                                                                                                                                                                  TRISKEY EQU TRISA
                                                                                                                                                                                                                                  TRISDIO EQU TRISB
                                                                                                                                                                                                                                  KEFF    EQU H'0'    ; Кнопка выбора эфекта
                                                                                                                                                                                                                                  KADD    EQU H'1'    ; Кнопка увеличения скорости
                                                                                                                                                                                                                                  KSUB    EQU H'2'    ; Кнопка уменьшения скорости
                                                                                                                                                                                                                                  ; 0 - Кнопка нажата
                                                                                                                                                                                                                                  ; 1 - Кнопка отпущена
                                                                                                                                                                                                                                  ;------- Настроить порты ввода/вывода
                                                                                                                                                                                                                                      BCF STATUS, RP0 ; Выбрать банк 0
                                                                                                                                                                                                                                      CLRF    KEYS        ; Инициализация защёлок текущего порта
                                                                                                                                                                                                                                      CLRF    PATTERN
                                                                                                                                                                                                                                      BSF STATUS, RP0 ; Выбрать банк 1
                                                                                                                                                                                                                                      MOVLW   0xFF        ; Значение для инициализации направления
                                                                                                                                                                                                                                      MOVWF   TRISKEY     ; каналов. Все будут входами
                                                                                                                                                                                                                                      MOVLW   0x00
                                                                                                                                                                                                                                      MOVWF   TRISDIO
                                                                                                                                                                                                                                      BCF STATUS, RP0 ; Выбрать банк 0
                                                                                                                                                                                                                                  ;------- Инициализировать начальное состояние
                                                                                                                                                                                                                                      CLRF    EFFECT
                                                                                                                                                                                                                                      BSF EFFECT, 0   ; Выбрать первый эффект
                                                                                                                                                                                                                                      CLRF    SPEED
                                                                                                                                                                                                                                      BSF SPEED, 0    ; Скорость
                                                                                                                                                                                                                                      MOVLW   0xA5
                                                                                                                                                                                                                                      MOVWF   PATTERN     ; Начальное состояине диодов
                                                                                                                                                                                                                                  REPEAT
                                                                                                                                                                                                                                  ;------- Вывести эффект
                                                                                                                                                                                                                                      CALL    PROCESS_EFFECT
                                                                                                                                                                                                                                  ;------- Осуществить задержку
                                                                                                                                                                                                                                      CALL    CHANGE_SPEED
                                                                                                                                                                                                                                  WT
                                                                                                                                                                                                                                  ;------- Выбор эффекта
                                                                                                                                                                                                                                      BTFSC   KEYS, KEFF
                                                                                                                                                                                                                                      BSF CURKEY, KEFF    ; Установить признак нажатости
                                                                                                                                                                                                                                      BTFSC   CURKEY, KEFF    ; Нажатая клавиша обработана?
                                                                                                                                                                                                                                      CALL    CHANGE_EFFECT   ; Нет - обработать
                                                                                                                                                                                                                                  ;------- Увеличение скорости
                                                                                                                                                                                                                                      BTFSC   KEYS, KADD
                                                                                                                                                                                                                                      BSF CURKEY, KADD
                                                                                                                                                                                                                                      BTFSC   CURKEY, KADD
                                                                                                                                                                                                                                      CALL    ADD_SPEED
                                                                                                                                                                                                                                  ;------- Уменьшение скорости
                                                                                                                                                                                                                                      BTFSC   KEYS, KSUB
                                                                                                                                                                                                                                      BSF CURKEY, KSUB
                                                                                                                                                                                                                                      BTFSC   CURKEY, KSUB
                                                                                                                                                                                                                                      CALL    SUB_SPEED
                                                                                                                                                                                                                                  ;------- Задержка
                                                                                                                                                                                                                                      CALL    WAIT
                                                                                                                                                                                                                                      DECFSZ  CSPEED, 1
                                                                                                                                                                                                                                      GOTO    WT
                                                                                                                                                                                                                                      GOTO    REPEAT
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  ; Изменяет скорость по селектору
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  CHANGE_SPEED
                                                                                                                                                                                                                                      MOVLW   0x01
                                                                                                                                                                                                                                      BTFSC   SPEED, 0
                                                                                                                                                                                                                                      MOVLW   0x01
                                                                                                                                                                                                                                      BTFSC   SPEED, 1
                                                                                                                                                                                                                                          MOVLW   0x04
                                                                                                                                                                                                                                      BTFSC   SPEED, 2
                                                                                                                                                                                                                                          MOVLW   0x08
                                                                                                                                                                                                                                      BTFSC   SPEED, 3
                                                                                                                                                                                                                                          MOVLW   0x0C
                                                                                                                                                                                                                                      BTFSC   SPEED, 4
                                                                                                                                                                                                                                          MOVLW   0x12
                                                                                                                                                                                                                                      BTFSC   SPEED, 5
                                                                                                                                                                                                                                          MOVLW   0x20
                                                                                                                                                                                                                                      BTFSC   SPEED, 6
                                                                                                                                                                                                                                          MOVLW   0x30
                                                                                                                                                                                                                                      BTFSC   SPEED, 7
                                                                                                                                                                                                                                          MOVLW   0x40
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                      DECF    SPEED, 1
                                                                                                                                                                                                                                      INCF    SPEED, 1
                                                                                                                                                                                                                                      BTFSC   STATUS, Z
                                                                                                                                                                                                                                      MOVLW   0x01
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                      MOVWF   CSPEED
                                                                                                                                                                                                                                      RETURN
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  ; Переключает диоды всоответствии с выбраным эфектом
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  CHANGE_EFFECT
                                                                                                                                                                                                                                      BCF CURKEY, KEFF
                                                                                                                                                                                                                                      DECF    CURKEY, 1
                                                                                                                                                                                                                                      INCF    CURKEY, 1
                                                                                                                                                                                                                                      BTFSC   STATUS, Z
                                                                                                                                                                                                                                      CALL    WAIT
                                                                                                                                                                                                                                      BSF CURKEY, KEFF
                                                                                                                                                                                                                                      BTFSC   KEYS, KEFF
                                                                                                                                                                                                                                      RETURN          ; Подавление дребезга
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                      RLF EFFECT, 1   ; Смена эффекта
                                                                                                                                                                                                                                      BTFSC   STATUS, C
                                                                                                                                                                                                                                      BSF EFFECT, 0
                                                                                                                                                                                                                                      BCF STATUS, C   ; Сбросить перенос, чтобы было 8 состояний
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                      MOVLW   0xA5
                                                                                                                                                                                                                                      MOVWF   PATTERN     ; Эффект
                                                                                                                                                                                                                                      BCF CURKEY, KEFF    ; Предотвратить повторную обработку нажатия
                                                                                                                                                                                                                                      RETURN
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  ; Увеличивает скорость
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  ADD_SPEED
                                                                                                                                                                                                                                      BCF CURKEY, KADD
                                                                                                                                                                                                                                      DECF    CURKEY, 1
                                                                                                                                                                                                                                      INCF    CURKEY, 1
                                                                                                                                                                                                                                      BTFSC   STATUS, Z
                                                                                                                                                                                                                                      CALL    WAIT
                                                                                                                                                                                                                                      BSF CURKEY, KADD
                                                                                                                                                                                                                                      BTFSC   KEYS, KADD
                                                                                                                                                                                                                                      RETURN          ; Подавление дребезга
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                      RRF SPEED, 1    ; Смена скорости
                                                                                                                                                                                                                                      BTFSC   STATUS, C
                                                                                                                                                                                                                                      BSF SPEED, 7
                                                                                                                                                                                                                                      BCF STATUS, C   ; Сбросить перенос, чтобы было 8 состояний
                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                      CALL    CHANGE_SPEED    ; Задать скорость
                                                                                                                                                                                                                                      BCF CURKEY, KADD    ; Предотвратить повторную обработку нажатия
                                                                                                                                                                                                                                      RETURN
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  ; Уменьшает скорость
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  SUB_SPEED
                                                                                                                                                                                                                                      BCF CURKEY, KSUB
                                                                                                                                                                                                                                      DECF    CURKEY, 1
                                                                                                                                                                                                                                      INCF    CURKEY, 1
                                                                                                                                                                                                                                      BTFSC   STATUS, Z
                                                                                                                                                                                                                                      CALL    WAIT
                                                                                                                                                                                                                                      BSF CURKEY, KSUB
                                                                                                                                                                                                                                      BTFSC   KEYS, KSUB
                                                                                                                                                                                                                                      RETURN          ; Подавление дребезга
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                      RLF SPEED, 1    ; Смена скорости
                                                                                                                                                                                                                                      BTFSC   STATUS, C
                                                                                                                                                                                                                                      BSF SPEED, 0
                                                                                                                                                                                                                                      BCF STATUS, C   ; Сбросить перенос, чтобы было 8 состояний
                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                      CALL    CHANGE_SPEED    ; Задать скорость
                                                                                                                                                                                                                                      BCF CURKEY, KSUB    ; Предотвратить повторную обработку нажатия
                                                                                                                                                                                                                                      RETURN
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  ; Переключает диоды всоответствии с выбраным эфектом
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  PROCESS_EFFECT
                                                                                                                                                                                                                                      BTFSC   EFFECT, 0
                                                                                                                                                                                                                                      GOTO    EFF_0
                                                                                                                                                                                                                                      BTFSC   EFFECT, 1
                                                                                                                                                                                                                                      GOTO    EFF_1
                                                                                                                                                                                                                                      BTFSC   EFFECT, 2
                                                                                                                                                                                                                                      GOTO    EFF_2
                                                                                                                                                                                                                                      BTFSC   EFFECT, 3
                                                                                                                                                                                                                                      GOTO    EFF_3
                                                                                                                                                                                                                                      BTFSC   EFFECT, 4
                                                                                                                                                                                                                                      GOTO    EFF_4
                                                                                                                                                                                                                                      BTFSC   EFFECT, 5
                                                                                                                                                                                                                                      GOTO    EFF_5
                                                                                                                                                                                                                                      BTFSC   EFFECT, 6
                                                                                                                                                                                                                                      GOTO    EFF_6
                                                                                                                                                                                                                                      BTFSC   EFFECT, 7
                                                                                                                                                                                                                                      GOTO    EFF_7
                                                                                                                                                                                                                                      RETURN
                                                                                                                                                                                                                                  EFF_0
                                                                                                                                                                                                                                      INCF    PATTERN, 1
                                                                                                                                                                                                                                      RETURN
                                                                                                                                                                                                                                  EFF_1
                                                                                                                                                                                                                                      INCF    PATTERN, 1
                                                                                                                                                                                                                                      SWAPF   PATTERN, 1
                                                                                                                                                                                                                                      RETURN
                                                                                                                                                                                                                                  EFF_2
                                                                                                                                                                                                                                      MOVF    PATTERN, 0
                                                                                                                                                                                                                                      XORLW   0xAA
                                                                                                                                                                                                                                      MOVWF   PATTERN
                                                                                                                                                                                                                                      RETURN
                                                                                                                                                                                                                                  EFF_3
                                                                                                                                                                                                                                      RLF PATTERN, 1
                                                                                                                                                                                                                                      INCF    PATTERN, 1
                                                                                                                                                                                                                                      RETURN
                                                                                                                                                                                                                                  EFF_4
                                                                                                                                                                                                                                      RRF PATTERN, 1
                                                                                                                                                                                                                                      DECF    PATTERN, 1
                                                                                                                                                                                                                                      RETURN
                                                                                                                                                                                                                                  EFF_5
                                                                                                                                                                                                                                      RLF PATTERN, 1
                                                                                                                                                                                                                                      SWAPF   PATTERN, 1
                                                                                                                                                                                                                                      RETURN
                                                                                                                                                                                                                                  EFF_6
                                                                                                                                                                                                                                      INCF    PATTERN, 1
                                                                                                                                                                                                                                      SWAPF   PATTERN, 1
                                                                                                                                                                                                                                      DECF    PATTERN, 1
                                                                                                                                                                                                                                      SWAPF   PATTERN, 1
                                                                                                                                                                                                                                      RETURN
                                                                                                                                                                                                                                  EFF_7
                                                                                                                                                                                                                                      MOVF    PATTERN, 0
                                                                                                                                                                                                                                      XORLW   0xAA
                                                                                                                                                                                                                                      MOVWF   PATTERN
                                                                                                                                                                                                                                      SWAPF   PATTERN, 1
                                                                                                                                                                                                                                      RETURN
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  ; Задержка
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  WAIT
                                                                                                                                                                                                                                      MOVLW   0x0A
                                                                                                                                                                                                                                      MOVWF   COUNTER
                                                                                                                                                                                                                                  NEXT_WT
                                                                                                                                                                                                                                      CLRF    TMR0        ; Сброс TMR0
                                                                                                                                                                                                                                      CLRF    INTCON      ; Выключить прерывания
                                                                                                                                                                                                                                      BSF STATUS, RP0 ; Банк 1
                                                                                                                                                                                                                                      MOVLW   0xC3        ; Выключить подтягивающие резисторы на PORTB
                                                                                                                                                                                                                                      MOVWF   OPTION_REG  ; прерывания по фронту сигнала на RB0
                                                                                                                                                                                                                                                  ; TMR0 инкрементируется от внутреннего тактового
                                                                                                                                                                                                                                                  ; сигнала. Предделитель 1:16
                                                                                                                                                                                                                                      BCF STATUS, RP0 ; Банк 0
                                                                                                                                                                                                                                  OVFL_WAIT
                                                                                                                                                                                                                                      BTFSS   INTCON, T0IF
                                                                                                                                                                                                                                      GOTO    OVFL_WAIT
                                                                                                                                                                                                                                      CLRWDT
                                                                                                                                                                                                                                      DECFSZ  COUNTER, 1
                                                                                                                                                                                                                                      GOTO    NEXT_WT
                                                                                                                                                                                                                                      RETURN
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                      END


                                                                                                                                                                                                                                AT8051
                                                                                                                                                                                                                                ExpandedWrap disabled
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  ; Программа mul.asm
                                                                                                                                                                                                                                  ;
                                                                                                                                                                                                                                  ; Выполняет произведение трёх двухбайтных чисел. Все числа находятся
                                                                                                                                                                                                                                  ; в РПД. Результат помещает в ВПД.
                                                                                                                                                                                                                                  ;
                                                                                                                                                                                                                                  ; Составлена Серохвостовым Антоном 3.03.06
                                                                                                                                                                                                                                  ; Последняя доработка 4.03.06
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                   main segment code
                                                                                                                                                                                                                                   out    segment xdata
                                                                                                                                                                                                                                   rseg   out
                                                                                                                                                                                                                                   rez:       ds  20h ; Место под результат
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                   fig1 data 2Dh      ; Первый множитель
                                                                                                                                                                                                                                   fig2   data 3Dh        ; Второй множитель
                                                                                                                                                                                                                                   fig3 data 4Dh      ; Третий множитель
                                                                                                                                                                                                                                   temp   data 5Bh        ; Промежуточное произведение
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                   figA data 61h      ; Адрес первого множителя
                                                                                                                                                                                                                                   figB data 62h  ; Адрес второго множителя
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                   rseg main
                                                                                                                                                                                                                                   cseg at 20h
                                                                                                                                                                                                                                      ;-------- Очистить место под результат
                                                                                                                                                                                                                                          mov dptr, #rez
                                                                                                                                                                                                                                          mov R1, #4
                                                                                                                                                                                                                                          call    Clear
                                                                                                                                                                                                                                      ;--------Перемножение rez=fig1*fig2
                                                                                                                                                                                                                                          mov dptr, #rez
                                                                                                                                                                                                                                          mov A, #fig1
                                                                                                                                                                                                                                          mov figA, A     ; Передать адрес первого множителя (fig1)
                                                                                                                                                                                                                                          mov A, #fig2
                                                                                                                                                                                                                                          mov figB, A         ; Передать адрес второго множителя (fig2)
                                                                                                                                                                                                                                          call    xMul
                                                                                                                                                                                                                                      ;--------Пересылка rez из ВПД в РПД
                                                                                                                                                                                                                                          mov dptr, #rez
                                                                                                                                                                                                                                          mov R0, #temp
                                                                                                                                                                                                                                  next:
                                                                                                                                                                                                                                          movx    A, @dptr
                                                                                                                                                                                                                                          mov @R0, A
                                                                                                                                                                                                                                          inc dptr
                                                                                                                                                                                                                                          inc R0
                                                                                                                                                                                                                                          mov A, R0               ; A - адрес текущего байт
                                                                                                                                                                                                                                          anl A, #0Fh
                                                                                                                                                                                                                                          xrl A, #0Fh
                                                                                                                                                                                                                                          jnz next
                                                                                                                                                                                                                                      ;-------- Очистить место под результат
                                                                                                                                                                                                                                          mov dptr, #rez
                                                                                                                                                                                                                                          mov R1, #6
                                                                                                                                                                                                                                          call    Clear
                                                                                                                                                                                                                                      ;--------Перемножение rez = (fig1*fig2)*fig3
                                                                                                                                                                                                                                          mov dptr, #rez
                                                                                                                                                                                                                                          mov A, #temp
                                                                                                                                                                                                                                          mov figA, A     ; Передать адрес первого множителя (fig1)
                                                                                                                                                                                                                                          mov A, #fig3
                                                                                                                                                                                                                                          mov figB, A         ; Передать адрес второго множителя (fig2)
                                                                                                                                                                                                                                          call    xMul
                                                                                                                                                                                                                                          jmp $
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  ; Чистит цепочку в памяти
                                                                                                                                                                                                                                  ; ВХОД: dptr - указатель на первый байт цепочки
                                                                                                                                                                                                                                  ;       R1   - размер цепочки
                                                                                                                                                                                                                                  ; ВЫХОД: Цепочка забитая нулями
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  Clear:
                                                                                                                                                                                                                                          mov A, #00
                                                                                                                                                                                                                                  more:   movx    @dptr, A
                                                                                                                                                                                                                                          inc dptr
                                                                                                                                                                                                                                          dec R1
                                                                                                                                                                                                                                          cjne    R1, #00, more
                                                                                                                                                                                                                                          ret
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  ; Перемножает два длинных числа зацепленных за границу параграфа
                                                                                                                                                                                                                                  ; (байты распологаются от младшего к старшему)
                                                                                                                                                                                                                                  ; ВХОД: figA - адрес первого числа
                                                                                                                                                                                                                                  ;       figB - адрес второго числа
                                                                                                                                                                                                                                  ;       rez - адрес под результат (должен быть забит нулями перед входом)
                                                                                                                                                                                                                                  ;     size - размерность чисел
                                                                                                                                                                                                                                  ; ВЫХОД: DPTR - указатель на произведение двух чисел
                                                                                                                                                                                                                                  ;-------------------------------------------------------------------------
                                                                                                                                                                                                                                  xMul:
                                                                                                                                                                                                                                      ;--------Определяем указатель на конец числа A
                                                                                                                                                                                                                                          mov A, figA
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                          mov R7, #00         ; Смещение частичных сумм
                                                                                                                                                                                                                                          mov dptr, #rez
                                                                                                                                                                                                                                  nextByteA:
                                                                                                                                                                                                                                     ;--------Проверяем, пройдено ли всё A
                                                                                                                                                                                                                                          mov R0, A               ; A - адрес текущего байт
                                                                                                                                                                                                                                          anl A, #0Fh
                                                                                                                                                                                                                                          xrl A, #0Fh
                                                                                                                                                                                                                                          jz      complete
                                                                                                                                                                                                                                      ;--------
                                                                                                                                                                                                                                          mov A, R7
                                                                                                                                                                                                                                          mov R6, A               ; Смещение частичной суммы
                                                                                                                                                                                                                                          mov R5, #0          ; Остаток предыдущего сложения
                                                                                                                                                                                                                                      ;--------Определяем указатель на конец числа B
                                                                                                                                                                                                                                          mov A, figB
                                                                                                                                                                                                                                  nextByteB:
                                                                                                                                                                                                                                     ;--------Проверяем пройдено ли всё число B
                                                                                                                                                                                                                                          mov R1, A               ; A - адрес текущего байта
                                                                                                                                                                                                                                          anl A, #0Fh
                                                                                                                                                                                                                                          xrl A, #0Fh
                                                                                                                                                                                                                                          jz      nextB
                                                                                                                                                                                                                                      ;--------Берём цифры из памяти
                                                                                                                                                                                                                                          movx    A, @dptr
                                                                                                                                                                                                                                          mov R2, A               ; Взять текущий байт результата
                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                          mov B, @R1          ; Взять цифру числа B
                                                                                                                                                                                                                                          mov A, @R0          ; Взять цифру числа A
                                                                                                                                                                                                                                      ;--------Умножение, учёт остатка и переноса
                                                                                                                                                                                                                                          mul AB
                                                                                                                                                                                                                                          add A, R2               ; Добавить текущий байт результата
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                          xch A, B
                                                                                                                                                                                                                                          addc    A, #00
                                                                                                                                                                                                                                          xch A, B                ; Добавляем перенос к остатку
                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                          add A, R5               ; Добавить остаток к текущему байту
                                                                                                                                                                                                                                          movx    @dptr, A            ; Обновить результат
                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                          mov A, B
                                                                                                                                                                                                                                          addc    A, #00          ; Добавить перенос к остатку
                                                                                                                                                                                                                                          mov R5, A               ; Сохранить остаток для следующей итерации
                                                                                                                                                                                                                                      ;--------Переход на следующую цифру числа B
                                                                                                                                                                                                                                          inc R6                  ; Переход к следующему байту частичной суммы
                                                                                                                                                                                                                                          inc R1                  ; Переход к следующему байту числа B
                                                                                                                                                                                                                                          inc dptr                ; Переход к следующему байту результата
                                                                                                                                                                                                                                          mov A, R1
                                                                                                                                                                                                                                          jmp nextByteB
                                                                                                                                                                                                                                      ;--------Подготовка к вычислению следующей частичной суммы
                                                                                                                                                                                                                                  nextB:
                                                                                                                                                                                                                                          inc R0                  ; Перейти к следующему байту числа A
                                                                                                                                                                                                                                          inc R7                  ; Задать смещение частичной суммы
                                                                                                                                                                                                                                          mov A, R5
                                                                                                                                                                                                                                          movx    @dptr, A            ; Сохранить в старшем разряде остаток
                                                                                                                                                                                                                                          mov dptr, #rez
                                                                                                                                                                                                                                          mov A, R7
                                                                                                                                                                                                                                      ;--------Организовать смещение частичной суммы
                                                                                                                                                                                                                                  move:
                                                                                                                                                                                                                                          inc dptr
                                                                                                                                                                                                                                          dec A
                                                                                                                                                                                                                                          jnz move
                                                                                                                                                                                                                                          mov A, R0      
                                                                                                                                                                                                                                          jmp nextByteA       ; Обработать следующий байт числа A
                                                                                                                                                                                                                                  complete:
                                                                                                                                                                                                                                          ret
                                                                                                                                                                                                                                          end


                                                                                                                                                                                                                                Altera Max Plus
                                                                                                                                                                                                                                ExpandedWrap disabled
                                                                                                                                                                                                                                  SUBDESIGN DopCode
                                                                                                                                                                                                                                  (
                                                                                                                                                                                                                                    i[8..1]: BIDIR;
                                                                                                                                                                                                                                    en_din, clk, cs: INPUT;
                                                                                                                                                                                                                                  )
                                                                                                                                                                                                                                  VARIABLE
                                                                                                                                                                                                                                    tt[8..1]: DFFE;   --Для защелки данных
                                                                                                                                                                                                                                    inv[8..1]: NODE;  --Инверсия входных данных
                                                                                                                                                                                                                                    one[8..1]: NODE;  --Единица для сложения
                                                                                                                                                                                                                                    cr[8..1]: NODE;   --Флаги переносов
                                                                                                                                                                                                                                    t[8..1]: NODE;    --Дополнительный код
                                                                                                                                                                                                                                  BEGIN
                                                                                                                                                                                                                                    one[] = B"00000001";
                                                                                                                                                                                                                                  --Защеклкивание данных
                                                                                                                                                                                                                                    tt[].d = i[];
                                                                                                                                                                                                                                    tt[].clk = clk;
                                                                                                                                                                                                                                    tt[].ena = cs & !en_din;
                                                                                                                                                                                                                                  --Инверсия
                                                                                                                                                                                                                                    inv[] = !tt[];  
                                                                                                                                                                                                                                  --Формируем флаги переносов
                                                                                                                                                                                                                                    cr[1] = B"0";
                                                                                                                                                                                                                                    FOR j IN 2 TO 8 GENERATE
                                                                                                                                                                                                                                      cr[j] = one[j-1] & inv[j-1] # (one[j-1] $ inv[j-1]) & cr[j-1];
                                                                                                                                                                                                                                    END GENERATE;
                                                                                                                                                                                                                                  --Суммируем разряды с учетом флагов переноса
                                                                                                                                                                                                                                    FOR j IN 1 TO 8 GENERATE
                                                                                                                                                                                                                                      t[j].in = (one[j] $ inv[j]) $ cr[j];
                                                                                                                                                                                                                                    END GENERATE;
                                                                                                                                                                                                                                  --Выдача результата на шину данных
                                                                                                                                                                                                                                    FOR j IN 1 TO 8 GENERATE
                                                                                                                                                                                                                                      i[j] = TRI(.in = t[j], .oe = cs & en_din);
                                                                                                                                                                                                                                    END GENERATE;
                                                                                                                                                                                                                                  END;


                                                                                                                                                                                                                                В частности это и с STL так было, на которое так сильно г-н Киллер напирает. А вернее даже не с STL, а со способом реализации библиотек, наподобие STL. Потому что нас учили прежде всего технологии создавать, а не пользоваться ими. Мне в частности в этом отношении много дала книжка Хариви и Пола Дейтл. Более красивых классов чем там, я не видел.

                                                                                                                                                                                                                                О форумных перепалках

                                                                                                                                                                                                                                Кстати, интересный момент. Когда возникает конфликт, как в этой теме, это показатель того, что проблемы в характере есть у обоих собеседников – потому что крючок может только за крючок зацепиться. Но когда мы сможем не цепляться, а просто задействовать индивидуальные особенности друг друга, то действительно сможем что-то вместе интересное делать. Потому что именно на стыке противоречий и рождаются красивые решения: маленькая ручка – долго пишет; тонкий носитель информации – большой объём; лёгкие дышащие кроссовки – сохраняют тепло зимой. Если же мы будем продолжать цепляться, то просто будет куча перепалок и священных войн, и «воз и ныне там».

                                                                                                                                                                                                                                Поэтому давайте просто чем-то хорошим делиться, а свои дурные характеры оставим при себе. У нас было время показать эту дурную сторону себя друг другу, так давайте теперь позволим ей просто быть. Так, глядишь, за позитивным разговором, она и уйдёт.

                                                                                                                                                                                                                                PS. Ну и на сладкое – ещё один код, надеюсь, не на растерзание. Мне самому он очень нравится – это набор подпрограмм для работы с большими числами:

                                                                                                                                                                                                                                ExpandedWrap disabled
                                                                                                                                                                                                                                                //Программа Arifm.cpp
                                                                                                                                                                                                                                                //Осущетсвляет арифметические действия
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                //Составлена Серохвостовым Антоном 8.11.04
                                                                                                                                                                                                                                                //Последняя доработка 8.11.04              
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                  #include <iostream.h>
                                                                                                                                                                                                                                  #include <string.h>
                                                                                                                                                                                                                                  #include <stdio.h>
                                                                                                                                                                                                                                  #include <conio.h>
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                  #define FIG_SIZE 100
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                  char* Invert(char *s)
                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                    int i;
                                                                                                                                                                                                                                    char *tmp;
                                                                                                                                                                                                                                    tmp = new char[FIG_SIZE]; tmp[0] = 0;
                                                                                                                                                                                                                                    if (s[0])
                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                      for (i = 0; i < strlen(s)-1; i++)
                                                                                                                                                                                                                                        tmp[i] = s[strlen(s)-i-1];
                                                                                                                                                                                                                                      if (s[0] == '-')
                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                        strcpy(s, tmp);
                                                                                                                                                                                                                                        strcpy(tmp, "-");
                                                                                                                                                                                                                                        strcat(tmp, s);
                                                                                                                                                                                                                                      } //if (s[0] ...
                                                                                                                                                                                                                                      else tmp[i] = s[0];
                                                                                                                                                                                                                                      tmp[i+1] = 0;
                                                                                                                                                                                                                                    } //if (s[0]) ...
                                                                                                                                                                                                                                    return tmp;
                                                                                                                                                                                                                                  } //Invert
                                                                                                                                                                                                                                  /**********************************/
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                  char* DelZero(char *s)
                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                    int i = 0;
                                                                                                                                                                                                                                    while (s[i++] == '0');
                                                                                                                                                                                                                                    strcpy(s, s+i-1);
                                                                                                                                                                                                                                    return s;
                                                                                                                                                                                                                                  } //DelZero
                                                                                                                                                                                                                                  /**********************************/
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                  void Add(char* a, char* b, char* &c)
                                                                                                                                                                                                                                  /*Складывает два числа представленные строками*/
                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                    int i = 0, j = 0, k = 0,  //Индексы цифр в числах a, b и c
                                                                                                                                                                                                                                    CR = 0,           //Перенос в старший разряд
                                                                                                                                                                                                                                    Sm;               //Результат очередной итерации
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                    c[0] = 0;
                                                                                                                                                                                                                                    a = Invert(DelZero(a)); b = Invert(DelZero(b));
                                                                                                                                                                                                                                    while (a[i] || b[j])
                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                      if (a[i])           //В первом числе есть еще разряд?
                                                                                                                                                                                                                                      {               //Да - взять его
                                                                                                                                                                                                                                        Sm = int(a[i++])-0x30;
                                                                                                                                                                                                                                        if (b[j])             //Во втором числе тоже есть разряды?
                                                                                                                                                                                                                                      Sm = Sm+int(b[j++])-0x30;       //Да - суммировать эти разряды
                                                                                                                                                                                                                                      } //if (a[i]) ...
                                                                                                                                                                                                                                      else Sm = int(b[j++])-0x30; //Нет - взять разряд из второго числа
                                                                                                                                                                                                                                      Sm = Sm+CR;         //Добавить перенос
                                                                                                                                                                                                                                      c[k++] = Sm%10+0x30; c[k] = 0;
                                                                                                                                                                                                                                      CR = Sm/10;
                                                                                                                                                                                                                                    } //while (a[i] ...
                                                                                                                                                                                                                                    if (CR)   //Перенос остался?
                                                                                                                                                                                                                                    {             //Да - учесть его
                                                                                                                                                                                                                                      c[k++] = CR; c[k] = 0;
                                                                                                                                                                                                                                    } //if (CR) ...
                                                                                                                                                                                                                                    c = DelZero(Invert(c));
                                                                                                                                                                                                                                  } //Add
                                                                                                                                                                                                                                  /**********************************/
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                  void Sub(char* a, char* b, char* &c)
                                                                                                                                                                                                                                  /*Вычетает b из a*/
                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                    int i = 0, j = 0, k = 0,  //Индексы чисел a, b и c соответственно
                                                                                                                                                                                                                                        B0 = 0,           //Заем из старшего разряда
                                                                                                                                                                                                                                        Sm;           //Результат очередной итерации
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                    c[0] = 0;
                                                                                                                                                                                                                                    a = Invert(DelZero(a)); b = Invert(DelZero(b));
                                                                                                                                                                                                                                    while (a[i] || b[j] || B0)
                                                                                                                                                                                                                                      if (a[i])       //Результат может быть положительным
                                                                                                                                                                                                                                      {           //Да - приступить к следующей итерации
                                                                                                                                                                                                                                   /***Сложение очередных разрядов***/
                                                                                                                                                                                                                                        b[j] ? (Sm = int(a[i])-int(b[j++])-B0)  //Взять разряд вычитаемого
                                                                                                                                                                                                                                         : (Sm = int(a[i])-0x30-B0);        //Пропустить, если его нет
                                                                                                                                                                                                                                        i++;
                                                                                                                                                                                                                                   /***Обработка переноса***/
                                                                                                                                                                                                                                        Sm >= 0 ? B0 = 0 : (Sm = Sm+10, B0 = 1);
                                                                                                                                                                                                                                   /******/
                                                                                                                                                                                                                                        c[k++] = Sm+0x30; c[k] = 0;
                                                                                                                                                                                                                                      } //if (a[i])
                                                                                                                                                                                                                                      else                //Нет - поменять числа местами и все заново
                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                        i = 0; j = 0; k = 1; B0 = 0;
                                                                                                                                                                                                                                        char *tmp = a;
                                                                                                                                                                                                                                        a = b; b = tmp;
                                                                                                                                                                                                                                        c[0] = '-'; c[1] = 0;
                                                                                                                                                                                                                                      } //else ...
                                                                                                                                                                                                                                    c = DelZero(Invert(c));
                                                                                                                                                                                                                                  } //Sub
                                                                                                                                                                                                                                  /**********************************/
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                  void Mul(char* a, char* b, char* &c)
                                                                                                                                                                                                                                  /***Перемножает два числа представленные строками***/
                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                    int i = 0,        //Индекс множителя
                                                                                                                                                                                                                                        k,        //Индекс множимого
                                                                                                                                                                                                                                        Ost = 0;      //Остаток предыдущей итерации
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                    c[0] = 0;
                                                                                                                                                                                                                                    a = Invert(DelZero(a)); b = Invert(DelZero(b));
                                                                                                                                                                                                                                    while (b[i])      //Пройдены все числа делителя?
                                                                                                                                                                                                                                    {                     //Нет - получить частичную сумму
                                                                                                                                                                                                                                      k = 0;
                                                                                                                                                                                                                                      while (a[k])       //Все цифры множимого пройдены?
                                                                                                                                                                                                                                      {              //Нет - формировать частичную сумму
                                                                                                                                                                                                                                        if (!c[i+k])      //Следующий разряд произведения есть?
                                                                                                                                                                                                                                        {             //Нет - добавить его
                                                                                                                                                                                                                                      c[i+k] = '0';
                                                                                                                                                                                                                                      c[i+k+1] = 0;
                                                                                                                                                                                                                                        } //if (!c[i+k] ...
                                                                                                                                                                                                                                        Ost = int(c[i+k])+(int(a[k])-0x30)*(int(b[i])-0x30)-0x30+Ost;
                                                                                                                                                                                                                                        c[i+k] = Ost%10+0x30;
                                                                                                                                                                                                                                        Ost = Ost/10; k++;
                                                                                                                                                                                                                                      } //while a[k]) ...
                                                                                                                                                                                                                                      if (Ost)     //На текущей итерации есть остаток?
                                                                                                                                                                                                                                      {            //Да - добавляем его
                                                                                                                                                                                                                                        c[i+k] = Ost+0x30;
                                                                                                                                                                                                                                        Ost = 0; c[i+k+1] = 0;
                                                                                                                                                                                                                                      } //if (Ost) ...
                                                                                                                                                                                                                                      i++;
                                                                                                                                                                                                                                    } //while (b[i]) ...
                                                                                                                                                                                                                                    if (Ost)     //Учтены все разряды?
                                                                                                                                                                                                                                    {        //Нет - учесть остаток
                                                                                                                                                                                                                                      c[i+k] = Ost+0x30; c[i+k+1] = 0;
                                                                                                                                                                                                                                    } //if (Ost) ...
                                                                                                                                                                                                                                    c = DelZero(Invert(c));
                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                  /**********************************/
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                  void Dvs(char *a, char *b, char* &c, char* &Ost)
                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                    char *f;      //Частное
                                                                                                                                                                                                                                    int  i = 0,       //Индекс делимого
                                                                                                                                                                                                                                         Del, j = 0, k = 0;
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                    a = DelZero(a); b = DelZero(b);
                                                                                                                                                                                                                                    c[0] = 0;
                                                                                                                                                                                                                                    f = new char[FIG_SIZE]; Ost[0] = 0;
                                                                                                                                                                                                                                    if (b[0])
                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                      while (a[i])
                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                        Ost[strlen(Ost)] = a[i++];
                                                                                                                                                                                                                                        Ost[++j] = 0;
                                                                                                                                                                                                                                        Sub(Ost, b, f); Del = 0;
                                                                                                                                                                                                                                        while (f[0] != '-')
                                                                                                                                                                                                                                        {
                                                                                                                                                                                                                                      Sub(Ost, b, f);
                                                                                                                                                                                                                                      if (f[0] != '-')
                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                        strcpy(Ost, f); Del++;
                                                                                                                                                                                                                                      } //if (f[0] ...
                                                                                                                                                                                                                                        } //while (f[0] ...
                                                                                                                                                                                                                                        c[k++] = Del+0x30;
                                                                                                                                                                                                                                      } //while (a[i]) ...
                                                                                                                                                                                                                                    } //if (b[0]) ...
                                                                                                                                                                                                                                    delete f; c[j] = 0;
                                                                                                                                                                                                                                    c = DelZero(c); Ost = DelZero(Ost);
                                                                                                                                                                                                                                  } //Dvs
                                                                                                                                                                                                                                  /**********************************/
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                  void main()
                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                    int  i, j;
                                                                                                                                                                                                                                    char op;
                                                                                                                                                                                                                                    char *a = new char[FIG_SIZE]; a[0] = 0;
                                                                                                                                                                                                                                    char *b = new char[FIG_SIZE]; b[0] = 0;
                                                                                                                                                                                                                                    char *c = new char[FIG_SIZE]; c[0] = 0;
                                                                                                                                                                                                                                    char *d = new char[FIG_SIZE]; d[0] = 0;
                                                                                                                                                                                                                                    char *str; str = new char[2*FIG_SIZE+1];
                                                                                                                                                                                                                                    clrscr();
                                                                                                                                                                                                                                    cout<<"Калькулятор больших чисел:\n";
                                                                                                                                                                                                                                    cout<<"использование: <число 1>операция<число 2>\n";
                                                                                                                                                                                                                                    cout<<"-операция: +, -, *, /\n";
                                                                                                                                                                                                                                    cout<<"\"exit\" - прекращение работы\n";
                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                    do {
                                                                                                                                                                                                                                         cout<<">";
                                                                                                                                                                                                                                         scanf("%s", str);
                                                                                                                                                                                                                                         i = 0; j = 0;
                                                                                                                                                                                                                                         while (str[i] && str[i] != '-' && str[i] != '+' &&
                                                                                                                                                                                                                                            str[i] != '/' && str[i] != '*')
                                                                                                                                                                                                                                       a[j++] = str[i++];
                                                                                                                                                                                                                                         a[j] = 0;
                                                                                                                                                                                                                                         op = str[i++];
                                                                                                                                                                                                                                         j = 0;
                                                                                                                                                                                                                                         while (str[i])
                                                                                                                                                                                                                                       b[j++] = str[i++];
                                                                                                                                                                                                                                         b[j] = 0;
                                                                                                                                                                                                                                         switch (op)
                                                                                                                                                                                                                                         {
                                                                                                                                                                                                                                       case '+': Add(a, b, c); break;
                                                                                                                                                                                                                                       case '-': Sub(a, b, c); break;
                                                                                                                                                                                                                                       case '*': Mul(a, b, c); break;
                                                                                                                                                                                                                                       case '/': Dvs(a, b, c, d);
                                                                                                                                                                                                                                         }
                                                                                                                                                                                                                                         cout<<" = "<<c<<'\n';
                                                                                                                                                                                                                                         if (op == '/')
                                                                                                                                                                                                                                       cout<<"Остаток = "<<d<<'\n';
                                                                                                                                                                                                                                       } while (strcmp(str, "exit"));
                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                Подпись выключена.
                                                                                                                                                                                                                                  Цитата Серохвостов Антон @
                                                                                                                                                                                                                                  Вам что мама в детстве мало любви дала, что вы пытаетесь самоутвердиться за счёт опускания других

                                                                                                                                                                                                                                  Тут говорят как оно есть на самом деле. Вот и все.

                                                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                                                  Цитата Серохвостов Антон @
                                                                                                                                                                                                                                  Вы бы лучше какой-нибудь красивый код привели, который в сравнении с приведёнными мной кодами, по какому-то параметру качественно выделялся, и я бы вместе с вами порадовался его красивости.

                                                                                                                                                                                                                                  Практически все отписавшиеся тут участники неоднократно выкладывали свой код. Учимся искать по сообщениям пользователя.

                                                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                                                  Цитата Серохвостов Антон @
                                                                                                                                                                                                                                  Но только будьте готовы, что на ваш красивый код налетит стая чаек и разнесёт его в пух и прах.

                                                                                                                                                                                                                                  Я так не думаю.

                                                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                                                  Цитата Серохвостов Антон @
                                                                                                                                                                                                                                  Потому что недостатки есть – везде.

                                                                                                                                                                                                                                  Есть. Только у новичков и больше на порядок.

                                                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                                                  Цитата Серохвостов Антон @
                                                                                                                                                                                                                                  Проблема – увидеть достоинства.

                                                                                                                                                                                                                                  Не увидел, увы.

                                                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                                                  Цитата Серохвостов Антон @
                                                                                                                                                                                                                                  Но если эти красивые решения приводят только к гордости, то грош им цена.

                                                                                                                                                                                                                                  Нет, эти красивые решения приводят к тому, что кто-то работает программистом, а кто-то перекладывает бумажки в офисе.

                                                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                                                  Цитата Серохвостов Антон @
                                                                                                                                                                                                                                  Я бы например никогда не пошёл учиться к человеку, который надменно низвергает «более глупых, чем он» людей, будь даже он семи пядей во лбу.

                                                                                                                                                                                                                                  Я никого не "низвергаю", я говорю как есть.

                                                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                                                  Цитата Серохвостов Антон @
                                                                                                                                                                                                                                  см. видео-лекцию «10 заповедей на пути процветания и счастья»

                                                                                                                                                                                                                                  Да вот заняться мен больше нечем, как смотреть лекции всяких шарлатанов.

                                                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                                                  Цитата Серохвостов Антон @
                                                                                                                                                                                                                                  а со способом реализации библиотек, наподобие STL.

                                                                                                                                                                                                                                  С нетерпением ждем от вас новую реализацию STL.

                                                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                                                  Цитата Серохвостов Антон @
                                                                                                                                                                                                                                  Поэтому давайте просто чем-то хорошим делиться

                                                                                                                                                                                                                                  Давайте, но пока я в этой теме ничего интересного, кроме кучки лаб на изъезженные темы, не увидел. Причем качество кода соответствует рядовому студенту, что видимо и помогает писать им лабы.
                                                                                                                                                                                                                                  Сообщение отредактировано: shm -
                                                                                                                                                                                                                                  Цитата TheMachine @
                                                                                                                                                                                                                                  т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                                    Цитата Серохвостов Антон @
                                                                                                                                                                                                                                    Например, на лабораторных надо было выполнять задания на языках Ассемблер, Форт, и на куче разных микроконтроллерных ассемблерах, но на лекциях информация о них не давалась – надо было искать её самим. Т.е. по сути изучать языки самим. И благодаря этому в памяти так называемых «остаточных знаний» больше осело.

                                                                                                                                                                                                                                    ага, у нас тоже такое было, и тоже по микроконтроллерам. только это не "изучение самому" и "багаж остаточных знаний", а лень преподавателя подготовить материал. зачем такие нужны? задания выдавать? так то большого ума не надо, научить чему-то гораздо труднее. причем научить актуальному, а не устаревшему и умирающему.
                                                                                                                                                                                                                                      Исходники для МК комментировать не буду, не потому, что не могу, а просто лень. Сишный откомментирую:
                                                                                                                                                                                                                                      1. В коде куча new и всего 1 delete, причем неправильно использованный.
                                                                                                                                                                                                                                      ExpandedWrap disabled
                                                                                                                                                                                                                                        f = new char[FIG_SIZE];
                                                                                                                                                                                                                                        ...
                                                                                                                                                                                                                                        delete f;

                                                                                                                                                                                                                                      Тут UB. Вопрос: как исправить этот код, чтобы он соответствовал Стандарту?
                                                                                                                                                                                                                                      Сообщение отредактировано: shm -
                                                                                                                                                                                                                                      Цитата TheMachine @
                                                                                                                                                                                                                                      т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                                        Цитата Серохвостов Антон @
                                                                                                                                                                                                                                        ещё один код

                                                                                                                                                                                                                                        да не позорьтесь уже, даже 10 лет назад это было не круто ;)
                                                                                                                                                                                                                                          2.
                                                                                                                                                                                                                                          ExpandedWrap disabled
                                                                                                                                                                                                                                            for (i = 0; i < strlen(s)-1; i++)
                                                                                                                                                                                                                                                      tmp[i] = s[strlen(s)-i-1];
                                                                                                                                                                                                                                                    if (s[0] == '-')
                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                      strcpy(s, tmp);
                                                                                                                                                                                                                                                      strcpy(tmp, "-");
                                                                                                                                                                                                                                                      strcat(tmp, s);
                                                                                                                                                                                                                                                    } //if (s[0] ...

                                                                                                                                                                                                                                          Это таак оптимально...
                                                                                                                                                                                                                                          Цитата TheMachine @
                                                                                                                                                                                                                                          т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                                            как-то уныло, Серохвостов Антон, совершенно вы меня не радуете. неужели я зря в вас верил, а вы такой же как все? ну право же слово, зачем искать в ужасном коде достоинства, когда можно поискать их в достойном коде и, заодно, научиться чему-то полезному?
                                                                                                                                                                                                                                            я понимаю, что вам не повезло с учителями, которые оказались неспособны научить вас хоть чему-то полезному и значимому и искренне рад, что вы смиренно воспринимаете их недостатки, но зачем вы наделяете их качествами, которых они лишены? как можно считать достойными специалистами людей, которые получив благодатный материал дают на выходе результат вроде вас, слабовладеющий предметом, невосприимчивый к справедливой критике.
                                                                                                                                                                                                                                            зы и, да, косяки, а не касяки. ошибка показательная, вот в ней весь вы и есть. это так же, как
                                                                                                                                                                                                                                            Цитата Серохвостов Антон @
                                                                                                                                                                                                                                            Что касается задачи про шары, то она в принципе не очень подходит для того, чтобы её ложить на алгоритмический язык.
                                                                                                                                                                                                                                            ложить — это именно то, что вы делаете, а вы именно лажаете. просто опять неправильно пишете
                                                                                                                                                                                                                                            Цитата usrjava @
                                                                                                                                                                                                                                            Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                                                                                              И вообще работа с длинными числами в текстовом виде - школьный подход.
                                                                                                                                                                                                                                              Цитата TheMachine @
                                                                                                                                                                                                                                              т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                                                Цитата shm @
                                                                                                                                                                                                                                                И вообще работа с длинными числами в текстовом виде - школьный подход.

                                                                                                                                                                                                                                                блин, а ведь есть у меня в загашнике подобный опыт. правда мне там надо было только единичку прибавлять и преобразовывать в BigDecimal было накладнее, чем стринги складывать. интересно было бы сейчас на тот код посмотреть
                                                                                                                                                                                                                                                Цитата usrjava @
                                                                                                                                                                                                                                                Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                                                                                                  3. Нигде корерктно не обрабатываются отрицательные числа.

                                                                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                                                                  Цитата zera @
                                                                                                                                                                                                                                                  там надо было только единичку прибавлять

                                                                                                                                                                                                                                                  Это нормально. А вот умножать большие числа в текстовом виде - не очень.

                                                                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                                                                  4. В коде символьные константы присутствуют вперемешку с их числовыми значениями в кодовой странице.
                                                                                                                                                                                                                                                  Сообщение отредактировано: shm -
                                                                                                                                                                                                                                                  Цитата TheMachine @
                                                                                                                                                                                                                                                  т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                                                    Цитата shm @
                                                                                                                                                                                                                                                    Причем качество кода соответствует рядовому студенту, что видимо и помогает писать им лабы.

                                                                                                                                                                                                                                                    Не рядовому, а весьма бездарному :)
                                                                                                                                                                                                                                                    Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                    Мне самому он очень нравится – это набор подпрограмм для работы с большими числами:

                                                                                                                                                                                                                                                    А почему это в виде класса с перегруженными операторами не оформить?
                                                                                                                                                                                                                                                    Да и пишутся все эти операции, кроме деления, даже если писать точно так же - из массива символов в массив символов - раза в три короче.
                                                                                                                                                                                                                                                    Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                    Если уж касяки разбирать, то главный касяк – это дурной характер и блуждание ума, которые здесь проявили и я, и значительная часть собеседников.

                                                                                                                                                                                                                                                    Видимо, вы и основную работу - писать тексты - делаете не очень хорошо, судя по грамматическим ошибкам :D

                                                                                                                                                                                                                                                    Добавлено
                                                                                                                                                                                                                                                    Цитата shm @
                                                                                                                                                                                                                                                    И вообще работа с длинными числами в текстовом виде - школьный подход.

                                                                                                                                                                                                                                                    Ага. Делал так как раз в школе :D

                                                                                                                                                                                                                                                    Добавлено
                                                                                                                                                                                                                                                    Цитата zera @
                                                                                                                                                                                                                                                    правда мне там надо было только единичку прибавлять и преобразовывать в BigDecimal было накладнее, чем стринги складывать.

                                                                                                                                                                                                                                                    Ну это совсем просто же. Я бы и сейчас так же сделал, наверное :)
                                                                                                                                                                                                                                                    Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                                                                      5. Деление вылезает за границы выделенной памяти.

                                                                                                                                                                                                                                                      Добавлено
                                                                                                                                                                                                                                                      Антон, хватит или продолжать список?
                                                                                                                                                                                                                                                      Цитата TheMachine @
                                                                                                                                                                                                                                                      т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                                                        Цитата shm @
                                                                                                                                                                                                                                                        А вот умножать большие числа в текстовом виде - не очень.

                                                                                                                                                                                                                                                        В текстовом - да, накладно, а вот если массив интов юзать - у меня как раз на эту тему были интересы в универе, созрел, класс больших чисел написал. А щас на него смотрю - и стыдно становица самому даже :(
                                                                                                                                                                                                                                                          Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                          В виду того, что не все собеседники соглашаются перевести беседу в позитивный ключ, я буду отвечать только на те сообщения, на которые считаю нужным
                                                                                                                                                                                                                                                          Понты гнуть не рано начал? Хакер... Пока что ты своего научного руководителя позоришь!
                                                                                                                                                                                                                                                            вот кстати о хакере.
                                                                                                                                                                                                                                                            а почему хакер-то?
                                                                                                                                                                                                                                                            Цитата usrjava @
                                                                                                                                                                                                                                                            Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                                                                                                              А тему - ИМХО - в МногоШум.
                                                                                                                                                                                                                                                                Цитата #SI# @
                                                                                                                                                                                                                                                                А тему - ИМХО - в МногоШум.

                                                                                                                                                                                                                                                                Пришли к выводу что там злойадмин.
                                                                                                                                                                                                                                                                  Ну тогда - в Корзину!
                                                                                                                                                                                                                                                                    Вообще, слово хакер (hack - рубить) изначально означало "программиста", который брал чужие программы, выдирал из них куски кода, не особо разбираясь, как эти куски работают, компоновал из них как-то работающую программу и отдавал заказчику. Или переделывал подобным образом программу, чтобы добавить в неё новую функциональность. Такой программист "работал" обычно много быстрее нормального программиста, хотя качество выдаваемого им продукта оказывалось довольно невысоким.
                                                                                                                                                                                                                                                                    Позднее этим же словом начали называться люди, способные быстро разобраться в чужом коде (даже в двоичном) и способные таким образом взломать защиту, воспользоваться неочевидными возможностями и т.п. Позднее к хакерам добавили и тех, кто просто знает все эти возможности и может ими воспользоваться.

                                                                                                                                                                                                                                                                    Так может ТС, называя себя потомственным хакером, имеет в виду первоначальное значение слова?
                                                                                                                                                                                                                                                                    Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
                                                                                                                                                                                                                                                                      Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                      В частности это и с STL так было, на которое так сильно г-н Киллер напирает.

                                                                                                                                                                                                                                                                      Пожалуйста, не могли бы вы - обращаться ко мне по моему форумнуму нику, как он написан в моем профиле? Вот эти вот - "г-н Киллер" - меня очень бесит, зовите меня просто KILLER. Я же ваш ник не коверкал и не искажал нигде, и в мыслях такого не было, так зачем вы это делаете?
                                                                                                                                                                                                                                                                      Сообщение отредактировано: KILLER -
                                                                                                                                                                                                                                                                        Цитата #SI# @
                                                                                                                                                                                                                                                                        Ну тогда - в Корзину!

                                                                                                                                                                                                                                                                        Там отвечать нельзя... :( В общем, будем поднимать тематику и культуру алгоритмизирования.

                                                                                                                                                                                                                                                                        Коалыч! Рад тебя видеть между прочим! :yes:
                                                                                                                                                                                                                                                                        Над нами - правила форума, внутри нас - нравственный закон!
                                                                                                                                                                                                                                                                        (Девиз начинающего модератора.)
                                                                                                                                                                                                                                                                          Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                          А вернее даже не с STL, а со способом реализации библиотек, наподобие STL. Потому что нас учили прежде всего технологии создавать, а не пользоваться ими. Мне в частности в этом отношении много дала книжка Хариви и Пола Дейтл. Более красивых классов чем там, я не видел.

                                                                                                                                                                                                                                                                          А можно по подробнее? Можно поподробнее об STL и книжке Хариви и Пола Дейтл, где описываются на столько красивые классы, что другим(классам) просто ничего не останется - как слица?
                                                                                                                                                                                                                                                                          Сообщение отредактировано: KILLER -
                                                                                                                                                                                                                                                                            Цитата Dark_Sup @
                                                                                                                                                                                                                                                                            В общем, будем поднимать тематику и культуру алгоритмизирования.

                                                                                                                                                                                                                                                                            плакаю :lool:
                                                                                                                                                                                                                                                                            Цитата TheMachine @
                                                                                                                                                                                                                                                                            т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                                                                              Цитата Dark_Sup @
                                                                                                                                                                                                                                                                              Коалыч! Рад тебя видеть между прочим!
                                                                                                                                                                                                                                                                              Взаимно! :D
                                                                                                                                                                                                                                                                                Цитата shm @
                                                                                                                                                                                                                                                                                1. В коде куча new и всего 1 delete, причем неправильно использованный.
                                                                                                                                                                                                                                                                                А вот это уже конструктивно. Ниже – вариант с пофиксенными багами. Кстати, если кто-то хочет научиться писать программы без подобных ошибок (связанных с выделением памяти), то в этом смысле очень хороша книжка Джеффа Элджера «С++», в которой этому вопросу очень много внимания уделено. В числе прочего там разбираются также и уязвимости компиляторов C++, – к сожалению, ошибок не лишены даже они, – из-за которых даже казалось бы правильный код, может обвалить программу.

                                                                                                                                                                                                                                                                                ExpandedWrap disabled
                                                                                                                                                                                                                                                                                                //Программа Arifm.cpp
                                                                                                                                                                                                                                                                                                //Осущетсвляет арифметические действия
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                                //Составлена Серохвостовым Антоном 8.11.04
                                                                                                                                                                                                                                                                                                //Последняя доработка 14.01.15              
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                  #include <iostream.h>
                                                                                                                                                                                                                                                                                  #include <string.h>
                                                                                                                                                                                                                                                                                  #include <stdio.h>
                                                                                                                                                                                                                                                                                  #include <conio.h>
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                  #define FIG_SIZE 100
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                  char* Invert(char *s)
                                                                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                                                                    int i;
                                                                                                                                                                                                                                                                                    char *tmp;
                                                                                                                                                                                                                                                                                    tmp = new char[FIG_SIZE]; tmp[0] = 0;
                                                                                                                                                                                                                                                                                    if (s[0])
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      for (i = 0; i < strlen(s)-1; i++)
                                                                                                                                                                                                                                                                                        tmp[i] = s[strlen(s)-i-1];
                                                                                                                                                                                                                                                                                      if (s[0] == '-')
                                                                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                                                                        strcpy(s, tmp);
                                                                                                                                                                                                                                                                                        strcpy(tmp, "-");
                                                                                                                                                                                                                                                                                        strcat(tmp, s);
                                                                                                                                                                                                                                                                                      } //if (s[0] ...
                                                                                                                                                                                                                                                                                      else tmp[i] = s[0];
                                                                                                                                                                                                                                                                                      tmp[i+1] = 0;
                                                                                                                                                                                                                                                                                    } //if (s[0]) ...
                                                                                                                                                                                                                                                                                    strcpy(s, tmp);
                                                                                                                                                                                                                                                                                    delete [] tmp;
                                                                                                                                                                                                                                                                                    return s;
                                                                                                                                                                                                                                                                                  } //Invert
                                                                                                                                                                                                                                                                                  /**********************************/
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                  char* DelZero(char *s)
                                                                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                                                                    int i = 0;
                                                                                                                                                                                                                                                                                    while (s[i++] == '0');
                                                                                                                                                                                                                                                                                    strcpy(s, s+i-1);
                                                                                                                                                                                                                                                                                    return s;
                                                                                                                                                                                                                                                                                  } //DelZero
                                                                                                                                                                                                                                                                                  /**********************************/
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                  void Add(char* a, char* b, char* &c)
                                                                                                                                                                                                                                                                                  /*Складывает два числа представленные строками*/
                                                                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                                                                    int i = 0, j = 0, k = 0,  //Индексы цифр в числах a, b и c
                                                                                                                                                                                                                                                                                    CR = 0,           //Перенос в старший разряд
                                                                                                                                                                                                                                                                                    Sm;               //Результат очередной итерации
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                    c[0] = 0;
                                                                                                                                                                                                                                                                                    a = Invert(DelZero(a)); b = Invert(DelZero(b));
                                                                                                                                                                                                                                                                                    while (a[i] || b[j])
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      if (a[i])           //В первом числе есть еще разряд?
                                                                                                                                                                                                                                                                                      {               //Да - взять его
                                                                                                                                                                                                                                                                                        Sm = int(a[i++])-0x30;
                                                                                                                                                                                                                                                                                        if (b[j])             //Во втором числе тоже есть разряды?
                                                                                                                                                                                                                                                                                      Sm = Sm+int(b[j++])-0x30;       //Да - суммировать эти разряды
                                                                                                                                                                                                                                                                                      } //if (a[i]) ...
                                                                                                                                                                                                                                                                                      else Sm = int(b[j++])-0x30; //Нет - взять разряд из второго числа
                                                                                                                                                                                                                                                                                      Sm = Sm+CR;         //Добавить перенос
                                                                                                                                                                                                                                                                                      c[k++] = Sm%10+0x30; c[k] = 0;
                                                                                                                                                                                                                                                                                      CR = Sm/10;
                                                                                                                                                                                                                                                                                    } //while (a[i] ...
                                                                                                                                                                                                                                                                                    if (CR)   //Перенос остался?
                                                                                                                                                                                                                                                                                    {             //Да - учесть его
                                                                                                                                                                                                                                                                                      c[k++] = CR; c[k] = 0;
                                                                                                                                                                                                                                                                                    } //if (CR) ...
                                                                                                                                                                                                                                                                                    c = DelZero(Invert(c));
                                                                                                                                                                                                                                                                                  } //Add
                                                                                                                                                                                                                                                                                  /**********************************/
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                  void Sub(char* a, char* b, char* &c)
                                                                                                                                                                                                                                                                                  /*Вычетает b из a*/
                                                                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                                                                    int i = 0, j = 0, k = 0,  //Индексы чисел a, b и c соответственно
                                                                                                                                                                                                                                                                                        B0 = 0,           //Заем из старшего разряда
                                                                                                                                                                                                                                                                                        Sm;           //Результат очередной итерации
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                    c[0] = 0;
                                                                                                                                                                                                                                                                                    a = Invert(DelZero(a)); b = Invert(DelZero(b));
                                                                                                                                                                                                                                                                                    while (a[i] || b[j] || B0)
                                                                                                                                                                                                                                                                                      if (a[i])       //Результат может быть положительным
                                                                                                                                                                                                                                                                                      {           //Да - приступить к следующей итерации
                                                                                                                                                                                                                                                                                   /***Сложение очередных разрядов***/
                                                                                                                                                                                                                                                                                        b[j] ? (Sm = int(a[i])-int(b[j++])-B0)  //Взять разряд вычитаемого
                                                                                                                                                                                                                                                                                         : (Sm = int(a[i])-0x30-B0);        //Пропустить, если его нет
                                                                                                                                                                                                                                                                                        i++;
                                                                                                                                                                                                                                                                                   /***Обработка переноса***/
                                                                                                                                                                                                                                                                                        Sm >= 0 ? B0 = 0 : (Sm = Sm+10, B0 = 1);
                                                                                                                                                                                                                                                                                   /******/
                                                                                                                                                                                                                                                                                        c[k++] = Sm+0x30; c[k] = 0;
                                                                                                                                                                                                                                                                                      } //if (a[i])
                                                                                                                                                                                                                                                                                      else                //Нет - поменять числа местами и все заново
                                                                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                                                                        i = 0; j = 0; k = 1; B0 = 0;
                                                                                                                                                                                                                                                                                        char *tmp = a;
                                                                                                                                                                                                                                                                                        a = b; b = tmp;
                                                                                                                                                                                                                                                                                        c[0] = '-'; c[1] = 0;
                                                                                                                                                                                                                                                                                      } //else ...
                                                                                                                                                                                                                                                                                    c = DelZero(Invert(c));
                                                                                                                                                                                                                                                                                  } //Sub
                                                                                                                                                                                                                                                                                  /**********************************/
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                  void Mul(char* a, char* b, char* &c)
                                                                                                                                                                                                                                                                                  /***Перемножает два числа представленные строками***/
                                                                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                                                                    int i = 0,        //Индекс множителя
                                                                                                                                                                                                                                                                                        k,        //Индекс множимого
                                                                                                                                                                                                                                                                                        Ost = 0;      //Остаток предыдущей итерации
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                    c[0] = 0;
                                                                                                                                                                                                                                                                                    a = Invert(DelZero(a)); b = Invert(DelZero(b));
                                                                                                                                                                                                                                                                                    while (b[i])      //Пройдены все числа делителя?
                                                                                                                                                                                                                                                                                    {                     //Нет - получить частичную сумму
                                                                                                                                                                                                                                                                                      k = 0;
                                                                                                                                                                                                                                                                                      while (a[k])       //Все цифры множимого пройдены?
                                                                                                                                                                                                                                                                                      {              //Нет - формировать частичную сумму
                                                                                                                                                                                                                                                                                        if (!c[i+k])      //Следующий разряд произведения есть?
                                                                                                                                                                                                                                                                                        {             //Нет - добавить его
                                                                                                                                                                                                                                                                                      c[i+k] = '0';
                                                                                                                                                                                                                                                                                      c[i+k+1] = 0;
                                                                                                                                                                                                                                                                                        } //if (!c[i+k] ...
                                                                                                                                                                                                                                                                                        Ost = int(c[i+k])+(int(a[k])-0x30)*(int(b[i])-0x30)-0x30+Ost;
                                                                                                                                                                                                                                                                                        c[i+k] = Ost%10+0x30;
                                                                                                                                                                                                                                                                                        Ost = Ost/10; k++;
                                                                                                                                                                                                                                                                                      } //while a[k]) ...
                                                                                                                                                                                                                                                                                      if (Ost)     //На текущей итерации есть остаток?
                                                                                                                                                                                                                                                                                      {            //Да - добавляем его
                                                                                                                                                                                                                                                                                        c[i+k] = Ost+0x30;
                                                                                                                                                                                                                                                                                        Ost = 0; c[i+k+1] = 0;
                                                                                                                                                                                                                                                                                      } //if (Ost) ...
                                                                                                                                                                                                                                                                                      i++;
                                                                                                                                                                                                                                                                                    } //while (b[i]) ...
                                                                                                                                                                                                                                                                                    if (Ost)     //Учтены все разряды?
                                                                                                                                                                                                                                                                                    {        //Нет - учесть остаток
                                                                                                                                                                                                                                                                                      c[i+k] = Ost+0x30; c[i+k+1] = 0;
                                                                                                                                                                                                                                                                                    } //if (Ost) ...
                                                                                                                                                                                                                                                                                    c = DelZero(Invert(c));
                                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                                  /**********************************/
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                  void Dvs(char *a, char *b, char* &c, char* &Ost)
                                                                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                                                                    char *f;      //Частное
                                                                                                                                                                                                                                                                                    int  i = 0,       //Индекс делимого
                                                                                                                                                                                                                                                                                         Del, j = 0, k = 0;
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                    a = DelZero(a); b = DelZero(b);
                                                                                                                                                                                                                                                                                    c[0] = 0;
                                                                                                                                                                                                                                                                                    f = new char[FIG_SIZE]; Ost[0] = 0;
                                                                                                                                                                                                                                                                                    if (b[0])
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      while (a[i])
                                                                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                                                                        Ost[strlen(Ost)] = a[i++];
                                                                                                                                                                                                                                                                                        Ost[++j] = 0;
                                                                                                                                                                                                                                                                                        Sub(Ost, b, f); Del = 0;
                                                                                                                                                                                                                                                                                        while (f[0] != '-')
                                                                                                                                                                                                                                                                                        {
                                                                                                                                                                                                                                                                                      Sub(Ost, b, f);
                                                                                                                                                                                                                                                                                      if (f[0] != '-')
                                                                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                                                                        strcpy(Ost, f); Del++;
                                                                                                                                                                                                                                                                                      } //if (f[0] ...
                                                                                                                                                                                                                                                                                        } //while (f[0] ...
                                                                                                                                                                                                                                                                                        c[k++] = Del+0x30;
                                                                                                                                                                                                                                                                                      } //while (a[i]) ...
                                                                                                                                                                                                                                                                                    } //if (b[0]) ...
                                                                                                                                                                                                                                                                                    delete [] f; c[j] = 0;
                                                                                                                                                                                                                                                                                    c = DelZero(c); Ost = DelZero(Ost);
                                                                                                                                                                                                                                                                                  } //Dvs
                                                                                                                                                                                                                                                                                  /**********************************/
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                  void main()
                                                                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                                                                    int  i, j;
                                                                                                                                                                                                                                                                                    char op;
                                                                                                                                                                                                                                                                                    char *a = new char[FIG_SIZE]; a[0] = 0;
                                                                                                                                                                                                                                                                                    char *b = new char[FIG_SIZE]; b[0] = 0;
                                                                                                                                                                                                                                                                                    char *c = new char[FIG_SIZE]; c[0] = 0;
                                                                                                                                                                                                                                                                                    char *d = new char[FIG_SIZE]; d[0] = 0;
                                                                                                                                                                                                                                                                                    char *str; str = new char[2*FIG_SIZE+1];
                                                                                                                                                                                                                                                                                    clrscr();
                                                                                                                                                                                                                                                                                    cout<<"Калькулятор больших чисел:\n";
                                                                                                                                                                                                                                                                                    cout<<"использование: <число 1>операция<число 2>\n";
                                                                                                                                                                                                                                                                                    cout<<"-операция: +, -, *, /\n";
                                                                                                                                                                                                                                                                                    cout<<"\"exit\" - прекращение работы\n";
                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                    do {
                                                                                                                                                                                                                                                                                         cout<<">";
                                                                                                                                                                                                                                                                                         scanf("%s", str);
                                                                                                                                                                                                                                                                                         i = 0; j = 0;
                                                                                                                                                                                                                                                                                         while (str[i] && str[i] != '-' && str[i] != '+' &&
                                                                                                                                                                                                                                                                                            str[i] != '/' && str[i] != '*')
                                                                                                                                                                                                                                                                                       a[j++] = str[i++];
                                                                                                                                                                                                                                                                                         a[j] = 0;
                                                                                                                                                                                                                                                                                         op = str[i++];
                                                                                                                                                                                                                                                                                         j = 0;
                                                                                                                                                                                                                                                                                         while (str[i])
                                                                                                                                                                                                                                                                                       b[j++] = str[i++];
                                                                                                                                                                                                                                                                                         b[j] = 0;
                                                                                                                                                                                                                                                                                         switch (op)
                                                                                                                                                                                                                                                                                         {
                                                                                                                                                                                                                                                                                       case '+': Add(a, b, c); break;
                                                                                                                                                                                                                                                                                       case '-': Sub(a, b, c); break;
                                                                                                                                                                                                                                                                                       case '*': Mul(a, b, c); break;
                                                                                                                                                                                                                                                                                       case '/': Dvs(a, b, c, d);
                                                                                                                                                                                                                                                                                         }
                                                                                                                                                                                                                                                                                         cout<<" = "<<c<<'\n';
                                                                                                                                                                                                                                                                                         if (op == '/')
                                                                                                                                                                                                                                                                                       cout<<"Остаток = "<<d<<'\n';
                                                                                                                                                                                                                                                                                       } while (strcmp(str, "exit"));
                                                                                                                                                                                                                                                                                    delete [] a;
                                                                                                                                                                                                                                                                                    delete [] b;
                                                                                                                                                                                                                                                                                    delete [] c;
                                                                                                                                                                                                                                                                                    delete [] d;
                                                                                                                                                                                                                                                                                    delete [] str;
                                                                                                                                                                                                                                                                                  }


                                                                                                                                                                                                                                                                                Цитата shm @
                                                                                                                                                                                                                                                                                5. Деление вылезает за границы выделенной памяти.
                                                                                                                                                                                                                                                                                Можете привести тестовые данные, которые обваливают программу? Я не вижу, как она за границы выходит.
                                                                                                                                                                                                                                                                                Прикреплённый файлПрикреплённый файлstrings.zip (4,8 Кбайт, скачиваний: 55)
                                                                                                                                                                                                                                                                                Подпись выключена.
                                                                                                                                                                                                                                                                                  СОЗНАНИЕ – НЕДОСТАЮЩЕЕ ЗВЕНО
                                                                                                                                                                                                                                                                                  «Своей комнаты в общежитии у меня не было, так что я спал на полу в комнате друга, сдавал бутылки из-под Колы, чтобы выручить 5 центов с каждой, и купить еды. И ходил за семь миль через весь город каждый воскресный вечер, чтоб нормально поесть раз в неделю в храме Харе Кришна. Я любил это. И большинство из того, с чем я сталкивался, следуя за своим любопытством и интуицией, оказывалось позже бесценным».
                                                                                                                                                                                                                                                                                  Стив Джобс, на встрече в Стэнфорде

                                                                                                                                                                                                                                                                                  user posted image

                                                                                                                                                                                                                                                                                  Цитата shm @
                                                                                                                                                                                                                                                                                  Да вот заняться мен больше нечем, как смотреть лекции всяких шарлатанов.
                                                                                                                                                                                                                                                                                  А почему нет? Ведь таких «шарлатанов» слушают даже в Googleplex’е, а там, насколько мне известно, работают настоящие кулхацкеры. Это куда более ценная трата времени, чем деструктивная критика, которой вы ранее занимались. В своё время студенты MIT с большим интересом слушали подобную лекцию (см. The missing technology или мой её перевод на русский). Эти знания ценятся также в университетах Калифорнии, Принстона, Сорбонна, Колумбии, Нью-Йорка, Чикаго, Беркли, Мексики, Оксфорда, Канады, Гарварда и в других социально-значимых местах (о чём можно узнать из соответствующих отзывов, доступных в Интернет).

                                                                                                                                                                                                                                                                                  Кстати, это даже Стиву Джобсу было интересно, когда он находился на заре своей карьеры. Он в то время активно общался с кришнаитами, и это оставило заметные отпечатки на его мировоззрении. Также и г-н Кови об этом говорит – один из ведущих гуру бизнеса современности. Так что не уподобляйтесь ламерам, а ознакомьтесь, чем элита бизнеса, IT и науки сейчас живёт. Или хотя бы не называйте шарлатанством то, о чём даже и представления не имеете. Но так или иначе, спасибо вам, что переключились на конструктив. Ваши замечания по последнему СИшному моему коду весьма ценны для меня. Но возвращаясь к вопросу о «шарлатанских» лекциях, приведу несколько полезных вещей, озвученных Кови и Джобсом, пересказанных одним из лидеров кришнаизма:

                                                                                                                                                                                                                                                                                  «Человеку нужно так или иначе соприкоснуться с этой глубинной сущностью, со своим органом смысла. С тем внутри нас, что может нам наше призвание раскрыть. На всех уровнях! На духовном, и на материальном. У каждого из нас есть какая-то миссия: что-то мы должны сделать. Для кого-то это может быть семья или ещё что-то. У каждого человека есть призвание, где он может реализовать себя и пойти дальше. И г-н Кови рекомендует для того, чтобы соприкоснуться с этим смыслом или с сущностью внутри, вспомнить о смерти и посмотреть на всё то, что с нами происходит. Он предлагает нам поставить мысленный эксперимент: поприсутствовать на собственных похоронах и послушать, что люди будут говорить про вас. И подумать, а нравится вам то, что они про вас говорят или нет. Т.е. какой вклад вы оставили какой след вы оставили.

                                                                                                                                                                                                                                                                                  И тут мне хотелось процитировать Стива Джобса – тоже человека, который внёс вклад безусловно в современную цивилизацию. Он в одной из своих стэнфордских лекций говорил о том же самом. Он начал свою лекцию следующими словами: «Когда мне было 17 лет, я прочитал цитату, которая звучала примерно так: „Если вы будете жить каждый день своей жизни так, как будто бы это ваш последний день, в какой-то момент так оно и будет“». И он говорит, что в этот самый миг, когда он прочитал эту цитату относительно того, что человек должен жить каждый день в своей жизни как последний, он сказал, что каждое утро я стал подходить к зеркалу. И глядясь в зеркало, спрашивать у себя: «Что я сегодня собираюсь делать?» А потом задавал себе вопрос: «А делал бы я это, если бы это был действительно мой последний день?» И он приводит очень хорошую формулу: «Когда много дней подряд ответ на этот вопрос был отрицательный: „Нет, я не стал бы это делать, если бы это был последний день моей жизни“, я начинал понимать, что что-то мне нужно менять».

                                                                                                                                                                                                                                                                                  Иначе говоря, я делаю что-то, что в конечном счёте не имеет какого-то высшего смысла для меня самого, в том числе» (кстати, если интересен первоисточник – это семинар Вадима Тунеева «Найди себя и стань успешным во всех сферах своей жизни», прочитанный в 2012-м году). А в лекции «10 законов на пути процветания и счастья», которую я ужу упоминал в одном из предыдущих постов, раскрывается та же самая мысль. Причём и там и там эта мысль раскрывается в «кроссплатформенных законах жизни», под которыми подпишется любая адекватная идеология, в том числе религиозная. Ну и коль скоро речь зашла о кришнаитах, и плюс, насколько мне помнится, г-н Суровый интересовался, что это у меня такое интересное на носу, то приведу ещё одно видео (там в числе прочего есть и про эту субстанцию на носу), и на этом закончить лирическое отступление:
                                                                                                                                                                                                                                                                                  Интервью о кришнаизме

                                                                                                                                                                                                                                                                                  Цитата shm @
                                                                                                                                                                                                                                                                                  1. В коде куча new и всего 1 delete, причем неправильно использованный.
                                                                                                                                                                                                                                                                                  А вот это уже конструктивно. Ниже – вариант с пофиксенными багами. Кстати, если кто-то хочет научиться писать программы без подобных ошибок (связанных с выделением памяти), то в этом смысле очень хороша книжка Джеффа Элджера «С++», в которой этому вопросу очень много внимания уделено. В числе прочего там разбираются также и уязвимости компиляторов C++, – к сожалению, ошибок не лишены даже они, – из-за которых даже казалось бы правильный код, может обвалить программу.

                                                                                                                                                                                                                                                                                  ExpandedWrap disabled
                                                                                                                                                                                                                                                                                                  //Программа Arifm.cpp
                                                                                                                                                                                                                                                                                                  //Осущетсвляет арифметические действия
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                                  //Составлена Серохвостовым Антоном 8.11.04
                                                                                                                                                                                                                                                                                                  //Последняя доработка 14.01.15              
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    #include <iostream.h>
                                                                                                                                                                                                                                                                                    #include <string.h>
                                                                                                                                                                                                                                                                                    #include <stdio.h>
                                                                                                                                                                                                                                                                                    #include <conio.h>
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    #define FIG_SIZE 100
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    char* Invert(char *s)
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      int i;
                                                                                                                                                                                                                                                                                      char *tmp;
                                                                                                                                                                                                                                                                                      tmp = new char[FIG_SIZE]; tmp[0] = 0;
                                                                                                                                                                                                                                                                                      if (s[0])
                                                                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                                                                        for (i = 0; i < strlen(s)-1; i++)
                                                                                                                                                                                                                                                                                          tmp[i] = s[strlen(s)-i-1];
                                                                                                                                                                                                                                                                                        if (s[0] == '-')
                                                                                                                                                                                                                                                                                        {
                                                                                                                                                                                                                                                                                          strcpy(s, tmp);
                                                                                                                                                                                                                                                                                          strcpy(tmp, "-");
                                                                                                                                                                                                                                                                                          strcat(tmp, s);
                                                                                                                                                                                                                                                                                        } //if (s[0] ...
                                                                                                                                                                                                                                                                                        else tmp[i] = s[0];
                                                                                                                                                                                                                                                                                        tmp[i+1] = 0;
                                                                                                                                                                                                                                                                                      } //if (s[0]) ...
                                                                                                                                                                                                                                                                                      strcpy(s, tmp);
                                                                                                                                                                                                                                                                                      delete [] tmp;
                                                                                                                                                                                                                                                                                      return s;
                                                                                                                                                                                                                                                                                    } //Invert
                                                                                                                                                                                                                                                                                    /**********************************/
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    char* DelZero(char *s)
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      int i = 0;
                                                                                                                                                                                                                                                                                      while (s[i++] == '0');
                                                                                                                                                                                                                                                                                      strcpy(s, s+i-1);
                                                                                                                                                                                                                                                                                      return s;
                                                                                                                                                                                                                                                                                    } //DelZero
                                                                                                                                                                                                                                                                                    /**********************************/
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    void Add(char* a, char* b, char* &c)
                                                                                                                                                                                                                                                                                    /*Складывает два числа представленные строками*/
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      int i = 0, j = 0, k = 0,  //Индексы цифр в числах a, b и c
                                                                                                                                                                                                                                                                                      CR = 0,           //Перенос в старший разряд
                                                                                                                                                                                                                                                                                      Sm;               //Результат очередной итерации
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      c[0] = 0;
                                                                                                                                                                                                                                                                                      a = Invert(DelZero(a)); b = Invert(DelZero(b));
                                                                                                                                                                                                                                                                                      while (a[i] || b[j])
                                                                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                                                                        if (a[i])           //В первом числе есть еще разряд?
                                                                                                                                                                                                                                                                                        {               //Да - взять его
                                                                                                                                                                                                                                                                                          Sm = int(a[i++])-0x30;
                                                                                                                                                                                                                                                                                          if (b[j])             //Во втором числе тоже есть разряды?
                                                                                                                                                                                                                                                                                        Sm = Sm+int(b[j++])-0x30;       //Да - суммировать эти разряды
                                                                                                                                                                                                                                                                                        } //if (a[i]) ...
                                                                                                                                                                                                                                                                                        else Sm = int(b[j++])-0x30; //Нет - взять разряд из второго числа
                                                                                                                                                                                                                                                                                        Sm = Sm+CR;         //Добавить перенос
                                                                                                                                                                                                                                                                                        c[k++] = Sm%10+0x30; c[k] = 0;
                                                                                                                                                                                                                                                                                        CR = Sm/10;
                                                                                                                                                                                                                                                                                      } //while (a[i] ...
                                                                                                                                                                                                                                                                                      if (CR)   //Перенос остался?
                                                                                                                                                                                                                                                                                      {             //Да - учесть его
                                                                                                                                                                                                                                                                                        c[k++] = CR; c[k] = 0;
                                                                                                                                                                                                                                                                                      } //if (CR) ...
                                                                                                                                                                                                                                                                                      c = DelZero(Invert(c));
                                                                                                                                                                                                                                                                                    } //Add
                                                                                                                                                                                                                                                                                    /**********************************/
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    void Sub(char* a, char* b, char* &c)
                                                                                                                                                                                                                                                                                    /*Вычетает b из a*/
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      int i = 0, j = 0, k = 0,  //Индексы чисел a, b и c соответственно
                                                                                                                                                                                                                                                                                          B0 = 0,           //Заем из старшего разряда
                                                                                                                                                                                                                                                                                          Sm;           //Результат очередной итерации
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      c[0] = 0;
                                                                                                                                                                                                                                                                                      a = Invert(DelZero(a)); b = Invert(DelZero(b));
                                                                                                                                                                                                                                                                                      while (a[i] || b[j] || B0)
                                                                                                                                                                                                                                                                                        if (a[i])       //Результат может быть положительным
                                                                                                                                                                                                                                                                                        {           //Да - приступить к следующей итерации
                                                                                                                                                                                                                                                                                     /***Сложение очередных разрядов***/
                                                                                                                                                                                                                                                                                          b[j] ? (Sm = int(a[i])-int(b[j++])-B0)  //Взять разряд вычитаемого
                                                                                                                                                                                                                                                                                           : (Sm = int(a[i])-0x30-B0);        //Пропустить, если его нет
                                                                                                                                                                                                                                                                                          i++;
                                                                                                                                                                                                                                                                                     /***Обработка переноса***/
                                                                                                                                                                                                                                                                                          Sm >= 0 ? B0 = 0 : (Sm = Sm+10, B0 = 1);
                                                                                                                                                                                                                                                                                     /******/
                                                                                                                                                                                                                                                                                          c[k++] = Sm+0x30; c[k] = 0;
                                                                                                                                                                                                                                                                                        } //if (a[i])
                                                                                                                                                                                                                                                                                        else                //Нет - поменять числа местами и все заново
                                                                                                                                                                                                                                                                                        {
                                                                                                                                                                                                                                                                                          i = 0; j = 0; k = 1; B0 = 0;
                                                                                                                                                                                                                                                                                          char *tmp = a;
                                                                                                                                                                                                                                                                                          a = b; b = tmp;
                                                                                                                                                                                                                                                                                          c[0] = '-'; c[1] = 0;
                                                                                                                                                                                                                                                                                        } //else ...
                                                                                                                                                                                                                                                                                      c = DelZero(Invert(c));
                                                                                                                                                                                                                                                                                    } //Sub
                                                                                                                                                                                                                                                                                    /**********************************/
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    void Mul(char* a, char* b, char* &c)
                                                                                                                                                                                                                                                                                    /***Перемножает два числа представленные строками***/
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      int i = 0,        //Индекс множителя
                                                                                                                                                                                                                                                                                          k,        //Индекс множимого
                                                                                                                                                                                                                                                                                          Ost = 0;      //Остаток предыдущей итерации
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      c[0] = 0;
                                                                                                                                                                                                                                                                                      a = Invert(DelZero(a)); b = Invert(DelZero(b));
                                                                                                                                                                                                                                                                                      while (b[i])      //Пройдены все числа делителя?
                                                                                                                                                                                                                                                                                      {                     //Нет - получить частичную сумму
                                                                                                                                                                                                                                                                                        k = 0;
                                                                                                                                                                                                                                                                                        while (a[k])       //Все цифры множимого пройдены?
                                                                                                                                                                                                                                                                                        {              //Нет - формировать частичную сумму
                                                                                                                                                                                                                                                                                          if (!c[i+k])      //Следующий разряд произведения есть?
                                                                                                                                                                                                                                                                                          {             //Нет - добавить его
                                                                                                                                                                                                                                                                                        c[i+k] = '0';
                                                                                                                                                                                                                                                                                        c[i+k+1] = 0;
                                                                                                                                                                                                                                                                                          } //if (!c[i+k] ...
                                                                                                                                                                                                                                                                                          Ost = int(c[i+k])+(int(a[k])-0x30)*(int(b[i])-0x30)-0x30+Ost;
                                                                                                                                                                                                                                                                                          c[i+k] = Ost%10+0x30;
                                                                                                                                                                                                                                                                                          Ost = Ost/10; k++;
                                                                                                                                                                                                                                                                                        } //while a[k]) ...
                                                                                                                                                                                                                                                                                        if (Ost)     //На текущей итерации есть остаток?
                                                                                                                                                                                                                                                                                        {            //Да - добавляем его
                                                                                                                                                                                                                                                                                          c[i+k] = Ost+0x30;
                                                                                                                                                                                                                                                                                          Ost = 0; c[i+k+1] = 0;
                                                                                                                                                                                                                                                                                        } //if (Ost) ...
                                                                                                                                                                                                                                                                                        i++;
                                                                                                                                                                                                                                                                                      } //while (b[i]) ...
                                                                                                                                                                                                                                                                                      if (Ost)     //Учтены все разряды?
                                                                                                                                                                                                                                                                                      {        //Нет - учесть остаток
                                                                                                                                                                                                                                                                                        c[i+k] = Ost+0x30; c[i+k+1] = 0;
                                                                                                                                                                                                                                                                                      } //if (Ost) ...
                                                                                                                                                                                                                                                                                      c = DelZero(Invert(c));
                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                    /**********************************/
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    void Dvs(char *a, char *b, char* &c, char* &Ost)
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      char *f;      //Частное
                                                                                                                                                                                                                                                                                      int  i = 0,       //Индекс делимого
                                                                                                                                                                                                                                                                                           Del, j = 0, k = 0;
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      a = DelZero(a); b = DelZero(b);
                                                                                                                                                                                                                                                                                      c[0] = 0;
                                                                                                                                                                                                                                                                                      f = new char[FIG_SIZE]; Ost[0] = 0;
                                                                                                                                                                                                                                                                                      if (b[0])
                                                                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                                                                        while (a[i])
                                                                                                                                                                                                                                                                                        {
                                                                                                                                                                                                                                                                                          Ost[strlen(Ost)] = a[i++];
                                                                                                                                                                                                                                                                                          Ost[++j] = 0;
                                                                                                                                                                                                                                                                                          Sub(Ost, b, f); Del = 0;
                                                                                                                                                                                                                                                                                          while (f[0] != '-')
                                                                                                                                                                                                                                                                                          {
                                                                                                                                                                                                                                                                                        Sub(Ost, b, f);
                                                                                                                                                                                                                                                                                        if (f[0] != '-')
                                                                                                                                                                                                                                                                                        {
                                                                                                                                                                                                                                                                                          strcpy(Ost, f); Del++;
                                                                                                                                                                                                                                                                                        } //if (f[0] ...
                                                                                                                                                                                                                                                                                          } //while (f[0] ...
                                                                                                                                                                                                                                                                                          c[k++] = Del+0x30;
                                                                                                                                                                                                                                                                                        } //while (a[i]) ...
                                                                                                                                                                                                                                                                                      } //if (b[0]) ...
                                                                                                                                                                                                                                                                                      delete [] f; c[j] = 0;
                                                                                                                                                                                                                                                                                      c = DelZero(c); Ost = DelZero(Ost);
                                                                                                                                                                                                                                                                                    } //Dvs
                                                                                                                                                                                                                                                                                    /**********************************/
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    void main()
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      int  i, j;
                                                                                                                                                                                                                                                                                      char op;
                                                                                                                                                                                                                                                                                      char *a = new char[FIG_SIZE]; a[0] = 0;
                                                                                                                                                                                                                                                                                      char *b = new char[FIG_SIZE]; b[0] = 0;
                                                                                                                                                                                                                                                                                      char *c = new char[FIG_SIZE]; c[0] = 0;
                                                                                                                                                                                                                                                                                      char *d = new char[FIG_SIZE]; d[0] = 0;
                                                                                                                                                                                                                                                                                      char *str; str = new char[2*FIG_SIZE+1];
                                                                                                                                                                                                                                                                                      clrscr();
                                                                                                                                                                                                                                                                                      cout<<"Калькулятор больших чисел:\n";
                                                                                                                                                                                                                                                                                      cout<<"использование: <число 1>операция<число 2>\n";
                                                                                                                                                                                                                                                                                      cout<<"-операция: +, -, *, /\n";
                                                                                                                                                                                                                                                                                      cout<<"\"exit\" - прекращение работы\n";
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      do {
                                                                                                                                                                                                                                                                                           cout<<">";
                                                                                                                                                                                                                                                                                           scanf("%s", str);
                                                                                                                                                                                                                                                                                           i = 0; j = 0;
                                                                                                                                                                                                                                                                                           while (str[i] && str[i] != '-' && str[i] != '+' &&
                                                                                                                                                                                                                                                                                              str[i] != '/' && str[i] != '*')
                                                                                                                                                                                                                                                                                         a[j++] = str[i++];
                                                                                                                                                                                                                                                                                           a[j] = 0;
                                                                                                                                                                                                                                                                                           op = str[i++];
                                                                                                                                                                                                                                                                                           j = 0;
                                                                                                                                                                                                                                                                                           while (str[i])
                                                                                                                                                                                                                                                                                         b[j++] = str[i++];
                                                                                                                                                                                                                                                                                           b[j] = 0;
                                                                                                                                                                                                                                                                                           switch (op)
                                                                                                                                                                                                                                                                                           {
                                                                                                                                                                                                                                                                                         case '+': Add(a, b, c); break;
                                                                                                                                                                                                                                                                                         case '-': Sub(a, b, c); break;
                                                                                                                                                                                                                                                                                         case '*': Mul(a, b, c); break;
                                                                                                                                                                                                                                                                                         case '/': Dvs(a, b, c, d);
                                                                                                                                                                                                                                                                                           }
                                                                                                                                                                                                                                                                                           cout<<" = "<<c<<'\n';
                                                                                                                                                                                                                                                                                           if (op == '/')
                                                                                                                                                                                                                                                                                         cout<<"Остаток = "<<d<<'\n';
                                                                                                                                                                                                                                                                                         } while (strcmp(str, "exit"));
                                                                                                                                                                                                                                                                                      delete [] a;
                                                                                                                                                                                                                                                                                      delete [] b;
                                                                                                                                                                                                                                                                                      delete [] c;
                                                                                                                                                                                                                                                                                      delete [] d;
                                                                                                                                                                                                                                                                                      delete [] str;
                                                                                                                                                                                                                                                                                    }


                                                                                                                                                                                                                                                                                  Цитата shm @
                                                                                                                                                                                                                                                                                  5. Деление вылезает за границы выделенной памяти.
                                                                                                                                                                                                                                                                                  Можете привести тестовые данные, которые обваливают программу? Я не вижу, как она за границы выходит.

                                                                                                                                                                                                                                                                                  Цитата #SI# @
                                                                                                                                                                                                                                                                                  Пока что ты своего научного руководителя позоришь!
                                                                                                                                                                                                                                                                                  Цитата Dark_Sup @
                                                                                                                                                                                                                                                                                  Там отвечать нельзя... В общем, будем поднимать тематику и культуру алгоритмизирования.
                                                                                                                                                                                                                                                                                  А вот это приветствую. На мой взгляд плохо не «лажать», а плохо – не признавать свои ошибки. Вот это действительно позорно. Обучение программированию, как и любой другой сколь-нибудь серьёзный процесс, непрерывен. Если тебе кажется, что ты уже всё знаешь, скорее всего, ты движешься по наклонной вниз. Поэтому я за конструктивную критику, – вот примерно за такую, которую сейчас в контексте последнего приведённого мной кода делает г-н shm, за что ему спасибо.

                                                                                                                                                                                                                                                                                  В особенности работа надо ошибками актуальна в отношении духовных ценностей, с которыми, как показала и продолжает показывать манера общения некоторых людей в этом блоге (в том числе топикстартера) – у нас очень сильно напутано. Поэтому дайте поставим коллективный брейкпоинт на свои духовные ценности и отладим их. Как это делают кулхацкеры Google. Иначе как бы красиво мы ни писали свои программы, все они будут «термами не доставляющими беспокойств», потому как всё в этом мире решают отношения, а с дурным характером – их не видать.
                                                                                                                                                                                                                                                                                  Цитата KILLER @
                                                                                                                                                                                                                                                                                  А можно по подробнее? Можно поподробнее об STL и книжке Харви и Пола Дейтл, где описываются на столько красивые классы, что другим(классам) просто ничего не останется – как «слица»?
                                                                                                                                                                                                                                                                                  KILLER, Харви и Пол Дейтл «Как программировать на С++». Но почему сразу слица? Это же как в кулинарии. Если один повар вкусно готовит, а другие готовят по-другому, – это же априори не значит, что их еда не будет вкусна. Вот один из нравящихся мне примеров братьев Дейтл (здесь только сам класс, а полный вариант, в том числе с кодом тестирования – в аттаче):

                                                                                                                                                                                                                                                                                  strings.h
                                                                                                                                                                                                                                                                                  ExpandedWrap disabled
                                                                                                                                                                                                                                                                                    // strings.h
                                                                                                                                                                                                                                                                                    // Определение класса string
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    #ifndef STRINGS_H
                                                                                                                                                                                                                                                                                    #define STRINGS_H
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    #include <iostream.h>
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    class String {
                                                                                                                                                                                                                                                                                      friend ostream &operator<< (ostream &, const String &);
                                                                                                                                                                                                                                                                                      friend istream &operator>> (istream &, String &);
                                                                                                                                                                                                                                                                                    public:
                                                                                                                                                                                                                                                                                      String(const char * = "");    // конструктор преобразования
                                                                                                                                                                                                                                                                                      String(const String &);       // конструктор копии
                                                                                                                                                                                                                                                                                      ~String();                    // деструктор
                                                                                                                                                                                                                                                                                      const String &operator= (const String &); // присваивание
                                                                                                                                                                                                                                                                                      String &operator+= (const String &);      // конкатенация
                                                                                                                                                                                                                                                                                      int operator! () const;                   // String пуст?
                                                                                                                                                                                                                                                                                      int operator== (const String &) const;    // проверка s1 == s2
                                                                                                                                                                                                                                                                                      int operator!= (const String &) const;    // проверка s1 != s2
                                                                                                                                                                                                                                                                                      int operator< (const String &) const;     // проверка s1 < s2
                                                                                                                                                                                                                                                                                      int operator> (const String &) const;     // проверка s1 > s2
                                                                                                                                                                                                                                                                                      int operator>= (const String &) const;    // проверка s1 >= s2
                                                                                                                                                                                                                                                                                      int operator<= (const String &) const;    // проверка s1 <= s2
                                                                                                                                                                                                                                                                                      char & operator[] (int);      // возвращение ссылки на символ
                                                                                                                                                                                                                                                                                      String operator() (int, int); // возвращение подстроки
                                                                                                                                                                                                                                                                                      int getLength() const;        // возвращение длины строки
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    private:
                                                                                                                                                                                                                                                                                      char *sPtr;                   // указатель на начало строки
                                                                                                                                                                                                                                                                                      int length;                   // длина строки
                                                                                                                                                                                                                                                                                    };
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    #endif

                                                                                                                                                                                                                                                                                  strings.cpp
                                                                                                                                                                                                                                                                                  ExpandedWrap disabled
                                                                                                                                                                                                                                                                                    // strings.cpp
                                                                                                                                                                                                                                                                                    // Определения функций-элементов класса Strings
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    #include <iostream.h>
                                                                                                                                                                                                                                                                                    #include <iomanip.h>
                                                                                                                                                                                                                                                                                    #include <string.h>
                                                                                                                                                                                                                                                                                    #include <assert.h>
                                                                                                                                                                                                                                                                                    #include "strings.h"
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Конструктор преобразования: преобразовывает char * в String
                                                                                                                                                                                                                                                                                    String::String(const char *s)
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      cout << "Конструктор преобразования: " << s << endl;
                                                                                                                                                                                                                                                                                      length = strlen(s);           // вычисление длины
                                                                                                                                                                                                                                                                                      sPtr = new char[length + 1];  // выделение памяти
                                                                                                                                                                                                                                                                                      assert(sPtr != 0);            // завершение, если память не выделена
                                                                                                                                                                                                                                                                                      strcpy(sPtr, s);              // копирование строки аргумента в объект
                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Конструктор копии
                                                                                                                                                                                                                                                                                    String::String(const String &copy)
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      cout << "Конструктор копии: " << copy.sPtr << endl;
                                                                                                                                                                                                                                                                                      length = copy.length;         // копирование длины
                                                                                                                                                                                                                                                                                      sPtr = new char[length + 1];  // выделение памяти
                                                                                                                                                                                                                                                                                      assert(sPtr != 0);            // завершение, если память не выделена
                                                                                                                                                                                                                                                                                      strcpy(sPtr, copy.sPtr);      // копирование строки
                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Деструктор
                                                                                                                                                                                                                                                                                    String::~String()
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      cout << "Деструктор: " << sPtr << endl;
                                                                                                                                                                                                                                                                                      delete [] sPtr;       // освобождение память, отведенной строке
                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Перегруженная операция = ; избегает самоприсваивания
                                                                                                                                                                                                                                                                                    const String &String::operator= (const String &right)
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      cout << "вызов operator=" << endl;
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      if (&right != this)           // проверка самоприсваивания
                                                                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                                                                        delete [] sPtr;             // предотвращение утечки памяти
                                                                                                                                                                                                                                                                                        length = right.length;      // новая длина string
                                                                                                                                                                                                                                                                                        sPtr = new char[length + 1];// выделение памяти
                                                                                                                                                                                                                                                                                        assert(sPtr != 0);          // подтверждение выделения памяти
                                                                                                                                                                                                                                                                                        strcpy(sPtr, right.sPtr);   // копирование строки
                                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                                      else
                                                                                                                                                                                                                                                                                        cout << "Попытка самоприсваивания String" << endl;
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      return *this;     // обеспечивает возможность сцепленных присваиваний
                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Сцепление (конкатенация) правого операнда с данным объектом и
                                                                                                                                                                                                                                                                                    // сохранение сцепленной строки в этом объекте
                                                                                                                                                                                                                                                                                    String &String::operator+= (const String &right)
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      char *tempPtr = sPtr;         // сохранение до возможности удаления
                                                                                                                                                                                                                                                                                      length += right.length;       // новая длина String
                                                                                                                                                                                                                                                                                      sPtr = new char[length+1];    // выделение памяти
                                                                                                                                                                                                                                                                                      assert(sPtr != 0);            // завершение, если память не выделена
                                                                                                                                                                                                                                                                                      strcpy(sPtr, tempPtr);        // левая часть новой String
                                                                                                                                                                                                                                                                                      strcat(sPtr, right.sPtr);     // правая часть новой String
                                                                                                                                                                                                                                                                                      delete [] tempPtr;            // освобождение прежней области памяти
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      return *this;                 // обеспечивает возможность сцепленных вызовов
                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Пуст ли String?
                                                                                                                                                                                                                                                                                    int String::operator! () const { return length == 0; }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Равен ли этот String правому String?
                                                                                                                                                                                                                                                                                    int String::operator== (const String &right) const
                                                                                                                                                                                                                                                                                    { return strcmp(sPtr, right.sPtr) == 0; }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Этот String неравен правому String?
                                                                                                                                                                                                                                                                                    int String::operator!= (const String &right) const
                                                                                                                                                                                                                                                                                    { return strcmp(sPtr, right.sPtr) != 0; }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Меньше ли этот String правого String?
                                                                                                                                                                                                                                                                                    int String::operator< (const String &right) const
                                                                                                                                                                                                                                                                                    { return strcmp(sPtr, right.sPtr) < 0; }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Больше ли этот String правого String?
                                                                                                                                                                                                                                                                                    int String::operator> (const String &right) const
                                                                                                                                                                                                                                                                                    { return strcmp(sPtr, right.sPtr) > 0; }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Меньше или равен этот String по сравнению с правым String?
                                                                                                                                                                                                                                                                                    int String::operator<= (const String &right) const
                                                                                                                                                                                                                                                                                    { return strcmp(sPtr, right.sPtr) <= 0; }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Больше или равен этот String по сравнению с правым String?
                                                                                                                                                                                                                                                                                    int String::operator>= (const String &right) const
                                                                                                                                                                                                                                                                                    { return strcmp(sPtr, right.sPtr) >= 0; }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Возвращение ссылки на символ в String
                                                                                                                                                                                                                                                                                    char &String::operator[] (int subscript)
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      // первая проверка, не находится ли подстрока вне диапазона
                                                                                                                                                                                                                                                                                      assert(subscript >= 0 && subscript < length);
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      return sPtr[subscript];   // создание L-величины
                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Возвращение подстроки, начинающейся с заданного индекса
                                                                                                                                                                                                                                                                                    // и имеющую длину subLength, как ссылки на объект String
                                                                                                                                                                                                                                                                                    String String::operator() (int index, int subLength)
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      // подтверждение того, что индекс в диапазоне
                                                                                                                                                                                                                                                                                      // и длина строки >= 0
                                                                                                                                                                                                                                                                                      assert(index >= 0 && index < length && subLength >= 0);
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      String sub;       // Пустой String
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      // определение длины подстроки
                                                                                                                                                                                                                                                                                      if ((subLength == 0) || (index + subLength > length))
                                                                                                                                                                                                                                                                                        sub.length = length - index + 1;
                                                                                                                                                                                                                                                                                      else
                                                                                                                                                                                                                                                                                        sub.length = subLength + 1;
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      // выделение памяти для подстроки
                                                                                                                                                                                                                                                                                    //  delete sub.sPtr;                    // удаление символа из объекта
                                                                                                                                                                                                                                                                                      sub.sPtr = new char[sub.length];
                                                                                                                                                                                                                                                                                      assert(sub.sPtr != 0);            // подтверждение выделения памяти
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      // копирование подстроки в новый String
                                                                                                                                                                                                                                                                                      strncpy(sub.sPtr, &sPtr[index], sub.length);
                                                                                                                                                                                                                                                                                      sub.sPtr[sub.length] = '\0';      // завершение нового String
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      return sub;   // возвращение копии sub объекта String
                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Возвращение длины строки
                                                                                                                                                                                                                                                                                    int String::getLength() const { return length; }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Перегруженная операци вывода данных
                                                                                                                                                                                                                                                                                    ostream &operator<< (ostream &output, const String &s)
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      output << s.sPtr;
                                                                                                                                                                                                                                                                                      return output;    // возможность сцепления
                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                    // Перегруженная операция ввода данных
                                                                                                                                                                                                                                                                                    istream &operator>> (istream &input, String &s)
                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                      char temp[100];               // буфер для хранения входных данных
                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                      input >> setw(100) >> temp;  
                                                                                                                                                                                                                                                                                      s = temp;         // использование операции присваивания
                                                                                                                                                                                                                                                                                                        // класса String
                                                                                                                                                                                                                                                                                      return input;     // возможность сцепления
                                                                                                                                                                                                                                                                                    }


                                                                                                                                                                                                                                                                                  PS. До новых встреч, на страницах моего блога.
                                                                                                                                                                                                                                                                                  Прикреплённый файлПрикреплённый файлstrings.zip (4,8 Кбайт, скачиваний: 55)
                                                                                                                                                                                                                                                                                  Подпись выключена.
                                                                                                                                                                                                                                                                                    В секту заманивает!
                                                                                                                                                                                                                                                                                        Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                        из-за которых даже казалось бы правильный код, может обвалить программу.

                                                                                                                                                                                                                                                                                        вам ли об этом переживать?
                                                                                                                                                                                                                                                                                        Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                        Как это делают кулхацкеры Google.

                                                                                                                                                                                                                                                                                        кто такие кулхацкеры Google?
                                                                                                                                                                                                                                                                                        и, по итогам прочтения, что вы курите?
                                                                                                                                                                                                                                                                                        Цитата usrjava @
                                                                                                                                                                                                                                                                                        Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                                                                                                                                          Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                          Вот один из нравящихся мне примеров братьев Дейтл (здесь только сам класс, а полный вариант, в том числе с кодом тестирования – в аттаче):

                                                                                                                                                                                                                                                                                          А я-то думаю - чего это в коде даже delete[] для массивов используется? А тут вон оно чё.
                                                                                                                                                                                                                                                                                          Кстати, растёте. Если раньше вы выкидывали исходники, аналоги которым я писал в школе, то теперь добрались до первого курса - на нём я писал свой класс строк, когда С++ изучал :D
                                                                                                                                                                                                                                                                                          Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                                                                                                            Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                            Кстати, если кто-то хочет научиться писать программы без подобных ошибок (связанных с выделением памяти), то в этом смысле очень хороша книжка Джеффа Элджера «С++», в которой этому вопросу очень много внимания уделено.
                                                                                                                                                                                                                                                                                            Для этого надо просто программировать иначе. В частности вообще забыть про new/delete.
                                                                                                                                                                                                                                                                                            Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                            Вот один из нравящихся мне примеров братьев Дейтл (здесь только сам класс, а полный вариант, в том числе с кодом тестирования – в аттаче):
                                                                                                                                                                                                                                                                                            Напрасно он нравится. К нему уже... блин, со счёта сбился... 8 претензий. И это я только .h посмотрел, что там с реализацией, боюсь предположить.
                                                                                                                                                                                                                                                                                            Одни с годами умнеют, другие становятся старше.
                                                                                                                                                                                                                                                                                              изучил карту. так-то до источника знаний почти полторы тысячи километров. не складывается. какие еще будут варианты?
                                                                                                                                                                                                                                                                                              Цитата usrjava @
                                                                                                                                                                                                                                                                                              Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                                                                                                                                                Начал смотреть. С конца. Схватился за голову. Посмотрел в начало. На String::operator=() удовлетворённо кивнул и бросил. Совет: не пользуйся этим классом, он ужасен.
                                                                                                                                                                                                                                                                                                Одни с годами умнеют, другие становятся старше.
                                                                                                                                                                                                                                                                                                  Цитата Qraizer @
                                                                                                                                                                                                                                                                                                  Напрасно он нравится. К нему уже... блин, со счёта сбился... 8 претензий. И это я только .h посмотрел, что там с реализацией, боюсь предположить.

                                                                                                                                                                                                                                                                                                  Кстати, какие?
                                                                                                                                                                                                                                                                                                  Мои:
                                                                                                                                                                                                                                                                                                  1) iostream.h
                                                                                                                                                                                                                                                                                                  2) Нет move-конструктора. Впрочем, это следует из 1 :)
                                                                                                                                                                                                                                                                                                  3) Есть +=, но нет +
                                                                                                                                                                                                                                                                                                  4) operator() неконстантный.
                                                                                                                                                                                                                                                                                                  5) [] - нужна также неконстантная версия.
                                                                                                                                                                                                                                                                                                  6) Сравнения возвращают int, хотя семантически тут явно должен быть bool.

                                                                                                                                                                                                                                                                                                  Тоже только по хидеру.
                                                                                                                                                                                                                                                                                                  Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                                                                                                                      Цитата Qraizer @
                                                                                                                                                                                                                                                                                                      Начал смотреть. С конца.

                                                                                                                                                                                                                                                                                                      Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                      ExpandedWrap disabled
                                                                                                                                                                                                                                                                                                        // Перегруженная операция ввода данных
                                                                                                                                                                                                                                                                                                        istream &operator>> (istream &input, String &s)
                                                                                                                                                                                                                                                                                                        {
                                                                                                                                                                                                                                                                                                          char temp[100];               // буфер для хранения входных данных
                                                                                                                                                                                                                                                                                                         
                                                                                                                                                                                                                                                                                                          input >> setw(100) >> temp;  
                                                                                                                                                                                                                                                                                                          s = temp;         // использование операции присваивания
                                                                                                                                                                                                                                                                                                                            // класса String
                                                                                                                                                                                                                                                                                                          return input;     // возможность сцепления
                                                                                                                                                                                                                                                                                                        }

                                                                                                                                                                                                                                                                                                      Да, действительно... Мощно!!! :facepalm:
                                                                                                                                                                                                                                                                                                        Цитата zera @
                                                                                                                                                                                                                                                                                                        какие еще будут варианты?
                                                                                                                                                                                                                                                                                                        Тему - в Мусорку, флудера - на горшок!
                                                                                                                                                                                                                                                                                                        Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                        До новых встреч, на страницах моего блога
                                                                                                                                                                                                                                                                                                        Убейсибягалавойапстенку :whistle: .
                                                                                                                                                                                                                                                                                                          что значит "в корзину". корзина у нас read only, а тс может дать форуму много полезного, и дело не только в привлечении внимания к разделу.
                                                                                                                                                                                                                                                                                                          Цитата usrjava @
                                                                                                                                                                                                                                                                                                          Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                                                                                                                                                            Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                            А почему нет?

                                                                                                                                                                                                                                                                                                            Потому что все они рассчитаны по поиск доверчивых лохов!
                                                                                                                                                                                                                                                                                                            Цитата TheMachine @
                                                                                                                                                                                                                                                                                                            т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                                                                                                              Цитата zera @
                                                                                                                                                                                                                                                                                                              тс может дать форуму много полезного
                                                                                                                                                                                                                                                                                                              А, как НЕ надо программировать? Ну тут он всем носы уже утёр!
                                                                                                                                                                                                                                                                                                                Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                А вот это уже конструктивно.

                                                                                                                                                                                                                                                                                                                У меня все пункты конструктивны.
                                                                                                                                                                                                                                                                                                                Сообщение отредактировано: shm -
                                                                                                                                                                                                                                                                                                                Цитата TheMachine @
                                                                                                                                                                                                                                                                                                                т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                                                                                                                  Цитата #SI# @
                                                                                                                                                                                                                                                                                                                  Убейсибягалавойапстенку :whistle: .

                                                                                                                                                                                                                                                                                                                  Годы проходят, а Коалыч всё также суров. Постоянство-признак мастерства. :yes:

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

                                                                                                                                                                                                                                                                                                                  Над нами - правила форума, внутри нас - нравственный закон!
                                                                                                                                                                                                                                                                                                                  (Девиз начинающего модератора.)
                                                                                                                                                                                                                                                                                                                    Ещё, OpenGL?
                                                                                                                                                                                                                                                                                                                    • Ненадёжный страж включения. STRINGS_H легко пересечётся с каким-нибудь подобным.
                                                                                                                                                                                                                                                                                                                    • operator<<() и operator>>() абсолютно незачем быть друзьями.
                                                                                                                                                                                                                                                                                                                    • В данном случае конструктор с единственным (опциональным) параметром должен быть explicit.
                                                                                                                                                                                                                                                                                                                    • Зачем operator=() возвращает константную ссылку?
                                                                                                                                                                                                                                                                                                                    • Операторам сравнения не всем следует быть методами. Вообще, их список не полон.
                                                                                                                                                                                                                                                                                                                    • Что делать, если мне нужно '\0' внедрить в строку? Не, костылём его туда можно вбить, только работать такая строка всё равно не будет.
                                                                                                                                                                                                                                                                                                                    • Возможен каст ASCIIZ-строки в String, но невозможен обратный. Что делать, если понадобится передать String в какую-нибудь fopen()?
                                                                                                                                                                                                                                                                                                                    • Несимметричный дизайн operator[] и operator(), это сбивает с толку: почему я могу заменить один символ в String, но не могу заменить его подстроку?
                                                                                                                                                                                                                                                                                                                    iostream.h - это ещё пол-беды, даже меньше. В целом проблему можно сформулировать "использование устаревшей на 16 лет версии библиотеки". Хочу вот юникод, а как? А никак.
                                                                                                                                                                                                                                                                                                                    Одни с годами умнеют, другие становятся старше.
                                                                                                                                                                                                                                                                                                                      Цитата #SI# @
                                                                                                                                                                                                                                                                                                                      А, как НЕ надо программировать?

                                                                                                                                                                                                                                                                                                                      да не, примеры программ бесполезны чуть более, чем полностью. "как не надо" это когда есть предположения, что кто-то может считать, что надо именно так. его подход к программированию объективно интересен, в этом он прав, но совершенно бесполезен. зато есть некоторые вещи, которые позволяют глубже понять логику подобных.
                                                                                                                                                                                                                                                                                                                      например в первом же примере нам обещались интуитивно понятные идентификаторы, хорошее документирование. для меня лично было полезно увидеть эти примеры, потому что я теперь готов изучать выполненное хорошо документированное и с интуитивно понятными идентификаторами тестовое задание без опасности получить инфаркт от увиденного.
                                                                                                                                                                                                                                                                                                                      а программа создания меню с неограниченным количеством подпунктов, требующая от пользователя самостоятельно контролировать уникальность идентификаторов? не открытие ли это в мире формализации задач?
                                                                                                                                                                                                                                                                                                                      нет уж, не надо в корзину. я, все-таки, жду обещанной посильной помощи от топикстартера
                                                                                                                                                                                                                                                                                                                      Цитата usrjava @
                                                                                                                                                                                                                                                                                                                      Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                                                                                                                                                                        Сообщение отредактировано: Qraizer -
                                                                                                                                                                                                                                                                                                                        Одни с годами умнеют, другие становятся старше.
                                                                                                                                                                                                                                                                                                                          Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                          Ниже – вариант с пофиксенными багами.

                                                                                                                                                                                                                                                                                                                          ууу. их там еще хватает.
                                                                                                                                                                                                                                                                                                                          Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                          Можете привести тестовые данные, которые обваливают программу?

                                                                                                                                                                                                                                                                                                                          Да любые, даже 1/1.
                                                                                                                                                                                                                                                                                                                          И вообще, не стыдно потомственному хакеру просить найти ошибке в коде у каких-то нубов с форума?
                                                                                                                                                                                                                                                                                                                          Мне не жалко, я даже покажу где:
                                                                                                                                                                                                                                                                                                                          Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                          for (i = 0; i < strlen(s)-1; i++)
                                                                                                                                                                                                                                                                                                                          tmp[i] = s[strlen(s)-i-1];

                                                                                                                                                                                                                                                                                                                          и что-то гуру забыл, что строки в Си оканчиваются нулем, далее:
                                                                                                                                                                                                                                                                                                                          ExpandedWrap disabled
                                                                                                                                                                                                                                                                                                                            if (s[0] == '-')
                                                                                                                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                                                                                                  strcpy(s, tmp); //тут все и рушится
                                                                                                                                                                                                                                                                                                                                  strcpy(tmp, "-");
                                                                                                                                                                                                                                                                                                                                  strcat(tmp, s);
                                                                                                                                                                                                                                                                                                                                } //if (s[0] ...

                                                                                                                                                                                                                                                                                                                          И, более того, даже после этой правки деление работает неправильно. Вводим 10/2, а в качестве результата пуста строка.
                                                                                                                                                                                                                                                                                                                          ---
                                                                                                                                                                                                                                                                                                                          В целом берем даже первую в коде функцию Invert - это рукалицо, пусть даже и была бы она безошибочна. Ее можно написать с линейной трудоемкостью это раз и без использование доп. памяти это два. Осилишь? Кстати, что там по другим пунктам? Поправишь?

                                                                                                                                                                                                                                                                                                                          Добавлено
                                                                                                                                                                                                                                                                                                                          Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                          strings.cpp

                                                                                                                                                                                                                                                                                                                          :facepalm:
                                                                                                                                                                                                                                                                                                                          Сообщение отредактировано: shm -
                                                                                                                                                                                                                                                                                                                          Цитата TheMachine @
                                                                                                                                                                                                                                                                                                                          т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                                                                                                                            Цитата zera @
                                                                                                                                                                                                                                                                                                                            для меня лично было полезно увидеть эти примеры, потому что я теперь готов изучать выполненное хорошо документированное и с интуитивно понятными идентификаторами тестовое задание без опасности получить инфаркт от увиденного
                                                                                                                                                                                                                                                                                                                            Это к нашему Розычу. Рекомендую :yes: !
                                                                                                                                                                                                                                                                                                                              Цитата Qraizer @
                                                                                                                                                                                                                                                                                                                              Ненадёжный страж включения. STRINGS_H легко пересечётся с каким-нибудь подобным.

                                                                                                                                                                                                                                                                                                                              Ну для учебного примера, имхо, достаточно.
                                                                                                                                                                                                                                                                                                                              Цитата Qraizer @
                                                                                                                                                                                                                                                                                                                              operator<<() и operator>>() абсолютно незачем быть друзьями.

                                                                                                                                                                                                                                                                                                                              Почему? Мне подобное и для своих классов требовалось.
                                                                                                                                                                                                                                                                                                                              Цитата Qraizer @
                                                                                                                                                                                                                                                                                                                              Что делать, если мне нужно '\0' внедрить в строку? Не, костылём его туда можно вбить, только работать такая строка всё равно не будет.

                                                                                                                                                                                                                                                                                                                              Ну косяки реализации я не вижу смысла рассматривать :) По интерфейсу же сказать, что будет такой косяк, не представляется возможным.
                                                                                                                                                                                                                                                                                                                              Цитата Qraizer @
                                                                                                                                                                                                                                                                                                                              В данном случае конструктор с единственным (опциональным) параметром должен быть explicit.

                                                                                                                                                                                                                                                                                                                              Кстати да, про это я вообще забыл.
                                                                                                                                                                                                                                                                                                                              Цитата Qraizer @
                                                                                                                                                                                                                                                                                                                              Несимметричный дизайн operator[] и operator(), это сбивает с толку: почему я могу заменить один символ в String, но не могу заменить его подстроку?

                                                                                                                                                                                                                                                                                                                              Ну такое мне бы даже в голову не пришло :) Впрочем, согласен - подстроку логичней вытаскивать каким-нибудь substr.
                                                                                                                                                                                                                                                                                                                              По остальному согласен.
                                                                                                                                                                                                                                                                                                                              Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                                                                                                                                                Цитата OpenGL @
                                                                                                                                                                                                                                                                                                                                Почему? Мне подобное и для своих классов требовалось.
                                                                                                                                                                                                                                                                                                                                Ну убери friend из operator>>(). Скомпилилось? Ото ж. Убрать friend из operator<<() нельзя из-за моего предпоследнего пункта.

                                                                                                                                                                                                                                                                                                                                Добавлено
                                                                                                                                                                                                                                                                                                                                P.S. Количество методов – а уж тем более друзей – у класса следует минимизировать. operator+=() нельзя сделать неметодом, не потеряв в эффективности, а operator+() запросто.
                                                                                                                                                                                                                                                                                                                                Одни с годами умнеют, другие становятся старше.
                                                                                                                                                                                                                                                                                                                                  Цитата Qraizer @
                                                                                                                                                                                                                                                                                                                                  Ну убери friend из operator>>(). Скомпилилось? Ото ж.

                                                                                                                                                                                                                                                                                                                                  Не скомпилилось. Скомпилилось. Не на тот оператор посмотрел :D Да и опять это вопрос реализации.
                                                                                                                                                                                                                                                                                                                                  Сообщение отредактировано: OpenGL -
                                                                                                                                                                                                                                                                                                                                  Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                                                                                                                                                    Так о ней, родимой, о реализации, и постскриптум. Получил строку, вывел. Зачем там доступ к потрохам класса? Эффективности не прибавит, зато внесёт сильную связь с сущностью, к классу отношения не имеющую. То же с вводом. По-любому принцип строгой гарантии отказоустойчивости не позволяет менять вводимый параметр, пока не будет готова строка целиком. А присваивание опять же не требует доступа к потрохам. Вообще дружественность операций ввода/вывода практически всегда избыточна. Так что реализация должна в первую очередь определяться принципом отсутствия дружественности, а не наоборот. Если получается, что дружественность нужна, значит что-то не так с реализацией.

                                                                                                                                                                                                                                                                                                                                    Добавлено
                                                                                                                                                                                                                                                                                                                                    Это как с присваиванием. Если проверка на присваивание самому себе требуется, чтобы избежать бага, значит присваивание реализовано криво, и эта проверка всё равно не решает её проблем. Проверка на присваивание самому себе может быть использована в целях оптимизации, но не устранения багов.
                                                                                                                                                                                                                                                                                                                                    Сообщение отредактировано: Qraizer -
                                                                                                                                                                                                                                                                                                                                    Одни с годами умнеют, другие становятся старше.
                                                                                                                                                                                                                                                                                                                                      Серохвостов Антон
                                                                                                                                                                                                                                                                                                                                      А что такое виртуозное программирование?
                                                                                                                                                                                                                                                                                                                                      Чем оно отличается от невиртуозного?
                                                                                                                                                                                                                                                                                                                                      Мой сайт - prografix.github.io
                                                                                                                                                                                                                                                                                                                                        prografix, посмотри исходники и сделай выводы сам :lol:
                                                                                                                                                                                                                                                                                                                                        Цитата TheMachine @
                                                                                                                                                                                                                                                                                                                                        т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                                                                                                                                          Мне интересно, что скажет Антон. Может у него есть определение?
                                                                                                                                                                                                                                                                                                                                          Мой сайт - prografix.github.io
                                                                                                                                                                                                                                                                                                                                            ЧЕМ ДЫШИТ СОВРЕМЕННАЯ ИНТЕЛЛИГЕНЦИЯ
                                                                                                                                                                                                                                                                                                                                            user posted image
                                                                                                                                                                                                                                                                                                                                            Цитата shm @
                                                                                                                                                                                                                                                                                                                                            Потому что все они рассчитаны по поиск доверчивых лохов!
                                                                                                                                                                                                                                                                                                                                            Цитата shm @
                                                                                                                                                                                                                                                                                                                                            И вообще, не стыдно потомственному хакеру просить найти ошибке в коде у каких-то нубов с форума?
                                                                                                                                                                                                                                                                                                                                            Ну вы же знаете, КОГО обычно куда-то заманивают, и КОГО обычно разводят? Если вы переживаете по этому поводу, может быть вы – один из НИХ? Так или иначе, не вижу ничего зазорного в том, чтобы послушать ваши полезные советы, – а там глядишь и подружимся. Восточная мудрость гласит: «Разумный человек должен извлечь нектар из сосуда с ядом, подобрать золото даже в нечистом месте, взять добрую и достойную жену даже из безвестного рода и поучиться у человека или учителя даже из семьи неприкасаемых». Поэтому, даже несмотря на то, что в некоторых местах вы проявляете крайние степени «нубизма», баги вы ищите отменно. На самом деле, не столько плохо быть «нубом», сколько строить из себя «не нуба», бросаясь при этом громкими словами, чем вы и занимались относительно запостенных выше мной лекций. Вы бы перед выносом своих вердиктов, сначала изучили бы предмет своей критики. А то может так получится, что среди «нелохов» останется людей не многим больше, чем ваша единственная персона. Потому что серди ВАШИХ «доверчивых лохов» в числе прочего замечены следующие:
                                                                                                                                                                                                                                                                                                                                            - гарвардские студенты-менеджеры (ru),
                                                                                                                                                                                                                                                                                                                                            - ТОП-состав Ford Motor Company (en),
                                                                                                                                                                                                                                                                                                                                            - работники Intel Corporation (en),
                                                                                                                                                                                                                                                                                                                                            - актив бизнес-сообщества EY (en),
                                                                                                                                                                                                                                                                                                                                            - 1000+ банкиров HSBC (en),
                                                                                                                                                                                                                                                                                                                                            - «кулхацкеры» Google (ru),
                                                                                                                                                                                                                                                                                                                                            - парламент Большой Британии.
                                                                                                                                                                                                                                                                                                                                            Подпись выключена.
                                                                                                                                                                                                                                                                                                                                              Цитата shm @
                                                                                                                                                                                                                                                                                                                                              Ее можно написать с линейной трудоемкостью это раз и без использование доп. памяти это два. Осилишь?
                                                                                                                                                                                                                                                                                                                                              Почему нет? Вот очередной релиз, дай Бог не последний:
                                                                                                                                                                                                                                                                                                                                              ExpandedWrap disabled
                                                                                                                                                                                                                                                                                                                                                          //Программа Arifm.cpp
                                                                                                                                                                                                                                                                                                                                                              //Осущетсвляет арифметические действия
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                              //Составлена Серохвостовым Антоном 8.11.04
                                                                                                                                                                                                                                                                                                                                                              //Последняя доработка 15.01.15
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                #include <iostream.h>
                                                                                                                                                                                                                                                                                                                                                #include <string.h>
                                                                                                                                                                                                                                                                                                                                                #include <stdio.h>
                                                                                                                                                                                                                                                                                                                                                #include <conio.h>
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                #define FIG_SIZE 100
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                char* Invert(char *s)
                                                                                                                                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                                                                                                                  int i = *s == '-' ? 1 : 0,
                                                                                                                                                                                                                                                                                                                                                      j = strlen(s)-1;
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                  while (i < j)
                                                                                                                                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                                                                                                                                    s[i] = s[i]   ^ s[j];
                                                                                                                                                                                                                                                                                                                                                    s[j] = s[i]   ^ s[j];
                                                                                                                                                                                                                                                                                                                                                    s[i] = s[i++] ^ s[j--];
                                                                                                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                                                                                                  return s;
                                                                                                                                                                                                                                                                                                                                                } //Invert
                                                                                                                                                                                                                                                                                                                                                /**********************************/
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                char* DelZero(char *s)
                                                                                                                                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                                                                                                                  int i = 0;
                                                                                                                                                                                                                                                                                                                                                  while (s[i++] == '0');
                                                                                                                                                                                                                                                                                                                                                  strcpy(s, s+i-1);
                                                                                                                                                                                                                                                                                                                                                  return s;
                                                                                                                                                                                                                                                                                                                                                } //DelZero
                                                                                                                                                                                                                                                                                                                                                /**********************************/
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                void Add(char* a, char* b, char* &c)
                                                                                                                                                                                                                                                                                                                                                /*Складывает два числа представленные строками*/
                                                                                                                                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                                                                                                                  char *tmpA = new char[FIG_SIZE]; strcpy(tmpA, a);
                                                                                                                                                                                                                                                                                                                                                  char *tmpB = new char[FIG_SIZE]; strcpy(tmpB, b);
                                                                                                                                                                                                                                                                                                                                                  int i = 0, j = 0, k = 0,  //Индексы цифр в числах a, b и c
                                                                                                                                                                                                                                                                                                                                                  CR = 0,           //Перенос в старший разряд
                                                                                                                                                                                                                                                                                                                                                  Sm;               //Результат очередной итерации
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                  c[0] = 0;
                                                                                                                                                                                                                                                                                                                                                  tmpA = Invert(DelZero(tmpA)); tmpB = Invert(DelZero(tmpB));
                                                                                                                                                                                                                                                                                                                                                  while (tmpA[i] || tmpB[j])
                                                                                                                                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                                                                                                                                    if (tmpA[i])            //В первом числе есть еще разряд?
                                                                                                                                                                                                                                                                                                                                                    {               //Да - взять его
                                                                                                                                                                                                                                                                                                                                                      Sm = int(tmpA[i++])-0x30;
                                                                                                                                                                                                                                                                                                                                                      if (tmpB[j])              //Во втором числе тоже есть разряды?
                                                                                                                                                                                                                                                                                                                                                    Sm = Sm+int(tmpB[j++])-0x30;       //Да - суммировать эти разряды
                                                                                                                                                                                                                                                                                                                                                    } //if (a[i]) ...
                                                                                                                                                                                                                                                                                                                                                    else Sm = int(tmpB[j++])-0x30; //Нет - взять разряд из второго числа
                                                                                                                                                                                                                                                                                                                                                    Sm = Sm+CR;         //Добавить перенос
                                                                                                                                                                                                                                                                                                                                                    c[k++] = Sm%10+0x30; c[k] = 0;
                                                                                                                                                                                                                                                                                                                                                    CR = Sm/10;
                                                                                                                                                                                                                                                                                                                                                  } //while (a[i] ...
                                                                                                                                                                                                                                                                                                                                                  if (CR)   //Перенос остался?
                                                                                                                                                                                                                                                                                                                                                  {             //Да - учесть его
                                                                                                                                                                                                                                                                                                                                                    c[k++] = CR; c[k] = 0;
                                                                                                                                                                                                                                                                                                                                                  } //if (CR) ...
                                                                                                                                                                                                                                                                                                                                                  c = DelZero(Invert(c));
                                                                                                                                                                                                                                                                                                                                                  delete [] tmpA;
                                                                                                                                                                                                                                                                                                                                                  delete [] tmpB;
                                                                                                                                                                                                                                                                                                                                                } //Add
                                                                                                                                                                                                                                                                                                                                                /**********************************/
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                void Sub(char* a, char* b, char* &c)
                                                                                                                                                                                                                                                                                                                                                /*Вычетает b из a*/
                                                                                                                                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                                                                                                                  char *tmpA = new char[FIG_SIZE]; strcpy(tmpA, a);
                                                                                                                                                                                                                                                                                                                                                  char *tmpB = new char[FIG_SIZE]; strcpy(tmpB, b);
                                                                                                                                                                                                                                                                                                                                                  int i = 0, j = 0, k = 0,  //Индексы чисел a, b и c соответственно
                                                                                                                                                                                                                                                                                                                                                      B0 = 0,           //Заем из старшего разряда
                                                                                                                                                                                                                                                                                                                                                      Sm;           //Результат очередной итерации
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                  c[0] = 0;
                                                                                                                                                                                                                                                                                                                                                  tmpA = Invert(DelZero(tmpA)); tmpB = Invert(DelZero(tmpB));
                                                                                                                                                                                                                                                                                                                                                  while (tmpA[i] || tmpB[j] || B0)
                                                                                                                                                                                                                                                                                                                                                    if (tmpA[i])    //Результат может быть положительным
                                                                                                                                                                                                                                                                                                                                                    {           //Да - приступить к следующей итерации
                                                                                                                                                                                                                                                                                                                                                 /***Сложение очередных разрядов***/
                                                                                                                                                                                                                                                                                                                                                      tmpB[j] ? (Sm = int(tmpA[i])-int(tmpB[j++])-B0)  //Взять разряд вычитаемого
                                                                                                                                                                                                                                                                                                                                                       : (Sm = int(tmpA[i])-0x30-B0);        //Пропустить, если его нет
                                                                                                                                                                                                                                                                                                                                                      i++;
                                                                                                                                                                                                                                                                                                                                                 /***Обработка переноса***/
                                                                                                                                                                                                                                                                                                                                                      Sm >= 0 ? B0 = 0 : (Sm = Sm+10, B0 = 1);
                                                                                                                                                                                                                                                                                                                                                 /******/
                                                                                                                                                                                                                                                                                                                                                      c[k++] = Sm+0x30; c[k] = 0;
                                                                                                                                                                                                                                                                                                                                                    } //if (a[i])
                                                                                                                                                                                                                                                                                                                                                    else                //Нет - поменять числа местами и все заново
                                                                                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                                                                                      i = 0; j = 0; k = 1; B0 = 0;
                                                                                                                                                                                                                                                                                                                                                      char *tmp = tmpA;
                                                                                                                                                                                                                                                                                                                                                      tmpA = tmpB; tmpB = tmp;
                                                                                                                                                                                                                                                                                                                                                      c[0] = '-'; c[1] = 0;
                                                                                                                                                                                                                                                                                                                                                    } //else ...
                                                                                                                                                                                                                                                                                                                                                  c = DelZero(Invert(c));
                                                                                                                                                                                                                                                                                                                                                  delete [] tmpA;
                                                                                                                                                                                                                                                                                                                                                  delete [] tmpB;
                                                                                                                                                                                                                                                                                                                                                } //Sub
                                                                                                                                                                                                                                                                                                                                                /**********************************/
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                void Mul(char* a, char* b, char* &c)
                                                                                                                                                                                                                                                                                                                                                /***Перемножает два числа представленные строками***/
                                                                                                                                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                                                                                                                  char *tmpA = new char[FIG_SIZE]; strcpy(tmpA, a);
                                                                                                                                                                                                                                                                                                                                                  char *tmpB = new char[FIG_SIZE]; strcpy(tmpB, b);
                                                                                                                                                                                                                                                                                                                                                  int i = 0,        //Индекс множителя
                                                                                                                                                                                                                                                                                                                                                      k,        //Индекс множимого
                                                                                                                                                                                                                                                                                                                                                      Ost = 0;      //Остаток предыдущей итерации
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                  c[0] = 0;
                                                                                                                                                                                                                                                                                                                                                  tmpA = Invert(DelZero(tmpA)); tmpB = Invert(DelZero(tmpB));
                                                                                                                                                                                                                                                                                                                                                  while (tmpB[i])       //Пройдены все числа делителя?
                                                                                                                                                                                                                                                                                                                                                  {                     //Нет - получить частичную сумму
                                                                                                                                                                                                                                                                                                                                                    k = 0;
                                                                                                                                                                                                                                                                                                                                                    while (tmpA[k])    //Все цифры множимого пройдены?
                                                                                                                                                                                                                                                                                                                                                    {              //Нет - формировать частичную сумму
                                                                                                                                                                                                                                                                                                                                                      if (!c[i+k])      //Следующий разряд произведения есть?
                                                                                                                                                                                                                                                                                                                                                      {             //Нет - добавить его
                                                                                                                                                                                                                                                                                                                                                    c[i+k] = '0';
                                                                                                                                                                                                                                                                                                                                                    c[i+k+1] = 0;
                                                                                                                                                                                                                                                                                                                                                      } //if (!c[i+k] ...
                                                                                                                                                                                                                                                                                                                                                      Ost = int(c[i+k])+(int(tmpA[k])-0x30)*(int(tmpB[i])-0x30)-0x30+Ost;
                                                                                                                                                                                                                                                                                                                                                      c[i+k] = Ost%10+0x30;
                                                                                                                                                                                                                                                                                                                                                      Ost = Ost/10; k++;
                                                                                                                                                                                                                                                                                                                                                    } //while a[k]) ...
                                                                                                                                                                                                                                                                                                                                                    if (Ost)     //На текущей итерации есть остаток?
                                                                                                                                                                                                                                                                                                                                                    {            //Да - добавляем его
                                                                                                                                                                                                                                                                                                                                                      c[i+k] = Ost+0x30;
                                                                                                                                                                                                                                                                                                                                                      Ost = 0; c[i+k+1] = 0;
                                                                                                                                                                                                                                                                                                                                                    } //if (Ost) ...
                                                                                                                                                                                                                                                                                                                                                    i++;
                                                                                                                                                                                                                                                                                                                                                  } //while (b[i]) ...
                                                                                                                                                                                                                                                                                                                                                  if (Ost)     //Учтены все разряды?
                                                                                                                                                                                                                                                                                                                                                  {        //Нет - учесть остаток
                                                                                                                                                                                                                                                                                                                                                    c[i+k] = Ost+0x30; c[i+k+1] = 0;
                                                                                                                                                                                                                                                                                                                                                  } //if (Ost) ...
                                                                                                                                                                                                                                                                                                                                                  c = DelZero(Invert(c));
                                                                                                                                                                                                                                                                                                                                                  delete [] tmpA;
                                                                                                                                                                                                                                                                                                                                                  delete [] tmpB;
                                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                                /**********************************/
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                void Dvs(char *a, char *b, char* &c, char* &Ost)
                                                                                                                                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                                                                                                                  char *tmpA = new char[FIG_SIZE]; strcpy(tmpA, a);
                                                                                                                                                                                                                                                                                                                                                  char *tmpB = new char[FIG_SIZE]; strcpy(tmpB, b);
                                                                                                                                                                                                                                                                                                                                                  char *f;      //Частное
                                                                                                                                                                                                                                                                                                                                                  int  i = 0,       //Индекс делимого
                                                                                                                                                                                                                                                                                                                                                       Del, j = 0, k = 0;
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                  tmpA = DelZero(tmpA); tmpB = DelZero(tmpB);
                                                                                                                                                                                                                                                                                                                                                  c[0] = 0;
                                                                                                                                                                                                                                                                                                                                                  f = new char[FIG_SIZE]; Ost[0] = 0;
                                                                                                                                                                                                                                                                                                                                                  if (tmpB[0])
                                                                                                                                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                                                                                                                                    while (tmpA[i])
                                                                                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                                                                                      Ost[strlen(Ost)] = tmpA[i++];
                                                                                                                                                                                                                                                                                                                                                      Ost[++j] = 0;
                                                                                                                                                                                                                                                                                                                                                      Sub(Ost, tmpB, f); Del = 0;
                                                                                                                                                                                                                                                                                                                                                      while (f[0] != '-')
                                                                                                                                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                                                                                                                                    Sub(Ost, tmpB, f);
                                                                                                                                                                                                                                                                                                                                                    if (f[0] != '-')
                                                                                                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                                                                                                      strcpy(Ost, f); Del++;
                                                                                                                                                                                                                                                                                                                                                    } //if (f[0] ...
                                                                                                                                                                                                                                                                                                                                                      } //while (f[0] ...
                                                                                                                                                                                                                                                                                                                                                      c[k++] = Del+0x30;
                                                                                                                                                                                                                                                                                                                                                    } //while (a[i]) ...
                                                                                                                                                                                                                                                                                                                                                  } //if (b[0]) ...
                                                                                                                                                                                                                                                                                                                                                  c[j] = 0;
                                                                                                                                                                                                                                                                                                                                                  c = DelZero(c); Ost = DelZero(Ost);
                                                                                                                                                                                                                                                                                                                                                  delete [] f;
                                                                                                                                                                                                                                                                                                                                                  delete [] tmpA;
                                                                                                                                                                                                                                                                                                                                                  delete [] tmpB;
                                                                                                                                                                                                                                                                                                                                                } //Dvs
                                                                                                                                                                                                                                                                                                                                                /**********************************/
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                void main()
                                                                                                                                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                                                                                                                  int i, j;
                                                                                                                                                                                                                                                                                                                                                  char op;
                                                                                                                                                                                                                                                                                                                                                  char *a = new char[FIG_SIZE]; a[0] = 0;
                                                                                                                                                                                                                                                                                                                                                  char *b = new char[FIG_SIZE]; b[0] = 0;
                                                                                                                                                                                                                                                                                                                                                  char *c = new char[FIG_SIZE]; c[0] = 0;
                                                                                                                                                                                                                                                                                                                                                  char *d = new char[FIG_SIZE]; d[0] = 0;
                                                                                                                                                                                                                                                                                                                                                  char *str; str = new char[2*FIG_SIZE+1];
                                                                                                                                                                                                                                                                                                                                                  clrscr();
                                                                                                                                                                                                                                                                                                                                                  cout<<"Калькулятор больших чисел:\n";
                                                                                                                                                                                                                                                                                                                                                  cout<<"использование: <число 1>операция<число 2>\n";
                                                                                                                                                                                                                                                                                                                                                  cout<<"-операция: +, -, *, /\n";
                                                                                                                                                                                                                                                                                                                                                  cout<<"\"exit\" - прекращение работы\n";
                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                  do {
                                                                                                                                                                                                                                                                                                                                                       cout<<">";
                                                                                                                                                                                                                                                                                                                                                       scanf("%s", str);
                                                                                                                                                                                                                                                                                                                                                       i = 0; j = 0;
                                                                                                                                                                                                                                                                                                                                                       while (str[i] && str[i] != '-' && str[i] != '+' &&
                                                                                                                                                                                                                                                                                                                                                          str[i] != '/' && str[i] != '*')
                                                                                                                                                                                                                                                                                                                                                     a[j++] = str[i++];
                                                                                                                                                                                                                                                                                                                                                       a[j] = 0;
                                                                                                                                                                                                                                                                                                                                                       op = str[i++];
                                                                                                                                                                                                                                                                                                                                                       j = 0;
                                                                                                                                                                                                                                                                                                                                                       while (str[i])
                                                                                                                                                                                                                                                                                                                                                     b[j++] = str[i++];
                                                                                                                                                                                                                                                                                                                                                       b[j] = 0;
                                                                                                                                                                                                                                                                                                                                                       switch (op)
                                                                                                                                                                                                                                                                                                                                                       {
                                                                                                                                                                                                                                                                                                                                                     case '+': Add(a, b, c); break;
                                                                                                                                                                                                                                                                                                                                                     case '-': Sub(a, b, c); break;
                                                                                                                                                                                                                                                                                                                                                     case '*': Mul(a, b, c); break;
                                                                                                                                                                                                                                                                                                                                                     case '/': Dvs(a, b, c, d);
                                                                                                                                                                                                                                                                                                                                                       }
                                                                                                                                                                                                                                                                                                                                                       cout<<" = "<<c<<'\n';
                                                                                                                                                                                                                                                                                                                                                       if (op == '/')
                                                                                                                                                                                                                                                                                                                                                     cout<<"Остаток = "<<d<<'\n';
                                                                                                                                                                                                                                                                                                                                                     } while (strcmp(str, "exit"));
                                                                                                                                                                                                                                                                                                                                                  delete [] a;
                                                                                                                                                                                                                                                                                                                                                  delete [] b;
                                                                                                                                                                                                                                                                                                                                                  delete [] c;
                                                                                                                                                                                                                                                                                                                                                  delete [] d;
                                                                                                                                                                                                                                                                                                                                                  delete [] str;
                                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                              Подпись выключена.
                                                                                                                                                                                                                                                                                                                                                Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                                                    s[i] = s[i]   ^ s[j];
                                                                                                                                                                                                                                                                                                                                                    s[j] = s[i]   ^ s[j];
                                                                                                                                                                                                                                                                                                                                                    s[i] = s[i++] ^ s[j--];

                                                                                                                                                                                                                                                                                                                                                В последней строке неопределённое поведение. Найдёшь его сам без подсказок?
                                                                                                                                                                                                                                                                                                                                                Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                                                                                                                                                                  Цитата OpenGL @
                                                                                                                                                                                                                                                                                                                                                  В последней строке неопределённое поведение. Найдёшь его сам без подсказок?
                                                                                                                                                                                                                                                                                                                                                  Операции постфиксного инкремента/декремента имеют тот же самый приоритет, что и операция []. Но правильный результат будет только в том случае, если сначала выполнится операция [] и только потом постфиксные инкремент/декремент. Уповать на то, что компилятор использует нужную мне последовательность выполнения операций (сначала левую [], а потом правую ++) – слишком самонадеянно, потому как в последующих реализациях компилятора следуя правилу наподобие «от переменны мест слагаемых сумма не меняется», компилятор может выбрать другую последовательность. До вашей наводки я об этом не задумывался, – просто посмотрел, что работает, и всё. Респект. Похоже нет другого выхода, как выносить инкремент i++ в отдельную команду. Или есть вариант более лаконичного кода?
                                                                                                                                                                                                                                                                                                                                                  Подпись выключена.
                                                                                                                                                                                                                                                                                                                                                    Цитата OpenGL @
                                                                                                                                                                                                                                                                                                                                                    Найдёшь его сам без подсказок?
                                                                                                                                                                                                                                                                                                                                                    Очепятки и ашЫпки в комментариях глаза режут. Сам код на этот предмет даже смотреть не стал. Приму на веру, что проверено компилятором (тоже не факт).
                                                                                                                                                                                                                                                                                                                                                    ЗЫ - словоблудия на трубе кто-нибудь смотрел? Он там что - проповеди (судя по форме одежды и позам) читает?
                                                                                                                                                                                                                                                                                                                                                      Что-то я не понял из объяснения, в чём тут баг :D Понял только, что угадал - действительно, надо вынести i++. Тут подробнее.
                                                                                                                                                                                                                                                                                                                                                      Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                                                                                                                                                                        Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                                                        ЧЕМ ДЫШИТ СОВРЕМЕННАЯ ИНТЕЛЛИГЕНЦИЯ
                                                                                                                                                                                                                                                                                                                                                        Да не интеллигенция (она практически вымерла), а образованщина с немереными понтами. В зеркало на себя давно последний раз смотрел?
                                                                                                                                                                                                                                                                                                                                                          Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                                                          Или есть вариант более лаконичного кода?

                                                                                                                                                                                                                                                                                                                                                          Надо стремиться к читабельности, а не лаконичности. Поэтому за обмен таким способом в реальном проекте надо отрывать руки. std::swap наше всё.
                                                                                                                                                                                                                                                                                                                                                          Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                                                                                                                                                                            Цитата OpenGL @
                                                                                                                                                                                                                                                                                                                                                            Надо стремиться к читабельности
                                                                                                                                                                                                                                                                                                                                                            Тут - на вкус, на цвет... Оно понятно, что вообще неформатированный код - это, сами понимаете, что такое.
                                                                                                                                                                                                                                                                                                                                                            А вот по части блоков есть нюанс. Общепринято (и в IDE по умолчанию) скобить так
                                                                                                                                                                                                                                                                                                                                                            ExpandedWrap disabled
                                                                                                                                                                                                                                                                                                                                                              void fff()
                                                                                                                                                                                                                                                                                                                                                              {
                                                                                                                                                                                                                                                                                                                                                                // bla-bla-bla
                                                                                                                                                                                                                                                                                                                                                                if (...)
                                                                                                                                                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                                                                                                                                  // ...
                                                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                                              }

                                                                                                                                                                                                                                                                                                                                                            А я со времён AutoLISP (а там порой до десятка закрывающих скобок бывало, это ж лестница на поллиста! :D ) и MultiEdit привык вот к такому
                                                                                                                                                                                                                                                                                                                                                            ExpandedWrap disabled
                                                                                                                                                                                                                                                                                                                                                              void fff() {
                                                                                                                                                                                                                                                                                                                                                                // ...
                                                                                                                                                                                                                                                                                                                                                                if (...) {
                                                                                                                                                                                                                                                                                                                                                                  // ...
                                                                                                                                                                                                                                                                                                                                                              } }

                                                                                                                                                                                                                                                                                                                                                            и ничуть не удивлюсь, если кто-то скажет, что МОЙ код ему глаза режет.

                                                                                                                                                                                                                                                                                                                                                            Добавлено
                                                                                                                                                                                                                                                                                                                                                            ЗЫ - а ТС-то уже на второй уровень пришёл :D !
                                                                                                                                                                                                                                                                                                                                                            Сообщение отредактировано: #SI# -
                                                                                                                                                                                                                                                                                                                                                              Цитата OpenGL @
                                                                                                                                                                                                                                                                                                                                                              Надо стремиться к читабельности, а не лаконичности. Поэтому за обмен таким способом в реальном проекте надо отрывать руки. std::swap наше всё.

                                                                                                                                                                                                                                                                                                                                                              На вкус и цвет...
                                                                                                                                                                                                                                                                                                                                                              ExpandedWrap disabled
                                                                                                                                                                                                                                                                                                                                                                  for (int i = *s == '-' ? 1 : 0, j = strlen(s)-1; i < j; i++, j--)
                                                                                                                                                                                                                                                                                                                                                                  {
                                                                                                                                                                                                                                                                                                                                                                    s[i] = s[i] ^ s[j];
                                                                                                                                                                                                                                                                                                                                                                    s[j] = s[i] ^ s[j];
                                                                                                                                                                                                                                                                                                                                                                    s[i] = s[i] ^ s[j];
                                                                                                                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                                                                                                              Подпись выключена.
                                                                                                                                                                                                                                                                                                                                                                а скажите, Серохвостов Антон, вот с вашим характером правдоруба и ниспровергателя авторитетов, неужели у вас не было конфликтов с преподавателями, несправедливо занижающими вам оценки?
                                                                                                                                                                                                                                                                                                                                                                Цитата usrjava @
                                                                                                                                                                                                                                                                                                                                                                Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                                                                                                                                                                                                                  Цитата #SI# @
                                                                                                                                                                                                                                                                                                                                                                  А вот по части блоков есть нюанс. Общепринято (и в IDE по умолчанию) скобить так

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

                                                                                                                                                                                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                                                                                                                                                                                  Цитата #SI# @
                                                                                                                                                                                                                                                                                                                                                                  и ничуть не удивлюсь, если кто-то скажет, что МОЙ код ему глаза режет.

                                                                                                                                                                                                                                                                                                                                                                  Кстати, да - такой стиль закрывающих скобок я ещё не видел :)
                                                                                                                                                                                                                                                                                                                                                                  Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                                                                                                                                                                                    Цитата OpenGL @
                                                                                                                                                                                                                                                                                                                                                                    такой стиль закрывающих скобок я ещё не видел
                                                                                                                                                                                                                                                                                                                                                                    А я, когда пишу на Паскале, тихо матерюсь из-за того, что в Паскале вместо скобок - бегины и енды (не, можно конечно продефайнить на скобки - но лень! :D ).
                                                                                                                                                                                                                                                                                                                                                                      Цитата #SI# @
                                                                                                                                                                                                                                                                                                                                                                      можно конечно продефайнить на скобки

                                                                                                                                                                                                                                                                                                                                                                      А можно поподробней? :blush:
                                                                                                                                                                                                                                                                                                                                                                      Может себе сделаю.
                                                                                                                                                                                                                                                                                                                                                                          КОД #КОДА
                                                                                                                                                                                                                                                                                                                                                                          Цитата #SI# @
                                                                                                                                                                                                                                                                                                                                                                          ЗЫ - словоблудия на трубе кто-нибудь смотрел? Он там что - проповеди (судя по форме одежды и позам) читает?
                                                                                                                                                                                                                                                                                                                                                                          Если переводить суть беседы на программерский язык, то там идёт речь о «коде #кода». Если картиночно-кратком виде это представлять, вот картинка. Ниже - некоторые выкладки на этот счёт. Но если более подробно надо объяснить картинку - пишите, раскрою предмет подробней.
                                                                                                                                                                                                                                                                                                                                                                          user posted image
                                                                                                                                                                                                                                                                                                                                                                          Давным-давно, – то было ещё в прошлом тысячелетии, – когда IDE были синими, а директивы препроцессора зелёными, в уме одного из пионеров программирования всплыл следующий код: «#define QUESTION bb || !bb». А чуть ранее ту же самую мысль в словах «быть или не быть – вот в чём вопрос», выразил Шекспировский Гамлет. Но ещё намного раньше – 5000 лет назад, – та же самая мысль всплыла в уме Вьясадевы, но на санскрите: атхато брахма джигьяса, – что переводится как «пришло время вопрошать об Абсолютной Истине». Но в самом начале, на заре творения материального мира, было только одно слово, и слово это было у Бога, и слово это было Бог». И слово это было ОМ.

                                                                                                                                                                                                                                                                                                                                                                          Подобно тому, как вся цифровая электроника является оперением «стрелки пирса», выпущенной из лука Чарльза Пирса в 1880-м году, также и весь материальный космос вырос из этого слова ОМ, источником которого является Бог. Причём очень лаконично вырос – ни без полиморфизма и объектно-ориентированного программирования, о чём подробно можно почитать на страницах «Шримад-Бхагаватам», который соотносится со звуком ОМ примерно также, как современные высокоуровневые языки программирования соотносятся с ассемблером.

                                                                                                                                                                                                                                                                                                                                                                          Вот только написан «Шримад-Бхагаватам» на совершенном языке, на санскрите (сан – совершенный, скрит – язык). Единственном языке, алфавит которого имеет научную природу по месту произнесения звуков. Причём он настолько формализован, что даст фору пресловутому C++, культовому языку программистов всех времён. C++ по праву является одним из самых удачных языков программирования, но вместе с тем в нём присутствуют недочёты, о чём красноречиво свидетельствуют соответствующие заметки в документах, стандартизирующих этот язык. Тогда как санскрит – полностью совершенен (подробнее об этом – в статье «Ведическая наука звука»). А о ведических истоках ООП и полиморфизма можно кратко почитать в статье «Квантовая физика и ведическая наука звука».

                                                                                                                                                                                                                                                                                                                                                                          Т.о. понимание природы санскрита и понимание «Шримад-Бхагаватам» приоткрывает перед нами тайну «#кода». Понимание этой тайны в контексте программирования полезно постольку, поскольку позволяет с высоты птичьего полёта посмотреть на всё материальное творение, и т.о. увидеть новые лаконичные решения старых изъезженных задач.

                                                                                                                                                                                                                                                                                                                                                                          Какой-то из выдающихся физиков, – возможно, это был Никола Тесла, – по нескольку часов занимался медитацией, «связываясь» с этим первоначальным «#кодом», и получал оттуда настолько интересные решения, что их даже современные учёные разгадать не могут. Поэтому суть любого успеха – в том, чтобы развить отношения с этим изначальным «#кодом», который как не странно является личностью.

                                                                                                                                                                                                                                                                                                                                                                          Но современный человек, зачастую, гордясь т.н. «научно-техническим прогрессом», упорно не хочет поворачиваться в сторону Бога, и живёт иллюзией, что он и без этого идёт по пути прогресса. Вот только благодаря так называемому развитию промышленности сейчас вместо посуды из металла: золота, серебра, бронзы или меди – используется посуда из пластика, вместо топленого масла – маргарин, а четверть городского населения не имеет крова». Подробнее эта мысль развита в статье «От пластика – к цивилизации Бхагаватам».

                                                                                                                                                                                                                                                                                                                                                                          PS. За опечатки прошу прощения. Спасибо за внимание, и до новых встреч на страницах моего блога.
                                                                                                                                                                                                                                                                                                                                                                          Подпись выключена.
                                                                                                                                                                                                                                                                                                                                                                            Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                                                                            Если переводить суть беседы на программерский язык, то там
                                                                                                                                                                                                                                                                                                                                                                            деление окружности диаметром :whistle: .

                                                                                                                                                                                                                                                                                                                                                                            Добавлено
                                                                                                                                                                                                                                                                                                                                                                            Цитата Суровый @
                                                                                                                                                                                                                                                                                                                                                                            А можно поподробней? :blush:
                                                                                                                                                                                                                                                                                                                                                                            Может себе сделаю.

                                                                                                                                                                                                                                                                                                                                                                            В сишном варианте (сорри)
                                                                                                                                                                                                                                                                                                                                                                            ExpandedWrap disabled
                                                                                                                                                                                                                                                                                                                                                                              #define { begin
                                                                                                                                                                                                                                                                                                                                                                              #define } end

                                                                                                                                                                                                                                                                                                                                                                            Ну а в коде так и пишешь
                                                                                                                                                                                                                                                                                                                                                                            ExpandedWrap disabled
                                                                                                                                                                                                                                                                                                                                                                              procedure aaa() {
                                                                                                                                                                                                                                                                                                                                                                                nil;
                                                                                                                                                                                                                                                                                                                                                                              }

                                                                                                                                                                                                                                                                                                                                                                            Ы... Забыл, что ТАКИЕ скобки в Паскале - для комментов :D !
                                                                                                                                                                                                                                                                                                                                                                            Сообщение отредактировано: #SI# -
                                                                                                                                                                                                                                                                                                                                                                              все, похоже хакер стух. а ведь грозился ответить на наши вопросы.
                                                                                                                                                                                                                                                                                                                                                                              Цитата usrjava @
                                                                                                                                                                                                                                                                                                                                                                              Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                                                                                                                                                                                                                                Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                                                                                до новых встреч на страницах моего блога
                                                                                                                                                                                                                                                                                                                                                                                Модеры, был же когда-то в МШ блог Мыша! Вот пусть там и блажит. На тематику эта х..ня таки не тянет!
                                                                                                                                                                                                                                                                                                                                                                                А на холивары - ну у него мосх и так свихнутый. Ладно бы ПГМ страдал, ещё б поняли...
                                                                                                                                                                                                                                                                                                                                                                                Сообщение отредактировано: #SI# -
                                                                                                                                                                                                                                                                                                                                                                                  Цитата #SI# @
                                                                                                                                                                                                                                                                                                                                                                                  Забыл, что ТАКИЕ скобки в Паскале - для комментов

                                                                                                                                                                                                                                                                                                                                                                                  о, господи, точно.
                                                                                                                                                                                                                                                                                                                                                                                  еще в памяти носится то, что после end должно быть либо ; либо .
                                                                                                                                                                                                                                                                                                                                                                                  Цитата usrjava @
                                                                                                                                                                                                                                                                                                                                                                                  Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                                                                                                                                                                                                                                    Цитата zera @
                                                                                                                                                                                                                                                                                                                                                                                    все, похоже хакер стух
                                                                                                                                                                                                                                                                                                                                                                                    Он такой же хакер, как я - балерина.
                                                                                                                                                                                                                                                                                                                                                                                      Цитата #SI# @
                                                                                                                                                                                                                                                                                                                                                                                      Ладно бы ПГМ страдал, ещё б поняли...

                                                                                                                                                                                                                                                                                                                                                                                      Так по последнему посту вроде ясно становится. Не ПГМ, а БГМ правда, но тут ведь от названия конкретного класса мало что зависит, базовый-то класс общий и даёт основные методы. :-?
                                                                                                                                                                                                                                                                                                                                                                                      Над нами - правила форума, внутри нас - нравственный закон!
                                                                                                                                                                                                                                                                                                                                                                                      (Девиз начинающего модератора.)
                                                                                                                                                                                                                                                                                                                                                                                        Цитата #SI# @
                                                                                                                                                                                                                                                                                                                                                                                        Тему - в Мусорку, флудера - на горшок!
                                                                                                                                                                                                                                                                                                                                                                                        Цитата #SI# @
                                                                                                                                                                                                                                                                                                                                                                                        Модеры, был же когда-то в МШ блог Мыша! Вот пусть там и блажит. На тематику эта х..ня таки не тянет!
                                                                                                                                                                                                                                                                                                                                                                                        Зашёл из любопытства к вам в профиль, и прочитав надпись на вашей награде, свалился под стол… Просто без комментариев. Если сейчас начать беспристрастный анализ контента форума на соответствие разделам и темам, а также анализ адекватности собеседников, то скорее всего придётся вычистить процентов 90 форума и «посадить на горшок» добрую половину форумчан, начиная с медалированных личностей, подобных вам. Причём я скорее всего не буду первым претендентом, а вы намного опередите меня.
                                                                                                                                                                                                                                                                                                                                                                                        Подпись выключена.
                                                                                                                                                                                                                                                                                                                                                                                          Ох, Коалыч, доигрались мы с тобой... ща зачистки будут. :o Ховайся, пока не поздно!
                                                                                                                                                                                                                                                                                                                                                                                          Над нами - правила форума, внутри нас - нравственный закон!
                                                                                                                                                                                                                                                                                                                                                                                          (Девиз начинающего модератора.)
                                                                                                                                                                                                                                                                                                                                                                                            какая дерзкая предъява, разве по кришнаитски это?
                                                                                                                                                                                                                                                                                                                                                                                            Цитата usrjava @
                                                                                                                                                                                                                                                                                                                                                                                            Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                                                                                                                                                                                                                                              Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                                                                                              На самом деле, не столько плохо быть «нубом», сколько строить из себя «не нуба», бросаясь при этом громкими словамиой лекций

                                                                                                                                                                                                                                                                                                                                                                                              Именно этим ты и занимаешься с самого начала дискуссии.

                                                                                                                                                                                                                                                                                                                                                                                              Добавлено
                                                                                                                                                                                                                                                                                                                                                                                              Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                                                                                              while (i < j)
                                                                                                                                                                                                                                                                                                                                                                                              {
                                                                                                                                                                                                                                                                                                                                                                                              s[i] = s[i] ^ s[j];
                                                                                                                                                                                                                                                                                                                                                                                              s[j] = s[i] ^ s[j];
                                                                                                                                                                                                                                                                                                                                                                                              s[i] = s[i++] ^ s[j--];
                                                                                                                                                                                                                                                                                                                                                                                              }


                                                                                                                                                                                                                                                                                                                                                                                              :facepalm:

                                                                                                                                                                                                                                                                                                                                                                                              Добавлено
                                                                                                                                                                                                                                                                                                                                                                                              Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                                                                                              Или есть вариант более лаконичного кода?

                                                                                                                                                                                                                                                                                                                                                                                              ExpandedWrap disabled
                                                                                                                                                                                                                                                                                                                                                                                                std::swap(s[i], s[j]);
                                                                                                                                                                                                                                                                                                                                                                                              Цитата TheMachine @
                                                                                                                                                                                                                                                                                                                                                                                              т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                                                                                                                                                                                                Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                                                                                                свалился под стол
                                                                                                                                                                                                                                                                                                                                                                                                Бедный... И так на голову больной, а тут ещё и об стол поди трахнулся... Хотя - клин клином... Всяко бывает.
                                                                                                                                                                                                                                                                                                                                                                                                Цитата zera @
                                                                                                                                                                                                                                                                                                                                                                                                разве по кришнаитски это?
                                                                                                                                                                                                                                                                                                                                                                                                Это он себя считает кришнаитом. Таки сомневаюсь я, что его дедушка был кришнаитом.
                                                                                                                                                                                                                                                                                                                                                                                                Цитата Серохвостов Антон @
                                                                                                                                                                                                                                                                                                                                                                                                анализ адекватности собеседников
                                                                                                                                                                                                                                                                                                                                                                                                Ты посунься на SQL.RU - там банят не так, как у нас, и тебе быстро всё сразу объяснят :lool: !
                                                                                                                                                                                                                                                                                                                                                                                                ЗЫ - КСЧ ещё жив? Не вздумайте его туда принять! :wacko:

                                                                                                                                                                                                                                                                                                                                                                                                Добавлено
                                                                                                                                                                                                                                                                                                                                                                                                Цитата Dark_Sup @
                                                                                                                                                                                                                                                                                                                                                                                                Ох, Коалыч, доигрались мы с тобой... ща зачистки будут
                                                                                                                                                                                                                                                                                                                                                                                                Да, Пурпыч под горячую руку за наезд на ньюба ... :D !
                                                                                                                                                                                                                                                                                                                                                                                                  Цитата #SI# @
                                                                                                                                                                                                                                                                                                                                                                                                  ЗЫ - словоблудия на трубе кто-нибудь смотрел?

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

                                                                                                                                                                                                                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                                                                                                                                                                                                                  Серохвостов Антон, т.к. большинство моих комментариев, а также других уважаемых участников форума ты просто игноришь, то вот некоторые факты про тебя:
                                                                                                                                                                                                                                                                                                                                                                                                  1. Ты никакой ни хакер и даже не программист.
                                                                                                                                                                                                                                                                                                                                                                                                  2. Твой код по уровню соответствует школьнику старших классов или средненькому студенту младших курсов. Опять же беру что-то среднее. Т.к. я в с старших класс школы мог писать куда более качественный код.
                                                                                                                                                                                                                                                                                                                                                                                                  3. Твой удел в плане программирования вытекает из пункта 2 - писать лабы студентам младших курсов. И это даже не палится т.к уровень соответствует. Хотя, я бы на месте преподов твой код без допилок не принял бы и на троечку.
                                                                                                                                                                                                                                                                                                                                                                                                  4. В этой теме ты только себя позоришь.

                                                                                                                                                                                                                                                                                                                                                                                                  Заметь, это не критика, это факты. Осознав внимательно, что тут написано ты можешь продолжать дальше учиться программированию. И еще заметь, если бы ты изначально пришел в тематику со своим кодом и попросил помочь с ошибками без лишних понтов - тебе бы помогли бы без порицания. И сейчас это не поздно сделать, если собираешься обучаться. Но если ты считаешь себя гуру, то имеешь то, что в этой теме про тебя понаписано.
                                                                                                                                                                                                                                                                                                                                                                                                  Сообщение отредактировано: shm -
                                                                                                                                                                                                                                                                                                                                                                                                  Цитата TheMachine @
                                                                                                                                                                                                                                                                                                                                                                                                  т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                                                                                                                                                                                                    :good:
                                                                                                                                                                                                                                                                                                                                                                                                      Цитата shm @
                                                                                                                                                                                                                                                                                                                                                                                                      И это даже не палится т.к уровень соответствует

                                                                                                                                                                                                                                                                                                                                                                                                      вот это точно, мимикрия высшего уровня
                                                                                                                                                                                                                                                                                                                                                                                                      Цитата usrjava @
                                                                                                                                                                                                                                                                                                                                                                                                      Технологии в основе, которых по-сути лежит javascript в расширенном так сказать виде
                                                                                                                                                                                                                                                                                                                                                                                                        Цитата shm @
                                                                                                                                                                                                                                                                                                                                                                                                        std::swap(s[i], s[j]);

                                                                                                                                                                                                                                                                                                                                                                                                        Или std::reverse для входной строки сразу :D
                                                                                                                                                                                                                                                                                                                                                                                                        Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                                                                                                                                                                                                                          shm меня не покидает ощущение что программированию Антон учился по "Бильдам". А может и сам является автором этих нетленных трудов.
                                                                                                                                                                                                                                                                                                                                                                                                            Цитата Павел Калугин @
                                                                                                                                                                                                                                                                                                                                                                                                            shm меня не покидает ощущение что программированию Антон учился по "Бильдам". А может и сам является автором этих нетленных трудов.

                                                                                                                                                                                                                                                                                                                                                                                                            Вряд-ли - в коде ни одного триграфа нет :D
                                                                                                                                                                                                                                                                                                                                                                                                            Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                                                                                                                                                                                                                              Цитата OpenGL @
                                                                                                                                                                                                                                                                                                                                                                                                              Вряд-ли - в коде ни одного триграфа нет :D

                                                                                                                                                                                                                                                                                                                                                                                                              Ого, как тебе Никонов запал в душу - через столько лет помнишь его предпочтения в организации кода! :D

                                                                                                                                                                                                                                                                                                                                                                                                              Или может Бильды тайно перечитываешь порой? :P

                                                                                                                                                                                                                                                                                                                                                                                                              Добавлено
                                                                                                                                                                                                                                                                                                                                                                                                              shm, а ты похоже тему-то убил. :'( Подождём до утра, конечно, но похоже скоро придётся уёзжать по известному адресу...
                                                                                                                                                                                                                                                                                                                                                                                                              Над нами - правила форума, внутри нас - нравственный закон!
                                                                                                                                                                                                                                                                                                                                                                                                              (Девиз начинающего модератора.)
                                                                                                                                                                                                                                                                                                                                                                                                                Цитата Dark_Sup @
                                                                                                                                                                                                                                                                                                                                                                                                                Ого, как тебе Никонов запал в душу - через столько лет помнишь его предпочтения в организации кода!

                                                                                                                                                                                                                                                                                                                                                                                                                Такое не забывается :)
                                                                                                                                                                                                                                                                                                                                                                                                                Подпись была включена в связи с окончанием срока наказания
                                                                                                                                                                                                                                                                                                                                                                                                                  Цитата Павел Калугин @
                                                                                                                                                                                                                                                                                                                                                                                                                  А может и сам является автором этих нетленных трудов.

                                                                                                                                                                                                                                                                                                                                                                                                                  Вряд ли. Хотя Никонов бы ему тут составил достойную компанию.

                                                                                                                                                                                                                                                                                                                                                                                                                  Добавлено
                                                                                                                                                                                                                                                                                                                                                                                                                  Цитата Dark_Sup @
                                                                                                                                                                                                                                                                                                                                                                                                                  shm, а ты похоже тему-то убил.

                                                                                                                                                                                                                                                                                                                                                                                                                  Ну ТС начал сам сливаться, я решил не томить и открыть карты.
                                                                                                                                                                                                                                                                                                                                                                                                                  Сообщение отредактировано: shm -
                                                                                                                                                                                                                                                                                                                                                                                                                  Цитата TheMachine @
                                                                                                                                                                                                                                                                                                                                                                                                                  т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                                                                                                                                                                                                                                                                                                                                                                                                                    Цитата Павел Калугин @
                                                                                                                                                                                                                                                                                                                                                                                                                    shm меня не покидает ощущение что программированию Антон учился по "Бильдам". А может и сам является автором этих нетленных трудов.
                                                                                                                                                                                                                                                                                                                                                                                                                    Та нет. Просто слишком старые учебники и средства разработки. Причём меня не оставляет мысль, что учебники навязаны преподаванием.
                                                                                                                                                                                                                                                                                                                                                                                                                    Одни с годами умнеют, другие становятся старше.