单线性回归分析模型误差



第 17 行:"sumXY"重新声明为不同类型的符号

第 20 行:返回类型"float (*)(float,float)"但预期为 "float" 时不兼容的类型

如何解决此错误?

#include <stdio.h>
#include<math.h>
#include<stdlib.h>
float sumX, sumY, sumXY, sumsqX, xy, sum, n, b, a;
float a1, a2, a3, a4, a5, b1, b2, b3, b4, b5, c1, c2, c3, c4, c5, d1, d2, d3, d4, d5;
float a6, a7, a8, b6, b7, b8, c6, c7, c8, d6, d7, d8;

float sumf(float a, float b, float c, float m, float n, float e, float q, float z) {
sum = a + b + c + m + n + e + q + z;
return sum;
}
float sumXY(float p, float q) {
sumXY = p * q;
return sumXY;
}
int main()
{
printf("Enter the values of n:nn");
scanf("%f", &n);
sumX = 0;
printf("Enter the values of X:nn");
scanf("%f", &a1);
scanf("%f", &a2);
scanf("%f", &a3);
scanf("%f", &a4);
scanf("%f", &a5);
scanf("%f", &a6);
scanf("%f", &a7);
scanf("%f", &a8);
sumX = sumf(a1, a2, a3, a4, a5, a6, a7, a8);
sumY = 0;
printf("Enter the values of Y:nn");
scanf("%f", &b1);
scanf("%f", &b2);
scanf("%f", &b3);
scanf("%f", &b4);
scanf("%f", &b5);
scanf("%f", &b6);
scanf("%f", &b7);
scanf("%f", &b8);
sumY = sumf(b1, b2, b3, b4, b5, b6, b7, b8);
c1 = sumXY(a1, a1);
c2 = sumXY(a2, a2);
c3 = sumXY(a3, a3);
c4 = sumXY(a4, a4);
c5 = sumXY(a5, a5);
c6 = sumXY(a6, a6);
c7 = sumXY(a7, a7);
c8 = sumXY(a8, a8);
sumsqX = sumf(c1, c2, c3, c4, c5, c6, c7, c8);
d1 = sumXY(a1, b1);
d2 = sumXY(a2, b2);
d3 = sumXY(a3, b3);
d4 = sumXY(a4, b4);
d5 = sumXY(a5, b5);
d6 = sumXY(a6, b6);
d7 = sumXY(a7, b7);
d8 = sumXY(a8, b8);
xy = sumf(d1, d2, d3, d4, d5, d6, d7, d8);

printf("t-----------------------------------------------------n");
printf("ttt*****Regression Table****n");
printf("ttt.....................n");

printf("ntXttYtX^2ttXYttn");
printf("nt%.2ftt%.2ftt%.2ftt%.2fn", a1, b1, c1, d1);
printf("nt%.2ftt%.2ftt%.2ftt%.2fn", a2, b2, c2, d2);
printf("nt%.2ftt%.2ftt%.2ftt%.2fn", a3, b3, c3, d3);
printf("nt%.2ftt%.2ftt%.2ftt%.2fn", a4, b4, c4, d4);
printf("nt%.2ftt%.2ftt%.2ftt%.2fn", a5, b5, c5, d5);
printf("nt%.2ftt%.2ftt%.2ftt%.2fn", a6, b6, c6, d6);
printf("nt%.2ftt%.2ftt%.2ftt%.2fn", a7, b7, c7, d7);
printf("nt%.2ftt%.2ftt%.2ftt%.2fn", a8, b8, c8, d8);
printf("t=======================================================n");
printf("nt%.2ftt%.2ftt%.2ftt%.2fn", sumX, sumY, sumsqX, xy);
printf("t=======================================================nn");
b = (sumXY(n, xy) - sumXY(sumX, sumY)) / (sumXY(n, sumsqX) - pow(sumX, 2));
a = (sumY / n) - sumXY(b, sumX) / n;
printf("The regression Co-Efficient is :t%.2fnn", b);
printf("The regression constant is :t%.2fnn", a);
}

正如您在评论中所说

float ..., sumXY, ...;

sumXY定义为浮点型全局变量

的位置然后

float sumXY(float p, float q) {

定义具有相同名称的函数

在程序的其余部分,您不使用sumXY作为变量,因此请替换

float sumX, sumY, sumXY, sumsqX, xy, sum, n, b, a;

float sumX, sumY, sumsqX, xy, sum, n, b, a;

例如
float sumXY(float p, float q) {
sumXY = p * q;
return sumXY;
}

float sumXY(float p, float q) {
return p * q;
}

即使定义一个函数只是为了做乘法也很奇怪


其他一些评论:

  • 我鼓励您检查scanf("%f", &xxx);的返回值,如果用户没有输入有效的浮点数,则当前变量的所有下一个变量都将未设置,但您不会知道
  • 为什么使用这么多变量而不是数组? 使用数组,您可以将连续的scanf放在循环中,并且printf的同上,而不必在参数中单独给出它们。想象一下,如果值的数量不再是 8,而是其他像 88 这样的东西!
  • 使用全局变量是一个坏主意,它们可以是main中的所有局部变量,而无需在其他地方进行任何更改

这是程序的更正和简化版本,您可以看到如果元素数不能为 8 就足够了,将#define N 8更改为新值就足够

#include <stdio.h>
#include<math.h>
#include<stdlib.h>
int enterValues(const char * msg, float v[], size_t n)
{
puts(msg);
for (size_t i = 0; i != n; ++i) {
if (scanf("%f", &v[i]) != 1) {
puts("invalid input");
return 0;
}
}
return 1;
}
float sumf(float a[], size_t n) {
float sum = 0;
for (size_t i = 0; i != n; ++i)
sum += a[i];
return sum;
}
float sumXY(float p, float q) {
return p * q;
}
#define N 8
int main()
{
float n;
printf("Enter the values of n:nn");
if (scanf("%f", &n) != 1) {
puts("invalid input");
return -1;
}
float a[N];
if (!enterValues("Enter the values of X:n", a, sizeof(a)/sizeof(a[0])))
return -1;
float sumX = sumf(a, N);
float b[N];
if (!enterValues("Enter the values of Y:n", b, N))
return -1;
float sumY = sumf(b, N);
float c[N];
for (size_t i = 0; i != n; ++i)
c[i] = sumXY(a[i], a[i]);
float sumsqX = sumf(c, N);
float d[N];
for (size_t i = 0; i != n; ++i)
d[i] = sumXY(a[i], b[i]);
float xy = sumf(d, N);
printf("t-----------------------------------------------------n");
printf("ttt*****Regression Table****n");
printf("ttt.....................n");

printf("ntXttYtX^2ttXYttn");
for (size_t i = 0; i != N; ++i) {
printf("nt%.2ftt%.2ftt%.2ftt%.2fn", a[i], b[i], c[i], d[i]);
}
printf("t=======================================================n");
printf("nt%.2ftt%.2ftt%.2ftt%.2fn", sumX, sumY, sumsqX, xy);
printf("t=======================================================nn");
float bb = (sumXY(n, xy) - sumXY(sumX, sumY)) / (sumXY(n, sumsqX) - pow(sumX, 2));
float aa = (sumY / n) - sumXY(bb, sumX) / n;
printf("The regression Co-Efficient is :t%.2fnn", bb);
printf("The regression constant is :t%.2fnn", aa);
return 0;
}

最新更新