На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Друзья, соблюдайте, пожалуйста, правила форума и данного раздела:
Данный раздел не предназначен для вопросов и обсуждений, он содержит FAQ-заготовки для разных языков программирования. Любой желающий может разместить здесь свою статью. Вопросы же задавайте в тематических разделах!
• Если ваша статья может быть перенесена в FAQ соответствующего раздела, при условии, что она будет оформлена в соответствии с Требованиями к оформлению статей.
• Чтобы остальным было проще понять, указывайте в описании темы (подзаголовке) название языка в [квадратных скобках]!
Модераторы: Модераторы
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Неотёсанные топики , [Pascal] Здесь шлифуем FAQ (ЧАВО)
    Помещено в Указатели (Pointers)
    Сообщение отредактировано: Jin X -
      Цитата
      romtek, 26.05.04, 00:07
      if P<>Nil then


      Необходимо закоммненить. Типа

      ExpandedWrap disabled
        if P<>Nil then { Если распределение памяти прошло успешно }


      Ну а записать туда Sz Рандомных символов? :rolleyes:
        Цитата
        Romtek, 25.05.04, 19:07
        Какой пример привести для работы с нетипизированными ук-лями?

        Просто пример выделения памяти под "произвольные данные". Когда их тип точно не определён, но известен размер. Например графическое изображение. Ну или текст. А лучше данные из файла. Они по любому могут быть неопределённые ;)

        Добавлено в :
        Да.. так будет лучше всего. сначала узнаём размер файла. Потом выделяем соответствующее количество байт, и грузим содержимое в дамп данных. Потом загадочный коментарный блок "обработка данных" и удаление блока из памяти и закрытие файла. %))) Для примера вполне сойдёт. Главное чтобы понятно было как работать. а... или даже лучше потом чёнить с данными сделать. Например закодировать каждый байт данных командой xor <введённое пользователем число> (заодно в примере придётся использовать команду mem.)
          Линк на тему Поиск данных
          Сообщение отредактировано: Romtek -
            М... а комментарии какие-то? ;)
              да комментариев особо не надо. Есть массив, указатель на него и границы передаются в процедуру. В процедуре выполняется цикл, от границ берется среднее, сверяется с ключом. Если ключ больше, значит слева от среднего и в самом среднем ключа быть не может (массив отсортирован по возрастанию, если по убыванию, нужно поменять знак сравнения), передвигаем левую границу за среднее (Lb:=M+1;) если меньше, аналогично поступаем с правой, если равно, то возвращаем индекс. Цикл завершается, если в середине не осталось ни одного элемента (until Lb>Ub;), тогда выходим с записанным в начале значением -1.
                Цитата Задача
                В строке содержится список неотрицательных десятичных чисел, содержащих целую и дробную части, разделенные точкой. Элементы списка разделены запятыми. Требуется удалить незначащие нули в целой и дробной частях, если они имеются. Если при этом полностью удаляется дробная часть, то удалению подлежит также разделяющая их точка.

                Учесть, что целая часть числа должна содержать по крайней мере одну цифру (например, для числа 000.0500 получим 0.05, а для числа 000.000 - значение 0). Например, для строки
                S = '35.0500,0054.03,000,045,0.7000,000606.0600,0.000,55'
                получим
                S = '35.05,54.03,0,45,0.7,606.06,0,55'.

                ExpandedWrap disabled
                  Program StringTask6;
                  Var
                     S,Sb : string;
                     i,k,k1,k2 : byte;
                     Cond : Boolean;
                  { --------------------------- }
                  Function Comma (k:byte) :byte;
                  Var
                     i : byte;
                  Begin
                    Comma:= 0;
                    For i:=k to length(S) do
                      If S[i]=',' then
                        Begin
                          Comma:=i;
                          Exit
                        End;
                  End { Comma };
                  { --------------------------- }
                  Begin
                    Readln(S);
                    Writeln('S=',S);
                    Cond:=true;
                    k2:=0;
                    While Cond do
                      Begin
                        k1:=k2+1;
                        k2:=Comma(k1 + 1) ;
                        If k2=0 then
                          Begin
                            k2:=length(S)+1; Cond:=false
                          End;
                        Sb:=Copy(S,k1,k2-k1);
                        k:=Pos('.',Sb);
                        If k=0 then   { число не имеет дробной части }
                          k:=length(Sb) +1;
                        i:=1; { Удаление незначащих }
                        While (i<k-1) and (Sb[i]='0') do { нулей в целой части }
                          Inc(i); { числа }
                        If i>1 then
                        Delete(Sb,1,i-1);
                        k:=Pos('.',Sb);
                        If k>0 then
                          Begin
                            i:=length(Sb);    { Удаление незначащих }
                            While (i>k) and (Sb[i]='0') do   { нулей в дробной части }
                              Dec (i);    { числа }
                            If i<length(Sb) then
                              Delete(Sb,i+1,length(Sb)-i);
                            If Sb[length(Sb)]='.' then
                  { Удаление разделяющей }
                              Delete(Sb,length(Sb),1);       { точки }
                          End;
                        If length(Sb)<k2-k1 then         { Замена числа в строке }
                          Begin   { S, если его длина }
                            Delete(S,k1,k2-k1);   { изменилась }
                            Insert(Sb,S,k1);
                            k2:=k1+length(Sb);    { Коррекция значения k2 }
                          End;
                      End;
                    Writeln('S=',S);
                  End.
                   
                  (*
                  Примечание. В программе StringTask6 учитывается, что первая цифра первого числа находится в первой позиции исходной строки S, а первая цифра следующих чисел - после запятой (по условию задачи в строке S нет пробелов).
                  *)
                  Ух ты %) я тоже решил написать эту задачку %)
                  ExpandedWrap disabled
                    const
                      example:string='35.0500,0054.03,000,045,0.7000,000606.0600,0.000,55';
                     
                    function normalizevalues(s:string):string;
                    var
                      p:byte;
                      temp:string;
                    begin
                      temp:='';
                      p:=1;
                      s:=' '+s+' '; {Добавим лишние проблеы, чтобы случайно не выйти за границы при проверке}
                      while p<=length(s) do {цикл, в котором обрабатывается строка}
                      begin
                        if s[p]=',' then {если текущий символ - ',' то убираем слева и справа лишние нули}
                        begin
                          while s[p+1]='0' do inc(p); {справа нули в исходной строке пропускаем}
                          while (temp[byte(temp[0])] in ['0','.']) and
                            not (temp[byte(temp[0])-1] in [',',' ']) do dec(temp[0]); {убираем в готовой строке нули слева}
                          temp:=temp+','; {добавляем запятую}
                          if not (s[p+1] in ['1'..'9']) then temp:=temp+'0'; {если нужно оставить один ноль - добавляем его}
                        end else if s[p]<>' ' then temp:=temp+s[p]; {Иначе просто добавляем символ}
                        inc(p);
                      end;
                      normalizevalues:=temp;
                    end;
                     
                    begin
                      writeln(example);
                      writeln(normalizevalues(example));
                    end.
                    IMHO твоя прога сложнее для понимания, особенно для новичков...
                      еще один алгоритмик:

                      Это конечно изврат, но работать будет:

                      Сначала число записать в real пременную, а потом преобразовать в строку... И все сразу нормализуется....
                      Сообщение отредактировано: e-moe -
                        M
                        e-moe,
                        Some1,
                        я прошу вас не превращать тему в разделе FAQ в подобие раздела Многошум!


                        Здесь помещаются окончательные варианты, а обсуждением следует заниматься в отдельной теме. Предупреждаю, такие посты будут удаляться!
                          Вот ещё один вариант, который как раз очень понятен для новичка, хотя и не оптимален как код.
                          Принцип такой, что мы ищем в строке сначала пары ',0' и найдя удаляем из строки нолик. Таким образом все нолики после запятых (тоесть в начале следующей цифры) будут удалены. Затем по такому же принципу мы ищем все '0,' и опять же удаляем нули, таким образом убирая все лишние нули в конце цифры. В результате у нас получатся уже улучшеные цифры. Но вот незадача - могут остаться точечки, если в дробной части были только нули. Поэтому мы ищем все последовательности типа '.,' и удаляем из них ненужные точки. После этого казалось бы всё. Ан нет. Ведь вот так обрезая цифры мы удалим вобще число вроде '000', от которого останутся только рожки да ножки и две запятые по бокам - ',,' Вот такие пары запятых мы и ищем, вставляе попутно между ними нулики. Остаётся ещё добавить нулики между ',.' потому что при обрезке начала цифры у нас удалятся все нули, а если цифра была '0.01', то получится '.01', а нам нужно чтобы один ноль сохранился. Поэтому мы ищем пары ',.' и вставляем между ними нулики.
                          Теперь вроде всё.
                          Ну и ещё я добавляю к началу строки и к концу по одной запятой, для того чтобы корректно обрабатывались первое и последнее число. В конце функции я от них избавляюсь незамысловатой конструкцией и командой copy :)
                          ExpandedWrap disabled
                            function normalizevalues(s:string):string;
                            begin
                              s:=','+s+',';
                              while pos(',0',s)<>0 do delete(s,pos(',0',s)+1,1);
                              while pos('0,',s)<>0 do delete(s,pos('0,',s),1);
                              while pos('.,',s)<>0 do delete(s,pos('.,',s),1);
                              while pos(',,',s)<>0 do insert('0',s,pos(',,',s)+1);
                              while pos(',.',s)<>0 do insert('0',s,pos(',.',s)+1);
                              normalizevalues:=copy(s,2,length(s)-2);
                            end;
                            конструкцию типа
                            ExpandedWrap disabled
                                while pos(',0',s)<>0 do delete(s,pos(',0',s)+1,1);
                            я заменил бы на
                            ExpandedWrap disabled
                                repeat
                                  m:=pos(',0',s);
                                  if m<>0 then delete(s,m+1,1);
                                until m=0;


                            Добавлено в :


                            e-moe, хочется видеть процедуры, готовые к использованию...
                            1-я процедура должна выделять числа, разделённых запятой
                            2-я - нормализовать сами числа,
                            т.к. в большинстве случаев числа не будут разделены запятыми.
                              я бы не советовал использовать const при выводе длинного числа, потому что оно забивает стек копией числа
                              пусть медленно, но работает...
                              +

                              Это сообщение было перенесено сюда или объединено из темы "Длинная арифметика - решение математики"
                                Vesper, как раз-таки наоборот: const передает ссылку на объект, а если без const - то будет забиваться стек.

                                Это сообщение было перенесено сюда или объединено из темы "Длинная арифметика - решение математики"
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0463 ]   [ 15 queries used ]   [ Generated: 28.03.24, 17:10 GMT ]