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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Найти первую цифру дробной части, не могу найти алгоритм 
V
    Опции темы
nitrak
Дата 8.1.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дано положительное вещественное число А.
 Найдите первую цифру дробной части.
PM MAIL   Вверх
Фантом
Дата 8.1.2009, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



floor((A-floor(A))*10)

Надо подключить math.h.
PM   Вверх
nitrak
Дата 8.1.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, помогло!!
 а что делает функция floor??
PM MAIL   Вверх
Dmi3ev
Дата 8.1.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

 а что делает функция floor?? 

округляет


--------------------

PM MAIL   Вверх
Фантом
Дата 8.1.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Цитата(nitrak @ 8.1.2009,  17:41)
Спасибо, помогло!!
 а что делает функция floor??

Пожалуйста.  smile 

Возвращает наибольшее целое число (с типом double) , меньшее или равное аргументу (который тоже double).
PM   Вверх
nitrak
Дата 8.1.2009, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все! я доделал!))
 еще раз спасибо!!
Код

#include "stdafx.h"
#include "iostream.h"
#include "math.h"

double F(double A); 
    
    void main()
    {
        double A;
        cout<<"BBEDITE CHISLO    :    ";
        cin>>A;
        cout<<"Pervaya Cifra DROBNOY CHASTI"<<A<<"=" << F(A)<<endl;
    }

// определение функции
double F(double A)
    {
    return floor((A-floor(A))*10);    
    }


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


Эксперт
***


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

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



Цитата

Все! я доделал!))

не совсем  smile  а если число отрицательно, допустим -0.2, то у тебя выведет цифру -2. А такой цифры нет. да и floor здесь лишнее. и без прототипа можно обойтись, зачем он тут? да и зачем функция double, когда у тебя всегда будет int возвращаться.
Код

#include "iostream.h"
#include "math.h"
using namespace std;
int F(double A)
    {
    return abs(int((A-int(A))*10));
    }

    void main()
    {
        double A;
        cout<<"BBEDITE CHISLO    :    ";
        cin>>A;
        cout<<"Pervaya Cifra DROBNOY CHASTI"<<A<<"=" << F(A)<<endl;
        system("pause");
    }





--------------------

PM MAIL   Вверх
Фантом
Дата 9.1.2009, 04:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Вы меня, надеюсь, извините, но, вообще говоря, оба варианта, кхм... не вполне удачны.  smile 

1) Заголовочные файлы лучше писать не в кавычках, а в <> - в противном случае компилятор их, скорее всего, не найдет.
2) Зачем нужна строка #include "stdafx.h" ?
3) Функция main() в соответствии со стандартом языка должна возвращать int. На такой заголовок любой приличный компилятор выругается. 
4) Вариант #include "iostream.h" (равно как и #include<iostream.h>) приказал долго жить уже, если не ошибаюсь, 11 лет назад, в 1998 году. В сочетании же с using namespace std; это вообще какая-то смесь французского с нижегородским. Правильно #include<iostream>.
5) Число по условию было положительным, а "защита от дурака" в условие задачи не входила.  smile 
6) Функция int abs(int) определена не в math.h, а в stdlib.h
7) Приведением типов лучше вообще никогда не пользоваться (по крайней мере, без сильнейшей необходимости). Ибо это  частый источник ошибок, а заодно и неудобный для компилятора вариант. Понятно, что в такой "программе" это мелочи, но все же...
8) system("pause") - а откуда известно, что shell знает, что такое "pause"? 
9) Ну и главное - на закуску. Это"скриншот" работы второго варианта программы:
Код

BBEDITE CHISLO    :    324.2
Pervaya Cifra DROBNOY CHASTI324.2=1

Вопрос - почему не "2"?  smile Справедливости ради скажу, что в моем варианте (c floor) подобное тоже может получаться, хотя и существенно реже. Решите эту задачку?   smile 

Подсказка: задачка п.9 чем-то очень похожа на п.5.  smile 
PM   Вверх
Dmi3ev
Дата 9.1.2009, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Фантом, у меня просто в данный момент нет компилятора и ближайшую неделю не будет, но попытаюсь ответить.
Цитата

4) Вариант #include "iostream.h" (равно как и #include<iostream.h>) приказал долго жить уже, если не ошибаюсь, 11 лет назад, в 1998 году. В сочетании же с using namespace std; это вообще какая-то смесь французского с нижегородским. Правильно #include<iostream>.

согласен!
я пишу нормально, но потом вставил из проги nitrak-а и то не полностью))) чтобы ему понятнее было)))
Цитата

8) system("pause") - а откуда известно, что shell знает, что такое "pause"? 

известно! это уже придирки...
вот такой вариант можно
Код

//---------------------------------------------------------------------------
#include <string>
#include <iostream>
using namespace std;
//---------------------------------------------------------------------------
char  f(char s[])
{
if(char *p=strchr(s, '.'))
 return (*(p+1));
else
 return '0';
}

int main()
{
char s[255];
cout<<"enter your number:"<<endl;
cin>>s;
cout<<"first="<<f(s)<<endl;
system("pause");
return 0;
}
//---------------------------------------------------------------------------

пойдёт? можно проверить строку на то, что она полностью из цифр, а так...


--------------------

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


Опытный
**


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

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



Цитата(Фантом @  9.1.2009,  03:07 Найти цитируемый пост)
Заголовочные файлы лучше писать не в кавычках, а в <> - в противном случае компилятор их, скорее всего, не найдет.

