Member 12985896 Ответов: 2

Заставьте этот код работать с помощью этих точных уравнений


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

void main(void)
{
	printf("Name and Date: Matthew Adair, January 20, 2017 \n");
	printf("Course and Section: ENGR 19700 and Class #24743 \n");
	printf("Problem: Adair_temp5_M.c C Programming Homework 5 \n");
	printf("Statement: Program is to print information with \n");

	double TF_, TK_, TR_;


	printf("What is the temperature in Farenheit? \n");
	scanf("%Lf", &TF_);
	TF_ = TR_ - 459.67;
	TR_ = (9 / 5)*TK_;
	printf("The Kelvin equivalent to the given temperature in Farenheit is %Lf \n", TK_);


	

}


Что я уже пробовал:

Я чувствую, что это должно сработать, но я продолжаю получать ошибку проверки времени выполнения #3-T

NotPolitcallyCorrect

Я не понимаю, как вы думаете, что это сработает. Вы используете неинициализированные переменные, считываете значение от пользователя, а затем перезаписываете его вычислением с неинициализированной переменной, выполняете другое вычисление с использованием неинициализированной переменной и, наконец, печатаете значение неинициализированной переменной, которую вы даже не вычисляли. Умение пользоваться отладчиком также является ценным навыком, который вам часто понадобится.

Member 12985896

В классе мы не используем отладчик, но в любом случае разве переменные не инициализируются, когда я использую "double TF_, TK_, TR_;", так же, как если бы я использовал "int"? Программа работает, если я переверну уравнения типа "TF_ = TR_ - 459.67; "будет" TR_ = TF_ + 459.67;".

NotPolitcallyCorrect

"мы не используем отладчик", значит, ваш учитель не выполняет свою работу.
"переменные инициализируются, когда я использую "double", а не в C/C++ . Вы должны инициализировать их.

Member 12985896

Под инициализацией переменной вы подразумеваете присвоение ей значения? Например, с помощью "двойной TF_ = 81.3;" вместо "двойной TF_;" и потом делать "scan_s("%ЛФ", &ампер;TF_);"? Я ценю вашу помощь, но не совсем понимаю, что вы имеете в виду. Мой профессор не самый лучший, и программирование определенно не является моей сильной стороной на данный момент.

NotPolitcallyCorrect

"имею в виду придание ему значения", частично. Когда вы объявляете переменную, она имеет значение, но это может быть что угодно, и вы не будете знать, что это такое. Смысл инициализации заключается в том, чтобы дать вашей переменной a известный ценность.

Philippe Mori

Ну, проблема в том, что вы сбиты с толку тем, как C++ интерпретирует "уравнение". В C++ вы должны поместить слева переменную, которая получает результат, а справа само уравнение. Так вы бы и сделали TR_ = TF_ + 459.67; например.

2 Ответов

Рейтинг:
14

Jon McKee

* Обновлено после прочтения комментария*

double TF_, TK_, TR_;
printf("What is the temperature in Farenheit? \n");
scanf("%Lf", &TF_); //Read TF
TF_ = TR_ - 459.67; //Overwrite TF?
TR_ = (9 / 5)*TK_;
printf("The Kelvin equivalent to the given temperature in Farenheit is %Lf \n", TK_);

В вашем коде вы читаете температуру в градусах Фаренгейта. перезапись что с TR_ - 459.67. Зачем вообще вводить TF в первую очередь? Кроме того, эти уравнения все еще неверны для того, что происходит в ваших операторах printf. Фаренгейт для Рэнкина-это R = F + 459.67 а Рэнкин для Кельвина-это K = R * (5/9) Ваши уравнения пытаются перейти от Рэнкина к Фаренгейту, а затем от Кельвина к Рэнкину. Это фиксированный код:
double TF_, TK_, TR_;
printf("What is the temperature in Farenheit? \n");
scanf("%Lf", &TF_);
TR_ = TF_ + 459.67;
TK_ = (5/9) * TR_;
printf("The Kelvin equivalent to the given temperature in Farenheit is %Lf \n", TK_);

Я бы также рекомендовал использовать полезные имена переменных.
double fahrenheit, kelvin, rankine;
printf("What is the temperature in Farenheit? \n");
scanf("%Lf", &fahrenheit);
rankine = fahrenheit + 459.67;
kelvin = (5/9) * rankine;
printf("The Kelvin equivalent to the given temperature in Farenheit is %Lf \n", kelvin);

быстрое Примечание: double variableName; это объявление переменной. Теперь у вас есть память, связанная с переменной. В этой памяти сейчас может храниться все, что угодно. Это может быть 0; это может быть случайный мусор. Вам нужно назначить (инициализировать) его перед использованием. Пример: variableName = 0; или более компактно double variableName = 0;.

Причина, по которой он часто работает в любом случае, заключается в том, что многие ядра операционной системы в качестве функции безопасности не выдают неинициализированную память. Кроме того, многие языковые спецификации имеют значения по умолчанию (хотя то, соблюдает ли это компилятор, может варьироваться). Все это может измениться и находится вне вашего контроля. Вы не должны полагаться на него, особенно когда в этом случае так легко избежать полунетерминированных эффектов. Просто = 0;.


Member 12985896

Извините, что я был не совсем ясен, и я думаю, что ваш ответ имеет большой смысл, но мой профессор хотел, чтобы я использовал эти уравнения. Уравнения: 1) TF = TR - 459,67 для преобразования Фаренгейта в Рэнкин и 2)TR = (9/5) TK для преобразования Рэнкина в Кельвин. Я согласен, что было бы проще сделать это по-своему, используя только одно уравнение, но именно так хочет мой профессор (иногда он может быть довольно неразумным).

Есть ли способ, которым я могу использовать эти точные уравнения с градусами Фаренгейта, Кельвина и Рэнкина аналогично тому, как я это сделал? Я думаю, что причина, по которой он не работает, похожая на то, как вы его ставите, заключается в том, что у меня есть уравнения в формате, где уже инициализированный TF_ = TR_ - 459.67, когда он должен быть TR_ = TF_ + 459.67, верно?

Вот точные слова моего профессора: "не вводите новых уравнений или других уравнений. Уравнения должны отображаться в таком виде в программе хотя бы один раз."

PS: под "TF_" я подразумеваю температуру в градусах Фаренгейта, которую я мог бы просто поставить как TF, но мой профессор хочет, чтобы по крайней мере три символа на переменную.

Jon McKee

Обновленный =)

Member 12985896

Д: Что это должно означать?

Jon McKee

Что? "Обновлено + смайлик"? Я просто отвечал, чтобы сказать, что обновил свой ответ после прочтения вашего комментария. Новый код выше должен работать в соответствии с вашими требованиями.

Рейтинг:
12

Patrice T

Цитата:
но в любом случае разве переменные не инициализируются, когда я использую "double TF_, TK_, TR_;", так же, как если бы я использовал "int"?

int и float используются для выделения памяти, и ничего больше.
Инициализация переменной означает присвоение ей значения.
Цитата:
В классе мы не используем отладчик,
Серьезный провал со стороны вашего учителя.
-----
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Он позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Member 12985896

Спасибо за помощь, но я бы не стал делать то, что сделал, в конечном итоге инициализируя переменную "TF_", как только scan_s пройдет, потому что тогда я буду вводить переменную. Если нет, не могли бы вы привести мне пример того, как заставить его работать?

Member 12985896

Вот пример кода, который я сделал, на самом деле ничего не инициализируя.

#include < stdio.h>
#include < math. h>
#определение ПИ 3.1416

void main (пустота)
{
двойной T_period;
инт Adair_mass, К11, к22;

printf ("введите массу в кг:\n");
scanf_s("%д", &ампер;Adair_mass);
printf ("введите значение жесткости для первой пружины:\n");
scanf_s ("%d", & k11);
printf ("введите значение жесткости для второй пружины:\n");
scanf_s ("%d", & k22);

T_period = (double)2*PI*(sqrt ((Adair_mass) / (k11 + k22)));

printf ("период движения (T) для введенных значений = %6.2 Lf\n", T_period);
printf ("период в научной нотации равен: %6.3 e\n", T_period);
}

Он работал совершенно нормально, и хотя я действительно использовал int, я мог бы сделать это с double, я думаю.

Patrice T

Изучайте отладчик самостоятельно и учитесь на собственных ошибках, это лучший способ учиться (самый эффективный).