Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 08.05.2022
Сообщений: 2

Перевод кода из C++ в Pascal ABC

08.05.2022, 11:15. Показов 1143. Ответов 3

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста перевести код

C++
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
AnsiString CheckFields(AnsiString Field)
   { AnsiString S = "", S1;
     int        i, j, C1, C2, ILS_Num, LastDigit, LastDigitCount;
     int        ILS14_1[12] = {9, 8, 7, 0, 6, 5, 4, 0, 3, 2, 1, 0};
     bool       Flag;
 
     S = "068-619-801 04"; // в случае неверного СНИЛС возвращается значение "068-619-801 04”
         try {
         if(Field.Length() == 14)
           { Flag = true;
             i = 0;
             C1 = 0;
             ILS_Num = 0;
             LastDigit = -1;
             LastDigitCount = 0;
             while(i < 12)
                  { switch(i)
                       { case  3:
                         case  7: if(Field[i+1] != '-') Flag = false; break;
                         case 11: if(Field[i+1] != ' ') Flag = false; break;
                         default: { if(ILS14_1[i] != 0)
                                      { C1 = C1 + (int)(Field[i+1] - 0x30) * ILS14_1[i];
                                        ILS_Num = ILS_Num * 10 + (int)(Field[i+1] - 0x30);
                                        if(LastDigit == (int)(Field[i+1] - 0x30))
                                          { LastDigitCount++;
                                            if(LastDigitCount => 3) Flag = false;
                                          }
                                        else
                                          { LastDigit = (int)(Field[i+1] - 0x30);
                                            LastDigitCount = 1;
                                          }
                                      }
                                  } break;
                       }
                    i++;
                  }
             if(ILS_Num <= 1001998) Flag = false;
             if(Flag == true)
               { C1 = C1 - (int)(floor(C1 / 101) * 101);
                 S1 = (AnsiString)(C1);
                 switch(S1.Length())
                    { case 1: S1 = "0" + S1; break;
                      case 3: S1 = S1.SubString(2, 2); break;
                    }
                 if(S1 == Field.SubString(13, 2)) S = Field;
               }
           }
             }
         catch(...)
              {
              }
         return(S);
       }


Правила расчета контрольной суммы СНИЛС

Допустимые символы - цифры, пробел, дефис.

Проверяется на валидность контрольным числом.

СНИЛС имеет вид "XXX-XXX-XXX YY", где XXX-XXX-XXX - номер, а YY - контрольное число.



Проверка контрольного числа проводится только для номеров больше номера 001-001-998.

(вот это что-то новое – будет уточнено в ОПФР)



Контрольное число СНИЛС рассчитывается следующим образом:

* Каждая цифра СНИЛС умножается на номер своей позиции (позиции отсчитываются с конца);

* Полученные произведения суммируются;

* Если сумма меньше 100, то контрольное число равно самой сумме;

* Если сумма равна 100 или 101, то контрольное число равно 00;

* Если сумма больше 101, то сумма делится нацело на 101 и контрольное число определяется

остатком от деления аналогично предыдущим двум пунктам.



Дополнительная проверка:

* В номере XXX-XXX-XXX не может присутствовать одна и та же цифра три раза подряд. Дефисы при этой проверке игнорируются, т.е. неверными будут все нижеследующие примеры СНИЛСов:

XXX-222-XXX YY

XX2-22X-XXX YY
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.05.2022, 11:15
Ответы с готовыми решениями:

Перевод кода с C++ на Pascal ABC
int main(int argc, char* argv) { int *A, *B, *C; int i, len, lenB, lenC; printf(&quot;Vvedite razmer massiva: &quot;); scanf(&quot;%d&quot;, &amp;len); ...

Перевод кода C++ в код Pascal ABC
здравствуйте помогите пожалуйста перевести код, поиск в глубину , вывод пути, “N” (движение вверх), “E” (движение вправо), “S” (движение...

Перевод из Pascal ABC.net в Pascal ABC
Помогите, пожалуйста, перевести программу в Pascal ABC с Pascal ABC.net; если не трудно, объясните, почему не компилирует программу Pascal...

3
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
08.05.2022, 14:15
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function CheckSN(const s: String): Boolean;
const Digits=['0'..'9'];
var i, n: Integer; p, q, c: Char;
begin
  CheckSN:=False; n:=0; q:=#0; c:=#0;
  if (Length(s)<>14) or (s[4]<>'-') or (s[8]<>'-') or (s[12]<>' ') then Exit;
  for i:=1 to 9 do begin
    p:=q; q:=c; c:=s[i+Ord(i>3)+Ord(i>6)];
    if (p=q) and (q=c) then Exit;
    if c in Digits then Inc(n,(10-i)*(Ord(c)-Ord('0'))) else Exit;
  end;
  for i:=13 to 14 do if not (s[i] in Digits) then Exit;
  CheckSN:=n mod 101=10*(Ord(s[13])-Ord('0'))+Ord(s[14])-Ord('0');
end;
Добавлено через 6 минут
Без дополнительной проверки:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
function CheckSN(const s: String): Boolean;
const Digits=['0'..'9'];
var i, n: Integer; c: Char;
begin
  CheckSN:=False; n:=0;
  if (Length(s)<>14) or (s[4]<>'-') or (s[8]<>'-') or (s[12]<>' ') then Exit;
  for i:=1 to 9 do begin
    c:=s[i+Ord(i>3)+Ord(i>6)];
    if c in Digits then Inc(n,(10-i)*(Ord(c)-Ord('0'))) else Exit;
  end;
  for i:=13 to 14 do if not (s[i] in Digits) then Exit;
  CheckSN:=n mod 101=10*(Ord(s[13])-Ord('0'))+Ord(s[14])-Ord('0');
end;
Добавлено через 38 минут
Возможно, есть смысл проверку формата и контрольной суммы разделить.
0
0 / 0 / 0
Регистрация: 08.05.2022
Сообщений: 2
08.05.2022, 14:51  [ТС]
а как исправить такую ошибку?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
program snils;
    var i, n: integer; c: Char;
    function CheckSN(const s: String): Boolean;
    const Digits=['0'..'9'];
  begin
      CheckSN:=False; n:=0;
  if (Length(s)<>14) or (s[4]<>'-') or (s[8]<>'-') or (s[12]<>' ') then Exit;
    for i:=1 to 9 do begin
      c:=s[i+Ord(i>3)+Ord(i>6)];
    if c in Digits then Inc(n,(10-i)*(Ord(c)-Ord('0'))) else Exit;
      end;
        begin for i:=13 to 14 do if not (s[i] in Digits) then Exit;
          CheckSN:=n mod 101=10*(Ord(s[13])-Ord('0'))+Ord(s[14])-Ord('0');
  end;
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
08.05.2022, 18:46
Прочитать её текст внимательно.
Вы привели функцию, попросили её перевести на Паскаль. Вам такую (аналогичную) функцию написали.

Добавлено через 5 минут
На отдельный вопрос: зачем перемешали строчки, можно не отвечать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.05.2022, 18:46
Помогаю со студенческими работами здесь

Перевести в код Pascal ABC из кода Pascal Delphi
Помогите перевести в код ABC а то с Delphi вообще не знаком. Задание было такое: Записать в файл последовательного доступа N...

Перевести в код Pascal ABC из кода Pascal Delphi
procedure TForm1.Button1Click(Sender: TObject); const n=8; var x:array of real; y,z:array of real; i,j:byte; begin ...

Размер кода Pascal ABC
Уважаемые программисты! Обьясните пожалуйста , как можно сделать задачу A+B за 33 символа??( Требуется сложить два целых числа не больше...

перевод кода с Python на Pascal.ABC
Переведите, пожалуйста, код на Pascal: var f := ReadLines('input.txt'); var a := f.Skip(1).GroupBy(t-&gt; t.Count); var Para :=...

Перевод программы с Turbo Pascal на Pascal ABC.NET
написала программу в паскаль турбо на рабочем компьютере. перенесла в паскаль авсNet так как дома стоит эта версия /перестала работать что...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru