Проблема с компилятором Turbo C, функция sqrt() не работает с переменными аргументами

Я искал вопрос, похожий на мою проблему Похожая проблема. Но моя проблема заключается в использовании компилятора Turbo C v3.0. Должен ли я выполнять дополнительную работу с файлом math.h? пожалуйста помоги.

int main (void){
    double result, a;
    clrscr();
    printf("Enter a # for square root.\n");
    scanf("%f",&a);
    printf("a = %f\n",a);
    result = sqrt(a);
    printf("a = %f  and square root is %f\n",a, result);
    getch();
    return 0;
    }

Вывод такой:

Введите # для квадратного корня.

64

a = 0.000000

a = 0,000000, а квадратный корень равен 0,000000


person AbdulAziz    schedule 29.01.2012    source источник


Ответы (3)


Для scanf(), %f для float. Вам нужно использовать %lf для double:

printf("Enter a # for square root.\n");
scanf("%lf",&a);

Это отличается от printf(), где продвижение типа позволяет использовать %f как для float, так и для double.

person Mysticial    schedule 29.01.2012
comment
Хорошо, когда я использовал тип данных float вместо double, как предложил @Emil Dumbazu, он отлично работает. Не могли бы вы объяснить, почему? Спасибо - person AbdulAziz; 29.01.2012
comment
Это работает на моей машине только с этим изменением. Можете ли вы уточнить, что не так сейчас? - person Mysticial; 29.01.2012
comment
Та же проблема. Я имею в виду, что это дало мне тот же результат раньше. Но когда я изменил тип данных, он работает нормально. - person AbdulAziz; 29.01.2012
comment
Странно, вы используете %lf, верно? Он отлично работает в MSVC. Хотя у меня нет Turbo C, чтобы попытаться воспроизвести вашу проблему. - person Mysticial; 29.01.2012
comment
В любом случае Большое спасибо за вашу помощь. - person AbdulAziz; 29.01.2012
comment
@Mysticial хорошо, я сделал это. Я действительно новичок в программировании, а также в stackoverflow :) - person AbdulAziz; 02.02.2012

Попробуй это :

   scanf("%lf",&a);

или измените переменную a на float:

 float a;
person Emil Dumbazu    schedule 29.01.2012
comment
Спасибо за подсказку, первый вариант не сработал, но я использовал второй float a, он отлично работает - person AbdulAziz; 29.01.2012

В дополнение к использованию "%lf" в качестве формата scanf вам необходимо иметь

#include <stdio.h>
#include <math.h>
#include <conio.h> /* I think */

Последний предназначен для вызовов clrscr() и getch(); они нестандартны, но я думаю, что они объявлены в <conio.h>.

Без #include <math.h> компилятор будет считать, что sqrt() возвращает результат int, а не double.

(В сторону: почему вы вызываете clrscr()? В чем преимущество очистки экрана перед выполнением чего-либо еще? Вызов getch() также не является строго необходимым, но в некоторых системах метод запуска программы по умолчанию приводит к закрытию окна. как только он закончится)

person Keith Thompson    schedule 29.01.2012
comment
Спасибо за ваше объяснение. Да, вы правы, я включил все, что вы упомянули. Я также включаю math.h, но результат тот же. Обычно я использую clrscr() для запуска или вывода на чистый экран. Есть ли недостатки у clrscr()? Для getch() программа закрывается сразу после завершения, поэтому я использую getch(). - person AbdulAziz; 29.01.2012
comment
@AbdulAziz: Плохая форма. Можете ли вы представить, если бы каждый раз, когда вы запускали, скажем, dir, copy, move или ren, система сначала очищала экран? Кроме того, если программа закрывается, как только она завершается, вы имеете в виду, что окно закрывается, как только она завершается, а затем запускайте ее через окно командной строки вместо двойного щелчка на каком-либо .exe файл. - person jamesdlin; 29.01.2012
comment
@Keith Спасибо за ваше руководство, но я использую Turbo C v3.0. Поэтому мне нужно получить доступ с помощью команды «RUN». - person AbdulAziz; 31.01.2012
comment
@AbdulAziz: вы должны иметь возможность запускать программу из командной строки, но это, по общему признанию, менее удобно. - person Keith Thompson; 31.01.2012
comment
@ Кейт Томпсон, не могли бы вы указать мне, как выполнить программу в командной строке, или дать мне какую-либо ссылку, объясняющую это. - person AbdulAziz; 31.01.2012
comment
@AbdulAziz: это зависит от того, где TurboC размещает исполняемые файлы. Возможно, кто-то другой ответит лучше, чем я. Какая версия Windows у вас установлена? - person Keith Thompson; 31.01.2012
comment
@KeithThompson я использую Windows 7 - person AbdulAziz; 01.02.2012
comment
@AbdulAziz: нажмите клавишу Windows, затем нажмите «Командная строка» в верхней части меню «Пуск». cd в каталог, где TurboC поместил ваш исполняемый файл (я не знаю, где это может быть). Введите имя исполняемого файла, чтобы запустить его. - person Keith Thompson; 01.02.2012