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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2016, 18:55   #1
Яна1789
 
Регистрация: 31.05.2016
Сообщений: 9
По умолчанию C++ Проверка программы

Здравствуйте. Мне дана задача, найти параметры (С1, С2, С3) аппроксимирующей функции y= С1*f1(x)+С2*f2(x)+ С3*f3(x), пользуясь методом наименьших квадратов. А поиск параметром осуществить, по методу Гаусса.
xi- 0.79;1.57;2.36;3.12;3.81
yi- 2.50;1.20;1.12;2.25;4.28
φ1(x)- 1
φ2(x)- x
φ3(x)- x^2
Моя программа:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#define n 5
#define m 3
void vvodMatrX(float X[n]);
void vvodMatrY(float Y[n]);
void matrAB(float A[m][m],float B[m],float x[n],float y[n]);
float fi(float x,int k);
void vmat (float A[m][m]);
void vvek(float B[m]);
void gauss(float A[m][m],float B[m],float C[m]);
void otklonenie(float G[n],float X[n]);
void tabl(float X[n],float Y[n],float C[m],float G[n]);

int main()

{

int i ,k,j,max;
float A[m][m],B[m],X[5]={0.79, 1.57, 2.36, 3.12, 3.81},
Y[5]={2.5, 1.2, 1.12, 2.25, 4.28},C[m],G[n];

clrscr();


matrAB(A,B,X,Y);
printf("matrica A: ");
vmat (A);
printf("\nvektor B:\n");
vvek(B);
gauss(A,B,C) ;
printf("\nF=%4.4f+%4.4f(x)+%4.4f((3 *x*x)-1) \n",C[0],C[1],C[2]);
printf("\nkoefficienti C0=%5.4f, C1=%5.4f, C2=%5.4f \n",C[0],C[1],C[2]);
printf("\nvicheslennie znacheniya\n");
vivodTabl(X,Y,C,G,i,F);
approks(G,J);
printf("\nznachenie kriteria approksimacii: \n");
printf(" J= %7.4f ",J);
otklonenie(G,X,g,max);
printf("\nMax. po modulu otklonenie:\n");
printf("max|g[i]|= %5.4f pri x= x[%d]= %5.4f \n",g,max+1,X[max]);
getch();
return 0;
}


void vvodMatrX(float X[n])
{
int i;
printf("\n");
for(j=0;j<m;j++)
scanf("%9.4f ",&X[i]);
}


void vvodMatrY(float Y[n])
{
int i;
printf("vvod y:\n");
for (i=0; i<n; i++)
scanf("%f", &Y[i]);
}
void vvodMatrY(float Y[n])
{
int i;
printf("vvod y:\n");
for (i=0; i<n; i++)
scanf("%f", &Y[i]);
}

void matrAB(float A[m][m],float B[m],float x[n],float y[n])
{
int i,j,l;
float S;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
S=0;
for(l=0;l<n;l++)
S=S+fi(x[l],i)*fi(x[l],j);
A[i][j]=S;
}
S=0;
for(l=0;l<n;l++)
S=S+ y[l]*fi(x[l],i);
B[i]=S;
}
}
void vivodmatr(float A[m][m])
{
int i,j;
for(i=0;i<m;i++)
{ printf("\n");
for(j=0;j<m;j++)
printf("%9.4f",A[i][j]);
}
printf("\n");
}
void vivodvekt(float B[m])
{
int i;
for(i=0;i<m;i++)
printf("%9.4f",B[i]);
}


void gauss(float A[m][m],float B[m],float C[m])
{
int i,k,j;
float sum;
for (i=0;i<m-1;i++)
{
for (k=i+1;k<m;k++)
{
C[i]=A[k][i]/A[i][i];
A[k][i]=0;
for (j=i+1;j<m;j++)
A[k][j]=A[k][j]-C[i]*A[i][j];
B[k]=B[k]-C[i]*B[i];

}
}

for (i=m-1;i>=0;i--)
{
sum=0;
for (j=i+1;j<m;j++)
sum=sum+A[i][j]*C[j];
C[i]=(B[i]-sum)/(A[i][i]);
}
}



void tabl(float X[n],float Y[n],float C[m],float G[n],int &i, float F[n])
{
for(i=0;i<n;i++)
{
F[i]=C[0]+C[1]*( X[i])+C[2]*((3*X[i]*X[i])-1);
G[i]=Y[i]-F[i];
}
}

void approks(float G[n],float &J)
{
int i;
J=0;
for(i=0;i<n;i++)
J=J+G[i]*G[i];
}


void otklonenie(float G[n],float X[n])
{
int i,max;
float g;
g=fabs(G[0]);
max=0;
for(i=1;i<n;i++)
if (fabs(G[i])>g)
{
g=fabs(G[i]);
max=i;
}

}

float fi(float x,int k)
{
if(k==0)
return (1);
else
if(k==1)
return (x);
else
if(k==2)
return ((3*x*x)-1);
}

void vivodTabl(float X[n],float Y[n],float C[m],float G[n], int &i, float F[n])
{
printf("i X[i] Y[i] F[i] G[i]\n");
for(i=0;i<n;i++)
printf("%i %5.4f %5.4f %5.4f %5.4f\n",i+1,X[i],Y[i],F[i],G[i]);
}

Так же выводится все должно в main.Т.е не отдельно в каждом, а вместе.
И меня интересует,правильно ли составлена программа или нет? И в чем ошибки.
Яна1789 вне форума Ответить с цитированием
Старый 03.06.2016, 00:13   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Что то не очень правильно. Вот у меня повылазило ошибки




Не понятно почему матрицы (xi, yi) жестко задавать в программе, а не задаются с клавиатуры (ведь есть ф-ции void vvodMatrX). А после этого непонятно зачем нужны:
void vvodMatrX(float X[n])
void vvodMatrY(float Y[n])
void vvodMatrY(float Y[n]) - 2-й раз функция зачем то таже самая организована.
vivodTabl
Если Вы работает в С++, зачем использовать printf и scanf (аналоги cout, cin). Вас так учили?

Пока всё - я особо в код не вдавался.

p.s.: может показать Вам как пользоваться отладчиком? (для поиска ошибок)

Последний раз редактировалось ura_111; 03.06.2016 в 00:26.
ura_111 вне форума Ответить с цитированием
Старый 03.06.2016, 09:29   #3
Яна1789
 
Регистрация: 31.05.2016
Сообщений: 9
По умолчанию

Спасибо большое, что ответили.
Да,нас так учили.
Я исправила, но теперь в ошибках мне пишет "ld returned 1 exit status"
Почему это может быть? main вроде правильно написано.
Яна1789 вне форума Ответить с цитированием
Старый 03.06.2016, 09:31   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Приводите код - будем общаться конкретней по нему,
а то я не настолько профессионален чтобы по одному виду сообщения сказать что не так.

Последний раз редактировалось ura_111; 03.06.2016 в 09:34.
ura_111 вне форума Ответить с цитированием
Старый 03.06.2016, 09:59   #5
Яна1789
 
Регистрация: 31.05.2016
Сообщений: 9
По умолчанию

Вот он

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#define n 5
#define m 3
void vvodMatrX(float X[n]);
void vvodMatrY(float Y[n]);
void matrAB(float A[m][m],float B[m],float x[n],float y[n]);
void vivodmatr(float A[m][m]);
void vivodvekt(float
B[m]);
void gauss(float A[m][m],float B[m],float C[m]);
void tabl(float X[n],float Y[n],float C[m],float G[n], int &i, float F[n]);
void approks(float G[n],float &);
void otklonenie(float [],float X[n],float &,int &max);
float fi(float x,int k);
void vivodTabl(float X[n],float Y[n],float C[m],float G[n], int &i, float F[n]);

int main()

{
int i ,k,j,max;
float A[m][m],B[m],X[n],Y[n],C[m],G[n],J,g,F[n];
vvodMatrX(X);
vvodMatrY(Y);
matrAB(A,B,X,Y);
printf("matrica A:\n ");
vivodmatr(A);
printf("\nnvektor B:\n");
vivodvekt(B);
gauss(A,B,C);
tabl(X,Y,C,G,i,F);
printf("\nF=%4.4f+%4.4f(x)+%4.4f((3 *x*x)-1) \n",C[0],C[1],C[2]);
printf("\nkoefficienti C0=%5.4f, C1=%5.4f, C2=%5.4f \n",C[0],C[1],C[2]);
printf("\nvicheslennie znacheniya\n");
vivodTabl(X,Y,C,G,i,F);
approks(G,J);
printf("\nznachenie kriteria approksimacii: \n");
printf(" J= %7.4f ",J);
otklonenie(G,X,g,max);
printf("\nMax. po modulu otklonenie:\n");
printf("max|g[i]|= %5.4f pri x= x[%d]= %5.4f \n",g,max+1,X[max]);
getch();


}

void vvodMatrX(float X[n])
{
int i;
printf("vvod x:\n");
for (i=0; i<n; i++)
scanf("%f", &X[i]);
}

