Перевод кода из с++ в с - 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()
Объяснение кода листинга программы
razmer
- переменная, хранящая размер матрицы;a
- матрица с коэфицентами уравнения;x
- массив, в который будут записаны решения уравнения;b
- массив, содержащий свободные члены уравнения;exchange
- функция, меняющая местами строки в матрице;get_n_no_empty
- функция, определяющая ближайшую строку с ненулевым элементом в главной диагонали;pause
- вспомогательная функция, ожидающая нажатия клавиши пользователем;malloc
- функция, выделяющая память под динамическую переменную;free
- функция, освобождающая память, выделенную под динамическую переменную;printf
- функция, выводящая информацию на экран;fflush
- функция, очищающая буфер вывода;getch
- функция, ожидающая нажатия клавиши пользователем;exit
- функция, завершающая программу. Список функций и переменных:exchange
get_n_no_empty
pause
malloc
free
printf
fflush
getch
exit
razmer
a
x
b
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д