Решение системы уравнений методом Гаусса. Программа на русском C++
Приведённый текст программы записываем в файл «gauss»,
а приведённые в предыдущей статье список — в файл «russian».
Перед компиляцией делаем транслитерацию нашей утилитой:
cpp-rus.exe russian russian.cpp
cpp-rus.exe gauss gauss.cpp
После компиляции запускаем программу.
А вот её текст:
#include <iostream.h>
#include "russian.cpp"
//===================================================================
// функция, преобразующая символ из кодировки Windows в кодировку DOS
//===================================================================
ц8 cp1251 в cp866 (ц8 c)
{ если ((0xC0 <= c) && (c <= 0xEF))
c -= 0x40;
иначе
{ если ((0xF0 <= c))
c -= 0x10;
иначе
{ если (c == 0xA8)
c = 0xF0;
иначе
{ если (c == 0xB8)
c = 0xF1;
иначе
{ если (c == 0xB9)
{ c = 0xFC;
}
иначе
{ если (c == 0xA0)
c = 0x20;
} } } } }
вернуть c;
};
//===================================================================
// функция, преобразующая строку из кодировки Windows в кодировку DOS
//===================================================================
ц32 cp1251 в cp866 (ц8* строка_1251, ц16 сколько, ц8* строка_866)
{ цикл (ц16 i=0; i < сколько; i++)
строка_866[i] = cp1251 в cp866 (строка_1251[i]);
вернуть сколько;
};
//===================================================================
// функция, преобразующая строку из кодировки Windows в кодировку DOS
//===================================================================
ц7* cp1251 в cp866 (ц7* строка_1251)
{ статич ц7 строка [256*256];
цел длина = strlen((ц7*) строка_1251);
cp1251 в cp866 ((ц8*) строка_1251, длина, (ц8*) строка);
строка [длина] = 0;
вернуть строка;
};
//===================================================================
#define РАЗМЕР 20
пуст Показать (двойн матрица [РАЗМЕР] [РАЗМЕР+1], цел Размер)
{
цикл (int i=0; i< Размер; i++)
{ цикл (int j=0; j < Размер+1; j++)
вывод << матрица [i][j] << " ";
вывод << "\n";
}
вывод << "\n";
};
//===================================================================
цел равно 0 (двойн число)
{ если (fabs (число) > 0.000001)
вернуть 0;
вернуть -1;
};
//===================================================================
main()
{ двойн матрица [РАЗМЕР] [РАЗМЕР+1];
цел строка, столбец, тек;
цел Размер = 0;
вывод << cp1251 в cp866
("Программа расчёта матриц размером N x (N+1) методом Гаусса.\n\n");
пока ( Размер < 1 || Размер > 20)
{ вывод << cp1251 в cp866 ("Введите число строк в матрице (от 1 до ");
вывод << РАЗМЕР << ") : ";
ввод >> Размер;
}
сим ответ[10];
ответ[0] = 'n';
ответ[1] = 0;
пока (ответ[0] != 'y')
{ цикл (строка = 0; строка < Размер; строка ++)
{ цикл (столбец = 0; столбец <= Размер; столбец ++)
{
двойн число;
вывод << cp1251 в cp866 ("Введите строку № ") << строка;
вывод << cp1251 в cp866 (" , столбец № ") << столбец;
вывод << cp1251 в cp866 (" матрицы: ");
ввод >> число;
матрица [строка][столбец] = число;
} }
вывод << cp1251 в cp866 ("Вы правильно ввели матрицу?\n");
Показать (матрица, Размер);
вывод << cp1251 в cp866
("Y - правильно, приступить к расчёту\n");
вывод << cp1251 в cp866
("N - неправильно, ввести её заново. Ответьте Y или N : ");
ввод >> ответ;
если (ответ[0] == 'Y')
ответ[0] = 'y';
}
вывод << cp1251 в cp866 ("\nСводим матрицу к треугольной. Ход решения.\n");
цикл (тек=0; тек < Размер; тек++)
{ цикл (строка = тек; строка < Размер; строка ++)
{ двойн делитель = матрица [строка] [тек];
если (равно 0(делитель))
перейти ОШИБКА;
цикл (столбец = тек; столбец < Размер + 1; столбец ++)
матрица [строка] [столбец] /= делитель;
}
цикл (строка = тек+1; строка < Размер; строка ++)
{ цикл (столбец = 0; столбец < Размер + 1; столбец ++)
матрица [строка] [столбец] -= матрица [тек] [столбец];
}
Показать (матрица, Размер);
вывод << "\n";
}
вывод << cp1251 в cp866 ("Теперь делаем единичную матрицу. Ход решения.\n");
цикл (столбец = Размер-1; столбец > 0; столбец --)
{ цикл (строка = столбец; строка > 0; строка --)
{ двойн множитель = матрица [строка-1] [столбец];
двойн вычитаемое = множитель * матрица [столбец] [Размер];
матрица [строка-1] [Размер] -= вычитаемое;
матрица [строка-1] [столбец] -= множитель;
}
Показать (матрица, Размер);
вывод << "\n";
}
перейти ЛЯПОТА;
ОШИБКА:;
{ вывод << cp1251 в cp866 ("Введена вырожденная матрица!\n");
Показать (матрица, Размер);
}
ЛЯПОТА:;
вернуть 0;
};
P.S. Если вы скопировали этот текст «на пробу», не забудьте заменить
«<» и «\» на «<» и «\» соотвественно.
Опубликовано: 2012.09.25, последняя правка: 2014.12.04 12:06
Отзывы
2013/01/05 05:49, Сергей #
В исходнике есть непереведённые if и for.
2013/03/21 14:25, Виталий #
int тоже остались и, кстати, цел лучше заменить на цел16 или цел32, что было в Эльбрусе и алголе-68 ещё 30-40 лет назад и вместо двойн тоже лучше сделать вещ64 или цел64
2013/02/23 19:29, Автор сайта #
Применял «ц16» и «ц32», а с «int» промашка вышла, забыл заменить. Но к теме именования типов данных ещё вернёмся, тут будет отдельная страница.
2015/01/23 17:54, rst256 #
Если честно, от кириллицы в коде чуть не стошнило. Хотя кресты такое издевательство конечно заслужили.
2016/04/15 08:14, rst256 #
P.S. Если вы скопировали этот текст «на пробу», не забудьте заменить «<» и «\» на «<» и «\» соответственно. 1. Потом выясните что означают типы ц.. (ц7 и ц8 это char у вас? Хм. может русский язык и правда негативно влияет на способность программировать) 2. Замените "цикл" на "для" т.к. "цикл" тут означает "do" 3. Наверное придется подключить string.h для strlen, и убрать .h у iostream. 4. "перейти" заменить на "переход".
2016/04/15 15:59, Автор сайта #
1. Если ц7 и ц8 в данном примере работают, значит они не влияют на способность программировать. Это целые числа — без знака и со знаком. 2. Здесь «цикл» означает «for». 3. Зависит от компилятора. 4. Глагольные формы лучше подходят для императивного программирования, ибо «императивный» — это «повелительный».
2016/04/19 07:38, rst256 #
Да но <iostream> является стандартом, поверьте ваш компилятор примет его в такой форме. Так почему вы выбрали экзотику? Где "russian.cpp" я люблю играть в шарады, но мне хотелось бы увидеть, как код примера превратиться в рабочий код на с++. Скачиваем утилиту с сайта, и смотрим на результат. Потом можете поискать у себя в "russian.cpp" объявление макроса цикл. Хотя это только теория, "russian.cpp" в студию!
2016/04/19 07:48, rst256 #
4. Глагольные формы лучше подходят для императивного программирования, ибо «императивный» — это «повелительный». Согласен, но автор решил иначе, и это автор вы! Наверное, в недостающем файлике автор решил уже иначе, но я не видел файлик "russian.cpp". Народ царя, спасенного от демонов, требует. Говорят: царь-то не настоявший! Тьфу, блин, не царя, а "russian.cpp" требует. Добавить свой отзыв
Написать автору можно на электронную почту mail(аt)compiler.su
|