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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pascal] Количество чередований знаков  
:(
    Опции темы
Sven777
Дата 2.7.2007, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хочу изучить язык Паскаль по книжке, самостоятельно.И у меня возник вопрос.
Не могу решить вот эту задачу:

Определить сколько раз последовательность из N произвольных чисел меняет знак.

Просто не знаю, что делать с этими произвольными числами smile . Может есть какой-нибудь оператор Паскаля, который занимается этим делом.
Желательно бы и алгоритм к этой задаче.Весь его писать не надо просто объясните, как решать вопрос с произвольными числами. 


M
Kuvaldis
1. Название темы должно отражать ее суть
2. Не забываем указывать в заголовке темы нужный язык программирования


Это сообщение отредактировал(а) Kuvaldis - 3.7.2007, 00:50
PM MAIL   Вверх
sergejzr
Дата 2.7.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Для домашних заданий, курсовых, существует "Центр Помощи"

Тема перенесена! 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
likehood
Дата 2.7.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



Цитата(Sven777 @  2.7.2007,  19:02 Найти цитируемый пост)
Просто не знаю, что делать с этими произвольными числами

так в чем проблема то? если нужно получить произвольные числа, можешь просто ввести их с клавиатуры. главное в этой задаче - алгоритм определения чилса смен знакак.
PM MAIL   Вверх
Sven777
Дата 2.7.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Наверняка есть какой-нибудь генератор произвольных чисел. Или надо просто тупо вводить их?
PM MAIL   Вверх
likehood
Дата 2.7.2007, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



есть и генератор: random(N) - случайное число от 1 до N. (вначале программы нужно вызвать процедуру randomize; для инициализации генератора случайных чисел)
но в данном случае (как я понял) это не важно, главное - придумать алгоритм посчета числа смен знаков.

Это сообщение отредактировал(а) likehood - 2.7.2007, 18:59
PM MAIL   Вверх
Sven777
Дата 2.7.2007, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Можешь дать какую-нибудь ссылку про этот randomoze? 
PM MAIL   Вверх
likehood
Дата 2.7.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



просто в начале программы один раз вызываешь randomize; для инициализации генератора
затем для получения случайного числа (от 1 до N) вызываешь random(N);

Добавлено через 46 секунд
в принципе, в встроенном хэлпе про него должно быть написано
PM MAIL   Вверх
Sven777
Дата 2.7.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



likehood, Спасибо

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


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


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

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



Sven777
Тебе нужно сгенерировать случайное число так, чтобы оно могло быть как положительное, так и отрицательное.
random(N) генерит случайное число из интервала (1, N)
Поэтому используй для заполнения такую формулу:
переменная = Random(1, N) - N/2
Тогда значение будет между (-N/2, N/2)


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


Новичок



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

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



Sven777
 
Код

Const
  MSize =100;
var
  Mas : array[1..MSize] of integer;
  i : Integer;
  Count : integer;
создаешь массив с произвольными числами
  randomize;
  for i:=1 to MSize do Mas[i] :=random(100)-50;  // как предложил Kuvaldis
  Count :=0;
  for i:=2 to MSize do
  if Sign(Mas[i-1])*Sign(Mas[i]) = -1 then Inc(Count); // сделать проверку на 0
  writeln('кол-во изменений '+ IntToStr(Count)); // или ф-ция Str если Pascal


  
 smile Kuvaldis, likehood 
ф -ция random возвращяет значения 0 <= X < 1 или 0 <= X < 100 для данного примера

Это сообщение отредактировал(а) greenpc - 3.7.2007, 08:44
PM   Вверх
Sven777
Дата 3.7.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Задачу вроде бы решил.Произвольные числа вводяться с клавиатуры.
//Произведение двух чисел с разными знаками - отрицательное число//
На это и опирался.Немного топорно, конечно, получилось, но ничего задача работает правильно! Как на ваш взгляд все правильно сделал или можно было бы как-нибудь упростить, а то громозко как-то выглядит?

Код

Program upr5;
uses crt;
var x0,x1,n,i,k:integer;
Begin
  clrscr;
  write('n=');
  readln(n);
  write('x0=');
  readln(x0);
  write('x1=');
  readln(x1);
  k:=0;
  i:=1;
while i<n do
Begin
if x0*x1<0 then
begin
k:=k+1;
i:=i+1;
end
else i:=i+1;
if i >=n then break;
  x0:=x1;
  write('x1=');
  readln(x1);
end;
  writeln('k=',k);
  readkey;
End.    



M
Kuvaldis
Не забываем пользоваться тегами для подсветки кода


Это сообщение отредактировал(а) Kuvaldis - 3.7.2007, 19:46
PM MAIL   Вверх
likehood
Дата 3.7.2007, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



Прежде всего бросаются в глаза строчки 19 и 21, в которых происходит одно и то же действие в разных частях условного оператора. Поскольку увеличить i нужно в любом случае, лучше сделать это после условного оператора. Кстати, в данном случае лучше было использовать цикл for, тогда i увеличивалось бы автоматически.
Еще я бы перенёс ввод x1 в начало цикла, тогда в начале программы не нужно было бы вводить x1 и, кроме того, можно было бы убрать условие в 22 строке.
Ну и еще не помешает сделать нормальные отступы, чтобы программу было проще читать.
PM MAIL   Вверх
Sven777
Дата 3.7.2007, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Еще я бы перенёс ввод x1 в начало цикла, тогда в начале программы не нужно было бы вводить x1 и, кроме того, можно было бы убрать условие в 22 строке.

Вот эта идея мне понравилась. Учту эти замечания и попытаюсь переделать программу.



Цитата

Ну и еще не помешает сделать нормальные отступы, чтобы программу было проще читать.

А как надо правильно делать эти отступы???
PM MAIL   Вверх
likehood
Дата 3.7.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



Цитата(Sven777 @  3.7.2007,  21:16 Найти цитируемый пост)
А как надо правильно делать эти отступы???

Как то так:
Код

Program upr5;
uses crt;
var x0,x1,n,i,k:integer;
Begin
    clrscr;
    write('n=');
    readln(n);
    write('x0=');
    readln(x0);
    write('x1=');
    readln(x1);
    k:=0;
    i:=1;
    while i<n do
    Begin
        if x0*x1<0 then
        begin
            k:=k+1;
            i:=i+1;
        end
        else i:=i+1;
        if i >=n then break;
        x0:=x1;
        write('x1=');
        readln(x1);
    end;
    writeln('k=',k);
    readkey;
End.


После каждого begin'а делатеся отступ (обычно 4 пробела).

PM MAIL   Вверх
Sven777
Дата 3.7.2007, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



likehood, спасибо, решил как вы посоветовали и получилось намного кратче.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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