Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   C/С++ | Прошу помочь в написании кода... (http://forum.oszone.net/showthread.php?t=55864)

Sox 29-10-2005 21:06 368755

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 файла не создается, видно, что-то с компилятором,
Вроде все описал...

Savant 29-10-2005 21:52 368760

Sox
То, что сразу видно :
1) убери точки с запятой на концах строк : if (X<=0); и if (atan(X)<=0);
2) функция по-английски function

бррр... а как это вообще работает ? j = 0; while (j < 15) { printf ("X,|"); } вечный цикл однако

Sox 29-10-2005 22:06 368763

1)Убрал, 2)исправил...
Цитата:

j = 0; while (j < 15) { printf ("X,|"); }
Хм... по идее это задумывалось так, что начальный шаг =0, когда X=A, потом , пока таким образом не дойдем до 15 шага согласно условию, надо выводить Х и черту... думаешь, что-то здесь надо убрать?... может быть... :)
вроде как j=0 - это предварительное присваивание значения... может, каккую-нибудь проверку здесь надо вставить?
Или, может, j:=j+1 перенести выше к j=0 надо?( скорее всего)...

Savant 29-10-2005 22:27 368767

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(...) заменяем на это

Sox 29-10-2005 22:32 368768

Щас попробуем... на вид смотрится более солидно, чем у меня в начале было... :-)

Sox 29-10-2005 22:49 368769

хм... то есть только с простыми логарифмами? А с натуральными?
%01.2f - как-то помню, нам про такое рассказывали несклько недель назад, только я пива тогда много выпил, не помню что это значит... вроде f - число с плавающей точкой, 1- число цифр в целой части, .2 - в дробной...
и что такое getch()? А в принципе БОЛЬШОЕ СПАСИБО! :-)

Savant 29-10-2005 22:55 368770

Функции ln() в С нет, а роль натурального логарифма исполняет функция log(). А например log10() считает десятичный логарифм. Функция getch() (кстати она из conio.h , забыл сказать) прерывает выполнение программы, пока пользователь не нажмет какую-нибудь клавишу (удобно для просмотра результатов работы).

Sox 30-10-2005 00:08 368777

хм... а можно написать это так:
Код:

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;
}

То есть разбить проверку на несколько этапов?
Как бы вроде смысл от этого не меняется, вроде...

Savant 30-10-2005 12:31 368841

Цитата:

Как бы вроде смысл от этого не меняется, вроде...
Да как сказать... Зачем нужны второе и третье условия? Ведь для D(y) важно , чтоб произведение в логарифме было строго положительное число , а под корнем неотрицательное. А условие 4 у Вас, кстати, захватывает нолик (конечно, ежу понятно, что sin(5*0)=0 и функция y(x) все равно не определена, но лучше делать все по правилам). Далее смотрим на код и видим, что для обоих условий требуется выполнить один и тот же кусок код, значит, логичней было бы определить условия внутри только одного if-a.

Sox 30-10-2005 12:54 368850

Ясно, спасибо... :)
только вот еще один вопрос возник:
Цитата:

printf ("\n%01.2f | ", X);
"\n%01.2f | "- используется, как я понял, для вывода Y| ? Или просто для вывода "|"?

Sox 31-10-2005 22:34 369349

Код:

#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?

Savant 31-10-2005 23:49 369358

Да потому что Вы ЗАГЛАВНЫМИ буквами вызовы функций записали, а язык С чувствителен к регистру символов (в отличие от, например, языка паскаль).

И что Вы все время над кодом извращаетесь? Он у Вас опять нерабочий стал, абсолютно... И неправильный регистр не самая большая беда...

Sox 01-11-2005 11:44 369474

Неа, не поэтому. Почитайте в начале
Цитата:

(atan(X) * sin(5*X) <= 0)), undefined reference to `atan'
code1.c.text+0x127): undefined reference to `sin'

Тоже undefined reference. Большими буквами я написал в конце уже, после того как компилятор отверг эти термины, написанные маленькими буквами, которыми я пробовал писать до того...
И еще :
Цитата:

Код:

if (Y>YM)
{
        printf ("Y is too high, exiting");
}
}


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

ssdm 01-11-2005 20:47 369624

Для прерывания используй return ;

Sox 01-11-2005 21:36 369633

ssdm
Спасибо! ;)


Время: 13:50.

Время: 13:50.
© OSzone.net 2001-