Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Zakat
6 / 6 / 0
Регистрация: 24.12.2012
Сообщений: 149
#1

как выйти из циклов - C++

09.05.2013, 00:14. Просмотров 1993. Ответов 20
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <Windows.h>
#include <iostream>
 
void main(void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);   
    
    float R=31;
    float _x0, _y0;
    _x0=32-R;
    float Dokr;
    Dokr = (-40)*(-40)-4*1*(-560);
    _y0=((-40)+sqrt(Dokr))/2;
    float krayokruzhnostiX1, krayokruzhnostiX2;
    krayokruzhnostiX1=_x0-R;
    krayokruzhnostiX2=_x0+R;
    
    float a=31, b=38;
    float _x, _y;
    float Dell;
    _y=b-45;
    Dell = (-80)*(-80)-4*1*671;
    _x=(-80+sqrt(Dell))/2;
    float krayellipsaX1, krayellipsaX2;
    krayellipsaX1=_x-a;
    krayellipsaX2=_x+a;
    
    for( float X1=krayokruzhnostiX1; X1<krayokruzhnostiX2; X1=X1+0.001)
    {
        float Yokr1, Yokr2;
        float t, w, D;
        float n1=1;//типо a
        w=2*_y0;//типо b
        t=pow(X1-_x0, 2)+pow(_y0, 2)-pow(31, 2);// типо c
        D=w*w-4*n1*t;//дискриминант
        Yokr1=(-w+sqrt(D))/2*n1;//первый корень окружности
        Yokr2=(-w-sqrt(D))/2*n1;//второй корень окружности
        for(float X2=krayellipsaX1; X2<krayellipsaX2; X2=X2+0.001)
        {
            float znachenieellipsa=1;
            float Yell1, Yell2;
            float t1, w1, D1;
            float n2=1;//типо а
            w1=2*_y;//типо b
            t1=((pow(X2-_x, 2))/(a*a)-znachenieellipsa)*(b*b)+(_y*_y);//типо с
            D1=w1*w1-4*n2*t1;
            Yell1=(w1+sqrt(D1))/2*n2;//первый корень эллипса
            Yell2=(w1-sqrt(D1))/2*n2;//второй корень эллипса
        }
        
        
    }
    printf("точки пересечения\n\t\X1=%0.3f, Y1=%0.3f\n\tX2=%0.3f, Y2=%0.3f", X1, Yokr1, X2, Yokr2);
    system("pause");
}
подскажите пожалуйста как выйти из этих циклов? ну и чтобы сообщение вывелось)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2013, 00:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос как выйти из циклов (C++):

как выйти из программы - C++
при выполнении программы - выполняется выбранная операция, после чего при нажатии любой кнопки цикл повторяется... вопрос: Что нужно...

Как выйти из цикла while(); - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;cctype&gt; #include &lt;string&gt; #include &lt;vector&gt; using namespace std; int main()...

do while - как выйти из цикла? - C++
Подскажите пожалуйста, а то я уже всю голову &quot;сломал&quot;, почему при вводе &quot;А&quot; цикл не прерывается??? #include &lt;iostream&gt; #include...

Как выйти из программы - C++
Написав щось подібне калькулятору. Але що написати щоб вийти з консолі?? буду вдячний. І ще наприклад для повернення в голову...

Как выйти из оператора if - C++
Пишу ИИ для крестиков-ноликов и вопрос в том, если исполниться одино условие как сделать так что бы другие не проверялись? break чето в...

Как выйти из функции - C++
Прошу прощения. Произошел сбой при записи. Напишите еще раз суть задачи. То получилось что-то вроде рекурсии, постоянно вызывается этот...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ssXXss
266 / 188 / 10
Регистрация: 15.01.2011
Сообщений: 681
09.05.2013, 01:53 #16
сдается мне что это случится не скоро, у меня не хватило терпения ) ,попробуй распаралелить циклы.
0
Zakat
6 / 6 / 0
Регистрация: 24.12.2012
Сообщений: 149
09.05.2013, 02:07  [ТС] #17
ух... ну ладно, спасибо и на этом))
0
cyberbrain1000
23 / 23 / 3
Регистрация: 15.04.2013
Сообщений: 62
09.05.2013, 11:23 #18
окромя goto можно ещё исключение бросить. Помогает и при вложенных ф-циях
1
Zakat
6 / 6 / 0
Регистрация: 24.12.2012
Сообщений: 149
10.05.2013, 06:59  [ТС] #19
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <Windows.h>
#include <iostream>
 
void main(void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);   
 
    float R = 31;
    float _x0, _y0;
    _x0 = 32 - R;
    float Dokr;
    Dokr = (-40) * (-40) - 4 * 1 * (-560);
    _y0=((-40) + sqrt(Dokr)) / 2;
    float krayokruzhnostiX1, krayokruzhnostiX2;
    krayokruzhnostiX1 = _x0 - R;
    krayokruzhnostiX2 = _x0 + R;
    
    float a = 31, b = 38;
    float _x, _y;
    float Dell;
    _y = b - 45;
    Dell = (-80) * (-80) - 4 * 1 * 671;
    _x = (-80 + sqrt(Dell)) / 2;
    float krayellipsaX1, krayellipsaX2;
    krayellipsaX1 = _x - a;
    krayellipsaX2 = _x + a;
    
    
    float Yell1, Yell2;
    float Yokr1, Yokr2;
    float X1, X2;
    float t, w, D;
 
        float n1 = 1;//типо a
        w = 2 * _y0;//типо b
        
        float znachenieellipsa = 1;
            float t1, w1, D1;
            float n2 = 1;//типо а
            w1 = 2 * _y;//типо b
 
    for( float i1 = krayokruzhnostiX1; i1 < krayellipsaX2; i1 = i1 + 0.001)
    {
        t = pow(i1 - _x0, 2) + pow(_y0, 2) - pow(R, 2);// типо c
        D = w * w - 4 * n1 * t;//дискриминант
        Yokr1 = (w + sqrt(D)) / 2 * n1;//первый корень окружности
        Yokr2 = (w - sqrt(D)) / 2 * n1;//второй корень окружности
        
        
        t1 = ((pow(i1 - _x, 2)) / (a * a) - znachenieellipsa) * (b * b) + (_y * _y);//типо с
        D1 = w1 * w1 - 4 * n2 * t1;//дискриминант 
        Yell1 = (w1 + sqrt(D1)) / 2 * n2;//первый корень эллипса
        Yell2 = (w1 - sqrt(D1)) / 2 * n2;//второй корень эллипса
 
        if( Yell1 != Yokr1)
        {
            printf("точки окружности от края окружности до края эллипса по X\n\tX=%0.3f \n\tY=%0.3f, Y1=%0.3f\n", i1, Yokr1, Yokr2);
            printf("точки эллипса от края окружности до края эллипса по X\n\tX=%0.3f \n\tY=%0.3f, Y1=%0.3f\n", i1, Yell1, Yell2);
        }
        else{break;}
        
    }
 
        printf("точки пересечения\n");
    system("pause");
}
посидел подумал вот что получилось. сделал все в 1 цикл. таки она считает точки! только сейчас не знаю как найти Yell1 == Yokr1

Добавлено через 8 минут
p.s на 70 строку не обращайте внимания... =)

Добавлено через 13 часов 6 минут
народ, нужна помощь... нужно сделать так чтобы ВСЕ числа считались с остатком до 0.001... понял почему такой косяк... возникает погрешность...

Добавлено через 1 час 12 минут
возник новый вопрос... как в формулах сказать компьютеру чтобы вычислял до трех знаков после запятой? например в строках 52 53 и 58 59, а то ведь там числа могу получаться очень длинные...

Добавлено через 2 часа 32 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <Windows.h>
#include <iostream>
#include <iomanip>
using namespace std;
 
