Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.168] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Помещено в Указатели (Pointers)
|
Сообщ.
#2
,
|
|
|
Цитата romtek, 26.05.04, 00:07 if P<>Nil then Необходимо закоммненить. Типа if P<>Nil then { Если распределение памяти прошло успешно } Ну а записать туда Sz Рандомных символов? |
Сообщ.
#3
,
|
|
|
Цитата Romtek, 25.05.04, 19:07 Какой пример привести для работы с нетипизированными ук-лями? Просто пример выделения памяти под "произвольные данные". Когда их тип точно не определён, но известен размер. Например графическое изображение. Ну или текст. А лучше данные из файла. Они по любому могут быть неопределённые Добавлено в : Да.. так будет лучше всего. сначала узнаём размер файла. Потом выделяем соответствующее количество байт, и грузим содержимое в дамп данных. Потом загадочный коментарный блок "обработка данных" и удаление блока из памяти и закрытие файла. %))) Для примера вполне сойдёт. Главное чтобы понятно было как работать. а... или даже лучше потом чёнить с данными сделать. Например закодировать каждый байт данных командой xor <введённое пользователем число> (заодно в примере придётся использовать команду mem.) |
Сообщ.
#4
,
|
|
|
Линк на тему Поиск данных
|
Сообщ.
#5
,
|
|
|
М... а комментарии какие-то?
|
Сообщ.
#6
,
|
|
|
да комментариев особо не надо. Есть массив, указатель на него и границы передаются в процедуру. В процедуре выполняется цикл, от границ берется среднее, сверяется с ключом. Если ключ больше, значит слева от среднего и в самом среднем ключа быть не может (массив отсортирован по возрастанию, если по убыванию, нужно поменять знак сравнения), передвигаем левую границу за среднее (Lb:=M+1;) если меньше, аналогично поступаем с правой, если равно, то возвращаем индекс. Цикл завершается, если в середине не осталось ни одного элемента (until Lb>Ub;), тогда выходим с записанным в начале значением -1.
|
Сообщ.
#7
,
|
|
|
Цитата Задача В строке содержится список неотрицательных десятичных чисел, содержащих целую и дробную части, разделенные точкой. Элементы списка разделены запятыми. Требуется удалить незначащие нули в целой и дробной частях, если они имеются. Если при этом полностью удаляется дробная часть, то удалению подлежит также разделяющая их точка. Учесть, что целая часть числа должна содержать по крайней мере одну цифру (например, для числа 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'. 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 нет пробелов). *) |
Сообщ.
#8
,
|
|
|
Ух ты %) я тоже решил написать эту задачку %)
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. |
Сообщ.
#9
,
|
|
|
IMHO твоя прога сложнее для понимания, особенно для новичков...
|
Сообщ.
#10
,
|
|
|
еще один алгоритмик:
Это конечно изврат, но работать будет: Сначала число записать в real пременную, а потом преобразовать в строку... И все сразу нормализуется.... |
Сообщ.
#11
,
|
|
|
M e-moe, Some1, я прошу вас не превращать тему в разделе FAQ в подобие раздела Многошум! Здесь помещаются окончательные варианты, а обсуждением следует заниматься в отдельной теме. Предупреждаю, такие посты будут удаляться! |
Сообщ.
#12
,
|
|
|
Вот ещё один вариант, который как раз очень понятен для новичка, хотя и не оптимален как код.
Принцип такой, что мы ищем в строке сначала пары ',0' и найдя удаляем из строки нолик. Таким образом все нолики после запятых (тоесть в начале следующей цифры) будут удалены. Затем по такому же принципу мы ищем все '0,' и опять же удаляем нули, таким образом убирая все лишние нули в конце цифры. В результате у нас получатся уже улучшеные цифры. Но вот незадача - могут остаться точечки, если в дробной части были только нули. Поэтому мы ищем все последовательности типа '.,' и удаляем из них ненужные точки. После этого казалось бы всё. Ан нет. Ведь вот так обрезая цифры мы удалим вобще число вроде '000', от которого останутся только рожки да ножки и две запятые по бокам - ',,' Вот такие пары запятых мы и ищем, вставляе попутно между ними нулики. Остаётся ещё добавить нулики между ',.' потому что при обрезке начала цифры у нас удалятся все нули, а если цифра была '0.01', то получится '.01', а нам нужно чтобы один ноль сохранился. Поэтому мы ищем пары ',.' и вставляем между ними нулики. Теперь вроде всё. Ну и ещё я добавляю к началу строки и к концу по одной запятой, для того чтобы корректно обрабатывались первое и последнее число. В конце функции я от них избавляюсь незамысловатой конструкцией и командой copy 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; |
Сообщ.
#13
,
|
|
|
конструкцию типа
while pos(',0',s)<>0 do delete(s,pos(',0',s)+1,1); repeat m:=pos(',0',s); if m<>0 then delete(s,m+1,1); until m=0; Добавлено в : e-moe, хочется видеть процедуры, готовые к использованию... 1-я процедура должна выделять числа, разделённых запятой 2-я - нормализовать сами числа, т.к. в большинстве случаев числа не будут разделены запятыми. |
Сообщ.
#14
,
|
|
|
я бы не советовал использовать const при выводе длинного числа, потому что оно забивает стек копией числа
пусть медленно, но работает... + Это сообщение было перенесено сюда или объединено из темы "Длинная арифметика - решение математики" |
Сообщ.
#15
,
|
|
|
Vesper, как раз-таки наоборот: const передает ссылку на объект, а если без const - то будет забиваться стек.
Это сообщение было перенесено сюда или объединено из темы "Длинная арифметика - решение математики" |