Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Си

Автор: 18192123 15.02.2007 1:35

[attachmentid=5194]вот задание:
составить прогарамму для вычисления в точках xi=a+i*h, i=0,1,2…,n, h=(b-a)/n промежутка [a,b] наибольшего и среднего значений функции y=f(x), x[–2; –1], n = 10


#include <stdio.h>
#include <MATH.H>
void main ()
{
double n=10, a=-2, b=-1, h, s, max, x_i, y_i, sredn, x_0, i;
x_0 = a + i*h;
max = pow ( log(1-x_0)/ log( 2), 1/3) + tan (1 + 1/x_0)/( sqrt ( fabs(x_0)) -2);
s=max;
for ( i=1; i<=10; i++)
{
x_i=a + i*h;
y_i= pow ( log(1-x_0)/ log( 2), 1/3) + tan (1 + 1/x_0)/( sqrt ( fabs(x_0)) -2);
if (y_i>max)
{
max = y_i;
}
s = s+y_i;
}
sredn = s/(n+1);
printf ("¬ ЄбЁ¬ «м­®Ґ §­ зҐ­ЁҐ = %10f\n", max, "б।­ҐҐ §­ зҐ­ЁҐ = %10f\n", sredn);
}





проблема в том, что выдаёт ошибку 9

fatal..\include\stdio.h 9:unable to create output file 'c:\borland\bin\lab_11.obj'
я думаю, причина в заполнение directories, прикрипляю изображение (вверху)

Автор: volvo 15.02.2007 1:41

Вообще-то обычно Output Directory и Source Directories оставляют пустыми, чтобы компиляция производилась в текущую папку...

Автор: мисс_граффити 15.02.2007 1:46

Убери doc-файл
Правила запрещают... лучше jpeg

Автор: 18192123 15.02.2007 1:48

Цитата(volvo @ 14.02.2007 21:41) *

Вообще-то обычно Output Directory и Source Directories оставляют пустыми, чтобы компиляция производилась в текущую папку...

спасибо, буду знать.
так и сделала, но теперь выдаёт сообщение....(см. прикреплённый документ)
[attachmentid=5195]

Автор: volvo 15.02.2007 1:52

Во-первых, это не ошибка, а предупреждение - ты не использовала в программе значения x_i и b, хотя и присвоила им значения (компилятор просто удивляется, зачем присваивать, если потом не использовать?) А во-вторых, на вопросы с DOC файлами больше ответов не будет, эти посты будут просто удаляться...

Автор: 18192123 15.02.2007 1:56

Цитата(volvo @ 14.02.2007 21:52) *

Во-первых, это не ошибка, а предупреждение - ты не использовала в программе значения x_i и b, хотя и присвоила им значения (компилятор просто удивляется, зачем присваивать, если потом не использовать?) А во-вторых, на вопросы с DOC файлами больше ответов не будет, эти посты будут просто удаляться...

прошу прощения.
больше не повториться.

но тогда почему не выводится никаких результатов?

Добавлено через 15 мин.
Цитата(18192123 @ 14.02.2007 21:56) *

прошу прощения.
больше не повториться.

но тогда почему не выводится никаких результатов?

подредактировала программу:


#include <stdio.h>
#include <MATH.H>
void main ()
{
double n=10, a=-2, b=-1, h, s, max, x_i, y_i, sredn, x_0, i;
h = (b-a)/n;
x_0 = a + i*h;
max = pow ( log(1-x_0)/ log( 2), 1/3) + tan (1 + 1/x_0)/( sqrt ( fabs(x_0)) -2);
s=max;
for ( i=1; i<=10; i++)
{
x_i=a + i*h;
y_i= pow ( log(1-x_i)/ log( 2), 1/3) + tan (1 + 1/x_i)/( sqrt ( fabs(x_i)) -2);
if (y_i>max)
{
max = y_i;
}
s = s+y_i;
}
sredn = s/(n+1);
printf ("¬ ЄбЁ¬ «м­®Ґ §­ зҐ­ЁҐ = %10f\n", max, "б।­ҐҐ §­ зҐ­ЁҐ = %10f\n", sredn);
}




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

