Программа вылетает
Задание:
Дана область (см. рисунок).
Пользователь вводит координаты какой-то точки (x,y).
Если введенная точка принадлежит области, то P==( arcctg(8y) )/( cos(xy) ). Иначе P==( arcsin(y) )/(x-11).
Я только-только начал осваивать С++. В принципе, почти все свои вопросы решаю через гугл и MSDN. Однако сейчас ситуация такая: при компиляции ошибок программа не выдает, нормально запускается.
Затем выводятся фразы, выше красной линии ("Введите координату X точки = " и "Введите координату Y точки = "). Без ошибок записывается в память значения x и y.
После этого по нажатии Enter программа вылетает, вместо того, чтобы выдать результат (о том, принадлежит ли точка заданной области и вывод значения P).
#include "windows.h"
#include "stdio.h"
#include <iostream.h>
#include <math.h>
#include <conio.h>
int main()
{
char a[50], b[50];
float x, y, P;
bool d;
CharToOem("Введите координату X точки = ", a);
cout << a;
cin >> x;
CharToOem("Введите координату Y точки = ", b);
cout << b;
cin >> y;
[COLOR="Red"]-------------------------------------------[/COLOR]
if (x*x+y*y < 1 && x > -1 && y < 1 || x*x+y*y < 1 && x < 1 && y > -1 || y > -1 && y < 0 && x > -1 && x < 0) d=true;
else d=false;
if (d)
{
if (x >= 0) P=(asin(1/(sqrt(1+x*x))))/(cos(x*y));
else P=(180-asin(1/(sqrt(1+x*x))))/(cos(x*y));
CharToOem("Введенная точка располагается в заданной области\n", a);
cout << a;
CharToOem("Значение P = ", a);
cout << a;
cout << P;
}
else
{
P==(asin(y))/(x-11);
CharToOem("Введенная точка не располагается в заданной области\n", b);
cout << b;
CharToOem("Значение P = ", b);
cout << b;
cout << P;
}
getch();
return 0;
}
Задание:
Дана область (см. рисунок).
Пользователь вводит координаты какой-то точки (x,y).
Если введенная точка принадлежит области, то P==( arcctg(8y) )/( cos(xy) ). Иначе P==( arcsin(y) )/(x-11).
Я только-только начал осваивать С++. В принципе, почти все свои вопросы решаю через гугл и MSDN. Однако сейчас ситуация такая: при компиляции ошибок программа не выдает, нормально запускается.
Затем выводятся фразы, выше красной линии ("Введите координату X точки = " и "Введите координату Y точки = "). Без ошибок записывается в память значения x и y.
После этого по нажатии Enter программа вылетает, вместо того, чтобы выдать результат (о том, принадлежит ли точка заданной области и вывод значения P).
#include "windows.h"
#include "stdio.h"
#include <iostream.h>
#include <math.h>
#include <conio.h>
int main()
{
char a[50], b[50];
float x, y, P;
bool d;
CharToOem("Введите координату X точки = ", a);
cout << a;
cin >> x;
CharToOem("Введите координату Y точки = ", b);
cout << b;
cin >> y;
[COLOR="Red"]-------------------------------------------[/COLOR]
if (x*x+y*y < 1 && x > -1 && y < 1 || x*x+y*y < 1 && x < 1 && y > -1 || y > -1 && y < 0 && x > -1 && x < 0) d=true;
else d=false;
if (d)
{
if (x >= 0) P=(asin(1/(sqrt(1+x*x))))/(cos(x*y));
else P=(180-asin(1/(sqrt(1+x*x))))/(cos(x*y));
CharToOem("Введенная точка располагается в заданной области\n", a);
cout << a;
CharToOem("Значение P = ", a);
cout << a;
cout << P;
}
else
{
P[COLOR="Red"]==[/COLOR](asin(y))/(x-11);
CharToOem("Введенная точка не располагается в заданной области\n", b);
cout << b;
CharToOem("Значение P = ", b);
cout << b;
cout << P;
}
getch();
return 0;
}
Во первых отладчик никто не отменял как и предупреждения компилятора. А во вторых я преисполнен сочувствия к данному набору букв, которое кодом можно назвать с большим натягом, да и то только из-за того, что оно компилитцо древним компилятором.
Подскажите, пожалуйста, как это можно исправить?
MSDN оно, конечно хорошо, но как учебник имхо совсем не катит.
Не верю! (с)
Не будет в таком виде программа работать.
Во-первых, нужно удалить вот это:
-------------------------------------------[/color]
Во-вторых, исправить ошибку, указанную Ramon'ом:
В-третьих, размер буфера b[50] маловат для строки
В-четвёртых, необходимо подключить пространство имён std.
Подскажите, пожалуйста, как это можно исправить?
Хм, getch() в конце стоит, следовательно программа должна ждать нажатия клавиши. Или вы удалили эту строку?
Не будет в таком виде программа работать.
Выводятся строки "Введите координату X точки = " и "Введите координату Y точки = ". Принимаются вводимые значения.
Даже на 1 секунду появляется ответ (типа "Введенная точка располагается в заданной области" и значение P).
Это я добавил для удобства описания кода. В программе этого, конечно, нет:)
Удалил второе равенство.
Скажите, а в тем тут была ошибка? = - типа логическая опрерация, == - операция присваивания. Или я ошибаюсь?
fixed
fixed
В том-то и дело, koodeer, что прога почему-то не ждет нажатия клавиши. То есть после нажатия F5 процесс идет так:
1. Выводятся строки с запросом координат, я их ввожу;
2. После ввода значения Y программа переходит на новую строку и чего-то ждет
3. Как только нажимается еще ENTER - на долю секунды выдается результат, и программа вылетает обратно в Visual C++
Теперь код выглядит так:
#include "windows.h"
#include "stdio.h"
#include <iostream.h>
#include <math.h>
#include <conio.h>
[COLOR="Red"]using namespace std;[/COLOR]
int main()
{
char a[255], b[255];
float x, y, P;
bool d;
CharToOem("Введите координату X точки = ", a);
cout << a;
cin >> x;
CharToOem("Введите координату Y точки = ", b);
cout << b;
cin >> y;
if (x*x+y*y < 1 && x > -1 && y < 1 || x*x+y*y < 1 && x < 1 && y > -1 || y > -1 && y < 0 && x > -1 && x < 0) d=true;
else d=false;
if (d)
{
[COLOR="Red"]if (x >= 0) P=(asin(1/(sqrt(1+x*x))))/(cos(x*y));[/COLOR]
[COLOR="Red"]else P=(180-asin(1/(sqrt(1+x*x))))/(cos(x*y));[/COLOR]
CharToOem("Введенная точка располагается в заданной области\n", a);
cout << a;
CharToOem("Значение P = ", a);
cout << a;
cout << P;
}
else
{
[COLOR="Red"]P=(asin(y))/(x-11);[/COLOR]
CharToOem("Введенная точка не располагается в заданной области\n", b);
cout << b;
CharToOem("Значение P = ", b);
cout << b;
cout << P;
}
getch();
return 0;
}
И при компиляции выдаются следующие ошибки и предупреждения (к вопросу о пространстве имен std):
D:\...\Lab2.cpp(133) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
D:\...\Lab2.cpp(134) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
D:\...\Lab2.cpp(145) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
Строчки, на которые указывают ошибки, выделил [COLOR="Red"]красным[/COLOR].
PS Ну, предупреждения о потере точности - это фигня, я так понимаю.
Пора бы уже и знать,раз с Си работаете
#include "windows.h"
#include "stdio.h"
#include <iostream.h>
#include <math.h>
#include <conio.h>
int main()
{
char a[255], b[255], P1[256];
float x, y, P;
bool d;
CharToOem("Ââåäèòå êîîðäèíàòó X òî÷êè = ", a);
cout << a;
cin >> x;
CharToOem("Ââåäèòå êîîðäèíàòó Y òî÷êè = ", b);
cout << b;
cin >> y;
if (x*x+y*y < 1 && x > -1 && y < 1 || x*x+y*y < 1 && x < 1 && y > -1 || y > -1 && y < 0 && x > -1 && x < 0) d=true;
else d=false;
if (d)
{
if (x >= 0) P=(asin(1/(sqrt(1+x*x))))/(cos(x*y));
else P=(180-asin(1/(sqrt(1+x*x))))/(cos(x*y));
CharToOem("\nÂâåäåííàÿ òî÷êà ðàñïîëàãàåòñÿ â çàäàííîé îáëàñòè\n", a);
printf(a);
CharToOem("Çíà÷åíèå P = ", a);
printf(a);
sprintf(P1,"%f",P);
printf(P1);
}
else
{
P=(asin(y))/(x-11);
CharToOem("\nÂâåäåííàÿ òî÷êà íå ðàñïîëàãàåòñÿ â çàäàííîé îáëàñòè\n", b);
printf(b);
CharToOem("Çíà÷åíèå P = ", b);
printf(b);
sprintf(P1,"%f",P);
printf(P1);
}
getch();
return 0;
}
К автору: скомпилил ваш код, не знаю правильно он работает или нет, но у меня консольное окно ждет ввода после завершения приложения. Попробуйте поизвращаться и вставить второй getch().
P.S. не стоит смешивать ввод/вывод в стиле cout и printf. Используйте или то или то.