Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

4 задачи!

9.9K
12 марта 2006 года
MoM
46 / / 12.03.2006
Помогите, пожалуйста, решить задачи:

1. Определить, является ли натуральное число N степенью двойки. Задачу надо решить с помощью цикла For.
2. Дано натуральное число N. Вычислить: 1/sin1 + 1/(sin1+sin2) + ... + 1/(sin1+...+sinN). Решить надо также с помощью цикла For.
3. Вычислить с применением while ... do: y:=sqrt(a*x*sqrt(x)+exp(-a*sqr(cos(x)))), 0,25<=x<=0,8, a=1,75, дельта х=-0,05.
4. Вычислить с применением repeat ... until: b=1+(xlna)/1! + ((xlna)^2)/2! + ... + ((xlna)^n)/n!=a^x. Исходные данные: епсилон=0,01, х=3.0, альфа=2,5. Ответ: 15,62.
Страницы:
242
12 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by MoM
Помогите, пожалуйста, решить задачи:

2. Дано натуральное число N. Вычислить: 1/sin1 + 1/(sin1+sin2) + ... + 1/(sin1+...+sinN). Решить надо также с помощью цикла For.



//language C

Код:
#include <stdio.h>
#include <math.h>
int main(void)
{
  float total, sum_sin;
  total = 0.0;
  sum_sin = 0.0;
  for(int i = 1; i <= N; i= i+1)
  {
    sum_sin = sum_sin + sin(i);
    total = total + 1/sum_sin;
  }

  //it is printing of total
   printf("%f\n",total);
return 0;
}
583
13 марта 2006 года
#define
150 / / 03.12.2002
Цитата:
Originally posted by MoM
1. Определить, является ли натуральное число N степенью двойки. Задачу надо решить с помощью цикла For.


На PHP (я думаю транслировать в любой другой язык не сложно):

Код:
$num = 2048;

$res = 0;

// если число нечетное
if (($num % 2) != 0) $res = 0;
else for ($i = $num; $i >= 2; $i /= 2) {
  if($i == 2) {
    $res = 1;
    break;
  }  
}

echo ($res) ? 'Явл. стенью 2ки' : 'НЕ явл. степенью 2ки';
7.9K
13 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by #define
На PHP (я думаю транслировать в любой другой язык не сложно):
Код:
$num = 2048;

$res = 0;

// если число нечетное
if (($num % 2) != 0) $res = 0;
else for ($i = $num; $i >= 2; $i /= 2) {
  if($i == 2) {
    $res = 1;
    break;
  }  
}

echo ($res) ? 'Явл. стенью 2ки' : 'НЕ явл. степенью 2ки';

imho прога на $num = 5, скажет что 'Явл. стенью 2ки'.

929
13 марта 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by uki_
imho прога на $num = 5, скажет что 'Явл. стенью 2ки'.


Очень не уверен в этом - первый if сразу же сделает $res=0 и прога перейдет на вывод.

7.9K
13 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by sp999
Очень не уверен в этом - первый if сразу же сделает $res=0 и прога перейдет на вывод.

Мда, чтоб проще было понять суть ошибки, хотел привести минимальное число на которой программа дает сбой. Это из-за первого if не 5, а 10.

929
13 марта 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by uki_
Мда, чтоб проще было понять суть ошибки, хотел привести минимальное число на которой программа дает сбой. Это из-за первого if не 5, а 10.


С этим согласен - в программе жук.
Надо проверку на нечетность засунуть в цикл.

7.9K
13 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by sp999
С этим согласен - в программе жук.
Надо проверку на нечетность засунуть в цикл.

$res нужно инициализировать 1-ей.

Код:
$num = 2048;

$res = 1;

// если число нечетное
for ($i = $num; $i > 0; $i /= 2)
{
  if(($i%2)==1)
  {
    $res = 0;
    break;
  }  
}

echo ($res) ? 'Явл. стенью 2ки' : 'НЕ явл. степенью 2ки';
583
13 марта 2006 года
#define
150 / / 03.12.2002
Ага, не продумал такую ситуацию. uki_ глазастый :)
Это все хорошо, только автор поста что-то не объявляется, может ему и не надо уже.. ну а кто осмелится решить 3 и 4? У меня с математикой очень туго :)
7.9K
13 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by #define
...ну а кто осмелится решить 3 и 4? У меня с математикой очень туго :)

imho самая сложная (1-я), и самая самая простая (2-я):) решена. А 3 и 4 решается как 2-я, только в цикле while нужно смотреть, чтоб очередное члагаемое по абс.значению был больше epsilon. Иначе выход из цикла.

9.9K
13 марта 2006 года
MoM
46 / / 12.03.2006
Спасибо за помощь! Правда мне надо было на Паскале, ну ладно, попробую разобраться!

А что с 3 и 4 задачами?
242
13 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by MoM
Спасибо за помощь! Правда мне надо было на Паскале, ну ладно, попробую разобраться!

А что с 3 и 4 задачами?



А 3 и 4 задачи реши по примеру второй, будут проблемы с переводом пиши постараюсь помочь. А Паскаль я не учила, у нас с С начинают.

9.9K
13 марта 2006 года
MoM
46 / / 12.03.2006
Млин, не доходит как первую задачу перевести на язык Turbo Pascal!:(
242
13 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by MoM
Млин, не доходит как первую задачу перевести на язык Turbo Pascal!:(


А что не доходит?
//1 - объявление переменных типа флоат
float total, sum_sin;
На Паскале ~ : var total, sum_sin : real
//2- инициализация переменных нулями
total = 0.0;
sum_sin = 0.0;
На Паскале ~ :
total := 0.0
sum_sin := 0.0
//3 - вычесление результата :
for(int i = 1; i <= N; i= i+1)
{
sum_sin = sum_sin + sin(i);
total = total + 1/sum_sin;
}
На Паскале ~ :
for i:=1 to N do
begin
sum_sin := sum_sin + sin(i)
total := total + 1/sum_sin
end


sin() - это стандартная библиотека вычесляющая синус

583
14 марта 2006 года
#define
150 / / 03.12.2002
Вроде он про 1ую задачу спрашивал :) Или про 1ое предложенное решение?...
В любом случае, я считаю, что транслировать построчно не стоит, достаточно посмотреть - понять логику решения и воспроизвести эту логику на паскале.
7.9K
14 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by #define
Вроде он про 1ую задачу спрашивал :)

imho у OlgaKr к первой задаче просто душа не лежит. Но а вторая, то своя, родная. :)

252
14 марта 2006 года
koderAlex
1.4K / / 07.09.2005
Цитата:
Originally posted by MoM
Спасибо за помощь! Правда мне надо было на Паскале, ну ладно, попробую разобраться!

А что с 3 и 4 задачами?



А 3 задачу трудно решить :)
там у тебя функция задана , а решить надо ,по условию, уравнение .

9.9K
14 марта 2006 года
MoM
46 / / 12.03.2006
Цитата:
Originally posted by OlgaKr А что не доходит?
//1 - объявление переменных типа флоат
float total, sum_sin;
На Паскале ~ : var total, sum_sin : real
//2- инициализация переменных нулями
total = 0.0;
sum_sin = 0.0;
На Паскале ~ :
total := 0.0
sum_sin := 0.0
//3 - вычесление результата :
for(int i = 1; i <= N; i= i+1)
{
sum_sin = sum_sin + sin(i);
total = total + 1/sum_sin;
}
На Паскале ~ :
for i:=1 to N do
begin
sum_sin := sum_sin + sin(i)
total := total + 1/sum_sin
end


Спасибо за разъяснения, но я спрашивал про первую задачу, а с этой задачей я разобрался!:)

Цитата:
Originally posted by koderAlex
А 3 задачу трудно решить :)
там у тебя функция задана , а решить надо ,по условию, уравнение .


А это значит я не правильно написал, у этой задачи вообще условия не было! Просто дана ф-ция, которую надо вычислить!

7.9K
14 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by MoM
Спасибо за разъяснения, но я спрашивал про первую задачу, а с этой задачей я разобрался!:)

Код:
function is2pow(num: Integer): Boolean;
var
  i: Integer;
  res: Boolean;
begin
  res := true;
  for i := 1 to 32 do begin
    if num mod 2 = 1 then begin
      res := false;
      Break;
    end;
    num := num shr 1;
    if num = 1 then break;
  end;
  result := res;
end;
583
14 марта 2006 года
#define
150 / / 03.12.2002
uki_, ну ты загнул. Во-первых, shr - это не тот уровень задач :) Круто конечно, оптимизация, однако я думаю этим ты только запутаешь автора поста.
Во-вторых, написано, что "Задачу надо решить с помощью цикла For", в твоем коде он конечно есть, только мне кажется что про твой алгоритм нельзя сказать "задача решена при помощи цикла for". С тем же успехом наверное можно было бы написать while(true) с ограничитильным break'ом внутри.
Ну а с другой стороны, не всё коту масленица :) Азимут задан, пусть разбирается.
1.8K
14 марта 2006 года
k3Eahn
365 / / 19.12.2005
Не смотря на всё и вся, ИМХО, определять является число степенью двойки посредством цикла :o - ИЗВРАТ :)
9.9K
14 марта 2006 года
MoM
46 / / 12.03.2006
А в 4 задаче что делать с епсилон и альфа? И как описать факториал?
7.9K
14 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by k3Eahn
Не смотря на всё и вся, ИМХО, определять является число степенью двойки посредством цикла :o - ИЗВРАТ :)

Читал условие?

1. Определить, является ли натуральное число N степенью двойки. [color=red]Задачу надо решить с помощью цикла For.[/color]

Но можно и без цикла.

Код:
function is2pow(num: Integer): Boolean;
var
  x, p: Extended;
begin
  x := num;
  p := Int(log2(x));
  if Power(2, p) = x then
    result := true
  else
    result := false;
end;

P.S. А ты имеешь свой вариант, без цикла For, или ты любишь только умничать?
1.8K
15 марта 2006 года
k3Eahn
365 / / 19.12.2005
Цитата:
Originally posted by k3Eahn
Не смотря на всё и вся...



8)

Цитата:
Originally posted by uki_
P.S. А ты имеешь свой вариант, без цикла For, или ты любишь только умничать?




 
Код:
#define IsPowerOf2(val) (!((val-1) & val))
7.9K
15 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by k3Eahn
8)
 
Код:
#define IsPowerOf2(val) (!((val-1) & val))


#define IsPowerOf2(val) (!(0x80000000%val))

Вместо 3 операций 2. :D

1.8K
15 марта 2006 года
k3Eahn
365 / / 19.12.2005
Цитата:
Originally posted by uki_
#define IsPowerOf2(val) (!(0x80000000%val))

Вместо 3 операций 2. :D


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

Пример.
Есть прога:

Код:
#include <conio.h>
#include <stdio.h>
#include <windows.h>

int main(int argc, char* argv[])
{
    DWORD chk=GetTickCount() & 0x100;//чтобы компилятор не посчитал значение переменной на этапе компиляции
    printf("%s",(IsPowerOf2(chk)) ? "YES" : "NO");
    getch();
    return 0;
}


Кролик - Visual C++ 6.0 - проект-релиз(из-за оптимизации).

