Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal] Количество чередований знаков


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

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

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


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

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

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

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

так в чем проблема то? если нужно получить произвольные числа, можешь просто ввести их с клавиатуры. главное в этой задаче - алгоритм определения чилса смен знакак.

Автор: Sven777 2.7.2007, 18:44
Наверняка есть какой-нибудь генератор произвольных чисел. Или надо просто тупо вводить их?

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

Автор: Sven777 2.7.2007, 18:58
Можешь дать какую-нибудь ссылку про этот randomoze? 

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

Добавлено через 46 секунд
в принципе, в встроенном хэлпе про него должно быть написано

Автор: Sven777 2.7.2007, 19:38
likehood, Спасибо

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

Автор: greenpc 3.7.2007, 08:41
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 для данного примера

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

Код

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
Не забываем пользоваться тегами для подсветки кода

Автор: likehood 3.7.2007, 20:05
Прежде всего бросаются в глаза строчки 19 и 21, в которых происходит одно и то же действие в разных частях условного оператора. Поскольку увеличить i нужно в любом случае, лучше сделать это после условного оператора. Кстати, в данном случае лучше было использовать цикл for, тогда i увеличивалось бы автоматически.
Еще я бы перенёс ввод x1 в начало цикла, тогда в начале программы не нужно было бы вводить x1 и, кроме того, можно было бы убрать условие в 22 строке.
Ну и еще не помешает сделать нормальные отступы, чтобы программу было проще читать.

Автор: Sven777 3.7.2007, 20:16
Цитата

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

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



Цитата

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

А как надо правильно делать эти отступы???

Автор: likehood 3.7.2007, 20:22
Цитата(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 пробела).

Автор: Sven777 3.7.2007, 20:41
likehood, спасибо, решил как вы посоветовали и получилось намного кратче.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)