void vvodMatrY(float Y[n])
{
int i;
printf("vvod y:\n");
for (i=0; i<n; i++)
scanf("%f", &Y[i]);
}

void matrAB(float A[m][m],float B[m],float x[n],float y[n])
{
int i,j,l;
float S;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
S=0;
for(l=0;l<n;l++)
S=S+fi(x[l],i)*fi(x[l],j);
A[i][j]=S;
}
S=0;
for(l=0;l<n;l++)
S=S+y[l]*fi(x[l],i);
B[i]=S;
}
}


void vivodmatr(float A[m][m])
{
int i,j;
for(i=0;i<m;i++)
{
printf("\n");
for(j=0;j<m;j++)
printf("%9.4f",A[i][j]);
}
printf("\n");
}


void vivodvekt(float B[m])
{
int i;
for(i=0;i<m;i++)
printf("%9.4f",B[i]);
}
void tabl(float X[n],float Y[n],float C[m],float G[n],int &i, float F[n])
{
for(i=0;i<n;i++)
{
F[i]=C[0]+C[1]*( X[i])+C[2]*((3*X[i]*X[i])-1);
G[i]=Y[i]-F[i];
}
}


void approks(float G[n],float &J)
{
int i;
J=0;
for(i=0;i<n;i++)
J=J+G[i]*G[i];
}


void otklonenie( float G[n],float X[n],float &g, int &max)
{
int i;
g=fabs(G[0]);
max=0;
for(i=0;i<n;i++)
if (fabs(G[i])>g)
{
g=fabs(G[i]);
max=i;
}
}


float fi(float x,int k)
{
if(k==0)
return (1);
else
if(k==1)
return (x);
else
if(k==2)
return ((3*x*x)-1);
}

void vivodTabl(float X[n],float Y[n],float C[m],float G[n], int &i, float F[n])
{
printf("i X[i] Y[i] F[i] G[i]\n");
for(i=0;i<n;i++)
printf("%i %5.4f %5.4f %5.4f %5.4f\n",i+1,X[i],Y[i],F[i],G[i]);
}
Яна1789 вне форума Ответить с цитированием
Старый 03.06.2016, 10:16   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Код:
void gauss(float A[m][m],float B[m],float C[m]);
Не реализовали, о чем вам компилятор явно и написал.
p51x вне форума Ответить с цитированием
Старый 03.06.2016, 10:43   #7
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Вы писали: "...выводится всё должно в main..."

А сами выводите в отдельных функциях:

void vivodvekt(float B[m])
void vivodmatr(float A[m][m])
void vivodTabl(float X[n],float Y[n],float C[m],float G[n], int &i, float F[n])

Вопрос: а вводить данные тоже надо в main? Функции:

void vvodMatrX(float X[n])
void vivodmatr(float A[m][m])
ura_111 вне форума Ответить с цитированием
Старый 03.06.2016, 10:45   #8
Яна1789
 
Регистрация: 31.05.2016
Сообщений: 9
По умолчанию

Извините,я не понимаю, что вы имеете виду под "реализовать". Ведь далее у меня идет в void A,B,C,X и Y
Яна1789 вне форума Ответить с цитированием
Старый 03.06.2016, 10:48   #9
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Он имел ввиду: Яна куда пропала функция gauss из 1-го листинга программы?



void gauss(float A[m][m],float B[m],float C[m])
{
int i,k,j;
float sum;
for (i=0;i<m-1;i++)
{
for (k=i+1;k<m;k++)
{
C[i]=A[k][i]/A[i][i];
A[k][i]=0;
for (j=i+1;j<m;j++)
A[k][j]=A[k][j]-C[i]*A[i][j];
B[k]=B[k]-C[i]*B[i];

}
}

for (i=m-1;i>=0;i--)
{
sum=0;
for (j=i+1;j<m;j++)
sum=sum+A[i][j]*C[j];
C[i]=(B[i]-sum)/(A[i][i]);
}
}

Сопоставь 1- й и 2- й твои листинги программы.

Последний раз редактировалось ura_111; 03.06.2016 в 15:40.
ura_111 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка на ошибку программы Razdolbai Помощь студентам 1 13.11.2012 10:58
проверка программы Frank63 Паскаль, Turbo Pascal, PascalABC.NET 5 07.10.2012 22:40
проверка программы swat16 Помощь студентам 6 20.04.2012 10:30
проверка программы PradoSV Общие вопросы C/C++ 0 14.12.2009 21:26
Проверка работы программы... DimkinStd Общие вопросы Delphi 3 26.12.2006 13:24