flire 0 / 0 / 1 Регистрация: 04.10.2009 Сообщений: 5 |
||||
1 |
||||
Поиск одинаковых цифр в числе04.10.2009, 16:57. Показов 14446. Ответов 6 Метки нет (Все метки)
Здравствуйте. Обращаюсь к знающим людям за помощью. Вопрос таков: есть задание – написать программу на Pascal, вычисляющую, есть ли одинаковые цифры в введённом числе. Скажите, в чём ошибка в приведённом ниже коде?
Заранее спасибо.
0 |
Почетный модератор 64285 / 47584 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
04.10.2009, 17:37 |
2 |
А почему Вы считаете что тут ошибка? Немного потестировал, вроде работает. Добавлено через 1 минуту
0 |
0 / 0 / 1 Регистрация: 04.10.2009 Сообщений: 5 |
|
04.10.2009, 19:35 [ТС] |
3 |
Странно, у меня не работает… Например, при числе 1234567890 выдаёт “Да”.
0 |
⚽ 4188 / 1289 / 237 Регистрация: 27.07.2009 Сообщений: 3,961 |
|
04.10.2009, 19:39 |
4 |
используй вместо integer – longint
1 |
Почетный модератор 64285 / 47584 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
04.10.2009, 19:52 |
5 |
flire, Ты бы еще 265515155151456516566651656545 ввел. Хочешь длинные числа, используй строки, как тебе говорят, тогда алгоритм вообще другой будет.
0 |
⚽ 4188 / 1289 / 237 Регистрация: 27.07.2009 Сообщений: 3,961 |
|
04.10.2009, 19:56 |
6 |
ну строки тут нафиг, впринципе, не нужны, т.к. если цифр в числе больше 10, то по любому встречаются одинаковые цифры )))
1 |
Почетный модератор 64285 / 47584 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
04.10.2009, 20:49 |
7 |
TAVulator, +10!
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
04.10.2009, 20:49 |
Помогаю со студенческими работами здесь Поиск чисел, состоящих из одинаковых цифр Нужна программка, определяющая наличие одинаковых цифр в числе! Нужна программа, которая вычисляет количество одинаковых цифр в введенном числе(около 5 символов)) Поиск одинаковых цифр в числе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 7 |
ПЛАН-КОНСПЕКТ
учебного занятия кружка «Компьютер и информационные технологии»
Тема учебного занятия: «Определение одинаковых цифр в заданном пользователем трёхзначном (четырёхзначном) числе (язык программирования Pascal)».
Цель учебного занятия: научить составлять программы с использованием условного оператора, с применением арифметической функции int(x) и с применением логических операций в Pascal.
Задачи учебного занятия:
Образовательные:
-
сформировать знания о полной и краткой формах условного оператора в языке программирования Pascal;
-
сформировать умения составлять программы с использованием арифметических функций и логических операций языка программирования Pascal.
Развивающие: развивать познавательные, интеллектуальные и творческие способности обучающихся;
Воспитательные: воспитывать информационную культуру обучающихся, самостоятельность, внимательность, дисциплинированность.
Методы работы: беседа, практическая работа на ПК.
Формы работы: индивидуальная.
Оборудование: персональные компьютеры, доска, мел.
Программное обеспечение: операционная система Windows7, язык программирования Pascal.
Дидактические материалы: карточки с заданиями.
План.
-
Организационный этап.
-
Активизация имеющихся знаний обучающихся. Постановка цели и задач учебного занятия. Мотивация учебной деятельности обучающихся.
-
Изучение нового материала (формирование новых знаний).
-
понятие условного оператора полной и краткой формы;
-
ознакомление с арифметическими функциями языка программирования Pascal;
-
ознакомление с логическими операциями языка программирования Pascal.
-
Практическая работа.
-
Рефлексия (подведение итогов учебного занятия).
Ход учебного занятия.
-
Организационный этап.
Приветствие, проверка присутствующих. Текущий инструктаж по технике безопасности.
-
Активизация имеющихся знаний обучающихся. Постановка цели и задач учебного занятия. Мотивация учебной деятельности обучающихся.
а )методом фронтального опроса:
1. На какие основные части разделяется программа, пишущаяся на языке программирования Pascal? (на три основные части: заголовок программы, раздел объявления величин, тело программы);
2. Каким служебным словом обозначается название программы? (Program);
3. Какие существуют правила записи названия программы? (название программы записывается при помощи букв английского алфавита, допустимо использование арабских цифр, но заголовок не должен начинаться с цифры, длина названия программы должна быть не более 256 символов и не должна содержать пробелов);
4. Какой оператор предваряет раздел объявления переменных? (оператор Var);
5. Как выглядит запись объявления раздела переменных ?
(Var : 😉 ;
6. Каким служебным словом записывается начало тела программы? (Begin);
б) методом решения задач:
Задание №1
Найти ошибки в программах:
а) Написать программу на Pascal, вычисляющую площадь круга.
Program Z1;
Var R,S: integer;
Begin;
Read (R);
S=3,14*SQR(R);
Write (S);
End
б) Написать программу, вычисляющую значение функции у=у1-у2, если у1= 2.5х, а у2=5+х;
Program Z2;
Var x,y,y1,y2: Real;
Begin;
Write (x);
y:= y1- у2;
y1:=2.5*x;
у2=5+х;
Read (y);
End.
-
Изучение нового материала (формирование новых знаний).
В языке программирования Pascal предусмотрены следующие основные арифметические функции:
АРИФМЕТИЧЕСКИЕ ФУНКЦИИ (ОСНОВНЫЕ)
Функция |
Назначение |
Тип результата |
abs (x) |
абсолютное значение аргумента |
совпадает с типом аргумента |
sqr (x) |
квадрат аргумента |
совпадает с типом аргумента |
sqrt (x) |
квадратный корень аргумента |
вещественный |
cos (x) |
косинус аргумента |
вещественный |
sin (x) |
синус аргумента |
вещественный |
arctan (x) |
арктангенс аргумента |
вещественный |
exp (x) |
ex |
вещественный |
ln (x) |
натуральный логарифм |
вещественный |
int (x) |
целая часть числа |
вещественный |
frac (x) |
дробная часть числа |
вещественный |
В языке программирования Pascal предусмотрены следующие логические операции:
true xor true = false
true xor false = true
false xor true = true
false xor false = false
-
Конъюнкция (логическое умножение, пересечение) – and. Выражение a and b дает значение true только в том случае, если a и b имеют значение true. Во всех остальных случаях значения выражения a and b дает false.
-
true and true = true
-
true and false = false
-
false and true = false
false and false = false
-
Дизъюнкция (логическое сложение, объединение) – or. Выражение a or b дает значение false только в том случае, если a и b имеют значение false. Во всех остальных случаях результат – true.
-
true or true = true
-
true or false = true
-
false or true = true
false or false = false
-
Отрицание (инверсия) – not. Выражение not a имеет значение, противоположное значению a.
-
not true = false
not false = true
-
Исключающее ИЛИ – xor. Выражение a xor b дает значение true только в том случае, когда только один из операндов имеет значение true.
Последовательность выполнения логических операторов: not, and, or.
В языке Паскаль сначала выполняются логические операторы (and, or, xor, not), а уже потом операторы отношений (, =, , =), поэтому не нужно забывать расставлять скобки в сложных логических выражениях.
Далее мы переходим к изучению раздела «Алгоритмы ветвления».
Для решения такого типа задач необходимо узнать как выглядит блок оператора условия в графическом способе представления алгоритмов:
Блок-схема неполной формы оператора условия:
В неполном ветвлении ветвь Else отсутствует.
На рисунке показана блок схема оператора if-then.
If условие
Then [оператор1]
Блок-схема полной формы оператора условия:
На рисунке показана блок-схема полной формы оператора.
If условие
Then [оператор1]
Else [оператор2];
-
Практическая работа.
Задача 1. Определить есть ли среди цифр заданного трёхзначного числа одинаковые.
Решение задачи1.
program z28; {заголовок программы}
uses crt; {подключение библиотек}
var k,n,c,p:real; {описание переменных, которые используются в программе}
begin
clrscr;
writeln(’Задайте трёхзначное число’);
readln(n);
k:=n-int(n/10)*10;{определяем число единиц}
n:=int(n/10);{от исходного числа отбрасываем число единиц}
c:=n-int(n/10)*10; {определяем число десятков}
n:=int(n/10);{от исходного числа отбрасываем число десятков}
p:=n-int(n/10)*10; {определяем число сотен}
if (k=c) and (c=p) then writeln(’Три одинаковых’) else
begin
if (k=c) or (c=p) or (p=k) then writeln(’Два одинаковых’)
else writeln(’Нет одинаковых’);
if (p=c) then writeln(’Одинаковы первое и второе’);
if (c=k) then writeln(’Одинаковы второе и третье’);
if (p=k) then writeln(’Одинаковы первое и третье’);
end;
readkey;
end.
Задача 2. Определить есть ли среди цифр заданного четырёхзначного числа одинаковые.
Решение задачи2.
program z29; {заголовок программы}
uses crt; {подключение библиотек}
var k,n,c,p,l:real; {описание переменных, которые используются в программе}
begin
clrscr;
writeln(’Задайте четырёхзначное число’);
readln(n);
k:=n-int(n/10)*10;{определяем число единиц}
n:=int(n/10);{от исходного числа отбрасываем число единиц}
c:=n-int(n/10)*10; {определяем число десятков}
n:=int(n/10);{от исходного числа отбрасываем число десятков}
p:=n-int(n/10)*10; {определяем число сотен}
n:=int(n/10);{от исходного числа отбрасываем число сотен}
l:=n-int(n/10)*10; {определяем число тысяч}
if (l=p) and (p=c) and (c=k) then writeln(’Четыре одинаковых’) else
begin
if ((k=c) and (c=p)) or ((k=p) and (p=l)) or ((c=p) and (p=l)) then writeln(’Три одинаковых’) else
begin
if (k=c) or (c=p) or (p=k) or (l=k) or (c=l) or (l=p)) then writeln(’Два одинаковых’) else writeln(’Нет одинаковых’);
if (l=p) then writeln(’Одинаковы первое и второе’);
if (p=c) then writeln(’Одинаковы второе и третье’);
if (c=k) then writeln(’Одинаковы третье и четвёртое’);
if (l=c) then writeln(’Одинаковы первое и третье’);
if (l=k) then writeln(’Одинаковы первое и четвёртое’);
if (p=k) then writeln(’Одинаковы второе и четвёртое’);
end;
end;
readkey;
end.
-
Рефлексия (подведение итогов учебного занятия).
Закрепление изученного материала – демонстрация выполненных работ обучающихся.
Цель нашего учебного занятия выполнили?
Самостоятельно оцените себя.
Я бы сделал так: сохранил бы каждое число, имеющееся в матрице, в один одномерный массив. А в другой массив записывал бы сколько таких чисел в матрице. Хотя здесь, как мне кажется, лучше создать объект типа запись с 2-мя полями: “элемент” и “встретился раз”, потом создать массив этих записей. В цикле в поле “элемент” записать число, если его в этом массиве ещё нет, и во вложенном цикле считать количество таких же чисел. Примерно так…
Идея @Dex, конечно, в плане реализации проще, вот код.
Const
N0=40;
Var
A: Array[0..N0-1, 0..N0-1] Of Integer;
Mas: Array[0..N0*N0-1] Of Integer;
Col, MasInd, ElCol, SortInd: Word;
Tmp: Integer;
i, j, N: Byte;
begin
Repeat
Write('N = ');
ReadLn(N);
Until ((N>0) And (N<40)); // < 40 так задумано,
// 39-ый (40-ой) элемент нужен для последнего цикла, если N=39
MasInd:=0;
Randomize;
For i:=0 To N-1 Do
Begin
For j:=0 To N-1 Do
Begin // здесь делаю сразу всё то, что связано с матрицей
A[i, j]:=Random(10);
Mas[MasInd]:=A[i, j]; // заполняю массив элеметами
Inc(MasInd);
Write(' ', A[i, j]:3);
End;
WriteLn;
End;
ElCol:=N*N; // число элементов массива
Dec(ElCol);
WriteLn;
// пузырьковая сортировка: один из самых медленных алгоритмов, но краткий по объёму кода
For MasInd:=0 To ElCol-1 Do
For SortInd:=MasInd+1 To ElCol Do
If (Mas[MasInd]>Mas[SortInd]) Then
Begin
Tmp:=Mas[MasInd];
Mas[MasInd]:=Mas[SortInd];
Mas[SortInd]:=Tmp;
End;
{ For MasInd:=0 To ElCol Do
WriteLn(Mas[MasInd]); проверка сортировки }
MasInd:=0;
While (MasInd<=ElCol) Do // здесь и осуществляется перебор
Begin
i:=0;
Tmp:=Mas[MasInd];
Repeat // здесь считаю количество (можно переписать и с While)
Inc(i); // количество
Inc(MasInd);
Until (Tmp<>Mas[MasInd]);
WriteLn('Element ', Mas[MasInd-1], ' vstretilsya ', i ,' raz.');
End;
ReadLn;
end.
PascalABC.NET 3.3.5, сборка 1659 от 09.04.2018
Внимание! Если программа не работает, обновите версию!
function Duplicates(a,b:int64):array of char;
begin
var ha:=a.ToString.ToHashSet;
ha.IntersectWith(b.ToString.ToHashSet);
Result:=ha.ToArray
end;
begin
var m,n:int64;
Write(‘Введите через пробел два натуральных числа: ‘);
Read(m,n);
var r:=Duplicates(m,n);
if r.Length=0 then Writeln(‘Нет цифр, встречающихся в обоих числах’)
else r.Println(‘,’)
end.
Примеры
Введите через пробел два натуральных числа: 12345 6789067
Нет цифр, встречающихся в обоих числах
Введите через пробел два натуральных числа: 1342103 6748644
4
Реализация без множеств
procedure nToArray(n:int64; a:array of boolean);
begin
for var i:=0 to 9 do a[i]:=False;
if n=0 then a[0]:=True
else
while n>0 do begin
a[n mod 10]:=True;
n:=n div 10
end
end;
function Duplicates(a,b:int64):array of boolean;
begin
var ma:=new boolean[10];
var mb:=new boolean[10];
nToArray(a,ma);
nToArray(b,mb);
Result:=new boolean[10];
for var i:=0 to 9 do
Result[i]:=ma[i] and mb[i]
end;
begin
var m,n:int64;
Write(‘Введите через пробел два натуральных числа: ‘);
Read(m,n);
var r:=Duplicates(m,n);
Write(‘Совпадающие цифры: ‘);
for var i:=0 to 9 do
if r[i] then Write(i,’ ‘);
Writeln
end.
Пример
Введите через пробел два натуральных числа: 12352423 98789635233
Совпадающие цифры: 2 3 5
Вот именно эти детали. Тип для массива определить, обеспечить инициализации, массив не может быть возвращен функцией, … кое что еще – так и набежит.
Поиск в массиве одинаковых элементов
- В этой теме 0 ответов, 1 участник, последнее обновление 6 лет, 1 месяц назад сделано Васильев Владимир Сергеевич.
-
Сообщения
-
-
На языке Pascal проверить есть ли в заполненном случайными числами массиве элементы с одинаковыми значениями.
program arrays_9; uses crt; var n, i, j: integer; b: boolean; A: array[1..100] of integer; begin clrscr; randomize; b:=false; write('Количество элементов > '); read(n); for i:=1 to n do begin A[i]:=random(10); write(A[i], ' '); if i>1 then for j:=i-1 downto 1 do if A[i]=A[j] then b:=true; end; if b then write('Одинаковые элементы в массиве имеются') else write('Одинаковых элементов в массиве нет'); readkey; end.
-
-
Автор
Сообщения
- Для ответа в этой теме необходимо авторизоваться.