| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Помогите с реализацией программы. |
| Автор: N0rd 25.10.2004, 07:49 |
| Помогите пожалуйста с реализацией программы на С. Начну с небольшого рассказа о себе(может это и лишнее).Я студент первого курса Петрозаводского гос университета(р. Карелия).Специальность прикладная математика и информатика.В школе програмированию учили плохо, тока бейсику(у учительницы уходила неделя чтобы проверить программу в пять строк А вот собственно с чем мне нужно помочь. Преобразовать введенную строку в число и введенное число в строку. Функции форматных преобразований использовать для преобразования запрещается (printf, atof etc.) Реализация на С. Только вот о чём вас попрошу.Не надо выкладывать готовое решение(весь исходный текст).Пока что время у меня ещё до сдачи есть и я хочу сам хоть до чего нибудь дойти.Помогите с теоритеческими подсказками.Я пока что не понимаю даже суть этого задания. Буду надеятся что вы не пройдёте стороной и поможете своему младшему брату програмеру(пока что чайнику |
| Автор: Дрон 25.10.2004, 08:36 |
| N0rd Для начала: Берёшь массив типа char в 100 элементов. Берёшь переменную p типа int и присваиваешь ей значение 0. Дальше, когда я говорю, что мы что-то добавляем к строке -- это означает, что мы записываем в этот массив символ по индексу p и увеличиваем p на единицу. Чтобы добавить цифру z к массиву, тебе нужно записать в массив код её символа а его можно получить очень просто: z - '0'. Где в одинарных кавычках стоит ноль. Если нужно число в строку: 1. смотрим отрицательное оно или нет: если отрицательное добавляем к строке "-" 2. берём модуль целой части числа ( если был float или double, то просто приводим к int ) и дальше работаем с ним. Присвоим его переменной x. 2А. если он равен 0, то переходим к пункту 3. 2Б. считаем десятичный логарифм ( функция log10 ) и его округляем вниз до целого -- это будет на единицу меньше числа знаков целой части. Дальше берём 10 и возводим в эту степень (именно в целую степень, т.е. если логарифм был 6.78, то 10 нужно возвести в 6-ю степень). В степень можно возводить простым перемножением 2В. делим x на t. Получаем однозначное число d. Добавляем его к строке. Важно! И x и t должны быть типа int, чтобы d получилось целое. Иначе тебе его тоже прийдётся приводить к целому, чтобы получилась одна цифра. 2Г. x = x - t*d. Тем самым избавляемся от старшей цифры. 2Д. если x равно 0, то всё -- с целой частью закончили, иначе делим t на 10 и возвращаемся к шагу 2В 3. берём дробную часть ( из числа вычитаем целую часть, которую, кстати, нужно получить снова, так как в x у нас теперь 0 ) 4. если дробная часть 0, то можно радоваться -- всё готово, иначе продолжаем. 5. добавляем к строке точку (или запятую, кому как нравится Вот с дробной мне уже некогда тут расписывать -- на работу пора идти, а в принципе там, наверно, что-то похожее Правильность и оптимальность, кстати, не гарантирую. Придумывал на ходу Алгоритм преобразования строки в число тоже довольно прост. Сначала нужно определить величину этого числа, просто посчитав количество цифр до точки. Дальше нужно по одной цифре брать из массива, домножать на 10 в некоторой степени и суммировать |
| Автор: Akina 25.10.2004, 09:08 | ||||
| Дрон А почему со СТАРШЕЙ цифры? 1) Разбираем число на запчасти
2) Преобразуем в строку
Аналогично обратно... Вот только что делать с ошибками преобразования типов? PS. Из Барсика в Си переваришь поди... |
| Автор: Дрон 25.10.2004, 09:14 | ||
Вот такую работу со строками в Си не очень удобно реализовывать. А вот с дробной частью как раз так, как ты написал и надо ЗЫ: На работу решил позже пойти |
| Автор: Akina 25.10.2004, 11:07 | ||
Дрон
|
| Автор: Дрон 25.10.2004, 11:33 |
| Добавлять символ к строке -- вот, что сложно |
| Автор: Akina 25.10.2004, 18:06 |
| Дрон ну рассматривать строку аки массив байтов и держать еще текущий указатель... да мелочи это все... вот что делать если имеет место нечто вроде: x=1.1 Sign(x)=1 Re(x)=1 Im(x)=0.099999999996 вот вопрос.... |
| Автор: po-her 25.10.2004, 21:15 |
| нас учили так!!! 1.читаем посимвольно строку. 3.Проверяем на десятичную точку, если она есть то присваиваем переменной-показателю 1 если нет 0. 3.1 Если эта переменная уже единица то к переменной int начинаем прибавлять единицы (показатель степени) 4.из прочитанного символа вычитаем ASCII код нуля... 5.прибавляем это к переменной типа double и в 6.Эту переменную умножаем на 10. И так до конца строки. В конце vозвращаем ту переменную к которой прибавляли числа (double), поделенную на 10 в степени, а именно степень=тому числу к которому мы прибавляли единичке после нахождения точки... Вороде Все... |
| Автор: N0rd 26.10.2004, 20:22 |
| Всем большое спасибо за помощь!!! Отличный здесь форум. Прогу писать буду наверно попозже,сначала надо бы книжку прикупить с описанием функций и т.д.Может посоветуете какую книгу для начинающего по С( не ++). |
| Автор: Дрон 26.10.2004, 21:22 |
| N0rd Всегда рады помочь Насчёт книг -- есть здесь на форуме раздел: http://forum.vingrad.ru/index.php?showtopic=7168 Может там чего-нибудь найдёшь |