Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Программу из С++ нужно переделать в С (http://forum.oszone.net/showthread.php?t=300139)

i_love_es@vk 22-05-2015 07:00 2510059

Программу из С++ нужно переделать в С
 
Доброго времени суток! Помогите разобраться с заданием. Нужно переделать код из С++ в С.
Код на С++ работает правильно
#include <iostream>
#include <omp.h>

#define M 5000

#define E 0.00001
#define T 0.01


int main(){
int i, j, v;
long int dt1;
double alf, bet, mf;
double Spr, Spr1, Spz;
// double A[M][M], F[M], Xk[M], Zk[M], Rk[M], Sz[M];
double ** A = new double*[M];
double * F = new double[M];
double * Xk = new double[M];
double * Zk = new double[M];
double * Rk = new double[M];
double * Sz = new double[M];

omp_set_num_threads(2);

double ts = omp_get_wtime();

for (int i=0;i<M;i++)
A[i] = new double[M];

for (mf=0,i = 0; i < M; i++) {
#pragma omp parallel
{
#pragma omp for
for (j = 0; j < M; j++) {
if(i == j)
A[i][j] = 2.0;
else
A[i][j] = 8.;
}
}
F[i] = M + 1;
mf += F[i] * F[i];
}

/* Задаем начальное приближение корней. В Хk хранятся значения корней
* к-й итерации. */
#pragma omp parallel
{
#pragma omp for
for (i = 0; i < M; i++)
Xk[i] = 0.2;
}
/* Задаем начальное значение r0 и z0. */
for (i = 0; i < M; i++) {
Sz[i]=0;
double sum = 0;
#pragma omp parallel
{
#pragma omp for reduction(+:sum)
for (int j = 0; j < M; j++) {
sum += A[i][j] * Xk[j];
}
}
Sz[i] = sum;
Rk[i] = F[i] - Sz[i];
Zk[i] = Rk[i];
}


do {
Spz = 0;
Spr = 0;
for(i = 0; i < M; i++) {
Sz[i]=0;
double sum = 0;
#pragma omp parallel
{
#pragma omp for reduction(+:sum)
for(int j = 0; j < M; j++)
sum += A[i][j] * Zk[j];
}
Sz[i] = sum;
Spz += Sz[i] * Zk[i];
Spr += Rk[i] * Rk[i];
}
alf = Spr/Spz;

Spr1 = 0;
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < M; i++){
Xk[i] += alf*Zk[i];
Rk[i] -= alf*Sz[i];
#pragma omp critical
Spr1 += Rk[i]*Rk[i];
}
}
bet = Spr1/Spr;

#pragma omp parallel
{
#pragma omp for
for(i = 0; i < M; i++)
Zk[i] = Rk[i] + bet*Zk[i];
}

} while(Spr1/mf > E*E);


// Xk[0]...Xk[M-1] - корни

double tf = omp_get_wtime();
std::cout<<"\nruntime: "<<tf - ts<<" s.\n";
std::cout<<Xk[0]<<" "<<Xk[1];
return(0);
}


Время: 01:42.

Время: 01:42.
© OSzone.net 2001-