Хелп, с++ |
Здравствуйте, гость ( Вход | Регистрация )
Хелп, с++ |
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(); } -------------------- В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
|
|
|
Oct 6 2007, 17:34
Сообщение
#2
|
|
Новичок Группа: Members Сообщений: 34 Регистрация: 4.2.2007 Из: Новочебоксарск Пользователь №: 5,196 |
#include <stdlib.h>
int abs(int x); Возможно надо еще и (double)(1/3) сделать. |
|
|
Oct 6 2007, 17:37
Сообщение
#3
|
|
Новичок Группа: Members Сообщений: 34 Регистрация: 4.2.2007 Из: Новочебоксарск Пользователь №: 5,196 |
#include <math.h>
double fabs(double x); |
|
|
Oct 6 2007, 18:01
Сообщение
#4
|
|
Продвинутый пользователь Группа: Posters Сообщений: 220 Регистрация: 17.8.2007 Из: Чебы Пользователь №: 8,614 |
#include <stdlib.h> int abs(int x); Возможно надо еще и (double)(1/3) сделать. Ты имеешь в виду что под модулем должно стоять строго целое число ? Возможно надо еще и (double)(1/3) сделать. - в смысле ? если чо тоя тока на первом курсе и пока не разбираюсь в с++, но принципы программирования понимаю 0-))) -------------------- В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
|
|
|
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 |
Помогите плиз чо в этой программе не так ? Значит так, проблема тут в заключается в следующем: extern float pow(float, int); // Это объявление функции pow ты вторым параметром передаешь 1/3, она преобразутся в целое (int) в данном случае в нуль, а любое число в степени нуль это еденица. double(1/3) так же ни чо не меняет, она просто 0.3333....333333333f превращает в 0.33333..33333, затем уже дробная часть результата отсекается, (заметим не округляется по правилам округления), тем самым превращая результат в нуль. есь я чо напутал, что вполне вероятно , пожалуйсто поправляйте Кстати, делаю замечание, функция main должна возвращать какое нибудь значение, даж если в твоей реализации C++ все прокатило, то все равно, лучше чтоб main все таки возвращала чо нить, коль уж ты написал int main() {.....} если чо тоя тока на первом курсе и пока не разбираюсь в с++, но принципы программирования понимаю 0-))) Смерть от скромности тебе чувак не грозит . |
|
|
Oct 6 2007, 20:55
Сообщение
#7
|
|
Продвинутый пользователь Группа: Posters Сообщений: 220 Регистрация: 17.8.2007 Из: Чебы Пользователь №: 8,614 |
Не подскажете тогда как по-другому реализовать корень третьей степени в с++ ?
-------------------- В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
|
|
|
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)); |
|
|
Oct 6 2007, 21:08
Сообщение
#9
|
|
Продвинутый пользователь Группа: Posters Сообщений: 220 Регистрация: 17.8.2007 Из: Чебы Пользователь №: 8,614 |
И еще вопрос все C++ Builderы такие глючные ? (у меня стоит Borland C++ Builder 6)
-------------------- В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
|
|
|
Oct 6 2007, 21:10
Сообщение
#10
|
|
Новичок Группа: Members Сообщений: 34 Регистрация: 4.2.2007 Из: Новочебоксарск Пользователь №: 5,196 |
Visual C++ был
Че получилось? |
|
|
Oct 6 2007, 21:12
Сообщение
#11
|
|
Продвинутый пользователь Группа: Posters Сообщений: 220 Регистрация: 17.8.2007 Из: Чебы Пользователь №: 8,614 |
-------------------- В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
|
|
|
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);? |
|
|
Oct 6 2007, 21:21
Сообщение
#13
|
|
Продвинутый пользователь Группа: Posters Сообщений: 220 Регистрация: 17.8.2007 Из: Чебы Пользователь №: 8,614 |
Фуннкция объявлена как: #include <math.h> double pow(double x, double y); или float pow(float, int);? \\В смысле ? Просто написал так как я написал => см. выше. А как она здесь объявлена я не знаю. -------------------- В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
|
|
|
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); -------------------- В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
|
|
|
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 имеет реализацию и дробным показателем . Штука вот в чем: 1 / 3 - означает не одну треть, это значит что ты делишь целую еденицу на целую тройку, и результат тож целый, а именно нуль. Сделай так pow(...., 0.33333333333) или лучше так pow(...., 1.0 / 3.0) Тут ещё есть момент со входными данными, первый аргумент у pow не должен быть отрицательным, почему не могу точно сказать, могу лиш предположить что вещественная степень высчитывается через что то, что не умеет хавать числа меньше нуля (например натуральный логарифм). Вобщем по эксперементируй, попробуй задать угол t = 12 и t = 45, увидишь что в первом случае первый аргумент отрицательный и ответ какая то хрень, а во втором все чики-пуки. |
|
|
Гость_mix_* |
Oct 7 2007, 10:54
Сообщение
#17
|
Guests |
блин, пожизни пока я пишу ответ кто нить уже все напишет , надо меньше текста писать
|
|
|
Oct 7 2007, 12:51
Сообщение
#18
|
|
Продвинутый пользователь Группа: Posters Сообщений: 220 Регистрация: 17.8.2007 Из: Чебы Пользователь №: 8,614 |
Спасибо всем !!!
-------------------- В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
|
|
|
Dec 23 2007, 21:23
Сообщение
#19
|
|
Продвинутый пользователь Группа: Posters Сообщений: 220 Регистрация: 17.8.2007 Из: Чебы Пользователь №: 8,614 |
Мда.............. Появилась еще одна проблемка.
Задача: Вычеркните из слова все буквы встречающиеся трижды. Кто может помогите плиз. -------------------- В голове один мотив - ЧЕМПИОН ЛОКОМОТИВ
|
|
|
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; } -------------------- |
|
|
Текстовая версия | Сейчас: 4th May 2024 - 11:34 |