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

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

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

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



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

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

я тут раскинул мозгом в метро, вроде одного integer должно хватить вообще на всю программу
...
Рейтинг: 0 / 0
Задачи на программирование на C
    #38821441
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это не самый минимум по памяти для переменных,
можно еще по крайней мере 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
Задачи на программирование на C
    #38821444
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov, в Сях есть битовые структуры. Самое оно для такой задачи.
...
Рейтинг: 0 / 0
Задачи на программирование на C
    #38821445
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) удалить все комбинации символов the;

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

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

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

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

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

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

невыполнимы.
...
Рейтинг: 0 / 0
Задачи на программирование на C
    #38821460
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivтут речь идёт о неопределённо длинной последовательности из цифр, которые надо обрабатывать,
Неверно. Попробуйте построить максимально возможную последовательность.
...
Рейтинг: 0 / 0
Задачи на программирование на C
    #38821465
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДля этого нужно запомнить макс. 3 идущих подряд символа.
Для этого нужно максимум два флага.
...
Рейтинг: 0 / 0
Задачи на программирование на C
    #38822046
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
17 сообщений из 17, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачи на программирование на C
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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