Автор: 18192123 15.02.2007 2:41

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


#include <stdio.h>
#include <MATH.H>
void main ()
{
double n=10, a=-2, b=-1, h, s, max, x_i, y_i, sredn, x_0, i;
h = (b-a)/n;
x_0 = a + i*h;
max = pow ( log(1-x_0)/ log( 2), 1/3) + tan (1 + 1/x_0)/( sqrt ( fabs(x_0)) -2);
s=max;
for ( i=1; i<=10; i++)
{
x_i=a + i*h;
y_i= pow ( log(1-x_i)/ log( 2), 1/3) + tan (1 + 1/x_i)/( sqrt ( fabs(x_i)) -2);
if (y_i>max)
{
max = y_i;
}
s = s+y_i;
}
{sredn = s/(n+1); printf ("c।­ҐҐ §­ зҐ­ЁҐ = %f\n", sredn);
}
printf ("¬ ЄбЁ¬ «м­®Ґ §­ зҐ­ЁҐ = %f\n", max, "c।­ҐҐ §­ зҐ­ЁҐ = %f\n", sredn);
}



Автор: volvo 15.02.2007 2:58

x_0 = a + i*h;
В этой строке, по-твоему, чему равно i ?

Автор: мисс_граффити 15.02.2007 3:14

а ради чего переменная i делается double, еще и глобальной (в рамках функции main)?
она же нужна только в рамках цикла как счетчик?
другие переменные - тоже посмотри внимательно...

и еще - отступы. намного легче будет читаться код с ними...

Автор: 18192123 17.02.2007 3:36

вот мой окончательный вариант....но вот только когда пытаюсь вывести значение ф-ции в кадой точке хi-тое, получается одно и тоже....


#include <stdio.h>
#include <MATH.H>
void main ()
{
int n=10, a=-2, b=-1, i;
double h, s, max, x_i, y_i, sredn, x_0;
h = (b-a)/n;
s = 0;
x_0 = a ;
max = pow ( log(1-x_0)/ log( 2), 1/3) + tan (1 + 1/x_0)/( sqrt ( fabs(x_0)) -2);
printf (" при х_0 = %f", x_0);
printf (" значение ф-ции = %f\n", max);
s=max;
for ( i=1; i<=10; i++)
{
x_i=a + i*h;
y_i= pow ( log(1-x_i)/ log( 2), 1/3) + tan (1 + 1/x_i)/( sqrt (fabs(x_i)) -2);
printf (" при х_i = %f", x_i);
printf (" значение ф-ции = %f\n", y_i);
if (y_i>max)

max = y_i;

s = s+y_i;
}
sredn = s/(n+1); printf ("среднее значение = %f\n", sredn);

printf ("максимальное значение = %f\n", max);
}



Автор: volvo 17.02.2007 3:49

С++ это тебе не Паскаль smile.gif

h = (b-a)/n;
вычисляется как 0, потому как компилятор берет только целую часть результата (один из операндов - n - целое число)... Чтобы заставить программу вычислять h как положено - делаем так:
h = (double)(b-a) / n;

Теперь сначала результат (b - a) приведется к типу double, а потом (при делении) компилятор не будет брать только целую часть, т.к. было ЯВНОЕ приведение типа, а раз так - значит, программист это сделал сознательно, и именно это он хочет получить.

Автор: 18192123 17.02.2007 4:15

Цитата(volvo @ 16.02.2007 23:49) *

С++ это тебе не Паскаль smile.gif

h = (b-a)/n;
вычисляется как 0, потому как компилятор берет только целую часть результата (один из операндов - n - целое число)... Чтобы заставить программу вычислять h как положено - делаем так:
h = (double)(b-a) / n;

Теперь сначала результат (b - a) приведется к типу double, а потом (при делении) компилятор не будет брать только целую часть, т.к. было ЯВНОЕ приведение типа, а раз так - значит, программист это сделал сознательно, и именно это он хочет получить.

спасибо большое! теперь всё ясно!