Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2011, 16:57   #1
DinamoBrynsk
Пользователь
 
Регистрация: 19.08.2010
Сообщений: 40
По умолчанию вывести различные цифры

Программа должна выводить 6 различных цифер
Код:
var k,i:integer;
x,s:string;
begin
randomize;
k:=0;
repeat
a:=random(9);
str(a,x);
for i:=1 to length(s)-1 do
if s[i]<>x then begin
 s:=s+x;
 k:=k+1;
 end;
until k=6;
write(s);
end.
происходит зацикливание, почему?
DinamoBrynsk вне форума Ответить с цитированием
Старый 06.01.2011, 17:05   #2
xDyPx
Форумчанин
 
Аватар для xDyPx
 
Регистрация: 21.01.2009
Сообщений: 148
По умолчанию

Скорее всего, это условие
Код:
if s[i]<>x then begin
 s:=s+x;
 k:=k+1;
 end;
не срабатывает.
МОЙ САЙТ
Компьютер позволяет решать все те проблемы, которые до появления компьютера не существовали.
xDyPx вне форума Ответить с цитированием
Старый 06.01.2011, 17:17   #3
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Предположим что строка имеет вид 1234, а Random вернуло цифру 5.

Что будет происходить с k? Предположим k = 0.

Код:
for i:=1 to length(s)-1 do
if s[i]<>x then 
   begin

   s:=s+x;

   k:=k+1;

   end;
Проходя в цикле for всю строку будет выполняться условие s[i]<>x, так как [1,2,3,4] <> 5 и код внутри if будет выполнен 3 раза (ибо to length(s)-1). Тоесть за раз этот код прибавит к k сразу 3 раза.

В следствии чего может произойти так что until k=6;никогда не отработает.

PS: переменная a не указана в var.

Вариант исправления (непроверялся):

Код:
begin
randomize;
k:=0;

repeat

a:=random(9);
str(a,x);

k := k + 1; // сразу прибавим что цифра добавлена
for i:=1 to length(s)-1 do
if s[i] = x then begin // если встретим эту цифру то...
 k:=k-1; // вычтим обратно из k
 Break; // выйдем из цикла for.
 end;

until k=6;
Правда надо ещё со строкой подумать... Надо также прибавить к строке цифру, а потом если нашли повторное число то удалить её...
Сливочное масло Valio - компиляция как по маслу

Последний раз редактировалось Stilet; 06.01.2011 в 18:41.
Valio вне форума Ответить с цитированием
Старый 06.01.2011, 17:30   #4
DinamoBrynsk
Пользователь
 
Регистрация: 19.08.2010
Сообщений: 40
По умолчанию

Предположим что строка имеет вид 1234, а Random вернуло цифру 5.
Что будет происходить с k? Предположим k = 0.
Почему к=0??? будет равно 4, потому что в изначально строка пустая
DinamoBrynsk вне форума Ответить с цитированием
Старый 06.01.2011, 17:37   #5
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Цитата:
Сообщение от DinamoBrynsk Посмотреть сообщение
Предположим что строка имеет вид 1234, а Random вернуло цифру 5.
Что будет происходить с k? Предположим k = 0.
Почему к=0??? будет равно 4, потому что в изначально строка пустая
Смысл был в том, что твой код будет делать k := k + 1 столько раз сколько выполниться s[i]<>x. А это условие может выполниться более одного раза при проходе по строке.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 06.01.2011, 17:44   #6
DinamoBrynsk
Пользователь
 
Регистрация: 19.08.2010
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Valio Посмотреть сообщение
А это условие может выполниться более одного раза при проходе по строке.
почему ведь в строке будут всегда разные цифры
DinamoBrynsk вне форума Ответить с цитированием
Старый 06.01.2011, 17:48   #7
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Допиши это и смотри чему равны s, k, a.

Код:
......
Write(s, '--'); Write(a, '--'); Writeln(k); Readln;
Until k = 6;
....
Вот так будет работать как надо.

Код:
Var
  s, x : String;
  i, k, a : Integer;

Begin
Randomize;
k := 0; s := '';

Repeat
a := Random(9);
x := IntToStr(a);

s := s + x;
k := k + 1;

For i := 1 to Length(s) - 1 Do
  If s[i] = x Then
    Begin
      k := k - 1;
      Delete(s, Length(s), 1);
    End;
Write(s, '--'); Write(a, '--'); Writeln(k); Readln;
Until k = 6;

End.
Сливочное масло Valio - компиляция как по маслу

Последний раз редактировалось Stilet; 06.01.2011 в 18:42.
Valio вне форума Ответить с цитированием
Старый 06.01.2011, 18:45   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
x := IntToStr(a);
для автора на всякий случай замечу что в паскале этой функции нет и нужно писать
Код:
val(a,x,e);
Где e - еще одна переменка integer, принимающая номер ошибочного символа, если же число удается перевести в целое е сравнивается к нулю.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
различные цвета в ListBox-e Romarius Помощь студентам 4 25.12.2010 00:24
у числа вывести цифры по возрастан Артл Помощь студентам 3 16.12.2010 17:23
Обсуждаем различные WebOS. Revival001 Свободное общение 8 15.02.2010 00:32
Сортирует цифры по строкам, а надо чтобы сортировала цифры , записанные через пробелы Алексей_xXx Помощь студентам 14 06.05.2009 17:42