1)Для макроса [color=blue][#define IsPowerOf2(val) (!(0x80000000%val))][/color] компилятор сгенерил следующий код:
Код:
00401000  /$ FF15 60504000  CALL DWORD PTR DS:[<&KERNEL32.GetTickCou>; [GetTickCount
00401006  |. 8BC8           MOV ECX,EAX
00401008  |. B8 00000080    MOV EAX,80000000
0040100D  |. 81E1 00010000  AND ECX,100
00401013  |. 33D2           XOR EDX,EDX
00401015  |. F7F1           DIV ECX
00401017  |. B8 38604000    MOV EAX,tst.00406038                     ;  ASCII "YES"
0040101C  |. 85D2           TEST EDX,EDX
0040101E  |. 74 05          JE SHORT tst.00401025
00401020  |. B8 34604000    MOV EAX,tst.00406034                     ;  ASCII "NO"
00401025  |> 50             PUSH EAX
00401026  |. 68 30604000    PUSH tst.00406030                        ;  ASCII "%s"
0040102B  |. E8 10000000    CALL tst.00401040
00401030  |. 83C4 08        ADD ESP,8
00401033  |. E8 3E3B0000    CALL tst.00404B76
00401038  |. 33C0           XOR EAX,EAX
0040103A  \. C3             RETN


2)Для макроса [color=blue][#define IsPowerOf2(val) (!((val-1) & val))][/color] компилятор сгенерил следующий код:
Код:
00401000  /$ FF15 60504000  CALL DWORD PTR DS:[<&KERNEL32.GetTickCou>; [GetTickCount
00401006  |. 25 00010000    AND EAX,100
0040100B  |. 8D48 FF        LEA ECX,DWORD PTR DS:[EAX-1]
0040100E  |. 85C8           TEST EAX,ECX
00401010  |. B8 38604000    MOV EAX,tst.00406038                     ;  ASCII "YES"
00401015  |. 74 05          JE SHORT tst.0040101C
00401017  |. B8 34604000    MOV EAX,tst.00406034                     ;  ASCII "NO"
0040101C  |> 50             PUSH EAX
0040101D  |. 68 30604000    PUSH tst.00406030                        ;  ASCII "%s"
00401022  |. E8 19000000    CALL tst.00401040
00401027  |. 83C4 08        ADD ESP,8
0040102A  |. E8 473B0000    CALL tst.00404B76
0040102F  |. 33C0           XOR EAX,EAX
00401031  \. C3             RETN


Разница в размере и скорости сгенерированоого кода налицо:D

P.S. Потихоньку уходим в оффтоп:)
16K
15 марта 2006 года
ENIAC
3 / / 21.02.2006
Цитата:
Originally posted by uki_
imho самая сложная (1-я), и самая самая простая (2-я):) решена. А 3 и 4 решается как 2-я, только в цикле while нужно смотреть, чтоб очередное члагаемое по абс.значению был больше epsilon. Иначе выход из цикла.



Господа, а вам не кажется, что единица тоже является степенью двойки?

7.9K
15 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by OlgaKr
А в программе явный баг.
Да-ааааааааааааааа! :))))))))))))))
А задачка в самом деле крутая.
Студентам не позубам P( , да и не всякий программер осилит! :D

Я рад, что ты рада. Мда, как мало нужно для счастья...(некоторым):D

Код:
$num = 1;

$res = 1;

// если число нечетное
for ($i = $num; $i > 1; $i /= 2)
{
  if(($i%2)==1)
  {
    $res = 0;
    break;
  }    
}

echo ($res) ? 'Явл. стенью 2ки' : 'НЕ явл. степенью 2ки';

2k3Eahn А ты еще приведи листинг с микрокодами процессора.
Речь идет о Pascal или C.
На счет катиться в офтопик. Ну у тебя уже вступление было офтопиком. Требовалось же цикл for. Если б я знал что об ИЗВРАТЕ говорит ассемблерщик..:D
242
15 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by uki_
Я рад, что ты рада. Мда, как мало нужно для счастья...(некоторым):D


Палочку не загибай насчет счастья то. :)
Просто сработал закон: "Что посеял то пожал"
;)

Цитата:
Originally posted by uki_
Я рад, что ты рада.



А ты я смотрю благородный, я даже не ожидала.:D

7.9K
15 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by OlgaKr
Просто сработал закон: "Что посеял то пожал"
;)

Есть другой закон :"В каждой программе есть баг". Например, что выше, если передать 0, тогда вернет 1, для всех отрицательный чисел, тоже вернет 1, типа -3 степень двойки. imho, главное подсказать идею решения, а 100% реализация, (например добавление проверки правильности входных данных), это уже дело автора топика.

252
15 марта 2006 года
koderAlex
1.4K / / 07.09.2005
Цитата:
Originally posted by sp999
Всего-то добавить ветвление: число 1 или нет.
Если 1, то ответ является, если нет, то по описанному алгоритму.


int exp2(unsigned long x)
{
int i;
unsigned long y;
for(i=0;i<31;i++){
y=x>>i;
if((y&1)==1){
if(y==1){return(i);}else{return(-1);};
};
};
return(-1);
}
на С с FORом .
ENIAC и k3Eahn идею вам подкинули .:)

242
15 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by uki_
Есть другой закон :"В каждой программе есть баг". ...


Жалко что ты раньше об этом не сказал. ;)

Цитата:
Originally posted by uki_
... Например, что выше, если передать 0, тогда вернет 1 ...


Ну а насчет программы выше (только твоей) ты прав в ней тоже есть баг как минимум один: деление на ноль. :)

242
15 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by koderAlex
int exp2(unsigned long x)
{
int i;
unsigned long y;
for(i=0;i<31;i++){
y=x>>i;
if((y&1)==1){
if(y==1){return(i);}else{return(-1);};
};
};
return(-1);
}
на С с FORом .
ENIAC и k3Eahn идею вам подкинули .:)



Убил наповал!!!!!!!!!!! :):)
Ты с каких пор такой добрый?? ;) ;) ;)

7.9K
15 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by OlgaKr
Жалко что ты раньше об этом не сказал. ;)
Ну а насчет программы выше (только твоей) ты прав в ней тоже есть баг как минимум один: деление на ноль. :)

Если ты о макросе, то это мне известно. Второй макрос на 0 тоже выдает неправильный результат. Использование
int num = ....;
int is2 = (num<=0) ? 0 : IsPowerOf2(num);

Но, повторю, доведение программы до 100%, напр. добавление кода проверки правильности аргументов, это уже дело того, кому нужна прога. Это форум, а не сайт по написанию курсовиков итд.

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

583
15 марта 2006 года
#define
150 / / 03.12.2002
Народ, кончайте спорить. Начали понты загибать - кто как умеет. Нечего за счет других самооценку поднимать.
uki_ прав - идею решения подали еще с 1ых постов, не надо думать, что код, приведенный в качестве демонстрации решения, можно воткнуть AS IS и гарантировать работу программы без ошибок.
9.9K
15 марта 2006 года
MoM
46 / / 12.03.2006
Вот как решил первую задачу:

uses CRT;
Var i,n,a: Integer;
s: Real;
begin
clrScr;
readln(n);
for i:=1 to 30 do begin
s:=exp(i*Ln(2));
s:=round(s);
if s=n then a:=1;
end;
If (a=1) or (n=1) then writeln('Javlaetsa')
else writeln('Ne javlaetsa');
readln;
End.
9.9K
15 марта 2006 года
MoM
46 / / 12.03.2006
3 не выходит, вот, что накалякал:
uses CRT;
var a,x,y:real;
begin
clrScr;
readln(a);
x:=0.05;
while (x>=0. 25) and (x<=0.восемь) do writeln(y);
y:=sqrt(a*x*sqrt(x)+exp(-a*sqr(cos(x))));
readln;
end.
7.9K
15 марта 2006 года
uki_
122 / / 26.01.2006
br /> uses CRT;
Var
i,n,a: Integer;
s: Real;
begin
clrScr;
readln(n);
for i:=1 to 30 do begin
s:=exp(i*Ln(2));
s:=round(s);
if s=n then a:=1;
end;
If (a=1) or (n=1) then
writeln('Javlaetsa')
else
writeln('Ne javlaetsa');
readln;
End.

Неплохо, но как минимум
1. вместо exp(i*Ln(2) лучше Power(i, 2.0)
2. если s = n, тогда кроме a := 1, нужен и Break, нет смысла дальше проверять.
3. и возможно a нужно инициализировать 0-м.

7.9K
16 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by MoM
3 не выходит, вот, что накалякал:


Код:
uses CRT;
var
  x,y : real;
  ch  : char;
begin
  ClrScr;
  x := 0.25;
  while (x>=0. 25) and (x<=0.8 ) do begin
    y:=sqrt(1.75*x*sqrt(x)+exp(-1.75*sqrt(cos(x))));
    x := x + 0.5;
    writeln('x = ', x, 'y = ', y);
  end;
  writeln('');
  writeln('Nazsmite ljubuju klavisu');
  while KeyPressed();
end.


Код:
uses CRT;
var
  b, eps, xlna, lna: real;
  fact, i: Integer;
  ch: char;
begin
  lna  := 3.0 * Ln(2.5);
  xlna := lna;
  fact := 1;
  b := 1;
  i := 1;
  repeat
    eps := xlna / fact;
    b := b + eps;
    Inc(i);
    fact := fact * i;
    xlna := xlna * lna;
  until(eps < 0.01);
  WriteLn('b = ', b);
  WriteLn('');
  WriteLn('Nazsmite ljubuju klavisu');
  ch := ReadKey();
end.
252
16 марта 2006 года
koderAlex
1.4K / / 07.09.2005
Цитата:
Originally posted by OlgaKr
Убил наповал!!!!!!!!!!! :):)
Ты с каких пор такой добрый?? ;) ;) ;)


Реанимацию ей , ренимацию !!:)
А ты думала , что я злой ? Видно плохая у меня репутация .P(

9.9K
29 марта 2006 года
MoM
46 / / 12.03.2006
Вычислить с использованием подпрограммы - ф-ция:
y=

7
П * sqrt(sqr(x)+sqr(a))-k, x=0,07, a=0,8. Ответ: -223,78.
k=1

Вот моё решение:
Код:
uses CRT;
 function funct: Real;
  Var  a,x,y: Real;
       k: Integer;
  begin
   writeln('a,x');
   readln(a,x);
    for k:=1 to 7 do y:=sqrt(sqr(x)+sqr(a))-k;
    funct:=y;
  end;
begin
clrScr;
 writeln(funct:3:2);
readln;
end.



С ответом не сходится. Что не правильно?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог