вита7-%
|
|
1 | |
Функция, которая принимает аргумент типа String и возвращает результат типа Double24.06.2012, 17:45. Показов 6301. Ответов 16
Метки нет (Все метки)
Написать функцию, которая принимает аргумент типа String, и возвращает результат типа Double, который содержит числовой эквивалент значения аргумента. Необходимо удалить все нечисловые, кроме десятичной точки, символы и затем использовать функцию Val для преобразования строки в число.
помоги те плиз написать. |
24.06.2012, 17:45 | |
Ответы с готовыми решениями:
16
В переменную какого типа можно запихнуть двумерный массив типа String Составить программу с переменными типа String, которая выделяет второе с конца слово в строке функция принимает два параметра типа double и возвращает значение типа double Напишите перегруженную функцию power (), которая принимает два целочисленных параметра типа int и возвращает целочисленное значение типа int |
26805 / 14484 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
||||||
24.06.2012, 18:34 | 2 | |||||
Регулярка поможет
123.98
3
|
вита7-%
|
||||||
24.06.2012, 18:54 | 3 | |||||
|
24.06.2012, 19:30 | 4 | |||||
Я бы так написал:
1
|
24.06.2012, 20:02 | 5 | |||||
А в это врея (удивившись, что всю эту работу не делает Val), я сгоряча наваял следующее.
0
|
24.06.2012, 20:02 | 6 |
Не правда. Удаляет только по краям.
Строки 6-7 можно опустить. Инициализация нулевыми значениями для языка VB не требуется. PCount-счетчик нигде ничего не подсчитывает. Впрочем как и oStr, которая должна накапливать букво-цифры. Банально внутри цикла не хватает логики. Смысл строки 9 мне не понятен. Цикл не завершается ключевой командой Next. Преобразование Val зачем-то проводится якобы в цикле. Ошибок много. Алгоритм не дописан. Вы бы написали логику, которую хотите реализовать и что из этого Вам не понятно. __________________________________________________ Sasha_Smirnov, ать. Сколько я мелочей пропустил (+- e ... иди знай еще что). P.S. чёть у меня на твоем коде такое не пляшет: """dfgh123nn,989,,9grty"""
0
|
24.06.2012, 20:44 | 7 |
Слышали звон: функция Val сама прекрасно удаляет пробелы, знаки табуляций, переводов строки? Одна беда — лишь после найденного ею в строке числа.
Эта строка даёт 123. Не у всех, видимо ☺☺☺
0
|
24.06.2012, 20:49 | 8 | ||||||||||
Я если честно даже не знаю, что должно получаться.
Ну по моей логике должно быть как то так (постарался учесть все моменты):
Код
123.989 1E-300 -11 -1000000000 -1000000000 -1E+99
0
|
25.06.2012, 05:49 | 9 | |||||
40-минутная медитация выдала этакий
123 1E-300 -11 -1000000000 -1 -1000000000 Ну я уже как Альцгеймер!
0
|
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
|
||||||
25.06.2012, 09:18 | 10 | |||||
вот собственное творение на ваш суд
правда без обработки записи числа в степенной форме - но я думаю в этой задачи и изначально не было такого вопроса это вы, коллеги, уже сам в дебри полезли
2
|
15145 / 6418 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
|
|
25.06.2012, 10:49 | 11 |
1
|
25.06.2012, 18:01 | 12 | ||||||||||
Совершенству нет предела.
По Вашему коду: не-а. Интернейшнл - это системная настройка разделителя. А экселевсвкая:
Введите Immediate:
Целые числа не имеют разделителей. В WholePart ничего не запишется и функция выдаст 0 (хотя в контексте ТС таких чисел нет, но ИМХО, как то непрактично). А так, интересный вариант.
1
|
25.06.2012, 19:47 | 13 | |||||
А может, лучше просто CDbl?!
0
|
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
|
|||||||||||||||||||||||||||||||||||||||||
25.06.2012, 20:32 | 14 | ||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
Поменяйте в системных параметрах разделитель с точки на запятую и будет вам обратная сторона счастья
Добавлено через 40 минут Diskretor, заметьте, я намеренно использую функцию val для перевода в строки число. Функции val и str используют свой собственный парсер. И в нем разделителем жестко задана точка. Cdbl же использует системный разделитель целой и дробной части в исходной строке. И выдает ошибку в случае несовпадения, в отличие от val - который просто отбрасывает все что справа от неправильного разделителя и его тоже. Кстати VBA использует именно системный разделитель и в представлении чисел в отладочных окнах и для работы функций с числами, кроме указанных выше str и val. В качестве информации для размышления: Решив прояснить этот вопрос я начал ковыряться с кодом приведенным ниже. Отключите в настройках Excel использование системных разделителей, задайте какой нибудь свой, например "-" и поэкспериментируйте с кодом ниже с разными системными разделителями и с вкл\выкл настройки екселя для использования системных настроек. Результат вас скорее всего удивит.
Если использование системных разделителей включено - то Application.DecimalSeparator возвращает значение, указанное в параметрах Excel (которое в данном случае недоступно для редактирования из Excel - как обстоит дело с VBA - не пробовал), а Application.International(xlDecimalSeparator) - системный разделитель - как ему и положено! На чистом VB кстати определить региональные параметры можно только с помощью API-функций, или без API ма-а-леньким хитрым способом, который работает и в VBA Еще прошу заметить - ТС не указал, откуда он берет строку - из ячейки листа или вводит через inputbox Если строка берется из ячейки - тогда вот этот кусок кода:
Если же текст вводится к примеру через inputBox - тогда моего кода было бы достаточно, пока я же путем экспериментов не выяснил странную особенность поведения Application.International(xlDecimalSeparator) при отключенной настройке Excel "использовать системные разделители" - прошу подтвердить или опровергнуть данную информацию - это важно! Переделывать придется макросы наверно... и поиск разделителя в цикле тоже д.б. исправлен с:
надо добавить после цикла:
Может для кого то это и не новость, но я решил для себя что отныне я буду определять разделитель целой и дробной части, при использовании данных с листа стандартно через
Не по теме: Многа букав писал - устал однако! Пойду домой... :)
1
|
25.06.2012, 21:26 | 15 |
Ничуть не удивляет.
Не проверял, но полагаю эта опция "Не использовать системный разделитель" намеренно отключает програмный доступ к системной настройке (в том числе для всех команд) и Application.International(xlDecimalSeparator) таким образом использует Экселевский разделитель, что логично (ведь она работает через Excel.application, а не API). Думаю, дело здесь в универсальности. Я специально отказался от использования параметров настроек разделителей. Зачем мне их знать, если команда Cdbl принимает "," (запятую) как разделитель при любой системной настройке. Неа. Можете сами проверить. Я проверял, в т.ч. с перезагрузкой ("," всегда, + дополнительно подходит любой альтернативный разделитель, если такой задан системой). Думаю тоже самое касается команды Val и знака "." (точки). Не проверял. Тогда зачем все эти танцы с системными настройками. Делаем безусловный реплейс в начале кода на точки и все.
0
|
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
|
|
25.06.2012, 21:33 | 16 |
Чего то у меня вот не принимает при любой
она принимает в качестве разделителя только системную настройку Если в системе разделитель - запятая - от запятую если точка- то точку при несовпадении вываливается в ошибку val и str опять же используют строго точку. В общем я для себя mid(1/2,2,1) открыл - теперь буду его юзать! единственно что в VB почему то числа без ведущего нуля в строку преобразовываются т.е. на VB 0.5 в строковом представлении будет ".5" и там соответственно юзаю mid(1/2,1,1)
0
|
26805 / 14484 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
||||||
25.06.2012, 22:27 | 17 | |||||
Можно и так найти системный разделитель целой и дробной частей
1
|
25.06.2012, 22:27 | |
25.06.2012, 22:27 | |
Помогаю со студенческими работами здесь
17
Аргумент типа double несовместим с параметром типа double Аргумент типа double несовместим с параметром типа double* Функция типа long double возвращает странные значения Запись информации из вектора типа string в вектор типа double Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |