Перевод кода из с++ в с - C (СИ) (73504)

Узнай цену своей работы

Формулировка задачи:

Господа, помогите перевести из с++ в си фрагменты кода, очень надеюсь)
// пользовательские функции
// меняем местами строки в массиве с коэфицентами уравнения
void exchange(double **mas, int razmer,int from, int to){
    for(int i=0; i < razmer; i++){
        mas[from][i] = mas[from][i] + mas[to][i];
        mas[to][i] = mas[from][i] - mas[to][i];
        mas[from][i] = mas[from][i] - mas[to][i];
    }
}
 
// определяем ближайшую строку с не 0 диоганалью вниз
int get_n_no_empty(double **a, int razmer, int begin){
    for(int i=begin+1; i < razmer; i++){
        if(a[i][i] != 0){
            return i;
        }
    }
 
    cout << "Данная система не решается методом Гауса" << endl;
    getch();
    exit(1);
}
 
// функция ждет пока юзер прочтет и нажмет на кнопку, не обязательная функция
void pause(){
    cout << "Нажмите любую кнопку для продолжения" << endl;
    getch();
}
//----------------------------------------------------------------------------------------------
 int razmer; //размер матрицы
 double **a, // матрица с коэфицентами
        *x, // х
        *b; // свободные члены
/* Здесь переменной razmer необходимо присвоить размер матрицы */
    // создание динамических переменных
    b = new double[razmer];
    x = new double[razmer];
    a = new double*[razmer];
    for(int i=0; i < razmer; i++){
        a[i] = new double[razmer];
    }
/* Здесь нам надо присвоить значения матрице а, и заполнить свободные члены b */
 
    // начинаем решать)
    // частный случай, если размер матрицы == 1
    if(razmer == 1){
        if(a[0][0] != 0){
            cout << "x=" << b[0]/a[0][0] << endl;
        }else{
            cout << "Х любое" << endl;
        }
        getch();
        exit(0);
    }
    // прямой проход
    // идем слево на право по коэфицентам х
    for(int k=0; k < razmer-1; k++){
        // вычитаем по строкам
        for(int m=k+1; m < razmer; m++){
            // если на диагонали элемент = 0, то поменяем местами строки
            if(a[m][m] == 0) exchange(a, razmer, m, get_n_no_empty(a, razmer, m));
            
            double koeficent=a[m][k]/a[0][k];
            //вычисление новых коэфицентов уравнения
            b[m] = b[m] - b[0] * koeficent;
            for(int z=0; z < razmer; z++){
                a[m][z] = a[m][k] - a[0][k] * koeficent;
            }
 
        }
    }
    // ищем решения
    for(int m=razmer-1; m >= 0; m--){
        double sum=0;
        // идем по строке спаво налево, считая сумму корень*коэфицент, до текущего корня
        for(int i=razmer-1; i > m; i--){
            sum += x[i] * a[m][i];
        }
        x[m] = (b[m] - sum)/a[m][m];
    }
 
    // вывод решений
    cout << "###Решения:" << endl;
    for(int i=0; i < razmer; i++){
        cout << "x[" << i << "]=" << x[i] << endl;
    }
    pause();
//----------------------------------------------------------------------------------
   cout << "###Проверим решения:" << endl;
    for(int m=0; m < razmer; m++){
        double sum=0;
        for(int i=0; i < razmer; i++){
            sum += a[m][i] * x[i];
        }
        
        cout << m << ":" << (sum - b[m]) << endl;
    }
    pause()

Решение задачи: «Перевод кода из с++ в с»

textual
Листинг программы
// пользовательские функции
// меняем местами строки в массиве с коэфицентами уравнения
void exchange(double **mas, int razmer,int from, int to){
    for(int i=0; i < razmer; i++){
        mas[from][i] = mas[from][i] + mas[to][i];
        mas[to][i] = mas[from][i] - mas[to][i];
        mas[from][i] = mas[from][i] - mas[to][i];
    }
}
 
// определяем ближайшую строку с не 0 диоганалью вниз
int get_n_no_empty(double **a, int razmer, int begin){
    for(int i=begin+1; i < razmer; i++){
        if(a[i][i] != 0){
            return i;
        }
    }
 
    puts("Данная система не решается методом Гауса");
    fflush(stdout);
    getch();
    exit(1);
}
 
// функция ждет пока юзер прочтет и нажмет на кнопку, не обязательная функция
void pause(){
    puts("Нажмите любую кнопку для продолжения");
    fflush(stdout);
    getch();
}
//----------------------------------------------------------------------------------------------
 int razmer; //размер матрицы
 double **a, // матрица с коэфицентами
        *x, // х
        *b; // свободные члены
/* Здесь переменной razmer необходимо присвоить размер матрицы */
    // создание динамических переменных
    b = malloc(razmer * sizeof(double);
    x = malloc(razmer * sizeof(double);
    a = malloc(razmer * sizeof(double*);
    for(int i=0; i < razmer; i++){
        a[i] = malloc(razmer * sizeof(double);
    }
/* Здесь нам надо присвоить значения матрице а, и заполнить свободные члены b */
 
    // начинаем решать)
    // частный случай, если размер матрицы == 1
    if(razmer == 1){
        if(a[0][0] != 0){
            printf("x=%f\n", b[0]/a[0][0]);
        }else{
            printf("Х любое\n");
        }
        fflush(stdout);
        getch();
        exit(0);
    }
    // прямой проход
    // идем слево на право по коэфицентам х
    for(int k=0; k < razmer-1; k++){
        // вычитаем по строкам
        for(int m=k+1; m < razmer; m++){
            // если на диагонали элемент = 0, то поменяем местами строки
            if(a[m][m] == 0) exchange(a, razmer, m, get_n_no_empty(a, razmer, m));
            
            double koeficent=a[m][k]/a[0][k];
            //вычисление новых коэфицентов уравнения
            b[m] = b[m] - b[0] * koeficent;
            for(int z=0; z < razmer; z++){
                a[m][z] = a[m][k] - a[0][k] * koeficent;
            }
 
        }
    }
    // ищем решения
    for(int m=razmer-1; m >= 0; m--){
        double sum=0;
        // идем по строке спаво налево, считая сумму корень*коэфицент, до текущего корня
        for(int i=razmer-1; i > m; i--){
            sum += x[i] * a[m][i];
        }
        x[m] = (b[m] - sum)/a[m][m];
    }
 
    // вывод решений
    puts("###Решения:");
    for(int i=0; i < razmer; i++){
        printf("x[%d]=%f\n", i, x[i]);
    }
    fflush(stdout);
    pause();
//----------------------------------------------------------------------------------
   puts("###Проверим решения:");
    for(int m=0; m < razmer; m++){
        double sum=0;
        for(int i=0; i < razmer; i++){
            sum += a[m][i] * x[i];
        }
        
        fflush("%d:%f\n", m, sum - b[m]);
    }
    fflush(stdout);
    pause()

Объяснение кода листинга программы

  1. razmer - переменная, хранящая размер матрицы;
  2. a - матрица с коэфицентами уравнения;
  3. x - массив, в который будут записаны решения уравнения;
  4. b - массив, содержащий свободные члены уравнения;
  5. exchange - функция, меняющая местами строки в матрице;
  6. get_n_no_empty - функция, определяющая ближайшую строку с ненулевым элементом в главной диагонали;
  7. pause - вспомогательная функция, ожидающая нажатия клавиши пользователем;
  8. malloc - функция, выделяющая память под динамическую переменную;
  9. free - функция, освобождающая память, выделенную под динамическую переменную;
  10. printf - функция, выводящая информацию на экран;
  11. fflush - функция, очищающая буфер вывода;
  12. getch - функция, ожидающая нажатия клавиши пользователем;
  13. exit - функция, завершающая программу. Список функций и переменных:
  14. exchange
  15. get_n_no_empty
  16. pause
  17. malloc
  18. free
  19. printf
  20. fflush
  21. getch
  22. exit
  23. razmer
  24. a
  25. x
  26. b

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


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

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

10   голосов , оценка 4.1 из 5