заголовочные файлы взятые в кавычки ищутся сначала в рабочем каталоге, и если их там нет, то рассматриваются как <>.

Цитата(Фантом @  9.1.2009,  03:07 Найти цитируемый пост)
Приведением типов лучше вообще никогда не пользоваться (по крайней мере, без сильнейшей необходимости). Ибо это  частый источник ошибок, а заодно и неудобный для компилятора вариант. Понятно, что в такой "программе" это мелочи, но все же...

да, но есть огромное искушение сделать так:
Код

double val = 55497.546;
cout << static_cast<int>(val * 10) % 10; // если число будет слишком большим, то естественно не сработает

 smile 



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


Вы это прекратите!
***


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

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



Цитата(Dmi3ev @ 9.1.2009,  17:43)
Цитата

8) system("pause") - а откуда известно, что shell знает, что такое "pause"? 

известно! это уже придирки...


Ну, зачем мне к чему-то придираться?.. Просто так действительно делать нехорошо - не стоит закладываться на особенности конкретных компиляторов и конкретных операционных систем (как в данном случае). Если уж nitrak учит C++, пусть лучше сразу учится правильно.

Цитата

вот такой вариант можно


Можно. Он лучше - в том смысле, что введенная после точки цифра и то, что получится в ответе, всегда будут совпадать. Но, строго говоря, это тоже не решение задачки из п.9.   smile 

Ответ там, собственно, простой: числа 324.2 и 324.1999999... равны друг другу. И с точки зрения математики (всегда), и с точки зрения машинного представления (зачастую). Соответственно, вопрос о том, какой будет первая цифра дробной части у такого числа, просто не имеет однозначного ответа. Если предполагается, что исходная задача допускает однозначное решение, то это означает, что подобные данные в нее вводить нельзя. smile 

PM   Вверх
Dmi3ev
Дата 9.1.2009, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Ответ там, собственно, простой: числа 324.2 и 324.1999999... равны друг другу. И с точки зрения математики (всегда), и с точки зрения машинного представления (зачастую). Соответственно, вопрос о том, какой будет первая цифра дробной части у такого числа, просто не имеет однозначного ответа. Если предполагается, что исходная задача допускает однозначное решение, то это означает, что подобные данные в нее вводить нельзя

сталкивался, знаю.

Цитата

Он лучше - в том смысле, что введенная после точки цифра и то, что получится в ответе, всегда будут совпадать.

я думаю, что это даже самый простой способ решения задачи...


Цитата

Просто так действительно делать нехорошо - не стоит закладываться на особенности конкретных компиляторов и конкретных операционных систем (как в данном случае).

тогда можно использовать getch, sleep, cin, чтобы приостановить программу и увидеть ее результаты...


http://forum.vingrad.ru/forum/topic-212986.html
вот как раз эту тему поднимал... решение задачки из п.9

Это сообщение отредактировал(а) Dmi3ev - 9.1.2009, 19:20


--------------------

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


Вы это прекратите!
***


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

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



Цитата(taiven @ 9.1.2009,  18:23)
Цитата(Фантом @  9.1.2009,  03:07 Найти цитируемый пост)
Заголовочные файлы лучше писать не в кавычках, а в <> - в противном случае компилятор их, скорее всего, не найдет.

заголовочные файлы взятые в кавычки ищутся сначала в рабочем каталоге, и если их там нет, то рассматриваются как <>.

Конечно, насчет "скорее всего" я погорячился - наиболее распространенные современные компиляторы найдут, однако нарваться на то, что компилятор это не поймет, до сих пор достаточно реально (хотя в действующем стандарте языка эта норма есть). С другой стороны, в предполагаемом стандарте C++09 ее вроде бы собрались отменить (ради ликвидации потенциального источника ошибок). Во всяком случае, лучше так не делать - спокойнее будет.

Цитата

да, но есть огромное искушение сделать так:

Есть, кто же спорит. Но преобразованиями типов все равно пользоваться нехорошо - конструктор типа оно в любом случае вызовет.

Добавлено через 7 минут и 10 секунд
Цитата(Dmi3ev @ 9.1.2009,  19:07)
http://forum.vingrad.ru/forum/topic-212986.html
вот как раз эту тему поднимал... решение задачки из п.9

А, эту тему я не видел. Кстати, в дополнение к ней: есть еще одно решение - использовать языки, предназначенные для такой деятельности. Современные варианты Фортрана и Ады это все умеют "от рождения", причем более естественным (на мой взгляд) путем, чем C++.

Это сообщение отредактировал(а) Фантом - 9.1.2009, 19:27
PM   Вверх
Dmi3ev
Дата 9.1.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



да, повезло автору, все по полочкам разобрали... 
Цитата

А, эту тему я не видел. Кстати, в дополнение к ней: есть еще одно решение - использовать языки, предназначенные для такой деятельности. Современные варианты Фортрана и Ады это все умеют "от рождения", причем более естественным (на мой взгляд) путем, чем C++.

тоже выход smile  мне просто как-то надо было, чтобы точность  до тысячных была. так вот, а там было около 50 000 операций, после чего получалось число, а оно получалось то, да немного не то, а точность нужна была. я сначала не понимал в чем там дело, думал, я что-то туплю, а потом догадался и пошел на форум помощи искать...


--------------------

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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