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

"Простые" циклы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
alex-soft
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 78
25.04.2011, 15:17     "Простые" циклы #1
Помогите, пожалуйста, сделать Лаб.роботу по С++.
Вычислить и вывести значение функции при изменении значения аргумента от А к В с шагом С и определить минимальное и максимальное значение функции на отрезке. Создать три разных типа программы: создание цикла FOR; создание цикла WHILE; создание цикла DO-WHILE.
Вот, что-то сделал по примерам, которые нашел в Интернете. Это на цикл FOR.
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <dos.h>
 
main()
{
int S,s
for(int s=-2;s<2;s+=0.2);
{
printf("Input s= ");
scanf("%f",&s);
 
if((s>=-1)&&(s<=1.2)
S=s+ln(abs(cos(s)*cos(s)-s*s));
 
if (s<-1)
S=(sin(s)/cos(s)+sqrt(abs(s));
 
if(s>1.2)
S=s*s*s*lg(s+e^s);
printf("%f",S);
 
 
 
 
 
delay(1000);
}
return 0;
}
Миниатюры
"Простые" циклы  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HeM01
36 / 24 / 2
Регистрация: 05.01.2010
Сообщений: 37
25.04.2011, 16:13     "Простые" циклы #2
Скорее, програмка тебе нужна не на C++ а на обычном С, под Turbo C

1. int хранит целые числа, а по заданию видно, что нам нужны вещественные: float или double.
В printf ты указал %f, который ожидает как раз float или double.
2. То, что ты пытаешься сделать не правильно. Нужно получить с клавиатуры 2 вещественных числа, которые будут представлять отрезок, на котором мы будем производить вычисления. Третье число с клавиатуры должно показывать шаг, с которым мы проходим по отрезку.
3. Задержка в программе на несколько миллисекунд (на 1 секунду) не есть выход. Лучше использовать getch, которая ожидает нажатие клавиши.

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
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int main()
{
   float a, b, h, x, S;
   printf("Vvedite A, B, H:\n");
   scanf("%f %f %f", &a, &b, &h);
   for (x = a; x<=b; x = x + h)
   {
      if (x < -1.0)
      {
          S = tan(x) + sqrt(fabs(x));
      }
      else
      {
          if (x <= 1.2)
          {
              S = x + log(cos(x)*cos(x) - x*x);
          }
          else
          {
              S = x*x*x*log(x + exp(x));
          }
      }
      printf("%f", S);
   }
   getch();
   return 0;
}
Это не вся программка Нужно самому учиться и пробовать.
Минимальное и максимальное значение можно найти с помощью алгоритма:
1. Получить значение S (какой-либо функции) и сказать что оно максимальное (max)
2. Вычислить новое значение S и сравнить его с максимальным значением. Если > max, то переходим на пункт 3, иначе на пункт 4.
3. Присваиваем максимальному значению S: max = S;
4. Выбираем следующую точку. Если еще не конец нашего интервала, то переходим на пункт 2, иначе на пункт 5.
5. Вывод максимального.

Примерно такое же и для min значения.

Напомню что циклы while и do-while выполняются, пока условие выполняется. Ничего сложного
alex-soft
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 78
25.04.2011, 17:25  [ТС]     "Простые" циклы #3
Порылся в Интернете и немного добавил в программу.
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int main()
{
   float a, b, h, x, S;
   printf("Vvedite A, B, H:\n");
   scanf("%f %f %f", &a, &b, &h);
   for (x = a; x<=b; x = x + h)
   {
      if (x < -1.0)
      {
          S = tan(x) + sqrt(fabs(x));
      }
      else
      {
          if (x <= 1.2)
          {
              S = x + log(cos(x)*cos(x) - x*x);
          }
          else
          {
              S = x*x*x*log(x + exp(x));
          }
      }
      printf("%f", S);
   }
   
 
{  flout a=-2,b=2;
   float c=0.2,S=fun(x),min=S,max=S;
   do
{  s+=c; S=fun(x);
    if(S>max) max=S;
    if(S<min) min=S;
  
} while(x!=b); 
printf("Max %f , Min %f \n",max,min);
 
    getch();
   return 0;
}
HeM01
36 / 24 / 2
Регистрация: 05.01.2010
Сообщений: 37
25.04.2011, 18:08     "Простые" циклы #4
Ну... почти так:
Функция func не определена, это раз.
flout - нет такого, это два.
a, b, с мы определили до этого и ввели с клавиатуры, они никуда не исчезли. это три.
Сравнивать числа с плавающей точкой на неравенство (!=) нельзя! это четыре. Нужно использовать сравнения: <, <=, >, >=
Лишняя открывающая скобка. это пять.

А в общем да, примерно так
alex-soft
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 78
25.04.2011, 19:22  [ТС]     "Простые" циклы #5
Вот, внес некоторые изменения.
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int main()
{
   float a, b, h, x, S, fun;
  float a=-2, b=2, h=0.2;
      for (x = a; x<=b; x = x + h)
   {
      if (x < -1.0)
      {
          S = tan(x) + sqrt(fabs(x));
      }
      else
      {
          if (x <= 1.2)
          {
              S = x + log(cos(x)*cos(x) - x*x);
          }
          else
          {
              S = x*x*x*log(x + exp(x));
          }
      }
      printf("%f", S);
   }
   
float S=fun(x),min=S,max=S;
   do
{  x+=h; S=fun(x);
    if(S>max) max=S;
    if(S<min) min=S;
  
} while(x<=b); 
printf("Max %f , Min %f \n",max,min);
 
    getch();
   return 0;
}
HeM01
36 / 24 / 2
Регистрация: 05.01.2010
Сообщений: 37
25.04.2011, 19:48     "Простые" циклы #6
Такой вопрос: ты пробуешь это компилировать?
1. Ты в 8 строке переопределяешь переменные. Такой код не запустится.
2. В 7 ты пытаешь определить функцию с именем fun? Это делается не так
C
1
2
3
4
float fun(float x)
{
   return x*x*x; // вернет x в кубе
}
Такое определение должно быть вне любой функции, в том числе main.

3. После for, x у нас не потеряет своего значения, и будет больше и равный b. Так что, для того-что бы использовать его в do-while цикле нужно установить новое значение.

P. S. Не забудь что у тебя функция S составная - она состоит из 3 разных функций, которые справедливы на своем отрезке.
alex-soft
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 78
25.04.2011, 20:10  [ТС]     "Простые" циклы #7
Извини, пожалуйста, что допускаю такие глупые ошибки, ведь я на самом ОЧЕНЬ плохо программирую (если это можно назвать программированием).
Вот я немного исправил.
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int main()
{
   float x, S;
  float a=-2, b=2, h=0.2;
      for (x = a; x<=b; x = x + h)
   {
      if (x < -1.0)
      {
          S = tan(x) + sqrt(fabs(x));
      }
      else
      {
          if (x <= 1.2)
          {
              S = x + log(cos(x)*cos(x) - x*x);
          }
          else
          {
              S = x*x*x*log(x + exp(x));
          }
      }
      printf("%f", S);
   }
   
       
float fun(float x)
{
   return x*x*x;
}
 
float S=fun(x),min=S,max=S;
   do
{  x+=h; S=fun(x);
    if(S>max) max=S;
    if(S<min) min=S;
  
} while(x<=b); 
printf("Max %f , Min %f \n",max,min);
 
    getch();
   return 0;
}
Залей, пожалуйста, свой вариант этой программы.
А я уже постараюсь изменить его на другие два цикла: while, do-while.
HeM01
36 / 24 / 2
Регистрация: 05.01.2010
Сообщений: 37
25.04.2011, 20:47     "Простые" циклы #8
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
float func(float x)
{
      float S;   // локальная переменная S
      if (x < -1.0)
      {
          S = tan(x) + sqrt(fabs(x));
      }
      else
      {
          if (x <= 1.2)
          {
              S = x + log(cos(x)*cos(x) - x*x);
          }
          else
          {
              S = x*x*x*log(x + exp(x));
          }
      }
      return S;
}
 
int main()
{
   float a=-2, b=2, h=0.2;
   float x = a;
   float S = func(x);
   float max, min;
   max = S;
   min = S;
   printf("%f %f\n", x, S);
   for (x = a+h; x<=b; x = x + h)
   {
      S = func(x);
      if(S>max)
         max=S;
      if(S<min)
         min=S;
      printf("%f %f\n", x, S);
   }
   printf("Max %f , Min %f \n",max,min); 
   getch();
   return 0;
}
Что-то такое. Это все с использованием for цикла. Т.е. по отрезку [a;b] мы прошлись с шагом h. В цикле мы так же искали максимальное и минимальное значение.
Для других циклов нужно использовать такой же подход. Это совсем не тяжело

Учись, и будет получаться.
alex-soft
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 78
25.04.2011, 21:22  [ТС]     "Простые" циклы #9
Вот, что-то изменил. Посмотри, пожалуйста, если что-то надо - исправь. Цикл WHILE.
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
float func(float x)
{
      float S;   // локальная переменная S
      if (x < -1.0)
      {
          S = tan(x) + sqrt(fabs(x));
      }
      else
      {
          if (x <= 1.2)
          {
              S = x + log(cos(x)*cos(x) - x*x);
          }
          else
          {
              S = x*x*x*log(x + exp(x));
          }
      }
      return S;
}
 
int main()
{
   float a=-2, b=2, h=0.2;
   float x = a;
   float S = func(x);
   float max, min;
   max = S;
   min = S;
   printf("%f %f\n", x, S);
  x= a+h
while (x<=b)
   {
      S = func(x);
      if(S>max)
         max=S;
      if(S<min)
         min=S;
x = x + h;
      printf("%f %f\n", x, S);
   }
   printf("Max %f , Min %f \n",max,min); 
   getch();
   return 0;
}
P.S. Спасибо, что помог сделать программу с циклом FOR.
HeM01
36 / 24 / 2
Регистрация: 05.01.2010
Сообщений: 37
25.04.2011, 21:32     "Простые" циклы #10
Да не за что
Почти все так с while, только ты делаешь новый x, а значение остается старое. А так правильно
alex-soft
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 78
25.04.2011, 21:43  [ТС]     "Простые" циклы #11
Цитата Сообщение от HeM01 Посмотреть сообщение
только ты делаешь новый x, а значение остается старое.
Я немного не понял что именно нужно исправить? В какой строчке?
HeM01
36 / 24 / 2
Регистрация: 05.01.2010
Сообщений: 37
25.04.2011, 21:53     "Простые" циклы #12
C
1
2
3
4
5
6
7
8
9
10
   while (x<=b)
   {
      S = func(x);
      if(S>max)
         max=S;
      if(S<min)
         min=S;
      x = x + h;
      printf("%f %f\n", x, S);
   }
Вот тут у тебя расчеты производились со старым x. потом ты его увеличил, получил новое значение. А вот результаты то относятся к старому x.
alex-soft
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 78
25.04.2011, 21:58  [ТС]     "Простые" циклы #13
Так необходимо внести новый символ?
Или как-то по другому можно исправить?
HeM01
36 / 24 / 2
Регистрация: 05.01.2010
Сообщений: 37
25.04.2011, 22:16     "Простые" циклы #14
Просто напросто перенести строку присвоения ниже. Т.е. сначала вывод значений, а потом новый x получаем.
alex-soft
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 78
25.04.2011, 23:02  [ТС]     "Простые" циклы #15
Этот цикл правильно сделал?
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
float func(float x)
{
      float S;   // локальная переменная S
      if (x < -1.0)
      {
          S = tan(x) + sqrt(fabs(x));
      }
      else
      {
          if (x <= 1.2)
          {
              S = x + log(cos(x)*cos(x) - x*x);
          }
          else
          {
              S = x*x*x*log(x + exp(x));
          }
      }
      return S;
}
 
int main()
{
   float a=-2, b=2, h=0.2;
   float x = a;
   float S = func(x);
   float max, min;
   max = S;
   min = S;
   printf("%f %f\n", x, S);
   x= a+h
do   {
      S = func(x);
      if(S>max)
         max=S;
      if(S<min)
         min=S;
      printf("%f %f\n", x, S);
      x = x + h;
      } while (x<=b);
         }
   printf("Max %f , Min %f \n",max,min); 
   getch();
   return 0;
}
HeM01
36 / 24 / 2
Регистрация: 05.01.2010
Сообщений: 37
25.04.2011, 23:29     "Простые" циклы #16
Правильно, только в 45 строке лишняя скобка
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2011, 19:35     "Простые" циклы
Еще ссылки по теме:

C++ Проверить утверждение "результатами вычислений по формуле x*x+x+17 при 0 ≤ х ≤ 15 являются простые числа"
Циклы с выключателем и ошибка "ссылка на неразрешенный внешний символ" C++
C++ Проверить утверждение "результатами вычислений по формуле х^2+х+17, при 0 <=х <= 15, являются простые числа"

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

Или воспользуйтесь поиском по форуму:
alex-soft
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 78
26.04.2011, 19:35  [ТС]     "Простые" циклы #17
Удалил. Спасибо, что помог разобраться.
Yandex
Объявления
26.04.2011, 19:35     "Простые" циклы
Ответ Создать тему
Опции темы

Текущее время: 16:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru