4 задачи!
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.
Помогите, пожалуйста, решить задачи:
2. Дано натуральное число N. Вычислить: 1/sin1 + 1/(sin1+sin2) + ... + 1/(sin1+...+sinN). Решить надо также с помощью цикла For.
//language C
#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;
}
1. Определить, является ли натуральное число N степенью двойки. Задачу надо решить с помощью цикла For.
На PHP (я думаю транслировать в любой другой язык не сложно):
$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ки';
На PHP (я думаю транслировать в любой другой язык не сложно):
$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ки'.
imho прога на $num = 5, скажет что 'Явл. стенью 2ки'.
Очень не уверен в этом - первый if сразу же сделает $res=0 и прога перейдет на вывод.
Очень не уверен в этом - первый if сразу же сделает $res=0 и прога перейдет на вывод.
Мда, чтоб проще было понять суть ошибки, хотел привести минимальное число на которой программа дает сбой. Это из-за первого if не 5, а 10.
Мда, чтоб проще было понять суть ошибки, хотел привести минимальное число на которой программа дает сбой. Это из-за первого if не 5, а 10.
С этим согласен - в программе жук.
Надо проверку на нечетность засунуть в цикл.
С этим согласен - в программе жук.
Надо проверку на нечетность засунуть в цикл.
$res нужно инициализировать 1-ей.
$res = 1;
// если число нечетное
for ($i = $num; $i > 0; $i /= 2)
{
if(($i%2)==1)
{
$res = 0;
break;
}
}
echo ($res) ? 'Явл. стенью 2ки' : 'НЕ явл. степенью 2ки';
Это все хорошо, только автор поста что-то не объявляется, может ему и не надо уже.. ну а кто осмелится решить 3 и 4? У меня с математикой очень туго :)
...ну а кто осмелится решить 3 и 4? У меня с математикой очень туго :)
imho самая сложная (1-я), и самая самая простая (2-я):) решена. А 3 и 4 решается как 2-я, только в цикле while нужно смотреть, чтоб очередное члагаемое по абс.значению был больше epsilon. Иначе выход из цикла.
А что с 3 и 4 задачами?
Спасибо за помощь! Правда мне надо было на Паскале, ну ладно, попробую разобраться!
А что с 3 и 4 задачами?
А 3 и 4 задачи реши по примеру второй, будут проблемы с переводом пиши постараюсь помочь. А Паскаль я не учила, у нас с С начинают.
Млин, не доходит как первую задачу перевести на язык 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() - это стандартная библиотека вычесляющая синус
В любом случае, я считаю, что транслировать построчно не стоит, достаточно посмотреть - понять логику решения и воспроизвести эту логику на паскале.
Вроде он про 1ую задачу спрашивал :)
imho у OlgaKr к первой задаче просто душа не лежит. Но а вторая, то своя, родная. :)
Спасибо за помощь! Правда мне надо было на Паскале, ну ладно, попробую разобраться!
А что с 3 и 4 задачами?
А 3 задачу трудно решить :)
там у тебя функция задана , а решить надо ,по условию, уравнение .
//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
Спасибо за разъяснения, но я спрашивал про первую задачу, а с этой задачей я разобрался!:)
А 3 задачу трудно решить :)
там у тебя функция задана , а решить надо ,по условию, уравнение .
А это значит я не правильно написал, у этой задачи вообще условия не было! Просто дана ф-ция, которую надо вычислить!
Спасибо за разъяснения, но я спрашивал про первую задачу, а с этой задачей я разобрался!:)
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;
Во-вторых, написано, что "Задачу надо решить с помощью цикла For", в твоем коде он конечно есть, только мне кажется что про твой алгоритм нельзя сказать "задача решена при помощи цикла for". С тем же успехом наверное можно было бы написать while(true) с ограничитильным break'ом внутри.
Ну а с другой стороны, не всё коту масленица :) Азимут задан, пусть разбирается.
Не смотря на всё и вся, ИМХО, определять является число степенью двойки посредством цикла :o - ИЗВРАТ :)
Читал условие?
1. Определить, является ли натуральное число N степенью двойки. [color=red]Задачу надо решить с помощью цикла For.[/color]
Но можно и без цикла.
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, или ты любишь только умничать?
Не смотря на всё и вся...
8)
P.S. А ты имеешь свой вариант, без цикла For, или ты любишь только умничать?
8)
#define IsPowerOf2(val) (!(0x80000000%val))
Вместо 3 операций 2. :D
#define IsPowerOf2(val) (!(0x80000000%val))
Вместо 3 операций 2. :D
Хм... но модуль получается при делении, а деление как известно оооооооооооочень медленная операция.
Пример.
Есть прога:
#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] компилятор сгенерил следующий код:
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] компилятор сгенерил следующий код:
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. Потихоньку уходим в оффтоп:)
imho самая сложная (1-я), и самая самая простая (2-я):) решена. А 3 и 4 решается как 2-я, только в цикле while нужно смотреть, чтоб очередное члагаемое по абс.значению был больше epsilon. Иначе выход из цикла.
Господа, а вам не кажется, что единица тоже является степенью двойки?
А в программе явный баг.
Да-ааааааааааааааа! :))))))))))))))
А задачка в самом деле крутая.
Студентам не позубам P( , да и не всякий программер осилит! :D
Я рад, что ты рада. Мда, как мало нужно для счастья...(некоторым):D
$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
Я рад, что ты рада. Мда, как мало нужно для счастья...(некоторым):D
Палочку не загибай насчет счастья то. :)
Просто сработал закон: "Что посеял то пожал"
;)
Я рад, что ты рада.
А ты я смотрю благородный, я даже не ожидала.:D
Просто сработал закон: "Что посеял то пожал"
;)
Есть другой закон :"В каждой программе есть баг". Например, что выше, если передать 0, тогда вернет 1, для всех отрицательный чисел, тоже вернет 1, типа -3 степень двойки. imho, главное подсказать идею решения, а 100% реализация, (например добавление проверки правильности входных данных), это уже дело автора топика.
Всего-то добавить ветвление: число 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 идею вам подкинули .:)
Есть другой закон :"В каждой программе есть баг". ...
Жалко что ты раньше об этом не сказал. ;)
... Например, что выше, если передать 0, тогда вернет 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 идею вам подкинули .:)
Убил наповал!!!!!!!!!!! :):)
Ты с каких пор такой добрый?? ;) ;) ;)
Жалко что ты раньше об этом не сказал. ;)
Ну а насчет программы выше (только твоей) ты прав в ней тоже есть баг как минимум один: деление на ноль. :)
Если ты о макросе, то это мне известно. Второй макрос на 0 тоже выдает неправильный результат. Использование
int num = ....;
int is2 = (num<=0) ? 0 : IsPowerOf2(num);
Но, повторю, доведение программы до 100%, напр. добавление кода проверки правильности аргументов, это уже дело того, кому нужна прога. Это форум, а не сайт по написанию курсовиков итд.
И есть разница между программой, которая в принципе не правильна и между программой, которая стает на голову только при неправильный входных данных.
uki_ прав - идею решения подали еще с 1ых постов, не надо думать, что код, приведенный в качестве демонстрации решения, можно воткнуть AS IS и гарантировать работу программы без ошибок.
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.
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.
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-м.
3 не выходит, вот, что накалякал:
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.
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.
Убил наповал!!!!!!!!!!! :):)
Ты с каких пор такой добрый?? ;) ;) ;)
Реанимацию ей , ренимацию !!:)
А ты думала , что я злой ? Видно плохая у меня репутация .P(
y=
7
П * sqrt(sqr(x)+sqr(a))-k, x=0,07, a=0,8. Ответ: -223,78.
k=1
Вот моё решение:
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.
С ответом не сходится. Что не правильно?