Форум программистов, компьютерный форум CyberForum.ru

from C# to C++ - C++

Восстановить пароль Регистрация
 
nobless1368
 Аватар для nobless1368
14 / 14 / 1
Регистрация: 04.06.2012
Сообщений: 124
Записей в блоге: 1
17.02.2013, 03:37     from C# to C++ #1
Собственно сабж. Есть код на шарпе, хотелось бы перевести его на плюсы, но своих мозгов не хватает (или опыта?).

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
93
94
95
96
97
98
99
100
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace aias_lab4
{
    class Program
    {
        static void Main(string[] args)
        {
            char B, E; // 2 символа, определяющие нижнюю и верхнюю границы диапазона символов анализируемой строки (они могут совпадать)
            int nn = 0;
 
            Console.WriteLine("Vvedite nachalniy i konechniy simvoly diapozona simvolov:");
            B = Convert.ToChar(Console.ReadLine());
            E = Convert.ToChar(Console.ReadLine());
            int s = Math.Abs(Convert.ToInt32(E - B));
            Console.WriteLine("Vvedite dlinu ishodnoy stroki:");
            int n = Convert.ToInt32(Console.ReadLine());
            char[] T = new char[n];
            Random rand = new Random();
            for (int i=0; i<n; i++)
                T[i] = (char)(rand.Next(B, E+1));
            //Console.WriteLine(S);
            Console.WriteLine("Vvedite stroku obrazec:");
            string ps = Console.ReadLine();
            int m = ps.Length;
            char[] P = ps.ToCharArray();
            /*for (int i = 0; i < m; i++)
                Console.WriteLine(P[i]);*/
            int[] D = new int [256];
            Console.Write("Ishodnaya stroka: ");
            for (int i = 0; i < n; i++)
                Console.Write(T[i]);
            Console.WriteLine("\n");
            Console.WriteLine("Boyer-Mur:");
            int k;
            for (k = 0; k < 256; k++) 
                D[k] = m;
            for (k = 0; k < m-1; k++)
                D[P[k]] = m - k-1;
            int l,j,ss=0;
            for (k = -1; k < n - m; )
            {
                for (l = k + m, j = m-1; j >= 0 && T[l] == P[j]; j--, l--) nn++;
                if (j == -1)
                {
                   //Console.WriteLine("Naydeno sovpadenie s "+(l+2)+" elementa;");
                    ss++;
                }
                k += D[T[k + m]];
            }
            if (ss == 0)
                Console.WriteLine("Sovpadeniy ne naideno.");
            Console.WriteLine("Chislo sravneniy - " + nn);
 
 
 
            nn = 0;
 
 
 
 
            Console.WriteLine("");
            Console.WriteLine("Knut-Morris-Pratt:");
            ss = 0;
            int[] F = new int[m];
            F[0] = 0;
            for (int q = 1; q < m; q++) 
            {
                k = F[q-1];
                while (k > 0 && P[q] != P[k])
                {
                    k = F[k - 1];
                }
                F[q] = (P[q] == P[k]) ? k + 1 : 0; 
            }
            for (int q = 0, i = 0; i < n; i++) 
            {
                while (q > 0 && P[q] != T[i])
                {
                    q = F[q - 1];
                    nn++;
                }
                if (P[q] == T[i]) q++;
                nn++;
                if (q == m) 
                {
                    //Console.WriteLine("Naydeno sovpadenie s "+(i-m+2)+" elementa;");
                    ss++;
                    q = F[q-1];
                }
            }
            if (ss == 0)
                Console.WriteLine("Sovpadeniy ne naideno.");
            Console.WriteLine("Chislo sravneniy - " + nn);
        }
    }
}
Программа представляет собой реализацию алгоритма Бойера-Мура и алгоритма Кнута-Морриса-Пратта, если вдруг кому-то это интересно знать.
Буду признателен за любую помощь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
17.02.2013, 14:06     from C# to C++ #2
C++

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
#include <string>
#include <cmath>
 
int main()
{
    char B, E; // 2 символа, определяющие нижнюю и верхнюю границы диапазона символов анализируемой строки (они могут совпадать)
    int nn = 0;
    
    std::cout << "Vvedite nachalniy i konechniy simvoly diapozona simvolov: ";
 
    std::cin >> B;
    std::cin >> E;
        
    int s = std::abs(static_cast<int>(E) - static_cast<int>(B));
        
    std::cout << "Vvedite dlinu ishodnoy stroki: ";
        
    int n;
    std::cin >> n; 
        
    char* T = new char[n];
        
    for (int i=0; i<n; i++)
        T[i] = static_cast<char>(rand() % B + E+1);
 
    //Console.WriteLine(S);
    std::cout << "Vvedite stroku obrazec: ";
        
    std::string ps;
    std::getline(std::cin, ps);
 
    int m = ps.length();
        
    char* P = new char[ps.length() + 1];
    std::strcpy (P, ps.c_str());
    
    /*for (int i = 0; i < m; i++)
    std::cout << P[i];*/
    
    int* D = new int [256];
        
    std::cout << "Ishodnaya stroka: ";
        
    for (int i = 0; i < n; i++)
        std::cout << T[i] << '\n' << "Boyer-Mur: ";
        
    int k;
    for (k = 0; k < 256; k++) 
        D[k] = m;
 
    for (k = 0; k < m-1; k++)
        D[P[k]] = m - k-1;
 
    int l,j,ss=0;
    for (k = -1; k < n - m; )
    {
        for (l = k + m, j = m-1; j >= 0 && T[l] == P[j]; j--, l--, nn++);
        if(j == -1) {
            //std::cout << "Naydeno sovpadenie s " << l+2) << "elementa\n";
            ss++;
        }
        k += D[T[k + m]];
    }
        
    if (ss == 0)
        std::cout << "Sovpadeniy ne naideno.";
        
    std::cout << "Chislo sravneniy - " << nn << std::endl;
    
    nn = 0;
    
    std::cout << "\nKnut-Morris-Pratt: ";
    
    ss = 0;
        
    int* F = new int[m];
    F[0] = 0;
    
    for (int q = 1; q < m; q++) 
    {
        k = F[q-1];
 
        while (k > 0 && P[q] != P[k]) {
            k = F[k - 1];
        }
        
        F[q] = (P[q] == P[k]) ? k + 1 : 0; 
    }
    
    for (int q = 0, i = 0; i < n; i++) 
    {
        while (q > 0 && P[q] != T[i]) {
            q = F[q - 1];
            nn++;
        }
        if (P[q] == T[i]) 
            q++;
        nn++;
        
        if (q == m) {
            //std::cout << "Naydeno sovpadenie s " << i-m+2 << " elementa\n";
            ss++;
            q = F[q-1];
        }
    }
    
    if (ss == 0)
        std::cout << "Sovpadeniy ne naideno.\n";
    std::cout << "Chislo sravneniy - " << nn << std::endl;
 
    delete []T;
    delete []P;
    delete []D;
    delete []F;
        
    system("PAUSE");
    return 0;
}
C++/CLI

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include "stdafx.h"
 
