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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
Splendid
0 / 0 / 1
Регистрация: 27.03.2008
Сообщений: 75
#1

Перевести код из С++ в Си - C++

06.08.2008, 14:50. Просмотров 2153. Ответов 11
Метки нет (Все метки)

Есть код на С++, надо чистый С. Пыталась исправлять ошибки, но чем больше я это делаю, тем больше ошибок он выдает...поэтому привожу изначальный не исправленный на С++. Пожалуйста, помогите разобраться!
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
#include <algorithm>
#include <cmath>
#include <iostream>
#include <map>
#include <vector>
 
using namespace std;
 
 
//! Возвращает true, если n - точный квадрат простого числа
int perfect_square (const n)
{
int sq = ceil (sqrt ((double)n));
    return sq*sq == n;
}
 
 
//! Возвращает количество бит в числе (т.е. минимальное количество бит, которыми можно представить данное число)
 
unsigned bits_in_number (int n)
{
    if (n == 0)
  return 1;
    unsigned result = 0;
    while (n)
    {
  n /= 2;
  ++result;
    }
    return result;
}
 
//! Возвращает значение k-го бита числа (биты нумеруются с нуля)
 
int test_bit (const n, unsigned k)
{
    return (n & ((1) << k)) != 0;
}
 
//! Умножает a *= b (mod n)
 
void mulmod (int & a, int b, const & n)
{
    // наивная версия, годится только для длинной арифметики
    a *= b;
    a %= n;
}
 
 
//! Переводит число n в форму q*2^p
void transform_num (int n, int & p, int & q)
{
    int p_res = 0;
    while (n % 2 == 0)
    {
  ++p_res;
  n /= 2;
    }
    p = p_res;
    q = n;
}
 
 
int gcd(int a, int b)
{
    int c;
    while (b)
    {
        c = a % b;
        a = b;
        b = c;
    }
    return a;
}
 
int jacobi(long d, long n)
 
{
  int s;
  long d1, b = d, e = 0, m, n1;
 
 
  if (d == 0) return 0;
  if (d == 1) return 1;
 
  while ((b & 1) == 0)
    b >>= 1, e++;
  d1 = b;
  m = n % 8;
 
  if (!(e & 1)) s = 1;
 
  else if (m == 1 || m == 7) s = + 1;
 
  else if (m == 3 || m == 5) s = - 1;
 
  if (n % 4 == 3 && d1 % 4 == 3) s = - s;
 
  if (d1 != 1) n1 = n % d1; else n1 = 1;
 
  return s * jacobi(n1, d1);
 
}
 
//! Усиленный алгоритм Лукаса-Селфриджа проверки n на простоту. Используется усиленный алгоритм Лукаса с параметрами Селфриджа. Работает только с знаковыми типами!!! Второй параметр unused не используется, он только дает тип
 
int lucas_selfridge (const & n)
{
 
    // сначала проверяем тривиальные случаи
    if (n == 2)
  return true;
    if (n < 2 || (n % 2 == 0))
  return false;
 
    // проверяем, что n не является точным квадратом, иначе алгоритм даст ошибку
    if (perfect_square (n))
  return false;
 
    // алгоритм Селфриджа: находим первое число d такое, что:
    // jacobi(d,n)=-1 и оно принадлежит ряду { 5,-7,9,-11,13,... }
    int dd;
    for (int d_abs = 5, d_sign = 1;; d_sign = -d_sign, ++++d_abs)
    {
  dd = d_abs * d_sign;
  int g = gcd (n, d_abs);
  if (1 < g && g < n)
    // нашли делитель - d_abs
    return false;
  if (jacobi (int(dd), n) == -1)
    break;
    }
 
    // параметры Селфриджа
    int
  p = 1,
  q = (p*p - dd) / 4;
    
    // разлагаем n+1 = d*2^s
    int n_1 = n;
    ++n_1;
    int s, d;
    transform_num (n_1, s, d);
 
    // алгоритм Лукаса
    int
  u = 1,
  v = p,
  u2m = 1,
  v2m = p,
  qm = q,
  qm2 = q*2,
  qkd = q;
    for (unsigned bit = 1, bits = bits_in_number(d); bit < bits; bit++)
    {
  mulmod (u2m, v2m, n);
  mulmod (v2m, v2m, n);
  while (v2m < qm2)
    v2m += n;
  v2m -= qm2;
  mulmod (qm, qm, n);
  qm2 = qm;
  qm2 *= 2;
  if (test_bit (d, bit))
  {
    int t1, t2;
    t1 = u2m;
    mulmod (t1, v, n);
    t2 = v2m;
    mulmod (t2, u, n);
    
    int t3, t4;
    t3 = v2m;
    mulmod (t3, v, n);
    t4 = u2m;
    mulmod (t4, u, n);
    mulmod (t4, (int)dd, n);
 
    u = t1 + t2;
    if (!(u % 2 == 0))
    u += n;
    u /= 2;
    u %= n;
 
    v = t3 + t4;
    if (!(v % 2 == 0))
    v += n;
    v /= 2;
    v %= n;
    mulmod (qkd, qm, n);
  }
    }
 
    // точно простое (или псевдо-простое)
    if (u == 0 || v == 0)
  return true;
 
    // вычисляем оставшиеся члены
    int qkd2 = qkd;
    qkd2 *= 2;
    for (int r = 1; r < s; ++r)
    {
  mulmod (v, v, n);
  v -= qkd2;
  if (v < 0) v += n;
  if (v < 0) v += n;
  if (v >= n) v -= n;
  if (v >= n) v -= n;
  if (v == 0)
    return true;
  if (r < s-1)
  {
    mulmod (qkd, qkd, n);
    qkd2 = qkd;
    qkd2 *= 2;
  }
    }
 
    return false;
 
}
 
int main()
{
   
        int num=0;
        printf( "Enter any number -> \n");
        scanf("%u", &num);
        printf("%s\n",
            (
                lucas_selfridge (num) ?
                "It is possibly a prime number" :
                "It is composite number"
            )
        );
    
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2008, 14:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевести код из С++ в Си (C++):

перевести код на С++ или написать свой код - C++
Задано предложение. Составить программу вывода на экран слов, в которых первая и последняя буквы совпадают. program Project1; ...

Visual c++ код перевести в gcc linux код - C++
Ниже есть код. Нужно сделать так, что бы он компилировался и работал в линуксе(компиляция с помощью gcc). #include &quot;stdio.h&quot; #pragma...

Перевести код программы Паскаля в код С++ - C++
В массиве Х (15) найти произведение и количество элементов расположенных между наибольшими и наименьшими элементами кто может перевести...

Перевести код на c++ - C++
Всем привет! Столкнулся с такой проблемой... есть код на freebasic нужно его перевести на с++... Ну вот что-то никак не выходит... ...

Перевести код с C# на C++ - C++
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { ...

Перевести код с С - C++
Это программа на С, её нужно перевести в С++, что тут нужно изменить??? #include&lt;iostream.h&gt; #include&lt;stdio.h&gt; #include&lt;string.h&gt; ...

11
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
06.08.2008, 15:04 #2
Я, конечно, не знаю, но, на вскидку, этот код компилиться не будет. Даже вот эта конструкция:
Код
int perfect_square (const n)
{
не подскажите, далеко ли тут тип параметра убежал?

Добавлено через 4 минуты
Я Вам даже подскажу, что тут несколько ошибок этого типа
Ну да ладно. Вообщем, поставите тип нужный в функциях (надо же Вам чем-то заняться).
Потом будем делать С . Удалите для простоты верхние строки, а именно:
Код
#include <algorithm>
#include <cmath>
#include <iostream>
#include <map>
#include <vector>

using namespace std;
И добавите вместо них:
Код
#include <stdio.h>
#include <math.h>
P. S. я глянул на код. Вроде из всех подключенных модулей вообще ничего не используется, ни мапы, ни вектора, ничего. Откомпилите и проверите.
0
XuTPbIu_MuHTAu
Эксперт С++
2226 / 741 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
06.08.2008, 15:05 #3
Цитата Сообщение от Vourhey Посмотреть сообщение
Я, конечно, не знаю, но, на вскидку, этот код компилиться не будет
VC++ 6.0 компилирует. Вот только я не застал времена C,начинал сразу с С++,отличия знаю только ключевые.

Splendid, какой компилятор С вы используете?
0
Splendid
0 / 0 / 1
Регистрация: 27.03.2008
Сообщений: 75
06.08.2008, 15:07  [ТС] #4
насколько я знаю, запись: const эквивалентна записи const int - я не права?

Добавлено через 1 минуту
VC++ 6.0

Добавлено через 1 минуту
Vourhey, я так уже делала, выдает ошибки:

Код
--------------------Configuration: 1 - Win32 Debug--------------------
Compiling...
1.c
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(13) : warning C4244: 'initializing' : conversion from 'double ' to 'int ', possible loss of data
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(24) : error C2143: syntax error : missing ';' before 'type'
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(28) : error C2065: 'result' : undeclared identifier
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(42) : error C2143: syntax error : missing ')' before '&'
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(42) : error C2143: syntax error : missing '{' before '&'
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(42) : error C2059: syntax error : '&'
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(42) : error C2059: syntax error : ')'
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(51) : error C2143: syntax error : missing ')' before '&'
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(51) : error C2143: syntax error : missing '{' before '&'
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(51) : error C2059: syntax error : '&'
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(51) : error C2059: syntax error : ')'
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(107) : error C2143: syntax error : missing ')' before '&'
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(107) : error C2143: syntax error : missing '{' before '&'
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(107) : error C2059: syntax error : '&'
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(107) : error C2059: syntax error : ')'
F:\Program Files\Microsoft Visual Studio\MyProjects\test_na_C\1.c(231) : warning C4013: 'lucas_selfridge' undefined; assuming extern returning int
Error executing cl.exe.
0
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
06.08.2008, 15:08 #5
Отчасти правы. Отчасти - нет.
Не все компиляторы это поддерживают. Если компилить будут на разных компилерах то Вас будет ждать неприятный сюрприз от VC++ это точно. Если на одном, то ничего страшного.
Вообще ссылаться на умолчания - есть плохой стиль. Примите во внимание, когда будете серьезную программу писать.
0
Splendid
0 / 0 / 1
Регистрация: 27.03.2008
Сообщений: 75
06.08.2008, 15:11  [ТС] #6
возможно дело в ссылках?
Код
void transform_num (int n, int & p, int & q)
как их правильно на указатели заменить?

Добавлено через 49 секунд
Vourhey, спасибо! Я запомню.
0
XuTPbIu_MuHTAu
Эксперт С++
2226 / 741 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
06.08.2008, 15:20 #7
Поправил все ошибки. Через 5 минут выложу код

Добавлено через 4 минуты
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#include <stdio.h>
#include <math.h>
 
 
 
//! Возвращает true, если n - точный квадрат простого числа
int perfect_square (const n)
{
int    sq = ceil (sqrt ((double)n));
    return sq*sq == n;
}
 
 
//! Возвращает количество бит в числе (т.е. минимальное количество бит, которыми можно представить данное число)
 
unsigned int bits_in_number (int n)
{
    
    unsigned int result = 0;
    if (n == 0)  return 1;
    while (n)
    {
  n /= 2;
  ++result;
    }
    return  result;
}
 
//! Возвращает значение k-го бита числа (биты нумеруются с нуля)
 
int test_bit (const n, unsigned int k)
{
    return (n & ((1) << k)) != 0;
}
 
//! Умножает a *= b (mod n)
 
void mulmod (int * a, int b, const int n)
{
    // наивная версия, годится только для длинной арифметики
    *a *= b;
    *a %= n;
}
 
 
//! Переводит число n в форму q*2^p
void transform_num (int n, int * p, int * q)
{
    int p_res = 0;
    while (n % 2 == 0)
    {
  ++p_res;
  n /= 2;
    }
    *p = p_res;
    *q = n;
}
 
 
int gcd(int a, int b)
{
    int c;
    while (b)
    {
        c = a % b;
        a = b;
        b = c;
    }
    return a;
}
 
int jacobi(long d, long n)
 
{
  int s;
  long d1, b = d, e = 0, m, n1;
 
 
  if (d == 0) return 0;
  if (d == 1) return 1;
 
  while ((b & 1) == 0)
    b >>= 1, e++;
  d1 = b;
  m = n % 8;
 
  if (!(e & 1)) s = 1;
 
  else if (m == 1 || m == 7) s = + 1;
 
  else if (m == 3 || m == 5) s = - 1;
 
  if (n % 4 == 3 && d1 % 4 == 3) s = - s;
 
  if (d1 != 1) n1 = n % d1; else n1 = 1;
 
  return s * jacobi(n1, d1);
 
}
 
//! Усиленный алгоритм Лукаса-Селфриджа проверки n на простоту. Используется усиленный алгоритм Лукаса с параметрами Селфриджа. Работает только с знаковыми типами!!! Второй параметр unused не используется, он только дает тип
 
int lucas_selfridge (const int   n)
{
    int dd,d_abs,d_sign,g,p,q,n_1,s,d,u,v,u2m,v2m,qm,qm2,qkd,t1,t2,t3,t4,qkd2,r;
    unsigned int bit,bits;
    // сначала проверяем тривиальные случаи
    if (n == 2)
  return 1;
    if (n < 2 || (n % 2 == 0))
  return 0;
 
    // проверяем, что n не является точным квадратом, иначе алгоритм даст ошибку
    if (perfect_square (n))
  return 0;
 
    // алгоритм Селфриджа: находим первое число d такое, что:
    // jacobi(d,n)=-1 и оно принадлежит ряду { 5,-7,9,-11,13,... }
    
    for (d_abs = 5, d_sign = 1;; d_sign = -d_sign, d_abs+=2)
    {
  dd = d_abs * d_sign;
  g = gcd (n, d_abs);
  if (1 < g && g < n)
      // нашли делитель - d_abs
      return 0;
  if (jacobi ((dd), n) == -1)
      break;
    }
 
    // параметры Селфриджа
  p = 1,
  q = (p*p - dd) / 4;
    
    // разлагаем n+1 = d*2^s
    n_1 = n;
    ++n_1;
    //int s, d;
    transform_num (n_1, &s, &d);
 
    // алгоритм Лукаса
  u = 1,
  v = p,
  u2m = 1,
  v2m = p,
  qm = q,
  qm2 = q*2,
  qkd = q;
    for (bit = 1, bits = bits_in_number(d); bit < bits; bit++)
    {
  mulmod (&u2m, v2m, n);
  mulmod (&v2m, v2m, n);
  while (v2m < qm2)
      v2m += n;
  v2m -= qm2;
  mulmod (&qm, qm, n);
  qm2 = qm;
  qm2 *= 2;
  if (test_bit (d, bit))
  {
      t1, t2;
      t1 = u2m;
      mulmod (&t1, v, n);
      t2 = v2m;
      mulmod (&t2, u, n);
      
      t3, t4;
      t3 = v2m;
      mulmod (&t3, v, n);
      t4 = u2m;
      mulmod (&t4, u, n);
      mulmod (&t4, (int)dd, n);
 
      u = t1 + t2;
      if (!(u % 2 == 0))
    u += n;
      u /= 2;
      u %= n;
 
      v = t3 + t4;
      if (!(v % 2 == 0))
    v += n;
      v /= 2;
      v %= n;
      mulmod (&qkd, qm, n);
  }
    }
 
    // точно простое (или псевдо-простое)
    if (u == 0 || v == 0)
  return 1;
 
    // вычисляем оставшиеся члены
    qkd2 = qkd;
    qkd2 *= 2;
    for (r = 1; r < s; ++r)    {
  mulmod (&v, v, n);
  v -= qkd2;
  if (v < 0) v += n;
  if (v < 0) v += n;
  if (v >= n) v -= n;
  if (v >= n) v -= n;
  if (v == 0)
      return 1;
  if (r < s-1)
  {
      mulmod (&qkd, qkd, n);
      qkd2 = qkd;
      qkd2 *= 2;
  }
    }
 
    return 0;
 
}
 
int main()
{
   
        int num=0;
        printf( "Enter any number -> \n");
        scanf("%u", &num);
        printf("%s\n",
            (
                lucas_selfridge (num) ?
                "It is possibly a prime number" :
                "It is composite number"
            )
        )
    return 0;
}
Убрал ссылки.Инициализацию переменных перенес в начало. Убрал заголовочные файлы С++. Убрал конструкцию "++++"
Вроде всё. Спасибо,памятника не надо
0
Splendid
0 / 0 / 1
Регистрация: 27.03.2008
Сообщений: 75
06.08.2008, 15:23  [ТС] #8
Спасибо! Очень жду!
0
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
06.08.2008, 15:25 #9
Гыыы...и компилится же у вас такой код ужасть
0
Splendid
0 / 0 / 1
Регистрация: 27.03.2008
Сообщений: 75
06.08.2008, 15:27  [ТС] #10
XuTPbIu_MuHTAu - ОГРОМНЕЙШЕЕ СПАСИБО!!!!

и памятник

Добавлено через 1 минуту
Спасибо всем-всем-всем! Тему можно закрыть
0
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
06.08.2008, 15:29 #11
XuTPbIu_MuHTAu, я всегда компиляторы настраиваю на максимальный уровень предупреждений и детектирование ошибок. Так правильней Поэтому такой код он точно не откомпилит
Хотя, в большинстве своем, конечно, компилиться будет.
0
XuTPbIu_MuHTAu
Эксперт С++
2226 / 741 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
06.08.2008, 15:32 #12
Мне тоже код не понравился.Возникает ощущение,что хотели запутать и напугать

Я предупреждения снимаю,ненавижу читать про возможную потерю данных
при конверте float->int. Но пишу не так)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2008, 15:32
Привет! Вот еще темы с ответами:

Перевести код с C - C++
Не получается перевести из С в C++: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; using namespace std; int mycompare(int first, int...

Перевести код на С++ - C++
Прошу помощи с переводом кода на С++. Возникают трудности с корректным и правильным переводом кода. Заранее благодарен. ...

Перевести код на С++ с C# - C++
Помогите написать курсач. Надо игру написать на с++, а написал на с#. Переведите код

Перевести код с С - C++
Помогите переделать код з С на С++ #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int Nod(int a,int b,int *nod); int main(void) {...


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
06.08.2008, 15:32
Закрытая тема Создать тему
Опции темы

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