Как на паскале найти одинаковые числа

flire

0 / 0 / 1

Регистрация: 04.10.2009

Сообщений: 5

1

Поиск одинаковых цифр в числе

04.10.2009, 16:57. Показов 14446. Ответов 6

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте. Обращаюсь к знающим людям за помощью. Вопрос таков: есть задание – написать программу на Pascal, вычисляющую, есть ли одинаковые цифры в введённом числе. Скажите, в чём ошибка в приведённом ниже коде?

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
program odinak;
uses crt;
label again;
var
   k,n,n1,counter: integer;
   c:char;
begin
again: clrscr;
writeln('Vvedite chislo:');
readln(n);
counter:=0;
    while (n>0) do begin
        k:=(n mod 10);
        n:=(n div 10);
        n1:=n;
            while (n1>0) do begin
                if k=(n1 mod 10) then counter:=counter+1;
                n1:=(n1 div 10);
            end;
    end;
if counter<>0
    then writeln('Da.')
    else writeln ('Net.');
writeln('Again?');
readln(c);
if c='y' then goto again;
end.

Заранее спасибо.



0



Почетный модератор

64285 / 47584 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

04.10.2009, 17:37

2

А почему Вы считаете что тут ошибка? Немного потестировал, вроде работает.

Добавлено через 1 минуту
Единственно, это бы заменить goto на repeat .. until.



0



0 / 0 / 1

Регистрация: 04.10.2009

Сообщений: 5

04.10.2009, 19:35

 [ТС]

3

Странно, у меня не работает… Например, при числе 1234567890 выдаёт “Да”.



0



Эксперт по компьютерным сетямЭксперт Pascal/Delphi

4188 / 1289 / 237

Регистрация: 27.07.2009

Сообщений: 3,961

04.10.2009, 19:39

4

используй вместо integer – longint
или вообще string используй.



1



Почетный модератор

64285 / 47584 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

04.10.2009, 19:52

5

flire, Ты бы еще 265515155151456516566651656545 ввел. Хочешь длинные числа, используй строки, как тебе говорят, тогда алгоритм вообще другой будет.



0



Эксперт по компьютерным сетямЭксперт Pascal/Delphi

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

Помогаю со студенческими работами здесь

Поиск чисел, состоящих из одинаковых цифр
Суть такая, дано число от одного до 10 000, надо в выходном файле написать количество натуральных…

Нужна программка, определяющая наличие одинаковых цифр в числе!
Помогите, пожалуйста! У меня была идея но там надо знать количество цифр в числе! А количество…

Нужна программа, которая вычисляет количество одинаковых цифр в введенном числе(около 5 символов))
Помогите, нужна программа, которая вычисляет количество одинаковых цифр в введенном числе(около 5…

Поиск одинаковых цифр в числе
Ребята, помогите решить задачу, в программировании я совсем новичок. Никаких сложных кодов, в…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

7

ПЛАН-КОНСПЕКТ

учебного занятия кружка «Компьютер и информационные технологии»

Тема учебного занятия: «Определение одинаковых цифр в заданном пользователем трёхзначном (четырёхзначном) числе (язык программирования Pascal)».

Цель учебного занятия: научить составлять программы с использованием условного оператора, с применением арифметической функции int(x) и с применением логических операций в Pascal.

Задачи учебного занятия:

Образовательные:

  • сформировать знания о полной и краткой формах условного оператора в языке программирования Pascal;

  • сформировать умения составлять программы с использованием арифметических функций и логических операций языка программирования Pascal.

Развивающие: развивать познавательные, интеллектуальные и творческие способности обучающихся;

Воспитательные: воспитывать информационную культуру обучающихся, самостоятельность, внимательность, дисциплинированность.

Методы работы: беседа, практическая работа на ПК.

Формы работы: индивидуальная.

Оборудование: персональные компьютеры, доска, мел.

Программное обеспечение: операционная система Windows7, язык программирования Pascal.

Дидактические материалы: карточки с заданиями.

План.

  1. Организационный этап.

  2. Активизация имеющихся знаний обучающихся. Постановка цели и задач учебного занятия. Мотивация учебной деятельности обучающихся.

  3. Изучение нового материала (формирование новых знаний).

  • понятие условного оператора полной и краткой формы;

  • ознакомление с арифметическими функциями языка программирования Pascal;

  • ознакомление с логическими операциями языка программирования Pascal.

  1. Практическая работа.

  2. Рефлексия (подведение итогов учебного занятия).

Ход учебного занятия.

  1. Организационный этап.

Приветствие, проверка присутствующих. Текущий инструктаж по технике безопасности.

  1. Активизация имеющихся знаний обучающихся. Постановка цели и задач учебного занятия. Мотивация учебной деятельности обучающихся.

а )методом фронтального опроса:

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.

  1. Изучение нового материала (формирование новых знаний).

В языке программирования 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. Определить есть ли среди цифр заданного трёхзначного числа одинаковые.

Решение задачи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.

  1. Рефлексия (подведение итогов учебного занятия).

Закрепление изученного материала – демонстрация выполненных работ обучающихся.

Цель нашего учебного занятия выполнили?

Самостоятельно оцените себя.

Я бы сделал так: сохранил бы каждое число, имеющееся в матрице, в один одномерный массив. А в другой массив записывал бы сколько таких чисел в матрице. Хотя здесь, как мне кажется, лучше создать объект типа запись с 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.
  • Автор

    Сообщения

  • Для ответа в этой теме необходимо авторизоваться.

Добавить комментарий