IPB

Здравствуйте, гость ( Вход | Регистрация )

> Хелп, с++
L0K0motiv
сообщение Oct 6 2007, 16:36
Сообщение #1


Продвинутый пользователь
***

Группа: Posters
Сообщений: 220
Регистрация: 17.8.2007
Из: Чебы
Пользователь №: 8,614



задание : f=(m*tg(t)+|c*sin(t)|)^1/3
Помогите плиз чо в этой программе не так ? (после компиляции и выполнения, результат f=1 при любых значениях t)
#include <stdlib.h>
#include <iostream.h>
#include <math.h>
#include <conio.h>
#pragma argsused
int main(int argc, char* argv[])
{const double m=2.0,c=-1.0;
double t,f;
cout<<"Vvedite t ";
cin>>t;
f=pow(m*tan(t)+abs(c*sin(t)),(1/3));
cout<<"f ravno "<<f;
getch();
}


--------------------
В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
Вернуться к началу страницы
 
+Цитировать сообщение
2 страниц V   1 2 >  
Создать новую тему
Ответов (1 - 19)
Vitamin_C
сообщение Oct 6 2007, 17:34
Сообщение #2


Новичок
*

Группа: Members
Сообщений: 34
Регистрация: 4.2.2007
Из: Новочебоксарск
Пользователь №: 5,196



#include <stdlib.h>
int abs(int x);

Возможно надо еще и (double)(1/3) сделать.
Вернуться к началу страницы
 
+Цитировать сообщение
Vitamin_C
сообщение Oct 6 2007, 17:37
Сообщение #3


Новичок
*

Группа: Members
Сообщений: 34
Регистрация: 4.2.2007
Из: Новочебоксарск
Пользователь №: 5,196



#include <math.h>
double fabs(double x);
Вернуться к началу страницы
 
+Цитировать сообщение
L0K0motiv
сообщение Oct 6 2007, 18:01
Сообщение #4


Продвинутый пользователь
***

Группа: Posters
Сообщений: 220
Регистрация: 17.8.2007
Из: Чебы
Пользователь №: 8,614



Цитата(Vitamin_C @ Oct 6 2007, 18:34) *
#include <stdlib.h>
int abs(int x);

Возможно надо еще и (double)(1/3) сделать.

Ты имеешь в виду что под модулем должно стоять строго целое число ?
Возможно надо еще и (double)(1/3) сделать. - в смысле ?
если чо тоя тока на первом курсе и пока не разбираюсь в с++, но принципы программирования понимаю 0-)))


--------------------
В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
Вернуться к началу страницы
 
+Цитировать сообщение
Vitamin_C
сообщение Oct 6 2007, 19:58
Сообщение #5


Новичок
*

Группа: Members
Сообщений: 34
Регистрация: 4.2.2007
Из: Новочебоксарск
Пользователь №: 5,196



В качестве аргумента функции int abs(int x) - целое и возвращает она целое, double fabs(double x) <- здесь дабл. (double)(1/3) - приведение типов, а то в результате деления 1 на 3 можно получить целое число т.е. ноль (если дабл то -> 0,3333). Отладку производи в дебугере по шагам там значения посмотришь.
И не помню я ничего - давно с++ не занимался. Кого-нибудь еще спроси.
Вернуться к началу страницы
 
+Цитировать сообщение
Гость_mix_*
сообщение Oct 6 2007, 20:48
Сообщение #6





Guests






Цитата(L0K0motiv @ Oct 6 2007, 17:36) *
Помогите плиз чо в этой программе не так ?


Значит так, проблема тут в заключается в следующем:

extern float pow(float, int); // Это объявление функции pow

ты вторым параметром передаешь 1/3, она преобразутся в целое (int) в данном случае в нуль, а любое число в степени нуль это еденица. double(1/3) так же ни чо не меняет, она просто 0.3333....333333333f превращает в 0.33333..33333, затем уже дробная часть результата отсекается, (заметим не округляется по правилам округления), тем самым превращая результат в нуль.

есь я чо напутал, что вполне вероятно smile.gif , пожалуйсто поправляйте

Кстати, делаю замечание, функция main должна возвращать какое нибудь значение, даж если в твоей реализации C++ все прокатило, то все равно, лучше чтоб main все таки возвращала чо нить, коль уж ты написал int main() {.....}

Цитата(L0K0motiv @ Oct 6 2007, 19:01) *
если чо тоя тока на первом курсе и пока не разбираюсь в с++, но принципы программирования понимаю 0-)))

Смерть от скромности тебе чувак не грозит biggrin.gif .
Вернуться к началу страницы
 
+Цитировать сообщение
L0K0motiv
сообщение Oct 6 2007, 20:55
Сообщение #7


Продвинутый пользователь
***

Группа: Posters
Сообщений: 220
Регистрация: 17.8.2007
Из: Чебы
Пользователь №: 8,614



Не подскажете тогда как по-другому реализовать корень третьей степени в с++ ?


--------------------
В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
Вернуться к началу страницы
 
+Цитировать сообщение
Vitamin_C
сообщение Oct 6 2007, 21:05
Сообщение #8


Новичок
*

Группа: Members
Сообщений: 34
Регистрация: 4.2.2007
Из: Новочебоксарск
Пользователь №: 5,196



Попробуй заменить
f=pow(m*tan(t)+abs(c*sin(t)),(1/3));
на
f=pow((m*tan(t)+fabs(c*sin(t))),(double)(1/3));
Вернуться к началу страницы
 
+Цитировать сообщение
L0K0motiv
сообщение Oct 6 2007, 21:08
Сообщение #9


Продвинутый пользователь
***

Группа: Posters
Сообщений: 220
Регистрация: 17.8.2007
Из: Чебы
Пользователь №: 8,614



И еще вопрос все C++ Builderы такие глючные ? (у меня стоит Borland C++ Builder 6)


--------------------
В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
Вернуться к началу страницы
 
+Цитировать сообщение
Vitamin_C
сообщение Oct 6 2007, 21:10
Сообщение #10


Новичок
*

Группа: Members
Сообщений: 34
Регистрация: 4.2.2007
Из: Новочебоксарск
Пользователь №: 5,196



Visual C++ был smile.gif
Че получилось?
Вернуться к началу страницы
 
+Цитировать сообщение
L0K0motiv
сообщение Oct 6 2007, 21:12
Сообщение #11


Продвинутый пользователь
***

Группа: Posters
Сообщений: 220
Регистрация: 17.8.2007
Из: Чебы
Пользователь №: 8,614



Цитата(Vitamin_C @ Oct 6 2007, 22:10) *
Че получилось?

Нет не получилось : ( happy.gif dry.gif glare.gif


--------------------
В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
Вернуться к началу страницы
 
+Цитировать сообщение
Vitamin_C
сообщение Oct 6 2007, 21:15
Сообщение #12


Новичок
*

Группа: Members
Сообщений: 34
Регистрация: 4.2.2007
Из: Новочебоксарск
Пользователь №: 5,196



Фуннкция объявлена как:
#include <math.h>
double pow(double x, double y);
или
float pow(float, int);?
Вернуться к началу страницы
 
+Цитировать сообщение
L0K0motiv
сообщение Oct 6 2007, 21:21
Сообщение #13


Продвинутый пользователь
***

Группа: Posters
Сообщений: 220
Регистрация: 17.8.2007
Из: Чебы
Пользователь №: 8,614



Цитата(Vitamin_C @ Oct 6 2007, 22:15) *
Фуннкция объявлена как:
#include <math.h>
double pow(double x, double y);
или
float pow(float, int);?

\\В смысле ? Просто написал так как я написал => см. выше.
А как она здесь объявлена я не знаю.


--------------------
В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
Вернуться к началу страницы
 
+Цитировать сообщение
L0K0motiv
сообщение Oct 6 2007, 21:24
Сообщение #14


Продвинутый пользователь
***

Группа: Posters
Сообщений: 220
Регистрация: 17.8.2007
Из: Чебы
Пользователь №: 8,614



В Borl. C++ Builder 6 2 версии pow : Prototype

double pow(double x, double y);

long double powl(long double x, long double y);


--------------------
В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
Вернуться к началу страницы
 
+Цитировать сообщение
Gobbs
сообщение Oct 7 2007, 10:03
Сообщение #15


Супер постер
Иконка группы

Группа: Local moder
Сообщений: 888
Регистрация: 23.10.2005
Из: п.Кугеси
Пользователь №: 106



Код
f=pow(m*tan(t)+abs(c*sin(t)),1./3);

Обратите внимание на точку после "1" в частом 1./3
Еили не будет точки, то действует правило, а именно : результат частного целых чисел есть целое.

Сообщение отредактировал Gobbs - Oct 7 2007, 10:06
Вернуться к началу страницы
 
+Цитировать сообщение
Гость_mix_*
сообщение Oct 7 2007, 10:53
Сообщение #16





Guests






У тебя тут ошибка "тоньше" чем я думал. Взял я и открыл все таки VC++ и поглядел, ошибка у тебя именно с преобразованиями типов, то что я написал выше тож было бы правдой еслиб pow имел только реализацию с целым вторым аргументом, типа
float pow(float, int)
но как оказалось pow имеет реализацию и дробным показателем smile.gif .

Штука вот в чем: 1 / 3 - означает не одну треть, это значит что ты делишь целую еденицу на целую тройку, и результат тож целый, а именно нуль. Сделай так
pow(...., 0.33333333333)
или лучше так
pow(...., 1.0 / 3.0)

Тут ещё есть момент со входными данными, первый аргумент у pow не должен быть отрицательным, почему не могу точно сказать, могу лиш предположить что вещественная степень высчитывается через что то, что не умеет хавать числа меньше нуля (например натуральный логарифм).

Вобщем по эксперементируй, попробуй задать угол t = 12 и t = 45, увидишь что в первом случае первый аргумент отрицательный и ответ какая то хрень, а во втором все чики-пуки.
Вернуться к началу страницы
 
+Цитировать сообщение
Гость_mix_*
сообщение Oct 7 2007, 10:54
Сообщение #17





Guests






блин, пожизни пока я пишу ответ кто нить уже все напишет smile.gif , надо меньше текста писать ninja.gif
Вернуться к началу страницы
 
+Цитировать сообщение
L0K0motiv
сообщение Oct 7 2007, 12:51
Сообщение #18


Продвинутый пользователь
***

Группа: Posters
Сообщений: 220
Регистрация: 17.8.2007
Из: Чебы
Пользователь №: 8,614



Спасибо всем !!! drinks.gif drinks.gif drinks.gif declare.gif


--------------------
В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
Вернуться к началу страницы
 
+Цитировать сообщение
L0K0motiv
сообщение Dec 23 2007, 21:23
Сообщение #19


Продвинутый пользователь
***

Группа: Posters
Сообщений: 220
Регистрация: 17.8.2007
Из: Чебы
Пользователь №: 8,614



Мда.............. Появилась еще одна проблемка.
Задача: Вычеркните из слова все буквы встречающиеся трижды.
Кто может помогите плиз.


--------------------
В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
Вернуться к началу страницы
 
+Цитировать сообщение
Amp
сообщение Dec 23 2007, 21:48
Сообщение #20


Мега постер
Иконка группы

Группа: Local moder
Сообщений: 1,712
Регистрация: 21.8.2006
Пользователь №: 1,269



Может и не совсем удачное. Первое, что в голову пришло.

Код
#include <stdio.h>
#include <string>
#include <map>

int main()
{
    std::string    in_str("Hello, world!"), out_str;
    std::map<char, unsigned int>    ch_map;
    
    printf("Input string - %s\n", in_str.c_str());    
    
    for(unsigned int i = 0; i < in_str.length(); i++)
        if(ch_map.find(in_str[i]) == ch_map.end()) ch_map[in_str[i]] = 1;
        else ch_map[in_str[i]]++;
    
    for(unsigned int i = 0; i < in_str.length(); i++)
        if(ch_map[in_str[i]] != 3) out_str += in_str[i];
    
    printf("Output string - %s\n", out_str.c_str());
    
    return 0;
}


--------------------
irc-капец

#КартинкА#
Вернуться к началу страницы
 
+Цитировать сообщение

2 страниц V   1 2 >
ОтветитьСоздать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 2nd May 2024 - 21:22