Перевод кода с 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;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.143 из 5