Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачи на программирование на C / 17 сообщений из 17, страница 1 из 1
29.11.2014, 11:42
    #38820205
Winplex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
Пусть во входном потоке находится последовательность символов, заканчивающаяся точкой (кодировка ASCII). Вывести в выходной поток последовательность символов, измененную следующим образом:
1) удалить все комбинации символов the;
2) оставить только те группы цифр, которые составлены из подряд идущих цифр с возрастающими значениями; все остальные цифры и группы цифр удалить ( другие символы копировать в выходной поток без изменения);

Необходимо использовать только функции чтения/записи символов в поток (putchar, getchar,getch,getche). Предполагается, что задачи можно выполнить без массивов и указателей. Но всё обстоит так, что нам необходимо запоминать предыдущие последовательности символов и пропускать их, если, например, последовательность подряд идущих цифр нарушается. Как быть?
...
Рейтинг: 0 / 0
29.11.2014, 13:42
    #38820252
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
Тут нужно максимум 2 переменные для запоминания двух предыдущих символов. Никаких массивов.
...
Рейтинг: 0 / 0
29.11.2014, 16:04
    #38820305
Winplex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
Я вроде так и делал. В задании не сказано, должны ли последовательности цифр отстоять друг от друга. Ну, например, в поток вводятся символы 0123458745789. После первой 5 порядок нарушается, но неизвестно, значит ли это, что такую последовательность нужно исключить целиком. Получается, что все предыдущие символы необходимо запоминать, чтобы в случае, когда последовательность удовлетворяет условию, вывести её.
...
Рейтинг: 0 / 0
29.11.2014, 16:22
    #38820309
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
Winplex,

если они идут подряд, зачем запоминать их все?
...
Рейтинг: 0 / 0
29.11.2014, 17:12
    #38820321
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
Winplex, формулировка задания действительно неоднозначна и позволяет понять его минимум тремя разными способами. Но вне зависимости от этого подумайте об одном простом факте: любую возрастающую последовательность цифр можно сохранить в виде одной логической и одной интовой переменных.
...
Рейтинг: 0 / 0
29.11.2014, 18:02
    #38820329
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
хватит и десяти бит, т.е. одного word )
...
Рейтинг: 0 / 0
30.11.2014, 11:49
    #38820596
Winplex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
softwarerWinplex, формулировка задания действительно неоднозначна и позволяет понять его минимум тремя разными способами. Но вне зависимости от этого подумайте об одном простом факте: любую возрастающую последовательность цифр можно сохранить в виде одной логической и одной интовой переменных.
имеется ввиду упаковка этих самых цифр в один int? Нет, не думаю, что в задании такое подразумевается...
...
Рейтинг: 0 / 0
30.11.2014, 15:27
    #38820703
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
Aleksandr Sharahovесли они идут подряд, зачем запоминать их все?
"Возрастающие" != "монотонно возрастающие". В примере последовательность цифр возрастает до 8, и только потом идёт падение.
...
Рейтинг: 0 / 0
30.11.2014, 16:42
    #38820741
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
А если вспомнить про такое понятие как рекурсия, то дополнительные переменные не нужны (ну то есть данные сохраняться конечно будут, но неявно... в стеке).

А вообще, автор похоже заморачивается, так как формулировка задачи явно для начинающих... и какие там извороты нужны тогда? :)
...
Рейтинг: 0 / 0
30.11.2014, 20:06
    #38820840
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
Dimitry SibiryakovAleksandr Sharahovесли они идут подряд, зачем запоминать их все?
"Возрастающие" != "монотонно возрастающие". В примере последовательность цифр возрастает до 8, и только потом идёт падение.



А еще "возрастающие" != "убывающие".

Я, вроде, нигде не просил что-то мне объяснить :-)
...
Рейтинг: 0 / 0
01.12.2014, 09:30
    #38821031
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
softwarer,

я тут раскинул мозгом в метро, вроде одного integer должно хватить вообще на всю программу
...
Рейтинг: 0 / 0
01.12.2014, 15:16
    #38821441
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
это не самый минимум по памяти для переменных,
можно еще по крайней мере 10 бит сэкономить,
но ценой еще большего ущерба понятности

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
// bits  10987654 32109876 54321098 76543210
// data  DDDDDDDD DDDDDDDD LLLLLLLL CCCCCCCC
// CCCCCCCC = input char
// LLLLLLLL = number of saved ciphers or 255 if wrong sequence found
// DDDDDDDD DDDDDDDD = two saved letters or 10 digit flags

var
  d: cardinal;
begin;
  d:=0;
  while true do begin;
    Read(pchar(@d)^);                                                //read data to the low byte
    case chr(d) of
      '0'..'9': begin;                                               //digit input
        d:=d-ord('0');                                               //decrement digit base
        if d and $FF00=0 then while d and $FFFF0000<>0 do begin;     //flush saved chars
          write(chr(d shr 16));
          d:=d and $FFFF or d shr 8 and $00FF0000;
          end;
        if d and $FF00=$FF00 then {nothing}                          //skip wrong digit sequence
        else if d>=1 shl (d and $FF + 16) then d:=d or $FF00         //wrong digit sequence found
        else d:=d or 1 shl (d and $FF + 16) + $100;                  //save digit and increment counter
        end;
      else begin;                                                    //non-digit input
        if d and $FF00<>0 then begin;                                //digits in buffer
          if (d and $FF00>$100) and (d and $FF00<$FF00) then begin;  //valid counter - flush digits
            d:=d and $FFFF00FF;
            while d and $FFFF0000<>0 do begin;
              if d and $10000<>0 then write(chr(d shr 8 and $FF + ord('0')));
              d:=d shr 1 and $FFFF0000 or d and $FFFF + $100;
              end;
            end;
          d:=d and $FF;
          end;
        if (chr(d)<>'t') and (chr(d)<>'h') and (chr(d)<>'e')         //not our char
        or (chr(d shr 16)=chr(d))                                    //or our char matched with the first char
        or (chr(d shr 24)=chr(d)) then begin;                        //or our char matched with the second char
          while d and $FFFF0000<>0 do begin;                         //flush saved chars
            write(chr(d shr 16));
            d:=d and $FFFF or d shr 8 and $00FF0000;
            end;
          if (chr(d)<>'t') and (chr(d)<>'h') and (chr(d)<>'e') then begin; //not our char
            write(chr(d));
            if chr(d)='.' then break;
            d:=0;
            end
          else d:=d and $FF shl 16;
          end
        else if d and $FF0000=0 then d:=d and $FF shl 16             //save our char as the first char
        else if d and $FF000000=0 then d:=d and $FF0000 or d and $FF shl 24 //as the second char
        else d:=0;                                                   //eat 3 our chars
        end;
      end; //case
    end;
  Readln; //debug
  Readln; //debug
  end.

...
Рейтинг: 0 / 0
01.12.2014, 15:17
    #38821444
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
Aleksandr Sharahov, в Сях есть битовые структуры. Самое оно для такой задачи.
...
Рейтинг: 0 / 0
01.12.2014, 15:19
    #38821445
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
1) удалить все комбинации символов the;

Для этого нужно запомнить макс. 3 идущих подряд символа.

2) оставить только те группы цифр, которые составлены из подряд идущих цифр с возрастающими значениями; все остальные цифры и группы цифр удалить ( другие символы копировать в выходной поток без изменения);

тут речь идёт о неопределённо длинной последовательности из цифр, которые надо обрабатывать, т.е. о последовательности цифр бесконечной длинны. Для её хранения нужна память, тут никуда не денешься.

Можно это обрабатывать в два прохода чтения исходного потока, но не понятно, можно ли это делать, и тогда нужна память для
сохранения смещений цифровых групп.

Так что требования:

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

невыполнимы.
...
Рейтинг: 0 / 0
01.12.2014, 15:29
    #38821460
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
MasterZivтут речь идёт о неопределённо длинной последовательности из цифр, которые надо обрабатывать,
Неверно. Попробуйте построить максимально возможную последовательность.
...
Рейтинг: 0 / 0
01.12.2014, 15:30
    #38821465
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
MasterZivДля этого нужно запомнить макс. 3 идущих подряд символа.
Для этого нужно максимум два флага.
...
Рейтинг: 0 / 0
01.12.2014, 23:31
    #38822046
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачи на программирование на C
softwarerAleksandr Sharahov, в Сях есть битовые структуры. Самое оно для такой задачи.

На Паскальных записях тот код, если только не пытаться его дальше ужимать, тоже вполне прилично будет выглядить:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
type
  TRecord= packed record
    C: char;                  //input char
    L: byte;                  //number of saved digits or 255 if wrong sequence found
    case boolean of
      true: (W: word);        //10 digit flags
      false: (D1, D2: char);  //two saved letters
    end;

var
  R: TRecord;
begin;
  FillChar(R, SizeOf(R), 0);
  with R do while true do begin;
    Read(C);                                                       //read data to the low byte
    if ('0'<=C) and (C<='9') then begin;                           //digit input
      dec(C, ord('0'));                                            //decrement digit base
      if L=0 then while D1<>#0 do begin;                           //flush saved chars
        write(D1);
        D1:=D2;
        D2:=#0;
        end;
      if L=255 then {nothing}                                      //skip wrong digit sequence
      else if W>=1 shl byte(C) then L:=255                         //wrong digit sequence found
      else begin;                                                  //save digit and increment counter
        W:=W or 1 shl byte(C);
        inc(L);
        end;
      end
    else begin;                                                    //non-digit input
      if L<>0 then begin;                                          //digits in buffer
        if (1<L) and (L<255) then begin;                           //valid counter - flush digits
          L:=0;
          while W<>0 do begin;
            if W and 1<>0 then write(chr(L + ord('0')));
            W:=W shr 1;
            inc(L);
            end;
          end;
        W:=0;
        L:=0;
        end;
      if (C<>'t') and (C<>'h') and (C<>'e')                        //not our char
      or (C=D1)                                                    //or our char matched with the first char
      or (C=D2) then begin;                                        //or our char matched with the second char
        while D1<>#0 do begin;                                     //flush saved chars
          Write(D1);
          D1:=D2;
          D2:=#0;
          end;
        if (C<>'t') and (C<>'h') and (C<>'e') then begin;          //not our char
          write(C);
          if C='.' then break;
          end
        else D1:=C;                                                //save our char as the first char
        end
      else if D1=#0 then D1:=C                                     //save our char as the first char
      else if D2=#0 then D2:=C                                     //as the second char
      else begin;                                                  //eat 3 our chars
        D1:=#0;
        D2:=#0;
        end;
      end;
    end;
  Readln; //debug
  Readln; //debug
  end.



Идея того кода была в том, чтобы использовать "одну целочисленную переменную".
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачи на программирование на C / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]