Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
-9 / 1 / 0
Регистрация: 21.09.2015
Сообщений: 51
1

Как процедуру в Паскале реализовать, как функцию в с++?

18.04.2016, 08:37. Показов 1460. Ответов 8
Метки нет (Все метки)

Здравствуйте! Есть код на Паскале. Нужно процедуру реализовать в С++ как функцию. Возможно ли в моем случае? Попробовал по-всякому, но у меня выводит только единицы.
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
program razbienie_mnozhestwa(input,output);
var i,j,k,n:byte;wper:array[1..255]of boolean;
sled,pred,blok:array[1..255]of byte;
procedure write_razbienie; {процедура, выписывающая разбиение на экран}
var
 i,j:byte;
begin
 j:=1; {номер первого блока}
 repeat
  write('( ');
  for i:=j to n do if blok[i]=j then write(i, ' '); {если число і из блока j, то пишем это число}
  j:=sled[j]; {следующий по номеру блок}
  write(')');
 until j=0; 
 WRITELN
end;
begin
 write('input n:');
 readln(n); {вводим количество элементов множества}
 for i:=1 to n do begin {строим разбиение {{1, …, n}}
  blok[i]:=1;
  wper[i]:=true
 end;
 sled[1]:=0;
 write_razbienie; {выписать разбиение}
 j:=n; {активный элемент}
 while j>1 do begin {задача цикла – перемещение «активного» элемента j в соседний блок – в предыдущий или последующий (в последнем случае может возникнуть необходимость создания нового блока вида {j}, а затем определение активного элемента во вновь образованном разбиении}
  k:=blok[j]; {процесс переноса активного элемента; k – номер активного блока}
  if wper[j] then begin {j движется вперёд}
   if sled[k]=0 then begin {k – последний блок}
    sled[k]:=j; {j – одно элементный блок}
    pred[j]:=k;
    sled[j]:=0
   end;
   if sled[k]>j then begin {j образует новый блок}
    pred[j]:=k; {все блоки справа от блока с номером k содержат элементы, большие j. Отсюда следует, что j образует новый одно элементный блок}
    sled[j]:=sled[k];
    pred[sled[j]]:=j;
    sled[k]:=j
   end;
   blok[j]:=sled[k] {переносим наш элемент в активный блок с номером k}
  end
  else begin {j движется назад}
   blok[j]:=pred[k]; {помещаем j в предыдущий блок}
   if k=j then if sled[k]=0 then sled[pred[k]]:=0 else begin
    sled[pred[k]]:=sled[k];
    pred[sled[k]]:=pred[k]
   end
  end;
  write_razbienie;
  j:=n;
  while(j>1)and
   ((wper[j]and(blok[j]=j))or(not wper[j]and(blok[j]=1))) do begin
   wper[j]:=not wper[j];
   dec(j)
  end
 end
end.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2016, 08:37
Ответы с готовыми решениями:

Как программно реализовать процедуру съема данных?
Разработать цифровой измеритель температуры и давления промышленной установки: - на базе...

Как реализовать функцию?
Функция должна считывать из файла посимвольно строку, встречая символ ";" то что до него...

Как реализовать функцию, чтения из файла с сравнением?
Функция должна считывать из файла посимвольно строку, встречая символ ";" то что до него помещается...

Передача неизвестного количества аргументов в функцию, как реализовать?
Вот есть функция и в нее будут передаваться какие-то аргументы, причем заранее не известен их тип и...

8
Эксперт C
26046 / 16240 / 3488
Регистрация: 24.12.2010
Сообщений: 35,576
18.04.2016, 10:17 2
Цитата Сообщение от Aidar Посмотреть сообщение
Попробовал по-всякому,
Покажите
Цитата Сообщение от Aidar Посмотреть сообщение
Возможно ли в моем случае?
Возможно. В любом случае.
0
115 / 105 / 51
Регистрация: 29.03.2016
Сообщений: 480
18.04.2016, 11:21 3
Цитата Сообщение от Aidar Посмотреть сообщение
while(j>1)and ((wper[j]and(blok[j]=j))or(not wper[j]and(blok[j]=1))) do begin wper[j]:=not wper[j]; dec(j) end end
будьте добры, приглядитеьс к этой части, да и вообще ко всей программе. Все ли условия там правильно выполняются?
0
-9 / 1 / 0
Регистрация: 21.09.2015
Сообщений: 51
18.04.2016, 18:56  [ТС] 4
Байт, вот что получилось, но это только до 25 строки по паскалю. Допустим при вводе 3, на выводе должно быть (1 2 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
54
#include <iostream>
using namespace std;
 
void Output(int x,int s,int b) 
{
    int i, j;
    int sled[225], blok[225];
    for (int i = 1; i < 225; i++)
    {
        sled[i] = i;
        blok[i] = i;
    }
    sled[1] = 0;
    j = 1;
    while (j != 0) 
    {
        cout << "( ";
        for (i = j; i < x;) 
        {
            if (blok[i] == j) 
            {
                cout << i << " ";
            }
            j++;
        }
        cout << ")";
        j = sled[j];
    }
    cout << endl;
}
 
int main()
{
    int i, j, k, n;
    bool wper[225];
    int sled[225], pred[225], blok[225];
    j = 1;
    for (int i = 1; i < 225; i++)
    {
        sled[i] = i;
        pred[i] = i;
        blok[i] = i;
    }
    cout << "n=";
    cin >> n; //Количество элементов множества
    for (int i = 1; i < n; i++) {
        blok[i] = 1;
        wper[i] = true;
    }
    sled[1] = 0;
    Output(n, sled[225], blok[225]);
    system("pause");
    return 0;
}
Добавлено через 1 минуту
Serg_o_Grey, Да, все условия правильные.
0
115 / 105 / 51
Регистрация: 29.03.2016
Сообщений: 480
18.04.2016, 22:22 5
Aidar, в паскале при объявлении массива значения в нем инициализируются нулями, а в с++ их нужно инициализировать в цикле после объявления

Добавлено через 24 минуты
если делать простой перевод вашей программы с Паскаля то получаем:
Кликните здесь для просмотра всего текста
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
using namespace std;
 
unsigned char j, k, n;
bool wper[256];
unsigned char sled[256], pred[256], blok[256];
void write_razbienie()
{
    unsigned char j;
    j = 1;
    do
    {
        cout << "( ";
        for (int i = j; i < n; i++)
        {
            if (blok[i] == j) cout << i <<  " ";
        }
        j = sled[j];
        cout << ")";
    }while(j != 0);
    cout << endl;
}
 
int main()
{
    for (int i = 0; i < 256; i++) 
    {
        sled[i] = 0;
        pred[i] = 0;
        blok[i] = 0;
        wper[i] = false;
    }
    cout << "input n: ";
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        blok[i] = 1;
        wper[i] = true;
    }
    sled[1] = 0;
    write_razbienie();
    j = n;
    while(j > 1)
    {
        k = blok[j];
        if (wper[j])
        {
            if (sled[k] == 0)
            {
                sled[k] = j;
                pred[j] = k;
                sled[j] = 0;
            }
            if (sled[k] > j)
            {
                pred[j] = k;
                sled[j] = sled[k];
                pred[sled[j]] = j;
                sled[k] = j;
            }
            blok[j] = sled[k];
        }
        else
        {
            blok[j] = pred[k];
            if (k == j)
            {
                if (sled[k] == 0) sled[pred[k]] = 0;
                else
                {
                    sled[pred[k]] = sled[k];
                    pred[sled[k]] = pred[k];
                }
            }
            write_razbienie();
            j = n;
            while ((j > 1) && (((wper[j]) && (blok[j] == j)) || (!wper[j] && (blok[j] == 1))))
            {
                wper[j] = !wper[j];
                j--;
            }
        }
    }
    return 0;
}

но при выполнении программы выявляется, что программа уходит в "бесконечный" цикл и последнее условие никогда не будет выполнено. потому я и просил проверить условия.
ваш перевод этой программы разительно отличается от оригинала, как будто это две разные программы

лучше всего если вы опишите назначение программы и опишите ее принцип работы не в коде.

Без обид, может ваша программа и является гениальным решением какой-то задачи, но я не старался особо в ней разобраться. Гораздо проще и быстрее построить решение по ТЗ

Добавлено через 20 минут
хотя на паскале работает как надо. значит где-то я ошибся
0
-9 / 1 / 0
Регистрация: 21.09.2015
Сообщений: 51
18.04.2016, 23:05  [ТС] 6
Serg_o_Grey, мне кажется, что проблема только в функции.

Добавлено через 25 минут
Байт, можешь подсказать что-нибудь с процедурой, что неправильно?
0
115 / 105 / 51
Регистрация: 29.03.2016
Сообщений: 480
18.04.2016, 23:11 7
Лучший ответ Сообщение было отмечено Aidar как решение

Решение

не туда сунул цикл. теперь все норм

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
using namespace std;
 
int j, k, n;
bool wper[256];
int sled[256], pred[256], blok[256];
void write_razbienie()
{
    int j = 1;
    do
    {
        cout << "( ";
        for (int i = j; i <= n; i++)
        {
            if (blok[i] == j) cout << i <<  " ";
        }
        j = sled[j];
        cout << ")";
    }while(j != 0);
    cout << endl;
}
 
int main()
{
    for (int i = 0; i < 256; i++) 
    {
        sled[i] = 0;
        pred[i] = 0;
        blok[i] = 0;
        wper[i] = false;
    }
    cout << "input n: ";
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        blok[i] = 1;
        wper[i] = true;
    }
    sled[1] = 0;
    write_razbienie();
    j = n;
    while(j > 1)
    {
        k = blok[j];
        if (wper[j])
        {
            if (sled[k] == 0)
            {
                sled[k] = j;
                pred[j] = k;
                sled[j] = 0;
            }
            if (sled[k] > j)
            {
                pred[j] = k;
                sled[j] = sled[k];
                pred[sled[j]] = j;
                sled[k] = j;
            }
            blok[j] = sled[k];
        }
        else
        {
            blok[j] = pred[k];
            if (k == j)
            {
                if (sled[k] == 0) sled[pred[k]] = 0;
                else
                {
                    sled[pred[k]] = sled[k];
                    pred[sled[k]] = pred[k];
                }
            }
        }
        write_razbienie();
        j = n;
        while ((j > 1) && (((wper[j]) && (blok[j] == j)) || (!wper[j] && (blok[j] == 1))))
        {
            wper[j] = !wper[j];
            j--;
        }
    }
    return 0;
}
1
-9 / 1 / 0
Регистрация: 21.09.2015
Сообщений: 51
18.04.2016, 23:21  [ТС] 8
Serg_o_Grey, а если сделать ручной ввод элементов, это муторно будет?

Добавлено через 4 минуты
Serg_o_Grey, Спасибо большое, что помог
0
115 / 105 / 51
Регистрация: 29.03.2016
Сообщений: 480
19.04.2016, 00:19 9
Лучший ответ Сообщение было отмечено Aidar как решение

Решение

если учесть, что сейчас все завязано на номерах ячеек массива, то переделывать муторно (это если я верно понял задание)
проще сделать заново

Добавлено через 44 минуты
Цитата Сообщение от Aidar Посмотреть сообщение
а если сделать ручной ввод элементов, это муторно будет?
передемал. просто будет если задать соответствие каждому числу
1 -> 13
2 -> 2
3 -> 45
при печати элементов выводить соответствующие значения
только сортировки в этом случае не будет

Добавлено через 8 минут
собственно вот:

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
using namespace std;
 
int j, k, n;
bool wper[256];
int sled[256], pred[256], blok[256];
int* sootv;
void write_razbienie()
{
    int j = 1;
    do
    {
        cout << "( ";
        for (int i = j; i <= n; i++)
        {
            //if (blok[i] == j) cout << i <<  " ";
            if (blok[i] == j) cout << sootv[i-1] <<  " ";
        }
        j = sled[j];
        cout << ")";
    }while(j != 0);
    cout << endl;
}
 
int main()
{
    for (int i = 0; i < 256; i++) 
    {
        sled[i] = 0;
        pred[i] = 0;
        blok[i] = 0;
        wper[i] = false;
    }
    cout << "input n: ";
    cin >> n;
    sootv = new int[n];
    for (int i = 0; i < n; i++)
    {
        cout << "Element #" << i+1 << " --> ";
        cin >> sootv[i];
    }
    for (int i = 1; i <= n; i++)
    {
        blok[i] = 1;
        wper[i] = true;
    }
    sled[1] = 0;
    write_razbienie();
    j = n;
    while(j > 1)
    {
        k = blok[j];
        if (wper[j])
        {
            if (sled[k] == 0)
            {
                sled[k] = j;
                pred[j] = k;
                sled[j] = 0;
            }
            if (sled[k] > j)
            {
                pred[j] = k;
                sled[j] = sled[k];
                pred[sled[j]] = j;
                sled[k] = j;
            }
            blok[j] = sled[k];
        }
        else
        {
            blok[j] = pred[k];
            if (k == j)
            {
                if (sled[k] == 0) sled[pred[k]] = 0;
                else
                {
                    sled[pred[k]] = sled[k];
                    pred[sled[k]] = pred[k];
                }
            }
        }
        write_razbienie();
        j = n;
        while ((j > 1) && (((wper[j]) && (blok[j] == j)) || (!wper[j] && (blok[j] == 1))))
        {
            wper[j] = !wper[j];
            j--;
        }
    }
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.04.2016, 00:19

Калькулятор на Си. Как реализовать триногометрические ф-ции и функцию логарифм?
Написал код в котором надо вводить каждый елемент(первое число, знак операции, второе число, знак...

найти факториал всех чисел от 1 до 10 с шагом 2. Вычисление факториала реализовать как функцию
Нужно найти факториал всех чисел от 1 до 10 с шагом 2. Вычисление факториала реализовать как...

Не могу разобраться как реализовать функцию инициализации даты по веденному массиву char
//--------------------------------------------------------------------------- #pragma hdrstop ...

Как реализовать функцию, которая копирует символы из одной символьной строки(массива) в другую
Есть некоторый код, который уже почти работает, необходимо что-то исправить, что-то добавить.....


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.