void main(void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);   
 
    float R = 31.000;
    float _x0, _y0;
    _x0 = 32.000 - R;
    float Dokr;
    Dokr = (-40.000) * (-40.000) - 4.000 * 1.000 * (-560.000);
    _y0 = ((-40.000) + sqrt(Dokr)) / 2.000;
    float krayokruzhnostiX1, krayokruzhnostiX2;
    krayokruzhnostiX1 = _x0 - R;
    krayokruzhnostiX2 = _x0 + R;
    
    float a = 31.000, b = 38.000;
    float _x, _y;
    float Dell;
    _y = b - 45.000;
    Dell = (-80.000) * (-80.000) - 4.000 * 1.000 * 671.000;
    _x = (-80.000 + sqrt(Dell)) / 2.000;
    float krayellipsaX1, krayellipsaX2;
    krayellipsaX1 = _x - a;
    krayellipsaX2 = _x + a;
    
    
    float Yell1 = 0.000, Yell2 = 0.000;
    float Yokr1 = 0.000, Yokr2 = 0.000;
    float X1, X2;
    float t, w, D;
 
        float n1 = 1.000;//типо a
        w = 2.000 * _y0;//типо b
        
        float znachenieellipsa = 1.000;
            float t1, w1, D1;
            float n2 = 1.000;//типо а
            w1 = 2.000 * _y;//типо b
 
    for(float i1 = krayokruzhnostiX1; i1 <= 0; i1 = i1 + 0.000001)
    {       
        t = pow(i1 - _x0, 2.000) + pow(_y0, 2.000) - pow(R, 2.000);// типо c
        D = w * w - 4.000 * n1 * t;//дискриминант
        Yokr1 = (w + sqrt(D)) / 2.000 * n1;//первый корень окружности
        X1=i1;      
        
        t1 = ((pow(i1 - _x, 2.000)) / (a * a) - znachenieellipsa) * (b * b) + (_y * _y);//типо с
        D1 = w1 * w1 - 4 * n2 * t1;//дискриминант 
        Yell1 = (w1 + sqrt(D1)) / 2.000 * n2;//первый корень эллипса
                
        if(Yokr1 == Yell1)
            break;      
    }
    printf("X=%.3f Yokr=%.3f, Yell=%.3f\n", X1, Yokr1, Yell1);
 
    for(float i1 = 21; i1 <= krayellipsaX2; i1 = i1 + 0.000001)
    {       
        t = pow(i1 - _x0, 2.000) + pow(_y0, 2.000) - pow(R, 2.000);// типо c
        D = w * w - 4.000 * n1 * t;//дискриминант
        Yokr2 = (w - sqrt(D)) / 2.000 * n1;//второй корень окружности
        X2=i1;      
        
        t1 = ((pow(i1 - _x, 2.000)) / (a * a) - znachenieellipsa) * (b * b) + (_y * _y);//типо с
        D1 = w1 * w1 - 4 * n2 * t1;//дискриминант 
        Yell2 = (w1 - sqrt(D1)) / 2.000 * n2;//второй корень эллипса
 
        if(Yokr2 == Yell2)
            break;
        else
        {
        printf("X=%f Yokr=%f, Yell=%f\n", X2, Yokr2, Yell2);
        }
    }
        
    printf("X=%.3f Yokr=%.3f, Yell=%.3f\n", X2, Yokr2, Yell2);
        
    system("pause");
}
сделал два цикла, первый для первых точек, второй для вторых) в первом все нормально, можно сказать повезло... а вот со вторым циклом так не везет, проскакивает. количество итераций конечно много... но если можно подскажите как сделать чтобы сами значения при вычислении до трех знаков округлялись? поиск пробовал

Добавлено через 1 минуту
поиск пробовал, много интересного пишут, но я не могу понять как в мои выражения это вставить

Добавлено через 1 минуту
[IMG]http://s017.***********/i435/1305/2b/9e33add5876d.png[/IMG]
вот в этой точке проскакивает...

Добавлено через 16 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <Windows.h>
#include <iostream>
#include <iomanip>
using namespace std;
 
void main(void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);   
 
    float R = 31.000;
    float _x0, _y0;
    _x0 = 32.000 - R;
    float Dokr;
    Dokr = (-40.000) * (-40.000) - 4.000 * 1.000 * (-560.000);
    _y0 = ((-40.000) + sqrt(Dokr)) / 2.000;
    float krayokruzhnostiX1, krayokruzhnostiX2;
    krayokruzhnostiX1 = _x0 - R;
    krayokruzhnostiX2 = _x0 + R;
    
    float a = 31.000, b = 38.000;
    float _x, _y;
    float Dell;
    _y = b - 45.000;
    Dell = (-80.000) * (-80.000) - 4.000 * 1.000 * 671.000;
    _x = (-80.000 + sqrt(Dell)) / 2.000;
    float krayellipsaX1, krayellipsaX2;
    krayellipsaX1 = _x - a;
    krayellipsaX2 = _x + a;
    
    
    float Yell1 = 0.000, Yell2 = 0.000;
    float Yokr1 = 0.000, Yokr2 = 0.000;
    float X1, X2;
    float t, w, D;
 
        float n1 = 1.000;//типо a
        w = 2.000 * _y0;//типо b
        
        float znachenieellipsa = 1.000;
            float t1, w1, D1;
            float n2 = 1.000;//типо а
            w1 = 2.000 * _y;//типо b
            printf("точки пересечения эллипса и окружности\n");
    for(float i1 = krayokruzhnostiX1; i1 <= 0; i1 = i1 + 0.00001)
    {       
        t = pow(i1 - _x0, 2.000) + pow(_y0, 2.000) - pow(R, 2.000);// типо c
        D = w * w - 4.000 * n1 * t;//дискриминант
        Yokr1 = (w + sqrt(D)) / 2.000 * n1;//первый корень окружности
        X1=i1;      
            float tpy1 = int(Yokr1 * 1000 + 0.5)/10000.0;
        t1 = ((pow(i1 - _x, 2.000)) / (a * a) - znachenieellipsa) * (b * b) + (_y * _y);//типо с
        D1 = w1 * w1 - 4 * n2 * t1;//дискриминант 
        Yell1 = (w1 + sqrt(D1)) / 2.000 * n2;//первый корень эллипса
            float tpy2 = int(Yell1 * 1000 + 0.5)/10000.0;
        if(Yokr1 == Yell1)
            break;      
    }
    printf("\tX1=%.3f\tY1=%.3f\n", X1, Yokr1);
 
    for(float i1 = 21; i1 <= krayellipsaX2; i1 = i1 + 0.0001)
    {       
        t = pow(i1 - _x0, 2.000) + pow(_y0, 2.000) - pow(R, 2.000);// типо c
        D = w * w - 4.000 * n1 * t;//дискриминант
        Yokr2 = (w - sqrt(D)) / 2.000 * n1;//второй корень окружности
        X2=i1;      
            float tpy1 = int(Yokr2 * 1000 + 0.5)/1000.0; 
        t1 = ((pow(i1 - _x, 2.000)) / (a * a) - znachenieellipsa) * (b * b) + (_y * _y);//типо с
        D1 = w1 * w1 - 4 * n2 * t1;//дискриминант 
        Yell2 = (w1 - sqrt(D1)) / 2.000 * n2;//второй корень эллипса
            float tpy2 = int(Yell2 * 1000 + 0.5)/1000.0;
        if(tpy1 == tpy2)
            break;
        else
        {
        //printf("X=%f Yokr=%f, Yell=%f\n", X2, tpy1, tpy2);
        }
    }
        
    printf("\tX2=%.3f\tY2=%.3f\n", X2, Yokr2);
        
    system("pause");
}
фух все разобрался и решил эту задачку))
0
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
10.05.2013, 10:06 #20
Еще раз обращаю внимание на
if(Yokr1 == Yell1)
на 99,99999% не подойдет из-за
1. неточного представления чисел с плавающей запятой,
2. Дискретности шага перебора значений.
Надо писать
if(fabs(Yokr1 -Yell1)<sqrt(0.0001))

И еще. Зачем в квадрат возводить числа через e в степени логарифм двойки (функция pow)?
0
Zakat
6 / 6 / 0
Регистрация: 24.12.2012
Сообщений: 149
10.05.2013, 12:06  [ТС] #21
Цитата Сообщение от zss Посмотреть сообщение
Еще раз обращаю внимание на
if(Yokr1 == Yell1)
на 99,99999% не подойдет из-за
1. неточного представления чисел с плавающей запятой,
C++
1
float tpy1 = int(Yokr1 * 1000 + 0.5)/10000.0;
и остальные таких же 4 формулы для округления

Цитата Сообщение от zss Посмотреть сообщение
И еще. Зачем в квадрат возводить числа через e в степени логарифм двойки (функция pow)?
то есть? где? ну в моем представлении pow (x, y) где x-число, y-степень
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2013, 12:06
Привет! Вот еще темы с ответами:

Как выйти из условия if? - C++
Пользователю предлагается выбор, он должен ввести 1 или 2. Я хочу учесть и ситуацию, когда пользователь ошибся, и,чтобы не перезапускать...

Как выйти из цикла? Не получается - C++
Есть задача: Из-за высокой цены бензина водители озабочены затратами топлива своих автомобилей. Один водитель взял в рейс несколько...

Не пойму как из цикла выйти - C++
в учебнике такой пример. #include &lt;stdio.h&gt; main() { long nc; nc = 0; while ( getchar() != EOF)

Как досрочно выйти из программы - C++
Всем привет. Как досрочно выйти из программы: int main() { int b; setlocale(0,&quot;&quot;); cout&lt;&lt;&quot;Что вы хотите сделать? 1- блаблабла,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.05.2013, 12:06
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru