Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Программа вылетает

15K
23 октября 2009 года
Ybr
31 / / 19.03.2007
Здравствуйте!

Задание:
Дана область (см. рисунок).
Пользователь вводит координаты какой-то точки (x,y).
Если введенная точка принадлежит области, то P==( arcctg(8y) )/( cos(xy) ). Иначе P==( arcsin(y) )/(x-11).


Я только-только начал осваивать С++. В принципе, почти все свои вопросы решаю через гугл и MSDN. Однако сейчас ситуация такая: при компиляции ошибок программа не выдает, нормально запускается.
Затем выводятся фразы, выше красной линии ("Введите координату X точки = " и "Введите координату Y точки = "). Без ошибок записывается в память значения x и y.
После этого по нажатии Enter программа вылетает, вместо того, чтобы выдать результат (о том, принадлежит ли точка заданной области и вывод значения P).

Код:
#include "stdafx.h"
#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;
}
260
24 октября 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: Ybr
Здравствуйте!

Задание:
Дана область (см. рисунок).
Пользователь вводит координаты какой-то точки (x,y).
Если введенная точка принадлежит области, то P==( arcctg(8y) )/( cos(xy) ). Иначе P==( arcsin(y) )/(x-11).


Я только-только начал осваивать С++. В принципе, почти все свои вопросы решаю через гугл и MSDN. Однако сейчас ситуация такая: при компиляции ошибок программа не выдает, нормально запускается.
Затем выводятся фразы, выше красной линии ("Введите координату X точки = " и "Введите координату Y точки = "). Без ошибок записывается в память значения x и y.
После этого по нажатии Enter программа вылетает, вместо того, чтобы выдать результат (о том, принадлежит ли точка заданной области и вывод значения P).

Код:
#include "stdafx.h"
#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;
}



Во первых отладчик никто не отменял как и предупреждения компилятора. А во вторых я преисполнен сочувствия к данному набору букв, которое кодом можно назвать с большим натягом, да и то только из-за того, что оно компилитцо древним компилятором.

15K
29 октября 2009 года
Ybr
31 / / 19.03.2007
Запустил этот набор букаф (©Ramon) на Visual Studio 2008. Все работает, но значение P и сообщение о том, лежит ли точка в интервале, появляются меньше чем на секунду - и тут же программа завершает работу.
Подскажите, пожалуйста, как это можно исправить?
311
29 октября 2009 года
plastictown
309 / / 08.01.2006
Цитата: Ybr
В принципе, почти все свои вопросы решаю через гугл и MSDN.



MSDN оно, конечно хорошо, но как учебник имхо совсем не катит.

297
29 октября 2009 года
koodeer
1.2K / / 02.05.2009
Цитата: Ybr
Запустил этот набор букаф (©Ramon) на Visual Studio 2008. Все работает,


Не верю! (с)
Не будет в таком виде программа работать.

Во-первых, нужно удалить вот это:

Цитата:
[color=red]
-------------------------------------------[/color]


Во-вторых, исправить ошибку, указанную Ramon'ом:

 
Код:
P[color=red]==[/color](asin(y))/(x-11);

В-третьих, размер буфера b[50] маловат для строки
 
Код:
"Введенная точка не располагается в заданной области\n"

В-четвёртых, необходимо подключить пространство имён std.
Цитата: Ybr
но значение P и сообщение о том, лежит ли точка в интервале, появляются меньше чем на секунду - и тут же программа завершает работу.
Подскажите, пожалуйста, как это можно исправить?


Хм, getch() в конце стоит, следовательно программа должна ждать нажатия клавиши. Или вы удалили эту строку?

15K
29 октября 2009 года
Ybr
31 / / 19.03.2007
Цитата: koodeer
Не верю! (с)
Не будет в таком виде программа работать.


Выводятся строки "Введите координату X точки = " и "Введите координату Y точки = ". Принимаются вводимые значения.
Даже на 1 секунду появляется ответ (типа "Введенная точка располагается в заданной области" и значение P).

Цитата: koodeer
Во-первых, нужно удалить вот это:


Это я добавил для удобства описания кода. В программе этого, конечно, нет:)

Цитата: koodeer
Во-вторых, исправить ошибку, указанную Ramon'ом:
 
Код:
P[color=red]==[/color](asin(y))/(x-11);


Удалил второе равенство.
Скажите, а в тем тут была ошибка? = - типа логическая опрерация, == - операция присваивания. Или я ошибаюсь?

Цитата: koodeer
В-третьих, размер буфера b[50] маловат для строки
 
Код:
"Введенная точка не располагается в заданной области\n"


fixed

Цитата: koodeer
В-четвёртых, необходимо подключить пространство имён std.


fixed

Цитата: koodeer
Хм, getch() в конце стоит, следовательно программа должна ждать нажатия клавиши. Или вы удалили эту строку?


В том-то и дело, koodeer, что прога почему-то не ждет нажатия клавиши. То есть после нажатия F5 процесс идет так:

1. Выводятся строки с запросом координат, я их ввожу;
2. После ввода значения Y программа переходит на новую строку и чего-то ждет
3. Как только нажимается еще ENTER - на долю секунды выдается результат, и программа вылетает обратно в Visual C++

Теперь код выглядит так:

Код:
#include "stdafx.h"
#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(112) : error C2871: 'std' : does not exist or is not a namespace
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 Ну, предупреждения о потере точности - это фигня, я так понимаю.
7
29 октября 2009 года
@pixo $oft
3.4K / / 20.09.2006
"="–операция присваивания,"=="–логическая.Так-то
Пора бы уже и знать,раз с Си работаете
15K
29 октября 2009 года
Ybr
31 / / 19.03.2007
Работает вот такой код:
Код:
#include "stdafx.h"
#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("&#194;&#226;&#229;&#228;&#232;&#242;&#229; &#234;&#238;&#238;&#240;&#228;&#232;&#237;&#224;&#242;&#243; X &#242;&#238;&#247;&#234;&#232; = ", a);
    cout << a;
    cin >> x;
   
    CharToOem("&#194;&#226;&#229;&#228;&#232;&#242;&#229; &#234;&#238;&#238;&#240;&#228;&#232;&#237;&#224;&#242;&#243; Y &#242;&#238;&#247;&#234;&#232; = ", 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&#194;&#226;&#229;&#228;&#229;&#237;&#237;&#224;&#255; &#242;&#238;&#247;&#234;&#224; &#240;&#224;&#241;&#239;&#238;&#235;&#224;&#227;&#224;&#229;&#242;&#241;&#255; &#226; &#231;&#224;&#228;&#224;&#237;&#237;&#238;&#233; &#238;&#225;&#235;&#224;&#241;&#242;&#232;\n", a);
        printf(a);

        CharToOem("&#199;&#237;&#224;&#247;&#229;&#237;&#232;&#229; P = ", a);
        printf(a);

        sprintf(P1,"%f",P);
        printf(P1);
    }
        else
        {
            P=(asin(y))/(x-11);

            CharToOem("\n&#194;&#226;&#229;&#228;&#229;&#237;&#237;&#224;&#255; &#242;&#238;&#247;&#234;&#224; &#237;&#229; &#240;&#224;&#241;&#239;&#238;&#235;&#224;&#227;&#224;&#229;&#242;&#241;&#255; &#226; &#231;&#224;&#228;&#224;&#237;&#237;&#238;&#233; &#238;&#225;&#235;&#224;&#241;&#242;&#232;\n", b);
            printf(b);
   
            CharToOem("&#199;&#237;&#224;&#247;&#229;&#237;&#232;&#229; P = ", b);
            printf(b);

            sprintf(P1,"%f",P);
            printf(P1);
        }
   
    getch();
   
    return 0;
}
288
30 октября 2009 года
nikitozz
1.2K / / 09.03.2007
По поводу VC6: не будем путать автора и путаться сами. Если включем <iostream>, тогда используем std, если <iostream.h>, тогда про std забываем.

К автору: скомпилил ваш код, не знаю правильно он работает или нет, но у меня консольное окно ждет ввода после завершения приложения. Попробуйте поизвращаться и вставить второй getch().

P.S. не стоит смешивать ввод/вывод в стиле cout и printf. Используйте или то или то.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог