Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2012, 04:40   #1
skooma effect
Beginner
Пользователь
 
Регистрация: 08.06.2012
Сообщений: 23
По умолчанию [C++] skooma effect - вопросы новичка:)

Доброго времени суток! Дернуло меня 2 дня назад заняться программированием на С++...
Если модератор не будет возражать - в этой теме буду выкладывать вопросы по мере возникновения.

Использую Microsoft Visual C++ Express 2010.

Первые два вопроса:
1) Не выводятся русские буквы (вместо них иероглифы какие-то). Скрин прикрепляю (в самом низу), там "Привет" должно быть написано. Возможно это из-за английской версии IDE?
2) Кое-как сделал я программу для решения квадратных уравнений. Но вот беда, - ошибка, связанная с sqrt
Code:
Код:
#include <iostream>
#include <cmath>
using namespace std;
int main(void)
{
	int a, b, c, d, exit;
	float  x1, x2;
	cin >> a;
	cin >> b;
	cin >> c;
	d = pow (2.0,2) - 4 * a * c;
	x1 = ((-b) - sqrt(d)) / 2 * a;
	x2 = ((-b) + sqrt(d)) / 2 * a;
	cout << x1;
	cout << x2;
	cin >> exit;
	return 0;
}
Output:
Цитата:
1>------ Rebuild All started: Project: 5, Configuration: Debug Win32 ------
1> 1.cpp
1>e:\users\1\documents\visual studio 2010\projects\5\5\1.cpp(12): warning C4244: '=' : conversion from 'double' to 'int', possible loss of data
1>e:\users\1\documents\visual studio 2010\projects\5\5\1.cpp(13): error C2668: 'sqrt' : ambiguous call to overloaded function
1> d:\program files\microsoft visual studio 10.0\vc\include\math.h(589): could be 'long double sqrt(long double)'
1> d:\program files\microsoft visual studio 10.0\vc\include\math.h(541): or 'float sqrt(float)'
1> d:\program files\microsoft visual studio 10.0\vc\include\math.h(127): or 'double sqrt(double)'
1> while trying to match the argument list '(int)'
1>e:\users\1\documents\visual studio 2010\projects\5\5\1.cpp(14): error C2668: 'sqrt' : ambiguous call to overloaded function
1> d:\program files\microsoft visual studio 10.0\vc\include\math.h(589): could be 'long double sqrt(long double)'
1> d:\program files\microsoft visual studio 10.0\vc\include\math.h(541): or 'float sqrt(float)'
1> d:\program files\microsoft visual studio 10.0\vc\include\math.h(127): or 'double sqrt(double)'
1> while trying to match the argument list '(int)'
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
П.С. Не кидайтесь камнями сильно!)
Изображения
Тип файла: jpg Снимок.JPG (13.3 Кб, 72 просмотров)
Совпадения возможны

Последний раз редактировалось skooma effect; 17.06.2012 в 04:52.
skooma effect вне форума Ответить с цитированием
Старый 17.06.2012, 08:25   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

1) Пользуйтесь поиском, проблема обсуждалось огромное количество раз (подсказка: нужно использовать функцию setlocale, подробности найдете на форуме либо в гугле).
2) Сделайте переменные типа double, а не int. Функции sqrt с аргументом типа int не определено, компилятор пытается провести неявное преобразование типов, но не знает, как выбрать - float, doble или long double.
Кроме того:
а) int main(void) - старая запись, ныне так не по стандарту. Пишите просто int main().
б) return 0; - тоже ненужно, по умолчанию функция main (и только она), если опущено return, сама возвращает 0.
в) Вместо типа float лучше использовать double. Если нет никаких особых причин для обратного, всегда используйте для целых int (иногда при особой необходимости unsigned int), а для вещественных - double.
г) У вас в формуле ошибка - не двойку в квадрат нужно возводить, а переменную b. К тому же, для возведения в квадрат гораздо проще записать b * b, чем вызывать функцию, которая заточена на значительно более сложные вычисления (возведения в нецелую степень). Да и тратить ресурсы на вызов функции в данном случае - в некоторой степени моветон.
д) Вы x1 и x2 выводите без пробела между друг другом. Вообще лучше пишите так:
Код:
cin >> a >> b >> c;
//...
cout << "x1 = " << x1 << ", x2 = " << x2;
е) Вместо ввода некоего exit (кстати, лучше не использовать такое имя, т.к. оно закреплено за одной из функций) используйте такую конструкцию:
Код:
cin.ignore();
cin.get();
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 17.06.2012, 13:26   #3
skooma effect
Beginner
Пользователь
 
Регистрация: 08.06.2012
Сообщений: 23
По умолчанию

Цитата:
У вас в формуле ошибка - не двойку в квадрат нужно возводить, а переменную b.
ой, затупил)) а так - спасибо большое)
Совпадения возможны
skooma effect вне форума Ответить с цитированием
Старый 25.06.2012, 03:17   #4
skooma effect
Beginner
Пользователь
 
Регистрация: 08.06.2012
Сообщений: 23
По умолчанию

Привет опять всем форумчанам

Есть такой код:
Код:
#include <iostream>
using namespace std;
int main()
{
	double r, s, v, p = 3.1456;
	cout << "Enter radius: \n";
	cin >> r;
	v = 3.0 / 4.0 * p * (r * r * r);
	s = 3 * p * (r * r);
	cout << "S = " << s << "\nV = " << v;
	cin.get();
	cin.ignore();
}
Все работает, но в ходе написания программы возник вопрос:
Почему, когда я пишу не 3.0 (4.0), а 3 (4), значение объема равно 0? Это из-за типа переменной v?
Совпадения возможны
skooma effect вне форума Ответить с цитированием
Старый 25.06.2012, 04:31   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,979
По умолчанию

Цитата:
Сообщение от skooma effect Посмотреть сообщение
Почему, когда я пишу не 3.0 (4.0), а 3 (4), значение объема равно 0? Это из-за типа переменной v?
Нет. Переменная v тут ни при чём. Делов том, что если мы пишем 3 / 4 неявно задаётся целочисленный тип, а поскольку результат получается меньше единицы, то он округляется до нуля.
Если мы пишем 3.0 / 4.0 присваивается вещественный тип и результат получается корректным.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 25.06.2012, 06:23   #6
Петррр
Форумчанин
 
Аватар для Петррр
 
Регистрация: 02.09.2011
Сообщений: 336
По умолчанию

1
Код:
#include <iostream>

int main()
{
	setlocale(LC_ALL, "");
	std::cout << "Привет" << std::endl;
	system("pause");
	return 0;
}
Если ты не можешь найти то, ради чего стоит жить, лучше найти то, за что стоит умереть
Петррр вне форума Ответить с цитированием
Старый 25.06.2012, 08:36   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Цитата:
Если мы пишем 3.0 / 4.0 присваивается вещественный тип и результат получается корректным.
Просто добавлю что компилятор определяет тип результата по первому операнду в случае, когда тип может варьироваться от выражения (double может содержать как целые так и вещественные в себе). Ты поставил 3 / 4 - это целые операнды.
А 3.0 / 4.0 явно указаны как вещественные.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.06.2012, 09:09   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Просто добавлю что компилятор определяет тип результата по первому операнду в случае, когда тип может варьироваться от выражения (double может содержать как целые так и вещественные в себе). Ты поставил 3 / 4 - это целые операнды.
А 3.0 / 4.0 явно указаны как вещественные.
Код:
std::cout << 5/2.0f<<std::endl;
Ойли по первому, говоришь?
_Bers вне форума Ответить с цитированием
Старый 25.06.2012, 10:58   #9
skooma effect
Beginner
Пользователь
 
Регистрация: 08.06.2012
Сообщений: 23
По умолчанию

Спасибо за объяснение
Совпадения возможны
skooma effect вне форума Ответить с цитированием
Старый 25.06.2012, 11:14   #10
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

Для русских букв подключаешь
Код:
#include <clocale>
и в main'e прописываешь
Код:
setlocale(LC_ALL,"Russian");
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопросы от новичка. ромик0 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 15.09.2011 10:00
Вопросы от новичка AngelOfFate Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 03.06.2011 14:25
Вопросы новичка Tyfun Помощь студентам 1 08.09.2010 07:07
Вопросы новичка! Dimixis Помощь студентам 16 19.06.2007 09:35

Реклама для незарегистрированных, регистрация на форуме