2016-11-04 5 views
0

Я просто хочу знать, как я могу оптимизировать свой код на C. Моя программа отлично работает, я тестировал ее со множеством разных значений, все хорошо. Тем не менее, я хотел бы сократить количество строк и написать свою программу в лучшем качестве. Вот исходный код:Как оптимизировать мой C-код для решения квадратичных уравнений в R?

#include <stdio.h> 
#include <math.h> 

int main(void) { 
    float a,b,c,x,x1,x2; 
    printf("aX^2 + bX + c = 0\n"); 
    printf("Type the value of a: "); 
    scanf("%f", &a); 
    printf("Type the value of b: "); 
    scanf("%f", &b); 
    printf("Type the value of c: "); 
    scanf("%f", &c); 

    if (a!=0 && b!=0 && c!=0){ 
     float delta = b*b - 4*a*c; 
     if (delta>0){ 
      x1 = (-b-sqrt(delta))/(2*a); 
      x2 = (-b+sqrt(delta))/(2*a); 
      printf("Solutions are x1 = %f and x2 = %f\n",x1,x2); 
     } 
     else if (delta == 0){ 
      x = -b/(2*a); 
      printf("One unique solution is x = %f\n", x); 
     } 
     else { 
      printf("No solutions !\n"); 
     } 
    } 
    if (a==0 && b!=0 && c!=0) 
     printf("One unique solution x = %f\n", -c/b); 
    if (a==0 && b==0 && c!=0) 
     printf("No solutions !\n"); 
    if (a==0 && b==0 && c==0) 
     printf("Set of solutions is R\n"); 
    if (a!=0 && b==0 & c!=0) { 
     x = -c/a; 
     if(x>=0) 
      printf("Two soltions x = %f et -x = %f\n", sqrt(x),-sqrt(x)); 
     else{ 
      printf("No solutions !\n"); 
     } 
    } 
    if (a!=0 && b==0 && c==0) 
     printf("One unique x = 0\n"); 

} 
+3

Этот вопрос может быть лучше подходит для codereview.stackexchange.com. –

+0

@JimLewis Я не знал об этой ссылке, я положу ее туда. Спасибо друг. –

+0

Одна небольшая оптимизация: используйте 'else if' вместо всех raw' if's. Это позволит избежать ненужных сравнений после согласования одного условия if. –

ответ

0

Вы можете использовать этот пример, чтобы оптимизировать код:

#include <stdio.h> 
#include <math.h> 

int main() 
{ 
    double a, b, c, determinant, root1,root2, realPart, imaginaryPart; 

    printf("Enter coefficients a, b and c: "); 
    scanf("%lf %lf %lf",&a, &b, &c); 

    if(a==0 && b!=0 && c!=0){ 
    root1 = -c/b; 
    printf("linear equation root = -c/b = %.2lf", root1); 
    }else{ 

    determinant = b*b-4*a*c; 

    // condition for real and different roots 
    if (determinant > 0) 
    { 
    // sqrt() function returns square root 
     root1 = (-b+sqrt(determinant))/(2*a); 
     root2 = (-b-sqrt(determinant))/(2*a); 

     printf("root1 = %.2lf and root2 = %.2lf",root1 , root2); 
    } 

    //condition for real and equal roots 
    else if (determinant == 0) 
    { 
     root1 = root2 = -b/(2*a); 

     printf("root1 = root2 = %.2lf;", root1); 
    } 

    // if roots are not real 
    else 
    { 
     realPart = -b/(2*a); 
     imaginaryPart = sqrt(-determinant)/(2*a); 
     printf("root1 = %.2lf+%.2lfi and root2 = %.2f-%.2fi", realPart, imaginaryPart, realPart, imaginaryPart); 
    } 
} 
    return 0; 
} 
  • Если определитель больше 0, то корни вещественны и различны.
  • Если определитель равен 0, корни действительны и равны.
  • Если определитель меньше 0, корни сложны и различны.

Так,

Sample image

+0

Вы должны сказать, как ваш код отличается. – Carcigenicate

+0

