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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2012, 16:24   #1
Олежка9
Новичок
Джуниор
 
Регистрация: 07.06.2012
Сообщений: 2
По умолчанию Важно, Нужна срочна бло-схема

ПОМОГИТЕ написать блок-схему по коду!!!



Код:
#include <stdio.h>
#include <math.h>
#include <iostream.h>
#include <conio.h>

float *a, *b, *x, *y, **sums;
//a - неизвестные коэффициенты полинома 
//b - столбец свободных членов (в правой части уравнений) 
//x - координаты, заданные в файле 
//y - координаты, заданные в файле
//sums - суммы степеней x,y при неизвестных коэффициентах полинома
int N, K;
//N - число заданных точек в файле 
//K - степень аппроксимирующего полинома
char filename[100];
FILE* InFile=NULL;

void count_num_lines(){// подсчитывает количество точек, где задана функция.
int sparco=0;        
   do{
       sparco = 0;
       while(fgetc(InFile)!='\n' && !feof(InFile)) sparco=1;
       if(sparco) N++;
   }while(!feof(InFile));
}


void freematrix(){ //освобождает память, которая была выделена ранее.
int i;
   for(i=0; i<K+1; i++){
       delete [] sums[i];
   }
   delete [] a;
   delete [] b;
   delete [] x;
   delete [] y;
   delete [] sums;
}

void allocmatrix(){  //выделяет память для массивов a, b, x, y, sums
int i,j,k;			
   a = new float[K+1];
   b = new float[K+1];
   x = new float[N];
   y = new float[N];
   sums = new float*[K+1];
   if(x==NULL || y==NULL || a==NULL || sums==NULL){
   		cout<<"Ne dostatochno pamyati dlya rasmesheniya: N="<<N<<" , K="<<K<<endl;
       return;
   }
   for(i=0; i<K+1; i++){
       sums[i] = new float[K+1];
       if(sums[i]==NULL){
       cout<<"Ne dostatocno pamyati dlya razmesheniya "<<K+1<<" yravnenii"<<endl;	
       return;
       }
   }
   for(i=0; i<K+1; i++){
       a[i]=0;
       b[i]=0;
       for(j=0; j<K+1; j++){
	   sums[i][j] = 0;
       }
   }
   for(k=0; k<N; k++){
       x[k]=0;
       y[k]=0;
   }
}

void readmatrix(){ //прочитывает из файла координаты точек и вычисляет sumsij
   int i=0,j=0, k=0;
for(k=0; k<N; k++){   
       fscanf(InFile, "%f", &x[k]);
       fscanf(InFile, "%f", &y[k]);
   }
for(i=0; i<K+1; i++){
       for(j=0; j<K+1; j++){
	   sums[i][j] = 0;  //второе обнуление
	   for(k=0; k<N; k++){
	       sums[i][j] += pow(x[k], i+j);
	   }
       }
   }
for(i=0; i<K+1; i++){
       for(k=0; k<N; k++){
	   b[i] += pow(x[k], i) * y[k];
       }
   }
}

void printresult(){//распечатывает получившийся столбец решений
int i=0;
   printf("\n");
   for(i=0; i<K+1; i++){
       printf("a[%d] = %f\n", i, a[i]);
   }
}
void diagonal(){  //делает так, чтобы на главной диагонали не было нулей, чтобы не пришлось
// однажды делить на ноль в процессе приведения системы к треугольному виду.
   int i, j, k;
   float temp=0;
   for(i=0; i<K+1; i++){
       if(sums[i][i]==0){
	   for(j=0; j<K+1; j++){
	       if(j==i) continue;
	       if(sums[j][i] !=0 && sums[i][j]!=0){
		   for(k=0; k<K+1; k++){
		       temp = sums[j][k];
		       sums[j][k] = sums[i][k];
		       sums[i][k] = temp;
		   }
		   temp = b[j];
		   b[j] = b[i];
		   b[i] = temp;
		   break;
	       }
	   }
       }
   }
}

int main(){
   int i=0,j=0, k=0;
   do{
       cout<<"Vvedite pyt k failu s dannimi(Primer C:\\sparco.txt):"<<endl;
       cin>>filename;
       InFile = fopen(filename, "rt");
   }while(InFile==NULL);
   count_num_lines(); 
   cout<<"Kolichestvo tochek(strok) v faile: N="<<N<<endl;
   do{
       cout<<"Vvedite kolichestvo aproksimacii polinoma K<N: ";
       cin>>K;
   }while(K>=N);
   allocmatrix(); 
   rewind(InFile); //Перемещение курсора в начало файла 
readmatrix(); 
diagonal(); 
   fclose(InFile);
for(k=0; k<K+1; k++){
       for(i=k+1; i<K+1; i++){
	   if(sums[k][k]==0){
	   		cout<<"Reshenie ne syshestvyet"<<endl;
	       return 0;
	   }
	   float M = sums[i][k] / sums[k][k];
	   for(j=k; j<K+1; j++){
	       sums[i][j] -= M * sums[k][j];
	   }
	   b[i] -= M*b[k];
       }
   }
for(i=(K+1)-1; i>=0; i--){
       float s = 0;
       for(j = i; j<K+1; j++){
	   s = s + sums[i][j]*a[j];
       }
       a[i] = (b[i] - s) / sums[i][i];
   }
   printresult();
   freematrix();
   getch();// ожидание нажатия клавиши
   return 1;
}

Последний раз редактировалось ACE Valery; 07.06.2012 в 17:28.
Олежка9 вне форума Ответить с цитированием
Старый 07.06.2012, 17:29   #2
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Ну если для вас важно, то могли бы и написать, что должна делать программа.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 07.06.2012, 17:34   #3
Олежка9
Новичок
Джуниор
 
Регистрация: 07.06.2012
Сообщений: 2
По умолчанию

Система для аппроксимации линейной зависимости методом наименьших квадратов
Олежка9 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужна блок схема CheyZe Общие вопросы C/C++ 8 30.01.2011 05:02
Нужна блок схема Денис999 Помощь студентам 0 24.12.2010 19:28
срочна нужна помощь kalashik Паскаль, Turbo Pascal, PascalABC.NET 0 07.06.2009 15:51
Срочна нужна помощь с графиком в Excel =) LnQ Microsoft Office Excel 0 23.01.2009 17:10
Нужна программа, не важно на чем. lisunoff90 Фриланс 1 13.11.2008 15:46