Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++]Найти первую цифру дробной части


Автор: nitrak 8.1.2009, 16:51
Дано положительное вещественное число А.
 Найдите первую цифру дробной части.

Автор: Фантом 8.1.2009, 17:20
floor((A-floor(A))*10)

Надо подключить math.h.

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

Автор: Dmi3ev 8.1.2009, 19:10
Цитата

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

округляет

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

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

Возвращает наибольшее целое число (с типом double) , меньшее или равное аргументу (который тоже double).

Автор: nitrak 8.1.2009, 20:21
Все! я доделал!))
 еще раз спасибо!!
Код

#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);    
    }


Автор: Dmi3ev 9.1.2009, 01:17
Цитата

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

не совсем  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");
    }



Автор: Фантом 9.1.2009, 04:07
Вы меня, надеюсь, извините, но, вообще говоря, оба варианта, кхм... не вполне удачны.  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 

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

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;
}
//---------------------------------------------------------------------------

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

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

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

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

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

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

 smile 



Автор: Фантом 9.1.2009, 18:56
Цитата(Dmi3ev @ 9.1.2009,  17:43)
Цитата

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

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


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

Цитата

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


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

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

Автор: Dmi3ev 9.1.2009, 19:07
Цитата

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

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

Цитата

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

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


Цитата

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

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


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

Автор: Фантом 9.1.2009, 19:21
Цитата(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++.

Автор: Dmi3ev 9.1.2009, 19:41
да, повезло автору, все по полочкам разобрали... 
Цитата

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

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

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