@ Esdras Suy Я видел этот пример, я не хочу, как он. Он не проверяет значение каждого a, b и c. Если a = 0, тогда вся программа рухнет. –

+0

@ Esdras Suy Я сказал в R. Спасибо, хотя! –

1

Одна небольшая оптимизация: использовать else if вместо всех сырьевых if с. Это позволит избежать ненужных сравнений после того, как будет выполнено условие if.

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

+0

Как вы ожидаете ввода, который пользователь напишет, чтобы сначала разместить некоторые операторы if? –

+0

@AmineMarzouki Например, поскольку это квадратичный решатель уравнения, кажется маловероятным, что пользователь будет вводить 'a' в 0, поскольку этот случай сводится к линейному уравнению. Утверждения 'if' для этих случаев, вероятно, должны быть очень последними. –

+0

Да, я уже это сделал. –

1

Поскольку вы в основном строить государственную машину, давайте на самом деле сделать так:

int state = (a == 0) ? 0 : 1; 
state |= (b == 0) ? 0 : 2; 
state |= (c == 0) ? 0 : 4; 

switch(state) 
{ 
    case 0: // All co-efficents 0 Domain R print 
     break; 
    case 1: // Only a coefficient: 0 case 
     break; 
    case 2: // Only b coefficient 0 case. 
     break; 
    case 3: // a and b coefficient case - one root 0, other linear. 
     break; 
    case 4: // Only c case - no solutions 
     break; 
    case 5: // a and c case 
     break; 
    case 6: // b and c case (linear) 
     break; 
    case 7: // a,b,c all here - do full quadratic solve. 
     break; 
    default: 
     // This should never happen - assert and exit. 
     break; 
} 

Таким образом, все ваши дела четко определены. Каждый случай также мог бы вызвать функцию. Или, еще один шаг, массив указателей функций для каждого случая, полностью и правильно названный.

+0

Ваш код сэр, немного сложнее для меня. Я все еще новичок с C. Я не совсем понял синтаксис, но ваша идея блестящая! –

+0

В принципе, переменной 'state' присваивается значение от 0 до 7, в зависимости от того, сколько ваших коэффи- циентов равно 0 или не равно нулю (это то, что делают первые 3 строки). Затем оно принимает это значение и делает 1 прыгайте, чтобы добраться туда, куда ему нужно идти. Вы можете вставлять свои отпечатки при каждом комментарии, и это будет отлично работать. –

+0

Но почему вы пишете (a == 0)? 0: 1; в то время как b с 0 и 2 и c с 0 и 4?Я все равно не получаю –

1

1) Некоторые части расчетов повторяются. Разбейте вычисления на более мелкие куски, сохраните результаты в переменных и используйте их для создания необходимых результатов.

2) Вы можете полностью исключить специальную обработку корпуса a!=0 && b==0 & c!=0 (хотя вам нужно изменить некоторые другие тесты).

3) Некоторые операции (например, запрос и чтение) повторяются. Сделайте это в функции, которая принимает аргумент (например, строка для подсказки).

4) В первой строке, где вы печатаете «Нет решений», на самом деле существуют сложные или воображаемые решения. Второе место - другой тип решения.

5) Возможно, сломать некоторые из повторных вычислений (пункт 1) на отдельные функции.

6) Немного продвинутый: ваш код не будет хорошо работать с пользователем, который вводит мусор (нечисловой) ввод.

+0

1) В этом проблема, я не знал, могу ли я уменьшить случаи с ifs 2) любые предложения, как это сделать? 3) Хорошая точка, но на данный момент я их не буду использовать. 4) Если вы посмотрите в заголовке, я сказал, что R не C. Поэтому в этой программе не было бы сложных решений. 5) то же, что и 3) 6) Мне всегда было интересно об этом, можете ли вы привести пример простая программа, которая отклоняет нечисловой ввод? –

+0

Хорошо ... Я говорю вам, что это можно сделать. Это не сложно, но это твоя работа. Вы узнаете больше, разработав для себя, чем вы, если я просто переписал ваш код для вас. Просто продумайте математику. – Peter