Jump to content

Помогите избавиться от бесконечного зацикливания цикла! :)


Glebr
 Share

Recommended Posts

Подскажите пожалста, что не так, скажем при вводе двух одинаковых чисел выводится бесконечная таблица чисел, а нужна всего 1 строчка! Не пойму как исправить...

Да, язык Си, вот код:

#include <stdio.h>
#include <math.h>
void main()
{
double b, x, x1, x2, d, y;
printf("Введите начальное положение и конечное");
scanf("%lf%lf", &x1, &x2);
printf("\n┌─────────────┬────────────┐");
printf("\n│ x │ f(x) │ ");
b=(x2-x1)/9;
x=0.;
for(x=x1; x<=x2; x=x+b)
{
if(x<-1.) y=-2-x;
else
if(x<0.) y=(-2+sqrt(4-4*pow(x,2.)))/2;
else
if(x<2.) y=(4-sqrt(16-4*pow(x,2.)))/2;
else
if(x<4.) y=-1.;
else y=(x/2)-3;

printf("\n├─────────────┼────────────┤");
printf("\n│ %7.2lf │ %7.2lf │", x,y);

}
printf("\n└─────────────┴────────────┘");
}

Link to comment
Share on other sites

Ну так и разберитесь с этим

b=(x2-x1)/9;

x=0.;

for(x=x1; x<=x2; x=x+-_-

кстати зачем после нуля точка?

Ну точка по привычке после вещественного числа, чтоб предупреждений не было.

А с чем именно разобраться то? Я не понимаю как сделать, чтоб он один раз цикл прошёл и остановился при одинаковом начальном и конечном значении(х1=х2)

Link to comment
Share on other sites

#include <stdio.h>
#include <math.h>
void main()
{
double b, x, x1, x2, d, y;
printf("Введите начальное положение и конечное");
scanf("%lf%lf", &x1, &x2);
printf("\n┌─────────────┬────────────┐");
printf("\n│ x │ f(x) │ ");
b = ( x2 - x1 ) / 9;
for(x = x1; x <= x2 && b; x += b)
{
if(x<-1.) y=-2-x;
else if(x<0.) y=(-2+sqrt(4-4*pow(x,2.)))/2;
else if(x<2.) y=(4-sqrt(16-4*pow(x,2.)))/2;
else if(x<4.) y=-1.;
else y=(x/2)-3;

printf("\n├─────────────┼────────────┤");
printf("\n│ %7.2lf │ %7.2lf │", x,y);

}
printf("\n└─────────────┴────────────┘");
}

и всего делов

изменена только проверка. ещё убрано x = 0.; за явной безполезностью

Если у тебя введены одинаковые значения то x тождественно равен x1 так как b == 0, это удовлетворяет условию исполнения цикла

Link to comment
Share on other sites

да? а у меня выводит. первая итерация for безусловна. ну раз так то можно усложнить жизнь

#include <stdio.h>
#include <math.h>
void main()
{
double b, x, x1, x2, d, y;
printf("Введите начальное положение и конечное");
scanf("%lf%lf", &x1, &x2);
printf("\n┌─────────────┬────────────┐");
printf("\n│ x │ f(x) │ ");
b = ( x2 - x1 ) / 9;
int flagOfOneIteration = 0;
x = x1;
while((x <= x2 && b) || !flagOfOneIteration)
{
if(x<-1.) y=-2-x;
else if(x<0.) y=(-2+sqrt(4-4*pow(x,2.)))/2;
else if(x<2.) y=(4-sqrt(16-4*pow(x,2.)))/2;
else if(x<4.) y=-1.;
else y=(x/2)-3;

printf("\n├─────────────┼────────────┤");
printf("\n│ %7.2lf │ %7.2lf │", x,y);
++flagOfOneIteration;
x+=b;

}
printf("\n└─────────────┴────────────┘");
}

Так как в классике внутри тела цикла for менять параметры цикла - безумие, переходим на while. Но я уверен что вы что-то не так сделали с моим предыдущим примером.

Edited by CEBEP
Link to comment
Share on other sites

И что у вас выводит?

Не выводит значения, если х1 и х2 равны...

С вайлом не вариант. Работает, если ток со счётчиком делать, но я бы хотел без него, но не понимаю как сделать это... Спасибо, конечно, за ответы!

Link to comment
Share on other sites

да блин! for(операция1; условие; операция2){тело цикла} исполняется так:

операция1

тело цикла

операция2

если условие == true

тело цикла

операция2

если условие == true

тело цикла

операция2

если условие == true

тело цикла

операция2

если условие == true

тело цикла

операция2...

То есть ВСЕГДА один раз тело цикла выполняется НЕЗАВИСИМО от условий цикла! В первом примере всё работает совершенно корректно, у меня крепнет убеждение что вы его даже не пытались скомпилировать.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy