Показать полную графическую версию : C/С++ | Прошу помочь в написании кода...
У меня получилось вот такое:
#include <stdio.h>
#include <math.h>
int main()
{
double A, YM, H, C, X, D, Y;
int j;/*j - это шаг функции, ведь может бытьот 0 до 15 значений функции вообще*/
/*A- ввод */
printf ("A=");
scanf ("%lf", &A);
/*H - ввод */
printf ("H=");
scanf ("%lf", &H);
/*C - ввод */
printf ("C=");
scanf ("%lf", &C);
/*YM - ввод */
printf ("YM=");
scanf ("%lf", &YM);
/* показать - "argument | funktsion" */
printf ("argument | funktsion");
/* показать - горизонтальную черту*/
printf ("___________________");
/* Operation X = A */
X=A;
/* Operation D = H */
D=H;
/* Operation j = 0*/
j=0;
while (j<15)
{
/* показать - X, " | " */
printf ("X,|");
}
if(j<=15)
{
/* Operation X = X + D */
X=X+D;
/* Operation D = D * C */
D=D*C;
/* Operation j = j + 1 */
j=j+1;
if (X<=0);
{
printf ("Y=undefined");
}
if (atan(X)<=0);
{
printf ("Y=undefined");
}
for( j=0; j<=15)
if(Y > YM) break;
/* Y =ln(atan x*sin 5x) + SQRT(3x*x*x)*/
printf ("Y=ln(atan(X)*sin(5*X) + sqrt(3*X*X*X )\n");
}
};
Задание такое:
дается A - начальное значение аргумента X
YM - максимальное значение функции Y
H – шаг функции
С - коэффициент
Х вычисляется по формуле A, A + H, A + H + C*H, ....
функция дана для вычисления Y
тобишь вычисляется для каждого шага X а потом для него Y
и выводятся значения покуда Y не превысит YM, но всего не больше, чем 15 значений функции.
Сама функция: ___
y = ln( atan x sin 5x) + Ö3x3
Вертикальная черта отделяет x от y, горизонтальная черта отделяет их от самих значений.
Выполняется в консоли.
Вроде бы не сложно, но я всеж начинающий... :-) поэтому хотелось бы узнать, правильно ли программа составлена.... пытался компилировать... компилится, вроде ошибок нет так как исправлял, но .exe файла не создается, видно, что-то с компилятором,
Вроде все описал...
Sox
То, что сразу видно :
1) убери точки с запятой на концах строк : if (X<=0); и if (atan(X)<=0);
2) функция по-английски function
бррр... а как это вообще работает ? j = 0; while (j < 15) { printf ("X,|"); } вечный цикл однако
1)Убрал, 2)исправил...
j = 0; while (j < 15) { printf ("X,|"); } Хм... по идее это задумывалось так, что начальный шаг =0, когда X=A, потом , пока таким образом не дойдем до 15 шага согласно условию, надо выводить Х и черту... думаешь, что-то здесь надо убрать?... может быть... :)
вроде как j=0 - это предварительное присваивание значения... может, каккую-нибудь проверку здесь надо вставить?
Или, может, j:=j+1 перенести выше к j=0 надо?( скорее всего)...
3) ln(x) = log(x)
4) for( j=0; j<=15) <- красиво написал, если б точку с запятой не забыл был бы еще один бесконечный цикл
Пробуем так:
while (j < 15)
{
/* показать - X, " | " */
printf ("\n%01.2f | ", X);
/* Operation X = X + D */
X = X + D;
/* Operation D = D * C */
D = D * C;
/* Operation j = j + 1 */
j ++;
if ((X < 0) || (atan(X) * sin(5*X) <= 0))
{
printf ("Y undefined");
continue;
}
Y = log(atan(X)*sin(5*X)) + sqrt(3*X*X*X);
if (Y > YM)
{
printf("Y too high , exiting ;-)");
break;
}
printf ("Y = %01.2f", Y);
}
getch();
ну т.е. все, что ниже while(...) заменяем на это
Щас попробуем... на вид смотрится более солидно, чем у меня в начале было... :-)
хм... то есть только с простыми логарифмами? А с натуральными?
%01.2f - как-то помню, нам про такое рассказывали несклько недель назад, только я пива тогда много выпил, не помню что это значит... вроде f - число с плавающей точкой, 1- число цифр в целой части, .2 - в дробной...
и что такое getch()? А в принципе БОЛЬШОЕ СПАСИБО! :-)
Функции ln() в С нет, а роль натурального логарифма исполняет функция log(). А например log10() считает десятичный логарифм. Функция getch() (кстати она из conio.h , забыл сказать) прерывает выполнение программы, пока пользователь не нажмет какую-нибудь клавишу (удобно для просмотра результатов работы).
хм... а можно написать это так:
if (atan(X) * sin(5*X) <= 0)
{
printf ("Y undefined");
continue;
}
if (atan(X)<=0)
{
printf ("Y=undefined");
continue;
}
if (sin(5*X)<=0)
{
printf ("Y=undefined");
continue;
}
if (X<=0);
{
printf("Y=undefined");
continue;
}
То есть разбить проверку на несколько этапов?
Как бы вроде смысл от этого не меняется, вроде...
Как бы вроде смысл от этого не меняется, вроде...Да как сказать... Зачем нужны второе и третье условия? Ведь для D(y) важно , чтоб произведение в логарифме было строго положительное число , а под корнем неотрицательное. А условие 4 у Вас, кстати, захватывает нолик (конечно, ежу понятно, что sin(5*0)=0 и функция y(x) все равно не определена, но лучше делать все по правилам). Далее смотрим на код и видим, что для обоих условий требуется выполнить один и тот же кусок код, значит, логичней было бы определить условия внутри только одного if-a.
Ясно, спасибо... :)
только вот еще один вопрос возник: printf ("\n%01.2f | ", X);"\n%01.2f | "- используется, как я понял, для вывода Y| ? Или просто для вывода "|"?
#include <stdio.h>
#include <math.h>
int main()
{
double A, YM, H, C, X, D, Y;
int j;
/* sisestada -A */
printf ("A=");
scanf ("%lf", &A);
/*H - sisestamine */
printf ("H=");
scanf ("%lf", &H);
/*C - sisestamine */
printf ("C=");
scanf ("%lf", &C);
/* valjastada - horisontalnejoon */
printf ("___________________");
/* Operation X = A */
X=A;
/* Operation D = H */
D=H;
/* Operation j = 0 */
j=0;
while (j<15)
{
/* valjastada - X, " | " */
printf ("\n%01.2f | ", X);
/* Operation X = X + D */
X=X+D;
/* Operation D = D * C */
D=D*C;
/* Operation j = j + 1 */
j=j+1;
if ((X < 0) || (atan(X) * sin(5*X) <= 0))
{
printf ("Y undefined");
continue;
}
else
{
printf ("\n%01.2f | ",LOG(ATAN(X)*SIN(5*X)) + SQRT(3*X*X*X));
}
if (Y>YM)
{
printf ("Y is too high, exiting");
}
}
};
Компилятор выдает:
undefined reference to `atan'
code1.c:(.text+0x127): undefined reference to `sin'
code1.c:(.text+0x165): undefined reference to `ATAN'
code1.c:(.text+0x184): undefined reference to `SIN'
code1.c:(.text+0x190): undefined reference to `LOG'
code1.c:(.text+0x1b2): undefined reference to `SQRT'
collect2: ld returned 1 exit status
Вопрос: Почему, если все было задекларировано в math.h?
Да потому что Вы ЗАГЛАВНЫМИ буквами вызовы функций записали, а язык С чувствителен к регистру символов (в отличие от, например, языка паскаль).
И что Вы все время над кодом извращаетесь? Он у Вас опять нерабочий стал, абсолютно... И неправильный регистр не самая большая беда...
Неа, не поэтому. Почитайте в начале(atan(X) * sin(5*X) <= 0)), undefined reference to `atan'
code1.chttp://www.forum.oszone.net/images/smilies/sad.gif.text+0x127): undefined reference to `sin'
Тоже undefined reference. Большими буквами я написал в конце уже, после того как компилятор отверг эти термины, написанные маленькими буквами, которыми я пробовал писать до того...
И еще :
if (Y>YM)
{
printf ("Y is too high, exiting");
}
}
Как вызвать в этом месте прерывание работы программы без использования функции brake; ?
Код, кстати, абсолютно рабочий, компилятор находит только вот эти ошибки. Причем в независимости от регистра, что в большом, что в маленьком... ;) больше ошибок не находит...
Для прерывания используй return ;
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.