Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/65: Рейтинг темы: голосов - 65, средняя оценка - 4.82
18 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 12
1

Определить, является ли последовательность из N произвольных чисел строго возрастающей

06.11.2014, 10:23. Показов 13408. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Столкнулась с проблемой, с которой самостоятельно не могу разобраться. Буду очень сильно признательна за подсказку.
Задание, по сути, несложное. Нужно, используя операторы цикла (каждый из трех), определить, является ли последовательность из N произвольных чисел строго возрастающей. С оператором FOR вообще никаких вопросов - там всё понятно, а вот WHILE и REPEAT мне уже весь мозг вывихнули.
Суть в том, что у меня не получается построить программу таким образом, чтобы она "считывала" последовательность чисел, введенных через пробел. Последовательность нужно ограничивать, так как данные операторы не могут осуществлять циклы строго определенное количество раз. Пробовала ограничивать символом (n или i) - программа просто выходит через break, и ничего не происходит. Если ограничивать нулем, то последовательность никогда не будет возрастающей, потому что ноль тоже участвует в расчетах.
Поэтому попробовала реализовать таким образом, чтобы каждый новый член последовательности нужно было вбивать последовательно.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Program gh_02;
Var new, old: Real;
Begin
Writeln ('Введите число');
Readln (old);
Writeln ('Введите число');
Readln (new);
Repeat
If new>old then
Writeln ('Последовательность строго возрастает');
old:=new;
Writeln ('Введите число');
Readln (new);
Until new<old;
Writeln ('Возрастание последовательности прекращено');
Readln;
End.
Оно вроде и работает, но всё равно не даёт покоя мысль, что я неправильно выполнила задание... Пробовала реализовать по-другому, но всё время ерунда какая-то получается...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2014, 10:23
Ответы с готовыми решениями:

Определить, является ли последовательность чисел строго возрастающей
С клавиатуры вводятся числа до первого отрицательного. Определить, является ли последова-...

Определить, являеться ли последовательность чисел строго возрастающей
вводяться числа до первого отрицательного, определить являеться ли последовательность чисел строго...

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

Является ли последовательность из N произвольных чисел строго возрастающей
Как определить, является ли последовательность из N произвольных чисел строго возрастающей(не...

28
0 / 0 / 2
Регистрация: 04.11.2014
Сообщений: 17
06.11.2014, 11:38 2
Последовательность сразу забивать надо всю, и хранить в таком типе данных как массив, это первое. Вот пример ввода и вывода последовательности.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
const
   n = 5;
type
   mas = array[1..n] of integer;
var
   a: mas;
   i: byte;
begin
   writeln('введите элементы массива');
   for i:=1 to n do readln(a[i]);
   writeln('вывод элементов массива:');
   for i:=1 to n do write(a[i]:5);
end.
0
18 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 12
06.11.2014, 11:43  [ТС] 3
Михаил83, спасибо большое за ответ.
Но по условию задачи там массивы не нужно использовать, потому что задача на массивы в другом задании. В этом задании только операторы цикла. Попробовала подойти по-другому, через дельту:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  a, b, delta, f: real;
begin
  writeln ('Введите последовательность произвольных чисел через пробел. В конце последовательности поставить 0');
  read(a);
  if a <> 0 then read(b) else b := 0;
  delta := (a - b);
  f:=0;
  while b <> 0 do begin
    if delta * (a - b) <= 0 then f:=1;
    a := b;
    read(b)
  end;
  if a = 0 then b := 1;
  if f=0 then writeln('Последовательность является возрастающей')
  else writeln ('Последовательность не является возрастающей')
end.
Вроде всё работает, теперь надо то же самое, но через repeat. Попробовала просто переставить условие в конец цикла и переписать "ложь на истину", не получилось пока...
0
0 / 0 / 2
Регистрация: 04.11.2014
Сообщений: 17
06.11.2014, 12:31 4
Попробуй так (ввод массива см выше)
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
n,i:integer; //i - кол-во элементов массива
s:string;
begin
i:=5;
n:=Length(m); - получить кол-во элементов массива
repeat
if m[n]<m[n+1] then
s:='verno'
else s:='ne verno';
n:=n+1;
until n=i;
выводим значение S на экран
end;
Надеюсь суть уловил.
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
06.11.2014, 12:35 5
Михаил83, Вы сами попробовали это откомпилить? Или запилили код неглядя?

Добавлено через 1 минуту
К тому же выражения подобные:
Цитата Сообщение от Михаил83 Посмотреть сообщение
m[n]<m[n+1]
являются ни чем иным, как работой с массивом - что запрещено условиями.
0
18 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 12
06.11.2014, 12:39  [ТС] 6
Мой последний код по while почти устраивает меня, но если бы можно ограничить последовательность не нулем (он ведь тоже цифра, а по условию задачи последовательность состоит из произвольных чисел, в том числе может включать ноль), а, например, символом. Но у меня пока что не получается. Компилятор ошибки выдает...
0
0 / 0 / 2
Регистрация: 04.11.2014
Сообщений: 17
06.11.2014, 12:49 7
С while нормально, работает.
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
06.11.2014, 12:53 8
Цитата Сообщение от Gulnara Посмотреть сообщение
а, например, символом
Воспользуйтесь типом CHAR
Pascal
1
2
3
4
...
Ch:=Readkey;
a:=Ord(Ch)-Ord('0');
...
Добавлено через 3 минуты
Но надо учесть, что нажиматься будут не только цифры, т.е. моё a:=Ord(.. придется предварить фильтром на вводимое значение.
0
18 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 12
06.11.2014, 12:56  [ТС] 9
А к while как прописать? Там у меня все ошибки и выходят...
Pascal
1
 while b <> a do
так примерно?
0
0 / 0 / 2
Регистрация: 04.11.2014
Сообщений: 17
06.11.2014, 12:59 10
В дельфях работает и в паскале заработает если описание массива включить. По массив изначально ничего написано не было. И когда постил предыдушее сообщение не видел.
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
06.11.2014, 13:06 11
Цитата Сообщение от Gulnara Посмотреть сообщение
А к while как прописать?
Честно, в алгоритм и его правильность не вникал - я только предложил способ решения конкретной проблемы, а именно - работа с символом.
Т.е. если Вам понятен приведенный мною механизм - можете использовать его где и как угодно.

Добавлено через 3 минуты
Цитата Сообщение от Михаил83 Посмотреть сообщение
В дельфях работает и в паскале заработает
В том виде, в котором Вы это привели - не заработает... да и в Дельфях тоже. У Вас там несколько "очепяток".
0
18 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 12
06.11.2014, 13:07  [ТС] 12
Цитата Сообщение от APALoff Посмотреть сообщение
Но надо учесть, что нажиматься будут не только цифры, т.е. моё a:=Ord(.. придется предварить фильтром на вводимое значение.
Я пробовала использовать символ '/', но пока особо продвинуться не смогла. То ли в объявлении переменных ошибаюсь:
Pascal
1
var a: char;
То ли в обработке уже, в теле программы:
Pascal
1
2
a:= '/';
a:= Ord('/')-Ord('0');
здесь через компилятор проходит, а вот когда объявляю
Pascal
1
while b <> a do
вот тут он и говорит, что не может совместить знак <> и а...
Наверное, я чего-то не дочитала про символьные переменные...
0
0 / 0 / 2
Регистрация: 04.11.2014
Сообщений: 17
06.11.2014, 13:13 13
Пусть пользователь сначала вводит кол-во элементов в последовательности а затем саму последовательность.

Добавлено через 5 минут
Да, есть опечатка. Каюсь, спасибо что заметили. Правил уже на форуме.
Pascal
1
2
n:=i;
i:=length(m);
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
06.11.2014, 13:19 14
Цитата Сообщение от Gulnara Посмотреть сообщение
То ли в обработке уже, в теле программы:
Цитата Сообщение от APALoff Посмотреть сообщение
a:=Ord(Ch)-Ord('0');
- данная строка приведена для определения цифрового значения нажатого цифрового символа, но если Вы нажали '/' - то это уже никак не связано с цифровым значением цифры - именно потому и нужно предварительно отфильтровать нажатия.
Например так:
Pascal
1
2
3
Ch:=Readkey;
If Ch in ['0'..'9'] then a:=Ord(Ch)-Ord('0') else
  If Ch='/' then Exit;
Добавлено через 3 минуты
Цитата Сообщение от Gulnara Посмотреть сообщение
Pascal
1
2
a:= '/';
a:= Ord('/')-Ord('0');
Судя по приведенному - Вы не очень разобрались со смыслом данной строки.
Ord в данном случае возвращает код символа по таблице ASCII, т.е. если мы нажали '1', то Ch содержит символ '1' с кодом 49, '0' - это код 48, т.е. 49-48=1 - вот наше цифровое (а не символьное) значение нажатой клавиши '1'
0
18 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 12
06.11.2014, 13:20  [ТС] 15
Михаил83, это само собой разумеется, если использовать оператор FOR (оператор с параметрами). С операторами цикла while и repeat невозможно заранее задать количество циклов, потому что один из них - оператор с предусловием, а второй - с постусловием. То есть они будут выполнять цикл, пока выполняется (или не выполняется) определенное условие. А по условию задания нужно определить возрастание последовательности всеми ТРЕМЯ операторами.
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
06.11.2014, 13:22 16
Цитата Сообщение от Gulnara Посмотреть сообщение
А по условию задания нужно определить возрастание последовательности всеми ТРЕМЯ операторами.
Подозреваю, что не сразу всеми ТРЕМЯ, а просто написать 3 программы с разными циклами.
0
18 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 12
06.11.2014, 13:35  [ТС] 17
Цитата Сообщение от APALoff Посмотреть сообщение
Подозреваю, что не сразу всеми ТРЕМЯ, а просто написать 3 программы с разными циклами.
Почти так, и объединить их в одну, чтобы одним исполнением программы последовательно определять возрастание каждым оператором. То есть объявление переменных будет для всех общим, например.
По сути, объединить - не проблема, надо хотя бы разобраться с каждым отдельно для начала.
Цитата Сообщение от APALoff Посмотреть сообщение
Судя по приведенному - Вы не очень разобрались со смыслом данной строки.
Вы правы, я не программист, даже не учусь на него, но в учебной программе по моей специальности есть информатика и есть это задание, которое я добросовестно пытаюсь выполнить сама, и разобраться, что к чему. Поэтому очень буду признательна за дополнительные разъяснения.
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
06.11.2014, 14:29 18
Цитата Сообщение от Gulnara Посмотреть сообщение
добросовестно пытаюсь выполнить сама
И это на самом деле радует!

Я чуть выше дал пояснение как работает встроенная функция ORD - будут вопросы - задавайте.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,077
Записей в блоге: 1
06.11.2014, 21:37 19
Gulnara,

Организовать повтор тела цикла фиксированное количество раз (по условию N) любым из операторов цикла несложно, например:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
for i:=1 to n do оператор;
 
i:=1;
while i<=n do begin
  ...
  Inc(i);
end;
 
i:=1;
repeat
  ...
  Inc(i);
until i>n;
Вместо "оператор" естественно может быть и составной оператор begin ... end, если в теле цикла нужно выполнять более одного оператора.
Для цикла с предусловием без составного оператора обычно не обойтись, поскольку нужно увеличивать счетчик внутри тела цикла (но возможны ситуации, когда достаточно увеличения счетчика). Для цикла с постусловием repeat until уже сами по себе являются операторными скобками.

Осталось разобраться с телом циклов. Для проверки условия возрастания достаточно проверять, что текущий элемент больше предыдущего. Для следующего шага в качестве предыдущего элемента взять текущий. Хотя, если задание было сделано с for, то и тут проблем не будет.

Добавлено через 11 минут
То есть, для цикла for у вас получилось что-то вроде
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
var
  n, i, c, p, k: Integer;
begin
  Write('Введите количество элементов: '); ReadLn(n);
  Write('Введите элементы: ');
  k:=0; Read(c);
  for i:=1 to n do begin
    p:=c; Read(c);
    if c<=p then Inc(k);
  end;
  if k>0 then WriteLn('Последовательность НЕ возрастает.')
  else WriteLn('Последовательность строго возрастает.');
end.
0
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 10
07.11.2014, 14:35 20
вопрос, какой признак является концом ввода
как только укажите, выложу оба варианта
0
07.11.2014, 14:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2014, 14:35
Помогаю со студенческими работами здесь

Определить, является ли последовательность чисел строго возрастающей
С клавиатуры вводятся числа до первого отрицательного. Определить, является ли последовательность...

Определить, является ли последовательность чисел строго возрастающей или беспорядочной
С клавиатуры вводятся числа до первого отрицательного. Определить, является ли последовательность...

Определить, является ли заданная последовательность целых чисел строго возрастающей
Дана последовательность целых чисел. Узнать является ли она строго возрастающей

Определить является ли последовательность строго возрастающей
Вводится последовательность из N вещественных чисел. Определить является ли последовательность...

Определить, является ли последовательность строго возрастающей
помогите, кто может, пожалуйста решить задачу: Вводится последовательность из N вещественных...

Проверить, является ли последовательность чисел строго возрастающей
С клавиатуры вводятся числа до первого отрицательного. Определить, является ли последовательность...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru