Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pascal] Задачи с функциями и процедурами 
:(
    Опции темы
STRIKER221
Дата 3.11.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 2.11.2006
Где: Belarus

Репутация: нет
Всего: нет



Z=(sign(X)+sign(Y))expX    sign(x+y)         (expX=Степень Х)
Замечание: sign - фунция, возвращающая знак своего аргумента (например) sign (-6)=-1 
Функция sign определяется так: 
Sign(a)=:
-1 при а<0;
0 при а=0;
1 при а>0.

Исходные данные:                       Результат:
1. X=5    Y=-5                                Z=0
2. X=-7   Y=0                                 Z=1
PM MAIL ICQ   Вверх
Kuvaldis
Дата 3.11.2006, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



STRIKER221
Цитата

Z=(sign(X)+sign(Y))expX    sign(x+y)         (expX=Степень Х)

я не совсем понял, как здесь используется expX
Ты ничего не пропустил в описании функции?


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
STRIKER221
Дата 3.11.2006, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 2.11.2006
Где: Belarus

Репутация: нет
Всего: нет



expX это степень в которую возводится (sign(X)+sign(Y))
PM MAIL ICQ   Вверх
STRIKER221
Дата 6.11.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 2.11.2006
Где: Belarus

Репутация: нет
Всего: нет



там за место sign* подставляется значение -1 ,0 или 1. Складываются, возводятся в степень и потом перемножаются.

PM MAIL ICQ   Вверх
Kuvaldis
Дата 6.11.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



STRIKER221
Код

//------------------------------------------------------------------
function Sign(x : integer) : integer;
begin
    if (x < 0) then
       Sign := -1
    else if (x = 0) then
       Sign := 0
    else
       Sign := 1;
end;
//------------------------------------------------------------------
function degree(x, deg : integer) : real;
var
    i : integer;
    sign : integer;
    res : real;
begin
    if (deg < 0) then
    begin
        sign := -1;
        deg := -deg;
    end
    else
        sign := 1;

    res := 1;
    for i := 1 to deg do
        res := res * x;

    if (sign = -1) then
       res := 1 / res;

    degree := res;
end;
//------------------------------------------------------------------
var
  x, y : integer;
  res : real;
begin
  Write('x = ');
  Readln(x);
  Write('y = ');
  Readln(y);
  res := degree(Sign(x) + Sign(y), x)  * Sign(x + y);
  writeln('Result = ', res : 0 : 2); 
  readln; 
end.
//------------------------------------------------------------------



--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
STRIKER221
Дата 6.11.2006, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 2.11.2006
Где: Belarus

Репутация: нет
Всего: нет



Код

  if (sign = -1) then
       res := 1 / res;

А что делает эта часть????
PM MAIL ICQ   Вверх
Kuvaldis
Дата 7.11.2006, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



STRIKER221
Цитата

А что делает эта часть????

если степень числа - отрицательная, то по определению
a ^ (-x) = 1 / a^x
Мы в данной задаче не можем пользоваться стандартными функциями типа exp(), ln() так как основания у нас могут быть и отрицательные, что для данных функций противопоказано


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
STRIKER221
Дата 7.11.2006, 03:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 2.11.2006
Где: Belarus

Репутация: нет
Всего: нет




Спасибо

Это сообщение отредактировал(а) STRIKER221 - 7.11.2006, 13:51
PM MAIL ICQ   Вверх
STRIKER221
Дата 7.11.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 2.11.2006
Где: Belarus

Репутация: нет
Всего: нет



Какой командой добавить условие: когда сумма равна 0 выводить : Деление на 0 невозможно?
Код

begin
if (deg < 0) then
begin
  sign := -1;
  deg := -deg;
end
  else
 sign := 1;
 res := 1;
 for i := 1 to deg do
 res := res * x;
if (sign = -1) then
 res := 1 / res;
 degree:= res;
end;

Это будет что-то типа:
Код

if (sign =  0) then
writeln('...')
 ?
Но надо не if а что?

Это сообщение отредактировал(а) STRIKER221 - 7.11.2006, 14:50
PM MAIL ICQ   Вверх
Kuvaldis
Дата 7.11.2006, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



STRIKER221
Код

//------------------------------------------------------------------
function Sign(x : integer) : integer;
begin
    if (x < 0) then
       Sign := -1
    else if (x = 0) then
       Sign := 0
    else
       Sign := 1;
end;
//------------------------------------------------------------------
// return false, if error
function degree(x, deg : integer; var res : real) : boolean;
var
    i : integer;
    sign : integer;
begin
    if (deg = 0) then
    begin
        res := 1;   // default
        degree := true;
        Exit;
    end;

    if (deg < 0) then
    begin
        sign := -1;
        deg := -deg;
    end
    else
        sign := 1;

    res := 1;
    for i := 1 to deg do
        res := res * x;

    if (sign = -1) then
    begin
        if (res = 0) then
        begin            
            degree := false;
            Exit;
        end                
            res := 1 / res;                     
     end;
    
     degree := true;      
end;
//------------------------------------------------------------------
var
  x, y : integer;
  res : real;
begin
  Write('x = ');
  Readln(x);
  Write('y = ');
  Readln(y);
  if ( degree(Sign(x) + Sign(y), x, res) = false ) then
     writeln('Error! Zero dividing!')
  else
  begin
      res := res  * Sign(x + y);
      writeln('Result = ', res : 0 : 2);
  end;

  readln; 
end.
//------------------------------------------------------------------


Это сообщение отредактировал(а) Kuvaldis - 8.11.2006, 02:32


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
volvo877
Дата 8.11.2006, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



Kuvaldis,  smile 
Ты чего это?

Код

    if (sign = -1) then
    begin
        if (res = 0) then { <--- Чему равно res ? }
        begin
            res := 0;  { <--- ??? Зачем лишнее делать ??? }
            degree := false;
        end
        else
        begin
            res := 1 / res;
            degree := true;
        end;    
    end;


Вот такая реализация не будет проще читаться?
Код
function degree(x, deg : integer; var res : real) : boolean;
var
    i : integer;
    sign : integer;
begin
    degree := true;
    if (deg = 0) then
    begin
        res := 1;   // default
        Exit;
    end;

    if (deg < 0) then
    begin
        sign := -1;
        deg := -deg;
    end
    else
        sign := 1;

    res := 1;
    for i := 1 to deg do
        res := res * x;

    if (sign = -1) then
    begin
        if (res = 0) then degree := false
        else res := 1 / res;
    end;
end;
Кстати, в твоей реализации, что вернется, если изначально deg > 0? Я тебе скажу: False - это значение по умолчанию, ты же нигде в таким случае результат в True не перебрасываешь... А должно вернуться именно True, ведь ошибки не было, не так ли?

А Sign я бы вообще вот так написал:
//------------------------------------------------------------------
Код
function Sign(x : integer) : integer;
begin
    if (x = 0) then Sign := 0
    else Sign := X div Abs(X);
end;

PM MAIL   Вверх
Kuvaldis
Дата 8.11.2006, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



volvo877
Цитата

Вот такая реализация не будет проще читаться?

У меня привычка код оформлять от С++ (основной язык для меня)

Цитата

Кстати, в твоей реализации, что вернется, если изначально deg > 0? Я тебе скажу: False - это значение по умолчанию, ты же нигде в таким случае результат в True не перебрасываешь... А должно вернуться именно True, ведь ошибки не было, не так ли?

да... на самом деле проглядел. Спасибо. Не зря ведь говорят: посмешишь - людей насмешишь (задачка-то легкая smile идею показал, а протестить до конца было лень.

P.S. Я тебе удивляюь и снимаю шляпу. Хоть и появляешься ты не часто, но всегда ОЧЕНЬ дельные советы даешь. В данном случае красивая реализация функции Sign() 
Так что думаю, что + ты заслужил smile 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Мист
Дата 26.12.2008, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 26.12.2008

Репутация: нет
Всего: нет



[Pascal]Задачи с фунцыями и процедурами;(школьные задачи)
Решите плизз)))
№1 Найти все  простые числа которые меньше 100
№2 Найти разложение на разложение на  множители всех натуральных чисел з отрезка[a;b]
PM MAIL   Вверх
2p0i
Дата 27.12.2008, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2007

Репутация: нет
Всего: 1



Писал прямо в броузере, лень проверять smile
Цитата
№1 Найти все  простые числа которые меньше 100

Код

var i, j : integer; ok: boolean;
begin
  for i := 2 to 100 do begin
    ok := true;
    for j := 2 to i/2 do 
      if (i mod j <> 0)
        ok := false;
    if ok then write(i, ' ');
  end;
  writeln;
  readln;
end.

Цитата
№2 Найти разложение на разложение на  множители всех натуральных чисел з отрезка[a;b]

Код

var a, b, i, j, t: integer;
begin
  readln(a, b);
  for i := a to b do begin
    write(i, ':');
    t := i;
    for j := 2 to i/2 do begin
      while t mod j = 0 do begin
        write(' ', j);
        t := t div j;
      end;
    end;
    writeln;
  end;
end.


PM MAIL   Вверх
volvo877
Дата 27.12.2008, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



Цитата(2p0i @  26.12.2008,  23:28 Найти цитируемый пост)
лень проверять
В следующий раз лучше проверь... Во-первых, не 
Цитата
Код
      if (i mod j <> 0)
        ok := false;

, а 
Код

      if (i mod j = 0) then ok := false;
(разница - критическая). Во вторых, деление с циклом For несовместимо, будет ошибка, надо брать целую часть Trunc-ом. Ну, и в третьих - если хочется ускорить программу в 4 раза (525 проверок против твоих 2401):
Код
var i, j: integer; ok: boolean;
begin
  for i := 2 to 100 do begin
    ok := true;
    for j := 2 to trunc(sqrt(i)) do { <-- До корня из i проверять достаточно }
      if (i mod j = 0) then ok := false;

    if ok then write(i, ' ');
  end;
  writeln;
  readln;
end.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1115 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.