using namespace System;
using namespace System::Collections::Generic;
using namespace System::Text;
 
int main(array<System::String ^> ^args)
{
    wchar_t B, E; // 2 символа, определяющие нижнюю и верхнюю границы диапазона символов анализируемой строки (они могут совпадать)
    int nn = 0;
        
    Console::WriteLine("Vvedite nachalniy i konechniy simvoly diapozona simvolov:");
        
    B = Convert::ToChar(Console::ReadLine());
    E = Convert::ToChar(Console::ReadLine());
        
    int s = Math::Abs(Convert::ToInt32(E - B));
        
    Console::WriteLine("Vvedite dlinu ishodnoy stroki:");
    int n = Convert::ToInt32(Console::ReadLine());
        
    array<char>^ T = gcnew array<char>(n);
    Random^ rand = gcnew Random();
        
    for (int i=0; i<n; i++)
        T[i] = rand->Next(B, E+1);
    //Console::WriteLine(S);
        
    Console::WriteLine("Vvedite stroku obrazec:");
    String^ ps = gcnew String(Console::ReadLine());
        
    int m = ps->Length;
 
    array<char>^ P = gcnew array<char>(ps->Length+1);
    for (int i = 0; i < ps->Length+1; ++i)
        P[i] = ps[i];
 
    /*for (int i = 0; i < m; i++)
    Console::WriteLine(P[i]);*/
        
    array<int>^ D = gcnew array<int>(256);
        
    Console::Write("Ishodnaya stroka: ");
        
    for (int i = 0; i < n; i++)
        Console::Write(T[i]);
 
    Console::WriteLine("\n");
    Console::WriteLine("Boyer-Mur:");
        
    int k;
    for (k = 0; k < 256; k++) 
        D[k] = m;
        
    for (k = 0; k < m-1; k++)
        D[P[k]] = m - k-1;
        
    int l,j,ss=0;
    for (k = -1; k < n - m; )
    {
        for (l = k + m, j = m-1; j >= 0 && T[l] == P[j]; j--, l--) 
            nn++;
        if (j == -1) {
            //Console::WriteLine("Naydeno sovpadenie s "+(l+2)+" elementa;");
            ss++;
        }
            
        k += D[T[k + m]];
    }
        
    if (ss == 0)
        Console::WriteLine("Sovpadeniy ne naideno.");
    Console::WriteLine("Chislo sravneniy - " + nn);
        
    nn = 0;
        
    Console::WriteLine("");
    Console::WriteLine("Knut-Morris-Pratt:");
        
    ss = 0;
 
    array<int>^ F = gcnew array<int>(m);
    F[0] = 0;
        
    for (int q = 1; q < m; q++) 
    {
        k = F[q-1];
 
        while (k > 0 && P[q] != P[k]) {
            k = F[k - 1];
        }
            
        F[q] = (P[q] == P[k]) ? k + 1 : 0; 
    }
        
    for (int q = 0, i = 0; i < n; i++) 
    {
        while (q > 0 && P[q] != T[i]) {
            q = F[q - 1];
            nn++;
        }
            
        if (P[q] == T[i]) q++;
        nn++;
            
        if (q == m) {
            //Console::WriteLine("Naydeno sovpadenie s "+(i-m+2)+" elementa;");
            ss++;
            q = F[q-1];
        }
    }
        
    if (ss == 0)
        Console::WriteLine("Sovpadeniy ne naideno.");
    Console::WriteLine("Chislo sravneniy - " + nn);
 
    return 0;
}
nobless1368
 Аватар для nobless1368
14 / 14 / 1
Регистрация: 04.06.2012
Сообщений: 124
Записей в блоге: 1
18.02.2013, 20:34  [ТС]     from C# to C++ #3
Спасибо, но:
В 31 строчке getline отказывается вызывать cin. Понятия не имею почему. Решил заменой на
C++
1
std::cin >> ps;
Беда с заполнение массива T[i], ибо он не заполняется символами ввиду отсутствия возможности прямого преобразования типов с int, который возвращается функцией rand() в char.
Код c++/CLI тоже не пашет, но в нем копаться не стал, ибо не шарю...
Yandex
Объявления
18.02.2013, 20:34     from C# to C++
Ответ Создать тему
Опции темы

Текущее время: 13:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru