программа для определения цифр числа в диапазоне от 2 до 7.

здравствуйте, нужно написать программу которая проверяет все цифры числа в диапазоне от 2 до 7. если все цифры в этом диапазоне, то вывести True, иначе False. код для этой программы я написал, но работает не всегда. Не понимаю что надо исправить. Пожалуйста помогите. Вместо readinteger можете вставить любое число, чтобы проверить на работоспособность

var N := ReadInteger; var sum := 0; var a := 1; loop n do begin sum += a*a; a += 1; end; Print(sum);

Вы явно не ту программу скинули…

Кроме того, это огрызок (его нельзя выполнить как есть, надо как минимум ## добавить в начало)

И выделяйте код как принято в markdown: Extended Syntax | Markdown Guide

Если я понял задание, то можно как-то так:

## uses School;
var a:=readinteger.Digits.tohashset;
if (a.Min in |0,1|) or  (a.Max in |8,9|) then
  print(False) 
    else
  print(True); 

Что это вам даёт?

А вообще:

  1. Диапазоны быстрее чем массивы.
  2. Находить минимум и максимум это решение через 5 точку. Вы, получается, проходите всю последовательность и все элементы сравниваете друг с другом, вместо того чтобы сразу сравнить, является ли элемент подходящим.
  3. Выражение в заголовке if и так имеет тип boolean, то есть значение True или False. Поэтому if тут не нужен. Вам только вывернуть надо, но тут правило де моргана прекрасно работает - получается Print( (a.Min not in 0..1) and (a.Max not in 8..9 ) );.

В итоге то же самое но без лишнего:

## uses School;

ReadInteger.Digits.All(d->d in 2..7).Print;

Спасибо! Я пока что разбираюсь с этими нововведениями. tohashset убирает дубли. Думал, что программа быстрее заработает.

.Distinct тоже убирает дубли. Но надо пытаться разбираться как всё работает, а не использовать первый попавшийся метод.

.ToHashSet в первую очередь создаёт коллекцию элементов типа HashSet. То что там нет дублей - это вторично.

.Distinct возвращает новую последовательность, при перечислении которой будет создано множество, похожее на HashSet, на на много проще (а значит и быстрее). И на выходе при перечислении будут элементы, которые получилось добавить в это множество.

##

var d := SeqGen(1, i->Random(10)).Cycle
  .Distinct; // .ToHashSet тут зависнет

d.Take(5).Println; // Тут вычислит только первые 5 подходящих из бесконечной последовательности
d.Take(5).Println; // В отличии от .ToHashSet, .Distinct возвращает не коллекцию, поэтому тут начнёт вычислять заново

Но в обоих случаях - даже если не знать как оно работает, а подумать логически - чтобы оставить только уникальные элементы надо сравнить каждый новый элемент с предыдущими. Хеш-таблицы оптимизируют так, что обычно не с каждый предыдущим, а только похожими. Но это всё равно куча лишней работы, когда по сути вам по изначальному условию надо сопоставить каждый элемент с 2 границами единожды.

Гораздо лучше будет программа вроде этой. Она хоть и длиннее, но зато гораздо нагляднее и универсальнее:

Program digits_2to7;
Var
	n, i: int64;
	digit: integer;
	result: boolean;
Begin
	write('Input a number to test: ');
	readln(n);
	i := n;
	result := true;
	while i > 0 do begin
		digit := i mod 10;
		if (digit < 2) or (digit > 7) then begin
			result := false;
			break
		end;
		i := i div 10
	end;
	if result then
		writeln('Number n=', n, ' has no digits outside of 2-7 range.')
	else
		writeln('Number n=', n, ' has at least one digit outside of 2-7 range.')
End.

23 строки вместо двух. Я не стану вешать ярлык, кем нужно быть, чтобы иметь такое предпочтение.

1 лайк

Любую программу можно превратить в однострочник, если убрать всё форматирование, комментарии, пустые строки и так далее. Если не доходить до таких крайностей, то можно вот так:

Uses RegExpr;
Var s: string;
Begin
	readln(s);
	writeln(TRegExpr.Create('^[2-7]*$').Exec(s))
End.

Но по-моему решение на математических выражениях предпочтительней именно с педагогической точки зрения. Это же не Code Golf какой-нибудь, верно?

Кстати, заодно ответ на старое сообщение:

Не все так однозначно, это зависит от того, какая тема изучается. По поводу модуля RegExpr - да, был не в курсе, но зато немного посмеялся заметке

In 2019 year, after about 15 years of missed patches from anybody, work on TRegExpr was continued by Alexey Torgashin

Ну, если изучается не .Net, то вариант с div и mod лучше всего. Конечно, написать одну строчку на linq будет быстрее, при условии знания модуля School и синтаксиса, но толку от такой программы мало, поскольку увидеть есть ли в числе цифры вне диапазона 2-7 можно запросто глазами. Из этого можно сделать вывод, что программа нужна не для результата, а для демонстрации.

И что продемонстрирует строчка ReadInteger.Digits.All(d->d in 2..7).Print; ? Только то, что в PascalABC .Net есть разложение на цифры и всё.

А вот программа с div и mod даёт основу для других алгоритмов, например перевод числа в другую систему счисления получится минимальной модификацией этой программы, кроме того, подобное легко повторить на любом языке программирования — C, бейсик, Rust и тд, в то время как вариант с linq завязано только на .Net

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

Вариант с div и mod нужен один раз - при объяснении темы деления целых чисел и алгоритмов на основе деления и взятия остатков. Это как сортировка - один раз нужно показать алгоритм, а дальше пользоваться готовой. Да, преобразование к строке занимает несколько больше времени, чем последовательное деление и взятие остатков, но смысла в постоянном переписывании длинного алгоритма никакого нет.

А разве вопрос @Pexikk — это не есть про тот самый один раз? Так-то задачи на манипуляцию отдельными цифрами целого числа после окончания этой самой темы почти никогда не возникает, разве что во всяких занимательных задачах.

Вот сортировка — другое дело, она постоянно используется во многих программах, в том числе и практически полезных, а не учебных, например сортировка фотографий по дате и/или различным тегам.

“Задачи на манипуляцию” - посмотрите задания к ЕГЭ, например. А в школе ЕГЭ - самый важный аспект, увы…

Catcher прав: LINQ - это специфический инструмент для обработки последовательностей. Как и RedEx, мало кто знает, как он работает. Решать детские задачи с помощью LINQ имеет смысл только при изучении LINQ.

Весьма сомневаюсь, что в школе доберутся до LINQ, а основы всё равно выучат.

RAlex тоже прав: в данном случае речь идёт о последовательностях, которые вполне разумно и естественно обрабатывать с помощью LINQ.

Поэтому оба подхода верные, поэтому спорить не о чем: кому как удобнее решать задачу, тот так и решает. Если же нужно объяснить решение школьнику, то было бы странно объяснять ему, как решать задачу с помощью LINQ или RegEx.

1 : 1 - боевая ничья, победила дружба.

1 лайк

Первый/не_первый раз мы знать не можем, но делать свалку var до begin не полезно (и скорее даже вредно) для обучения на любой стадии.

“Задачи на манипуляцию” - посмотрите задания к ЕГЭ, например. А в школе ЕГЭ - самый важный аспект, увы…

Так в школе ЕГЭ — это как раз и есть проверка того, как изучены темы, в том числе доступ к отдельным цифрам в числе с помощью арифметики. А если применять другие способы, ответ, конечно, будет получен, но запланированная цель ЕГЭ достигнута не будет.

Кстати, я про это уже писал. На мой взгляд все эти фишки в PascalABC .Net, особенно модуль School — это собственно чит. Это примерно как на контрольных по математике в пятом классе разрешить калькуляторы.

Предварительное описание переменных — это не свалка, а полезная практика в целом. А если для каких-то существенных блоков кода нужны локальные переменные — это серьёзный повод задуматься, не стоит ли вынести этот блок кода в отдельную процедуру или функцию. Скорее всего это улучшит композицию и читаемость программы сильнее, чем просто описание в этом блоке кода соответствующих ему переменных само по себе.

А где именно описание переменных, непосредственно до begin или { или сразу после — это совершенно не принципиальный вопрос.

У ЕГЭ есть как сторонники, так и критики, вплоть до полного отторжения. Поэтому дискутировать тут бесполезно. Я считаю ЕГЭ идиотизмом, оглупляющим абитуриентов. Пользы от него с точки зрения получения знаний предмета - ноль. Он нацелен на получение знаний другого рода - как сдать предмет, применив одну из заранее заученных “компетенций”. В советское время компетенции были уделом выпускников ПТУ и частично техникумов. Инженеры использовали не компетенции, а знания. Поэтому советская наука всегда была на высоте. Так что задача школьника - сдать ЕГЭ и поскорее все это забыть. И в этих условиях любой “чит”, как Вы выразились, я только приветствую. ЕГЭ - зло и против зла все средства хороши.

Не согласен. Получается, что еще в далеком уже 1960 году, когда вышел язык Алгол-60, его разработчики (виднейшие умы), сделали по-вашему глупость, введя внутриблочные описания и возможность вкладывать друг в друга “матрешкой” подпрограммы.

когда вышел язык Алгол-60, его разработчики (виднейшие умы)

Ну насчёт виднейших умов — это несколько спорно, всё-таки почему-то на этом языке так никто толком и не писал, впрочем дело скорее не в умах отдельных разработчиках, а в том, что разрабатывали его большим комитетом…

сделали по-вашему глупость, введя внутриблочные описания

Почему глупость? Я не говорил, что описания внутри блоков — это плохо. Я говорил:

А где именно описание переменных, непосредственно до begin или { или сразу после — это совершенно не принципиальный вопрос.

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

ЕГЭ - это метод обучения, а проверка знаний. Я учился в советское время в челябинском политехе на хорошем факультете. Там сплошь и рядом были тесты - как машинные, так и ручные. Ни фига они не отупляют. Отупляют плохие преподы и плохие тесты.

ЕГЭ - это государственная проверка деятельности учителей, а не детей. Государство содержит школы и оплачивает труд учителей. Было бы странно, если бы государство не проверяло качество работы учителей. Учителя как в советское время, так и сейчас были невысокого уровня. Хорошие учителя умели вбивать знания, плохие - для подстраховки - вечно готовили детей к экзаменам. Что изменилось с введением ЕГЭ? - Хорошие учителя продолжают вбивать знания, плохие - готовят к ЕГЭ. Но теперь плохие учителя не могут симулировать хорошую работу, поскольку существует объективный контроль.

Мы в совё время готовились к 8 или типа того экзаменам в школе. Плюс 4 вступительных экзамена. Сдавали учителям - и хорошим, и плохим: кому как повезёт, такую отметку и получит.

Спорить можно о чём угодно, но лучше начать с изучения педагогической литературы. А там есть прекрасные примеры способов проверки знаний. В этом смысле ЕГЭ - плохой, как и все остальные, но лучший среди всех.

Я уверен, что ни Путин, ни Мишустин ЕГЭ не отменят, поэтому нужно смириться и принять ЕГЭ как должное. Более того, а кто вообще мешает школьнику самообразовываться или получать дополнительное образование? Мы в своё время так и делали и не ныли, кк современные школяры. Давно следует понять, что школа работает по государственным программам, в которых каждый час занятий расписан. Нет там времени на регексы и линки, поэтому на ЕГЭ нет таких задач, чтобы их решать таким изощрённым способом.

Я в своё время самостоятельно изучил стенографию, что помогло мне записывать лекции в институте. Нужно не ныть, а работать. Ни фиг на школу пенять, если ума нет.

1 лайк