Консультация № 197366
10.12.2019, 05:43
0.00 руб.
1 8 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Немного не понимаю, почему при сравнение двух массивов, многие элементы пропускает


Приложение:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
double[] arr = new double[18];
double[] arrx = new double[18];

double c = 7;
double h = 0.0182;
dataGridView1.RowCount = 18;
dataGridView1.ColumnCount = 2;

dataGridView2.RowCount = 18;
dataGridView2.ColumnCount = 3;

for (int i = 0; i < 18; i++)
{
double x = 0;
x += (c - h) + h * i;
arrx[i] = x;
double fx = 1 / c * Math.Sin(c * x);
arr[i] = fx;

dataGridView1.Rows[i].Cells[0].Value = x;
dataGridView1.Rows[i].Cells[1].Value = Math.Round(fx, 4);
}

double[] arrxi = new double[16];
for (int i = 0; i < 16; i++)
{
double xi = c + i * h;
arrxi[i] = xi;
dataGridView2.Rows[i].Cells[0].Value = xi;
double difffx = Math.Cos(c * xi);


for (int j = 0; j < 18; j++)
{
if (arrx[j] == arrxi[i])
{
double diff = (arr[j+1] - arr[j-1]) / (2 * h);

dataGridView2.Rows[i].Cells[1].Value = Math.Round(difffx, 4);
dataGridView2.Rows[i].Cells[2].Value = Math.Round(diff, 4);

}

}
}
}
}
Прикрепленные файлы:
f823d3e2190a452d5121331a7fce5b5af91fb5a2.png

Обсуждение

давно
Советник
400484
472
10.12.2019, 09:56
общий
это ответ
Здравствуйте, gena.sorbuchev!
Ответ кроется в вашем коде:
Код:

if (arrx[j] == arrxi[i])
{
double diff = (arr[j+1] - arr[j-1]) / (2 * h);

dataGridView2.Rows[i].Cells[1].Value = Math.Round(difffx, 4);
dataGridView2.Rows[i].Cells[2].Value = Math.Round(diff, 4);

}

dataGridView2 будет получать значение во 2 и 3 колонку только в случает равенства arrx[j] и arrxi[i]. Что по мне, то такое событие будет не часто. Т.к. они вычисляются по разному:
Код:

double x = 0;
x += (c - h) + h * i;
arrx[i] = x;

double xi = c + i * h;
arrxi[i] = xi;

Да и к тому же это double, а там как известна есть проблема со сравнением и округлением. Вот одна из статей. Можете поискать в сети.
5
давно
Посетитель
403237
19
10.12.2019, 10:14
общий
Адресаты:
Без данного условия индекс находится за границей массива и ругается на данную строчку double diff = (arr[j + 1] - arr[j - 1]) / (2 * h); Не подскажите как можно реализовать это?
Прикрепленные файлы:
15738735895a3225f7115140b87916c9.png
давно
Советник
400484
472
10.12.2019, 11:22
общий
10.12.2019, 11:25
Вопрос в следующем: почему у вас arrxi имеет длину 16, а другие массивы 18? Не странно ли это...
Код:

double[] arrxi = new double[16];

Почему у вас второй цикл идет до 18?
Код:

double[] arrxi = new double[16];
for (int i = 0; i < 16; i++)
{
...
for (int j = 0; j < 18; j++)
давно
Посетитель
403237
19
10.12.2019, 12:11
общий
Адресаты:
Я так делал из-за задания. Но даже если поставить длину массива везде 16, то все равно будет ошибка индекс находится вне границы массива.
давно
Советник
400484
472
10.12.2019, 12:19
общий
Вот еще кусок кода:
Код:

double diff = (arr[j+1] - arr[j-1]) / (2 * h);

Что будет если j = 17?
Код:

double[] arr = new double[18];
давно
Посетитель
403237
19
10.12.2019, 13:27
общий
Адресаты:
Понял. Спасибо за помощь. Получается в числителе должна стоять разность двух соседних значений функции , то есть разность 1 столбца и 2 второго столбца. Как это можно сделать?
давно
Посетитель
403237
19
10.12.2019, 13:51
общий
Адресаты:
Все не надо. Спасибо большое за помощь.
давно
Советник
400484
472
10.12.2019, 14:14
общий
Цитата: gena.sorbuchev
solowey:
Все не надо. Спасибо большое за помощь.

Всегда пожалуйста
Форма ответа