Перевод кода из с++ в с - 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- функция, завершающая программу. Список функций и переменных:exchangeget_n_no_emptypausemallocfreeprintffflushgetchexitrazmeraxb