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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2011, 22:49   #1
enji4ka
Пользователь
 
Аватар для enji4ka
 
Регистрация: 22.01.2009
Сообщений: 45
Сообщение Двоичная система

Здравствуйте! Помогите , пожалуйста, создать проверку для заданной программы. Текст программы следующий:
Код:
type Mas1=Array [0..24] of byte;
var I,N,Kd:Integer;
                A:Mas1;
                C:char;
begin
writeln('Введите число в двоичной системе:');
    repeat
      C:=Readkey;
      val(C,I,Kd);
       if (Kd=0) then begin
         write(C);
         A[N]:=I;
         N:=N+1;
       end;
    until (C=Char(13));
Помогите,пожалуйста,сделать проверку, чтобы вводилось только число, состоящее из 1 и 0, а если в числе присутствуют другие цифры, то просят заново ввести число).Что следует исправить или дописать, и где? Подскажите, пожалуйста... Буду рада услышать любые версии.. Спасибо!

Последний раз редактировалось Stilet; 06.05.2011 в 07:39. Причина: Ошибка
enji4ka вне форума Ответить с цитированием
Старый 05.05.2011, 23:28   #2
stck
Пользователь
 
Аватар для stck
 
Регистрация: 14.06.2010
Сообщений: 84
По умолчанию

Первое что сразу увидел: начальное значение N не задано и соответственно запись вида "A[N]:=I;" с не заданным начальным значением N некорректна.
Далее: Массив имеет 25 элементов, а ввод в него с клавиатуры идет до нажатия Enter. Не разумно. Ставь условие until (c=Char(13)) or (N=24);.
Программа после var начинается с begin и заканчивается end. begin увидел,а end?
Если используешь проверку кода в val необходимо поставить директиву {$R+},тогда при недопустимом символе в представлении числа переменная Kd принимает значение номера неправильного символа, а переменная I принимает значение 0.
И вообще, по сути вопрос: зачем усложнять себе жизнь так? Почему бы не организовать ввод в строку, а затем бежать по строке с case'ом и если вдруг exception тогда попросить ввести снова?
stck вне форума Ответить с цитированием
Старый 06.05.2011, 00:04   #3
enji4ka
Пользователь
 
Аватар для enji4ka
 
Регистрация: 22.01.2009
Сообщений: 45
По умолчанию

Это только часть всей программы, т.к. это самое главное, где мне нужно понять как проверку сделать, чтобы вводилось только число, состоящее из 1 и 0, а если в числе присутствуют другие цифры, то просят заново ввести число), а то сколько не пробовала, не получается((
*в val необходимо поставить директиву {$R+} - Не могли бы вы по подробнее об этом, я об этом я ещё незнаю)Если можете, подскажите как её записывать и куда в программу)
enji4ka вне форума Ответить с цитированием
Старый 06.05.2011, 03:39   #4
stck
Пользователь
 
Аватар для stck
 
Регистрация: 14.06.2010
Сообщений: 84
По умолчанию

Ну смотри. Допустим число будет содержаться в строке. В начале программы мы ставим ввод её пользователем. Он вводит число. Допустим 01101001030.
Далее мы идем в цикле по строке и на несовпадение с заданным аргументом через такую штуку как case of. Если конец строки, а заданный флаг не изменился то продолжаем работу, иначе - выводим сообщение. Примерно это реализовать можно так:
Код:
var flag:boolean;
     s:string;
     i,k,err_code:integer;
Label a;
BEGIN
A: write('Двоичное число: '); {Метка возврата при условии ошибки}
readln(s); {Читаем строку}
for i:=0 to length(s) do      { C 1го знака строки до последнего выполняем}
     begin
         val(s[i],k,err_code); { Конвертируем текущую цифру в строке в число}
         case k of:              { При значение к равном:}
              0:flag:=true;      { Если 0 то значение флага = истина}
              1:flag:=true;      { Если 1 то значение флага = истина}
         else                       {иначе}
               begin
                    flag:=false;  {флаг - ложь (для дальнейшей проверки)}
                    goto a;        {переходим к метке А}
               end;
         end;
     end;
if flag then ..............       {Можно добавить доп. проверку}
[далее ваш код]
Директивы ставятся в основном перед основным кодом программы. Здесь не используется, т.к. она необходима для того, чтобы найти где в исходной последовательности ошибка, как я писал выше.
Удачи, если что пишите в ЛС или скайп.

Последний раз редактировалось stck; 06.05.2011 в 03:44.
stck вне форума Ответить с цитированием
Старый 06.05.2011, 04:26   #5
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

Код:
program example;
uses crt;
type mas1=array[0..24] of byte;
var A:mas1;
    c:char;
    n,code:integer;
begin
     n:=-1;
     repeat
       c:=readkey;
       if (c='0')or(c='1') then
       begin
            inc(n);
            if n<=24 then
            begin
                 val(c,A[n],code);
                 write(c);
            end;
       end;
     until c=chr(13);
end.
1) n - количество введенных значений (0 или 1) - размер массива;
2) A[n] - массив введенных значений (0 или 1);
3) все символы, не равные 0 или 1 игнорируются;
4) ввод заканчивается после нажатия клавиши Enter;
5) если юзер набьет больше 24 знаков, то пойдет игнор юзера, пока он не нажмет клавишу Enter.
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.
Sparkman вне форума Ответить с цитированием
Старый 06.05.2011, 12:30   #6
enji4ka
Пользователь
 
Аватар для enji4ka
 
Регистрация: 22.01.2009
Сообщений: 45
По умолчанию

stck, спасибо большое за помощь и подробное описание, учту на будущее)
Sparkman, спасибо большое за помощь, всё просмотрела и поняла))
Вы мне очень помогли!
enji4ka вне форума Ответить с цитированием
Старый 06.05.2011, 12:32   #7
enji4ka
Пользователь
 
Аватар для enji4ka
 
Регистрация: 22.01.2009
Сообщений: 45
По умолчанию

Цитата:
Сообщение от stck Посмотреть сообщение
Ну смотри. Допустим число будет содержаться в строке. В начале программы мы ставим ввод её пользователем. Он вводит число. Допустим 01101001030.
Далее мы идем в цикле по строке и на несовпадение с заданным аргументом через такую штуку как case of. Если конец строки, а заданный флаг не изменился то продолжаем работу, иначе - выводим сообщение. Примерно это реализовать можно так:
Код:
var flag:boolean;
     s:string;
     i,k,err_code:integer;
Label a;
BEGIN
A: write('Двоичное число: '); {Метка возврата при условии ошибки}
readln(s); {Читаем строку}
for i:=0 to length(s) do      { C 1го знака строки до последнего выполняем}
     begin
         val(s[i],k,err_code); { Конвертируем текущую цифру в строке в число}
         case k of:              { При значение к равном:}
              0:flag:=true;      { Если 0 то значение флага = истина}
              1:flag:=true;      { Если 1 то значение флага = истина}
         else                       {иначе}
               begin
                    flag:=false;  {флаг - ложь (для дальнейшей проверки)}
                    goto a;        {переходим к метке А}
               end;
         end;
     end;
if flag then ..............       {Можно добавить доп. проверку}
[далее ваш код]
Директивы ставятся в основном перед основным кодом программы. Здесь не используется, т.к. она необходима для того, чтобы найти где в исходной последовательности ошибка, как я писал выше.
Удачи, если что пишите в ЛС или скайп.
Спасибо, Вам большое! Успехов в дальнейшем!
enji4ka вне форума Ответить с цитированием
Старый 06.05.2011, 12:59   #8
enji4ka
Пользователь
 
Аватар для enji4ka
 
Регистрация: 22.01.2009
Сообщений: 45
По умолчанию

Если Вам не трудно, помогите, пожалуйста, с этой программой):
Создать текстовый массив А с 14 элементами длиною от 1 до 11 символов (текст вводится с клавиатуры). Создать 2 новых массива В и С, в один из них, в В вписать только те символы элементов массива А, которые не являются ни цифрами, ни буквами, а в С -всё остальное)
enji4ka вне форума Ответить с цитированием
Старый 06.05.2011, 16:10   #9
stck
Пользователь
 
Аватар для stck
 
Регистрация: 14.06.2010
Сообщений: 84
По умолчанию

Код:
Var a:array[14] of string[11];
     b,c:array[154] of string[1];
     i,j,current_b,current_c:integer;
     s:string;
Begin
current_b:=0; current_c:=0;
for i:= 0 to 13 do
     begin
          readln(s);
          a[i]:=s;
     end;
for i:=0 to 13 do
     s:=a[i];
     for j:=0 to length(s) do
          begin
             if s[j] not in ['A'..'Z','0'..'9'] then
                 begin 
                      b[current_b]:=s[j];
                      inc(current_b);
                 end
            else 
                 begin 
                      c[current_c]:=s[j];
                      inc(current_c);
                 end;
          end;
for i:=0 to current_b do
writeln(b[i],' ');
for i:=0 to current_c do
writeln(c[i],' ');
End.
stck вне форума Ответить с цитированием
Старый 06.05.2011, 17:09   #10
enji4ka
Пользователь
 
Аватар для enji4ka
 
Регистрация: 22.01.2009
Сообщений: 45
По умолчанию

Var a:array[14] of string[11];
b,c:array[154] of string[1];

- В этой части программы, Turbo Pascal просит .., поставила их туда...

if s[j] not in ['A'..'Z','0'..'9'] then
begin
b[current_b]:=s[j];
inc(current_b);
end
else
begin
c[current_c]:=s[j];
inc(current_c);
end;

- А здесь он пишет Boolean expression expected.((
enji4ka вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не двоичная система счисления МмлашкО_о Помощь студентам 2 11.01.2011 20:39
Двоичная Система -=L.Morgan=- Помощь студентам 3 02.07.2009 08:35
двоичная система счисления galaid Паскаль, Turbo Pascal, PascalABC.NET 3 17.05.2009 15:42
двоичная система terminadoor Помощь студентам 1 21.09.2008 23:00