Ошибки с массивом вещественных чисел

153
01 апреля 2019, 05:20

Выполнял лабораторную работу:

Даны вещественные числа a,b. Значения функции (выполняется один
вариант по номеру бригады) записать в массив a[N+1]. Вычислить значения
интегралов по двум формулам(Симпсона и трапеций), используя
сформированный массив. Сравнить полученные значения.
1) Формула трапеций
I1=h*(a[0]/2+a[1]+a[2]+…+a[N-1]+a[N]/2)
2) Формула Симпсона
I2=h/3*( a[0]+a[N] + 4*(a[1]+a[3]+…+a[N-1]) +
2*(a[2]+a[4]+…+a[N-2]))
x изменяется от a до b с шагом h=(b-a)/N,
выполнить программу для N=10, N=100, N=1000.
6. f(x)=x 2 √(2+3x) 3 ; a=0.5; b=2.5;

Написал код:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <locale.h>
using namespace std;
const int N = 10;
main()
{float f, x, a1=0.5, b=2.5, h, i, I1, I2, p1=0, p2=0, a[N+1];
system("CLS");
setlocale(0,"RUS");
h=(b-a1)/N;
i=0;
for(x=a1;x<b;x+=h){
    f=x*x*sqrt(pow((2+3*x),3));
    a[i]=f;
    i++;
}
I1=a[0]/2;
for(i=1;i<N-1;i++)
    I1+=a[i];
I1+=a[N]/2;
I1*=h;                                         
for(i=1;i<N-1;i+=2)
    p1+=a[i];
for(i=2;i<N-2;i+=2)
    p2+=a[i];
I2=h/3*(a[0]+a[N]+4*p1+2*p2);
printf("\nI1 = %f\nI2 = %f",I1, I2);
printf("\n\n");
system("PAUSE");
return 0;
}

При компиляции выдаёт следующие ошибки:

In function 'int main()':
[Error] invalid types 'float [11][float]' for array subscript
[Error] invalid types 'float [11][float]' for array subscript
[Error] invalid types 'float [11][float]' for array subscript
[Error] invalid types 'float [11][float]' for array subscript

C чем может быть связано появление похожих ошибок?

Answer 1
  1. Размер массива не может быть вещественным числом, например, он не может состоять из 2.6 элементов. Размер должен быть задан целой константой.

  2. Вы объявили переменную 'a', а затем попытались объявить массив с тем же именем. Имя переменной должно быть уникальным, несколько переменных с тем же именем не допускаются.

Остальные ошибки, похоже, следствие этих. Вообще очень полезно читать сообщения компилятора. Я, собственно, просто пересказал своими словами то, что он вам написал.

Answer 2

Похоже, вы использовали в качестве размера массива и индекса числа с плавающей точкой...

Что такое массив из 3.5 элементов? Как обратиться к полуторному элементу массива?

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

Update

Диагноз подтверждается - вы используете в качестве индекса число с плавающей точкой. Это недопустимо - ни с точки зрения компилятора, ни с точки зрения обыденной реальности - например, в списке учащихся получить фамилию учащегося номер 8,25...

READ ALSO
QMap&lt;QString, Class*&gt; SIGSEGV при вставке значения

QMap<QString, Class*> SIGSEGV при вставке значения

В проекте создается экземпляр класса DatabaseManagerВ нем я создаю экземпляры класса Database в функции setupNewDatabase

141
Windows API, _set_se_translator

Windows API, _set_se_translator

Будет ли работать _set_se_translator в dll, собранной с флагом /EHa, если подключить такую dll к проекту без такого флага?

129
Как узнать края окна win32 в С++ на visual studio 2017

Как узнать края окна win32 в С++ на visual studio 2017

Здравствуйте я начал осваивать C++ примерно месяц назадПока что разобрался только с консолью и захотел сделать нормальное приложение, но я совсем...

120