Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с реализацией программы. Преобразование строки в число и обратно. 
:(
    Опции темы
N0rd
Дата 25.10.2004, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 24.10.2004
Где: Карелия,Петрозаво дск

Репутация: нет
Всего: нет



Помогите пожалуйста с реализацией программы на С.
Начну с небольшого рассказа о себе(может это и лишнее).Я студент первого курса Петрозаводского гос университета(р. Карелия).Специальность прикладная математика и информатика.В школе програмированию учили плохо, тока бейсику(у учительницы уходила неделя чтобы проверить программу в пять строк :) ).А здесь ещё ничему не научили, а уже проги на паскале, да на С требуют(а ещё ассемблер изучаем :( ).С паскалем я немного сам разобрался(первую прогу сдал уже, там надо было найти в текст файле самое длинное слово, через перенаправление стандартного ввода).А вот с С, проблемы.Пишем мы под линукс(в emacs).В будущем поставил перед собой скромненькую цель: стать разработчиком компьютерных игр и поднять российскую игроиндустрию :) .
А вот собственно с чем мне нужно помочь.
Преобразовать введенную строку в число и введенное число в строку. Функции
форматных преобразований использовать для преобразования запрещается (printf,
atof etc.) Реализация на С.
Только вот о чём вас попрошу.Не надо выкладывать готовое решение(весь исходный текст).Пока что время у меня ещё до сдачи есть и я хочу сам хоть до чего нибудь дойти.Помогите с теоритеческими подсказками.Я пока что не понимаю даже суть этого задания.
Буду надеятся что вы не пройдёте стороной и поможете своему младшему брату програмеру(пока что чайнику :) ).

PM MAIL   Вверх
Дрон
Дата 25.10.2004, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



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 в некоторой степени и суммировать :)


--------------------
Да. Именно так.
PM   Вверх
Akina
Дата 25.10.2004, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Дрон
А почему со СТАРШЕЙ цифры?

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. Из Барсика в Си переваришь поди...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Дрон
Дата 25.10.2004, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(Akina @ 25.10.2004, 10:08)
sRe=chr(30+(Re MOD 10)) + sRe

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

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

Это сообщение отредактировал(а) Дрон - 25.10.2004, 09:17


--------------------
Да. Именно так.
PM   Вверх
Akina
Дата 25.10.2004, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



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

Это сообщение отредактировал(а) Akina - 25.10.2004, 11:14


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Дрон
Дата 25.10.2004, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Добавлять символ к строке -- вот, что сложно :)


--------------------
Да. Именно так.
PM   Вверх
Akina
Дата 25.10.2004, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Дрон
ну рассматривать строку аки массив байтов и держать еще текущий указатель... да мелочи это все... вот что делать если имеет место нечто вроде:

x=1.1
Sign(x)=1
Re(x)=1
Im(x)=0.099999999996

вот вопрос....


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
po-her
Дата 25.10.2004, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.10.2004

Репутация: нет
Всего: нет



нас учили так!!!
1.читаем посимвольно строку.
3.Проверяем на десятичную точку, если она есть то присваиваем переменной-показателю 1 если нет 0.
3.1 Если эта переменная уже единица то к переменной int начинаем прибавлять единицы (показатель степени)
4.из прочитанного символа вычитаем ASCII код нуля...
5.прибавляем это к переменной типа double и в
6.Эту переменную умножаем на 10.
И так до конца строки.
В конце vозвращаем ту переменную к которой прибавляли числа (double), поделенную на 10 в степени, а именно степень=тому числу к которому мы прибавляли единичке после нахождения точки...
Вороде Все...

PM MAIL   Вверх
N0rd
Дата 26.10.2004, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 24.10.2004
Где: Карелия,Петрозаво дск

Репутация: нет
Всего: нет



Всем большое спасибо за помощь!!! :) :) Есть ещё хорошие люди.
Отличный здесь форум.
Прогу писать буду наверно попозже,сначала надо бы книжку прикупить с описанием функций и т.д.Может посоветуете какую книгу для начинающего по С( не ++).

PM MAIL   Вверх
Дрон
Дата 26.10.2004, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



N0rd
Всегда рады помочь :)

Насчёт книг -- есть здесь на форуме раздел: Начинаем изучение С/С++
Может там чего-нибудь найдёшь :)

Это сообщение отредактировал(а) Дрон - 26.10.2004, 21:26


--------------------
Да. Именно так.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.