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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 17.04.2012, 11:26   #1
Paster Fob
Форумчанин
 
Аватар для Paster Fob
 
Регистрация: 06.02.2011
Сообщений: 105
По умолчанию Ошибка или глюк?

Здравствуйте уважаемые спецы.Я пытался решить вот это задание:
http://programmersforum.ru/showthread.php?t=195695
код написал,но программа работает неправильно.Вместо нужного ответа выводит содержимое константы на экран.Почему не знаю,код как мне кажется правильный.В отладчике в пошаговом режиме всё работает и результат верный.Но как только запускаю программу ответ совершенно другой.
Если переделать в английские символы,то всё работает правильно.
Почему так?Вот мой код:
Код:
type tset=set of char;

const sen=['б'..'д','ж','з','к'..'н','п','р'..'т','ф'..'щ'];
      str='мама,папа,сын,дочь,свекровь,тесть,зять,сноха';

procedure readset(var afile:text;var aset:tset);
var ch:char;
begin
  while not eoln(afile) do begin
    read(afile,ch);
    aset:=aset+[ch];
  end;
  readln(afile);
end;

procedure writeset(var aset:tset);
var ch:char;
begin
  for ch:='а' to 'я' do
    if ch in aset then
      write(ch:3);
  writeln;
end;

var f:text;sn:tset;
begin
    sn:=[];
    writeln(str);
    assign(f,'');
    reset(f);
    readset(f,sn);
    close(f);
    sn:=sen-(sn*sen);
    writeset(sn);
    readln
end.
Paster Fob вне форума
Старый 17.04.2012, 11:38   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1-е. код, который Вы написали зависит от кодировки! (т.е. от той кодировки, которую использует даный компилятор Паскаля.)
у Вас какой?

2-е. А что за фокусы с назначением текстовому файлу ПУСТОГО имени? Это как вообще?
Переменная str у Вас в программе НИКАК не задействована! Вообще! Вы её выводите на экран и больше она нигде не используется.
Я подозреваю, что Вы не так хотели.
А программа вроде бы у Вас работает.
Назначение пустого имени (по крайней мере в TurboPascal) инициирует ввод с консоли. Вводите нужные слова.
нажимайте Enter
Получите результат...

3-е. В той теме, на которую Вы ссылаетесь, задача уже решена. Чем Вас не устроило решение оттуда? (хотя, конечно, там решение не очень, но и ваше ничем не лучше!)

Последний раз редактировалось Serge_Bliznykov; 17.04.2012 в 11:44.
Serge_Bliznykov вне форума
Старый 17.04.2012, 12:44   #3
Paster Fob
Форумчанин
 
Аватар для Paster Fob
 
Регистрация: 06.02.2011
Сообщений: 105
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
1-е. код, который Вы написали зависит от кодировки! (т.е. от той кодировки, которую использует даный компилятор Паскаля.)
у Вас какой?
Запускал на FPC,TP7,Lazarus везде одно и тоже.Хотел скрин сделать,но что-то не работает клавиша Print Screen
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
2-е. А что за фокусы с назначением текстовому файлу ПУСТОГО имени? Это как вообще?
Переменная str у Вас в программе НИКАК не задействована! Вообще! Вы её выводите на экран и больше она нигде не используется.
Я подозреваю, что Вы не так хотели.
А программа вроде бы у Вас работает.
Назначение пустого имени (по крайней мере в TurboPascal) инициирует ввод с консоли. Вводите нужные слова.
нажимайте Enter
Получите результат...
str не переменная,а константа,она выводится на экран.Текстовому файлу назначается пустое имя для связки с экраном.константа выводится на экран,затем считывается с экрана через файл в множество sn.
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
3-е. В той теме, на которую Вы ссылаетесь, задача уже решена. Чем Вас не устроило решение оттуда? (хотя, конечно, там решение не очень, но и ваше ничем не лучше!)
Я просто пытался решить задание помочь так сказать тс.Пока я делал он уже сам решил.А мне стало интересно почему мой код не работает,хотя всё правильно.
Paster Fob вне форума
Старый 17.04.2012, 13:33   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Paster Fob
константа выводится на экран,затем считывается с экрана через файл в множество sn
Это только ваши наивные мечты.
Вывод на экран это одно, а ВВОД с клавиатуры - это совершенно другое. По сути - это вообще не связанные вещи.
поэтому, после вывода str - программа ждёт вашего ввода - вводите нужные слова, нажимайте Enter - наслаждайтесь результатом.

Цитата:
почему мой код не работает,хотя всё правильно.
Serge_Bliznykov вне форума
Старый 17.04.2012, 14:01   #5
Paster Fob
Форумчанин
 
Аватар для Paster Fob
 
Регистрация: 06.02.2011
Сообщений: 105
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Это только ваши наивные мечты.
Вывод на экран это одно, а ВВОД с клавиатуры - это совершенно другое. По сути - это вообще не связанные вещи.
поэтому, после вывода str - программа ждёт вашего ввода - вводите нужные слова, нажимайте Enter - наслаждайтесь результатом.

Это я уже потом переделал на константу.Изначально не было её.Проблема оказалась в лишних операторах.Я разобрался,код подредактировал.
Код:
type tset=set of char;

const sen=['б'..'д','ж','з','к'..'н','п','р'..'т','ф'..'щ'];

procedure readset(var afile:text;var aset:tset);
var ch:char;
begin
  while not eoln(afile) do begin
    read(afile,ch);
    aset:=aset+[ch];
  end;
end;

procedure writeset(var aset:tset);
var ch:char;
begin
  for ch:='а' to 'я' do
    if ch in aset then
      write(ch:3);
  writeln;
end;

var f:text;sn:tset;
begin
    sn:=[];
    assign(f,'');
    reset(f);
    readset(f,sn);
    close(f);
    sn:=sen-(sn*sen);
    writeset(sn);
    readln
end.
Теперь всё ок.спасибо за подсказку.
Paster Fob вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
глюк или паломка? раувка Компьютерное железо 2 16.06.2011 10:08
Глюк компилятора или ошибка в задаче? i.pas C++ Builder 6 29.08.2010 18:49
Ини файл ошибка(глюк или что?) dr.Chas Общие вопросы Delphi 10 18.06.2008 08:09
Глюк? Или я туплю? Nick93.93 Общие вопросы Delphi 6 04.03.2007 14:28