Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Помогите с реализацией программы.


Автор: N0rd 25.10.2004, 07:49
Помогите пожалуйста с реализацией программы на С.
Начну с небольшого рассказа о себе(может это и лишнее).Я студент первого курса Петрозаводского гос университета(р. Карелия).Специальность прикладная математика и информатика.В школе програмированию учили плохо, тока бейсику(у учительницы уходила неделя чтобы проверить программу в пять строк :) ).А здесь ещё ничему не научили, а уже проги на паскале, да на С требуют(а ещё ассемблер изучаем :( ).С паскалем я немного сам разобрался(первую прогу сдал уже, там надо было найти в текст файле самое длинное слово, через перенаправление стандартного ввода).А вот с С, проблемы.Пишем мы под линукс(в emacs).В будущем поставил перед собой скромненькую цель: стать разработчиком компьютерных игр и поднять российскую игроиндустрию :) .
А вот собственно с чем мне нужно помочь.
Преобразовать введенную строку в число и введенное число в строку. Функции
форматных преобразований использовать для преобразования запрещается (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-ю степень). В степень можно возводить простым перемножением :). Результат присвоимпеременной t
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) Разбираем число на запчасти
Код
Neg=Sign(x) ' Знак
Re=Fix(Abs(x) ' Целая часть
Im=Abs(x)-Re ' Дробная часть


2) Преобразуем в строку
Код
sRe=""
While Re>0
sRe=chr(30+(Re MOD 10)) + sRe
Re=Re \ 10
Wend
sIm=""
While Im>0
sIm=sIm + chr(30+(Im*10))
Im=Im*10
Im=Im-Fix(Im)
Wend
sX=sRe + "." + sIm
if Neg < 0 Then sX = "-" + sX


Аналогично обратно... Вот только что делать с ошибками преобразования типов?
PS. Из Барсика в Си переваришь поди...

Автор: Дрон 25.10.2004, 09:14
Цитата(Akina @ 25.10.2004, 10:08)
sRe=chr(30+(Re MOD 10)) + sRe

Вот такую работу со строками в Си не очень удобно реализовывать.
А вот с дробной частью как раз так, как ты написал и надо :)

ЗЫ: На работу решил позже пойти :)

Автор: Akina 25.10.2004, 11:07
Дрон
Цитата
такую работу со строками в Си не очень удобно реализовывать
ну можно и наоборот - sRe=sRe + chr(30+(Re MOD 10)), а потом один раз использовать функцию инверсии строки - вроде есть такая...

Автор: Дрон 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
Может там чего-нибудь найдёшь :)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)