Перевод кода с C++ - C (СИ) (72770)
Формулировка задачи:
Доброго времени суток! помоги пожалуйста переделать код задачи из С++ в С
#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); }
Решение задачи: «Перевод кода с C++»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <omp.h> #define M 5000 #define E 0.00001 #define T 0.01 int main(void){ int i, j, v; long int dt1; double sum, tf, ts; double alf, bet, mf; double Spr, Spr1, Spz; // double A[M][M], F[M], Xk[M], Zk[M], Rk[M], Sz[M]; double ** A = malloc(sizeof(double*) * M); double * F = malloc(sizeof(double) * M); double * Xk = malloc(sizeof(double) * M); double * Zk = malloc(sizeof(double) * M); double * Rk = malloc(sizeof(double) * M); double * Sz = malloc(sizeof(double) * M); omp_set_num_threads(2); ts = omp_get_wtime(); for (i=0;i<M;i++) A[i] = malloc(sizeof(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; sum = 0; #pragma omp parallel { #pragma omp for reduction(+:sum) for (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; sum = 0; #pragma omp parallel { #pragma omp for reduction(+:sum) for(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(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] - корни tf = omp_get_wtime(); printf("\nruntime: %f s.\n", tf - ts); printf("%f %f", Xk[0], Xk[1]); return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д