Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Помогите пожалуйста разобраться с Switch case


Автор: ZXSpectrum 24.4.2012, 06:12
Сразу предупрежу ,что я полный ламер) Мне нужно выполнить лабораторку с  использованием конструкции switch-case. Вот ее условие:


Вычислить и вывести на экран значения аргумента и значения функции, заданной несколькими выражениями, для заданного интервала  хн ≤ x ≤ хк и шага dx изменения аргумента. Параметры a, b, c – действительные числа.
Вариант 10.
http://savepic.su/1817836.htm

Вот что я сумел на данный момент сделать, вся загвоздка в том что я не знаю как задать нужное мне условие для "case",который непременно желает оставаться константой(

Код
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>

main()
{

    int a, b, c, dx, F, xn, xk, x;
    int n;
    
    printf("Enter:\n");
    std::cout<<"a = ";            
    std::cin>>a;                
    std::cout<<"b = ";            
    std::cin>>b;    
    std::cout<<"c = ";            
    std::cin>>c;                
    std::cout<<"xn = ";            
    std::cin>>xn;                
    std::cout<<"xk = ";            
    std::cin>>xk;        
    std::cout<<"dx = ";            
    std::cin>>dx;        
    
    n=0;
    printf("Results:\n");

    for (x=xn; x<=xk; x=x+dx)
    {
         switch(x-10<0 && a==0) 
         {case 1: case 2: case 3: case 4: case 5:  case 6: case 7: case 8: case 9: case 10:
          case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: 
          case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: 
          case 31: case 32: case 33: case 34: case 35: case 36: case 37: case 38: case 39: case 40:
              F =(cos(x)+1)/(b-x);     break; 
         
          switch(x-10>0 && a!=0)
          {case 1: case 2: case 3: case 4: case 5:  case 6: case 7: case 8: case 9: case 10:
          case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: 
          case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: 
          case 31: case 32: case 33: case 34: case 35: case 36: case 37: case 38: case 39: case 40:
              F=(a*x*x-b*x+c)/(sin(x)); break;  
                  
                     
          default: F=(log(x+c))/(2*b);}}
         
         
    }
         printf ("%3d.      x=%6.2f     F=%8.3f\n\n",n,x,F);
         printf("F=%d \n", F);
        getch();
        return 0;
        
}


Ну вот ее рабочее решение с помощью if else :


Код
#include <stdio.h>
#include <conio.h>
#include <math.h>
main()
{
float a, b, c, dx, F, xn, xk, x;
int n;

clrscr();

printf("Enter a, b, c, xn, xk, dx:\n");
scanf("%f%f%f%f%f%f",&a,&b,&c,&xn,&xk,&dx);
n=0;
printf("Results:\n");

for (x=xn; x<=xk; x=x+dx)
    {
     if (x-10<0 && a==0)
            {F =(cos(x)+1)/(b-x);}

        else if (x-10>0 && a!=0)
            {F=(a*x*x-b*x+c)/(sin(x));}

        else
            F=(log(x+c))/(2*b);

    printf ("%3d.      x=%6.2f     F=%8.3f\n\n",n,x,F);
    }

getch();
return 0;
}

Всем СПАСИБО ЗА ВНИМАНИЕ!!!

Модератор: не забываем пользоваться кнопочкой "Код"

Автор: disputant 24.4.2012, 07:03
Цитата(ZXSpectrum @ 24.4.2012,  06:12)
Сразу предупрежу ,что я полный ламер) Мне нужно выполнить лабораторку с  использованием конструкции switch-case. Вот ее условие:


У вас какое-то "зачем просто, если можно сложно"...
С чего вы вообще решили, что в этой задаче требуется применение switch-case? 

Но если ну очень надо, то подумайте вот о чем:

Выражение x-10<0 - это bool со значениями true и false (1 и 0 при приведении к int)... Как и x-10>0, a==0, a != 0. Надо только немного повозиться, чтоб получить конкретные, но разные числовые значения (не пересекающиеся). Подумайте, как.

Кстати, можно совсем тупо: при помощи if-else получить одно из трех значений (скажем, 0, 1 и 2), а потом использовать его в switch для расчета smile.

Автор: borisbn 24.4.2012, 09:30
Цитата(ZXSpectrum @  24.4.2012,  06:12 Найти цитируемый пост)
Ну вот ее рабочее решение с помощью if else :

смотря на первое решение как-то не особо верится, что второе сделал ты сам...
Ну это так... лирика... В чём вопрос-то ? Есть второе решение. Оно красивое. Правильное. Работает. Что ещё нужно ?

Автор: bsa 24.4.2012, 10:50
ZXSpectrum
Код
int cond1 = (x < 10) ? 4 : 0;
int cond2 = (x > 10) ? 2 : 0;
int cond3 = (a == 0) ? 1 : 0;
int cond = cond1 + cond2 + cond3;
//cond:
//0x05 for x-10 < 0 and a == 0
//0x02 for x-10 > 0 and a != 0

Автор: borisbn 24.4.2012, 11:00
И ещё. Я бы перед делением в первом случае на (b-x), во втором - на sin(x) и в третьем - на 2*b, проверил бы, что этот знаменатель не равен нулю. Причём числа с плавающей точкой просто так сравнивать нехерошо. Так что потребуется функция типа такой
Код
bool isZero( double x, double eps = 1e-42 ) {
    return fabs( x ) < eps;
}

а дальше
Код

if (x-10<0 && a==0)
{
    F =  isZero( b-x ) : 0.0 ? (cos(x)+1)/(b-x);
}
else if (x-10>0 && a!=0)
{
    F = isZero( sin(x) ) ? 0.0 : (a*x*x-b*x+c)/(sin(x));
}
else
{
    F = isZero( 2*b ) ? 0.0 : (log(x+c))/(2*b);
}

Автор: ZXSpectrum 25.4.2012, 22:00
Всем Спасибо!! Попробую правильно реализовать ,предложенные вами варианты.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)