Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2013, 18:52   #1
mischka
Новичок
Джуниор
 
Регистрация: 04.06.2013
Сообщений: 1
Восклицание метод Гаусса

помогите, пожалуйста! не могу найти причину. когда данные идут с файла-все хорошо работает, когда с клавиатуры-подсчет не верный. Там в printmatrix появляется много каких-то нулей.

очень-очень срочно, у меня курсовая по этому, скоро сдавать.
заранее спасибо!

#include <conio.h>
#include <stdio.h>
#include <process.h>
float **a, *b, *x;
int N;
char filename[256];
FILE* InFile=NULL;
FILE* InFile1=NULL;
void count_num_lines(){
int nelf=0;
do{
nelf = 0;
while(fgetc(InFile)!='\n' && !feof(InFile)) nelf=1;
if(nelf) N++;
}while(!feof(InFile));
}

void freematrix(){

int i;
for(i=0; i<N; i++){
delete [] a[i];
}
delete [] a;
delete [] b;
delete [] x;
}
void menu(){

printf("natusnit klavishy 1 abo 2");
printf("\n**|1-dani z klaviatyru| \n");
printf("* |2-dani z fajly|\n");

}
void choice()
{int q;
void keyboard();
void file();
scanf_s ("%d",&q);
switch (q)
{case 1:
keyboard(); break;
case 2:
file(); break;
default:
printf ("ne virna forma");}

}
void allocmatrix(){
int i,j;
x = new float[N];
b = new float[N];
a = new float*[N];
if(x==NULL || b==NULL || a==NULL){
printf("\n ne vucta4ae pamjati %d.\n", N);
exit(-1);
}
for(i=0; i<N; i++){
a[i] = new float[N];
if(a[i]==NULL){
printf("\n ne vucta4ae pamjati %d.\n", N);
}
}
for(i=0; i<N; i++){
for(j=0; j<N; j++){
a[i][j]=0;
}
b[i]=0;
x[i]=0;
}
}

void readmatrix(){
int i=0,j=0;

for(i=0; i<N; i++){
for(j=0; j<N; j++){
fscanf(InFile, "%fl", &a[i][j]);
}
fscanf(InFile, "%fl", &b[i]);
}
}

void printmatrix(){

int i=0,j=0;
printf("\n");
for(i=0; i<N; i++){
for(j=0; j<N; j++){
printf(" %+f*X%d", a[i][j], j);
}
printf(" =%f\n", b[i]);
}
}
void testsolve(){
int i=0,j=0;
printf("\n");
for(i=0; i<N; i++){
float s = 0;
for(j=0; j<N; j++){
s += a[i][j]*x[j];
}
printf("%f\t%f\n", s, b[i]);
}
}
void printresult(){
int i=0;
printf("\n");
printf("Result\n");
for(i=0; i<N; i++){
printf("X%d = %f\n", i, x[i]);
}
}
void printresult1(){
int i=0;
fprintf(InFile1, "Result\n");
for(i=0; i<N; i++){
fprintf(InFile1, "X%d = %f\n", i, x[i]);
}
}
void diagonal(){
int i, j, k;
float temp=0;
for(i=0; i<N; i++){
if(a[i][i]==0){
for(j=0; j<N; j++){
if(j==i) continue;
if(a[j][i] !=0 && a[i][j]!=0){
for(k=0; k<N; k++){
temp = a[j][k];
a[j][k] = a[i][k];
a[i][k] = temp;
}
temp = b[j];
b[j] = b[i];
b[i] = temp;
break;

}
}
}
}
}
void keyboard()
{ int i=0, j=0, k=0;

printf("\n vvestu kilkict rivnjan: ");
scanf("%d", &N);
printf("\nVvestu koeficientu: \n");
allocmatrix();
// int i=0,j=0;
for(i=0; i<N; i++){
for(j=0; j<N; j++){
scanf("%d", &a[i][j]);
}
scanf("%d", &b[i]);
}
}

void file()
{
int i=0,j=0, k=0;
do{
printf("\n vvestu imja fajly : ");
scanf("%s", filename);
InFile = fopen(filename, "rt");
}
while(InFile==NULL);
count_num_lines();

allocmatrix();
rewind(InFile);
for(i=0; i<N; i++){
for(j=0; j<N; j++){
fscanf(InFile, "%fl", &a[i][j]);
}
fscanf(InFile, "%fl", &b[i]);
}
fclose(InFile);
}
void main(){
menu();
choice();
diagonal();
printmatrix();
int i, k, j;
//обробка рядків
for(k=0; k<N; k++){
for(i=k+1; i<N; i++){
if(a[k][k]==0){
printf("\n rozvjazky nemae.\n");
return;
}
float M = a[i][k] / a[k][k];
for(j=k; j<N; j++){
a[i][j] -= M * a[k][j];
}

b[i] -= M*b[k];
}
}
printmatrix();
for(int i=N-1; i>=0; i--){
float s = 0;
for(int j = i; j<N; j++){
s = s+a[i][j]*x[j];
}
x[i] = (b[i] - s) / a[i][i];
}

printmatrix();
testsolve();
printresult();
InFile1 = fopen("result.txt", "w");
printresult1();
fclose(InFile1);
freematrix();
_getch();

return;


}
mischka вне форума Ответить с цитированием
Старый 04.06.2013, 19:27   #2
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Код:
void choice()
{int q;
void keyboard();
void file();
scanf_s ("%d",&q);
switch (q)
{case 1:
keyboard(); break;
case 2:
file(); break;
default:
printf ("ne virna forma");}
А зачем Вы объявляете функции (void keyboard();
void file(); ) в функции choice()?
+ вы пишете на C, там оператор delete отсутствует
А вообще лучше используйте пошаговую отладку (сможете проследить все вызовы функций, проконтроллировать значения переменных и т.п)

Последний раз редактировалось Igor95; 04.06.2013 в 19:32.
Igor95 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Гаусса на C#. bestnicer Помощь студентам 0 27.11.2012 14:54
метод простых операций и метод гаусса зейделя tarasman11 Паскаль, Turbo Pascal, PascalABC.NET 1 23.09.2012 14:46
Безумно сложные задачки!!!! Метод Гаусса, итераций, метод половинного деления, задача Коши и т.д. Хомяк!!!!! Помощь студентам 4 08.07.2009 10:08
Метод Гаусса IgorKr Помощь студентам 10 03.02.2008 11:28