Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для qazar
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 26

Сложение в матрице: -7+3=-3, в чём дело?

24.12.2016, 18:36. Показов 1143. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. В программе вычисления матриц есть недочёт в суммировании матриц (да и не только в суммировании)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void __fastcall TForm1::Button3Click(TObject *Sender)
{
   double **A = new double *[row];
   for (i=0; i<row; i++)
   {
      A[i]=new double [col];
      for (j=0; j<col; j++)
      {
         A[i][j]=StrToFloat(StringGrid1->Cells[j+1][i+1]);
      }
   }
   double **B = new double *[row];
   for (i=0; i<row; i++)
   {
      B[i]=new double [col];
      for (j=0; j<col; j++)
      {
         B[i][j]=StrToFloat(StringGrid2->Cells[j+1][i+1]);
      }
   }
   double **C = new double *[row];
   for (i=0; i<row; i++)
   {
      C[i]=new double [col];
      for (j=0; j<col; j++)
      {
         C[i][j]=A[i][j]+B[i][j];
      }
   }
   for (i=0; i<row; i++)
   {
      for (j=0; j<col; j++)
      {
         StringGrid3->Cells[j+1][i+1]=SimpleRoundTo(C[i][j], -w);
      }
   }
   for (i = 0; i<row; i++) delete A[i];
   delete [] A;
   for (i = 0; i<row; i++) delete B[i];
   delete [] B;
   for (i = 0; i<row; i++) delete C[i];
   delete [] C;
}
При суммировании, например, 7+3=10 (к примеру взяты матрицы 1х1). -7+(-3)=-9, -7+3=-3, 7+(-3)=4.
Соответственно вещественные числа со знаком "-" тоже могут считаться неверно
Почему в некоторых случаях куда то девается единица?
В умножении тоже единица пропадает, -3*5=-14

В этой программе считает всё нормально:
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   double a,b,c;
   a=StrToFloat(Edit1->Text);
   b=StrToFloat(Edit2->Text);
   c=a+b;
   Edit3->Text=FloatToStr(c);         
}
А матрица то чем хуже?? (int или double - на вычисление никак не влияет)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.12.2016, 18:36
Ответы с готовыми решениями:

5 короткий сигналов биос, может ли дело быть в чем то другом чем в процессоре?
Комп врубается однако он никак не реагирует на мышь и клавиатуру, даже заходит во вход в Windows, но я не могу войти так как мышь и...

В чем дело?
Что такое, почему не создается прога?

В чём же дело ?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; main () { FILE * fo; fo = fopen(&quot;test.txt&quot;,&quot;wt&quot;); int...

6
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
25.12.2016, 00:24
Цитата Сообщение от qazar Посмотреть сообщение
StringGrid3->Cells[j+1][i+1]=SimpleRoundTo(C[i][j], -w);
-w где применяется?
0
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,411
Записей в блоге: 3
25.12.2016, 06:19
Лучший ответ Сообщение было отмечено qazar как решение

Решение

qazar, попробовал повторить твою ошибку (маленько переделал твой код, а то больно много циклов )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int row = StringGrid3->RowCount, col = StringGrid3->ColCount, w = -2;
  double **A = new double *[row];
  double **B = new double *[row];
  double **C = new double *[row];
  for(int i = 0; i < row; i++)
   {
      A[i] = new double [col];
      B[i] = new double [col];
      C[i] = new double [col];
      for(int j = 0; j < col; j++)
      {
         A[i][j] = StrToFloat(StringGrid1->Cells[j][i]);
         B[i][j] = StrToFloat(StringGrid2->Cells[j][i]);
         C[i][j] = A[i][j] + B[i][j];
         StringGrid3->Cells[j][i] = SimpleRoundTo(C[i][j], w);
         StringGrid4->Cells[j][i] = String().sprintf(_T("%0.2f"), C[i][j]);
      }
   }
  delete [] A;
  delete [] B;
  delete [] C;
}
Вывел матрицу С двумя способами: как ты - с округлением и просто форматированной строкой. Результаты на скрине - все считает, как надо.
Миниатюры
Сложение в матрице: -7+3=-3, в чём дело?  
1
 Аватар для qazar
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 26
26.12.2016, 16:02  [ТС]
Цитата Сообщение от lifeforce Посмотреть сообщение
-w где применяется?
эт просто округление для вещественных чисел (там в задании был один из пунктов: возможность задать точность вычисления, один, два, и т.д. знаков после запятой)

Добавлено через 33 минуты
Цитата Сообщение от D1973 Посмотреть сообщение
Вывел матрицу С двумя способами: как ты - с округлением и просто форматированной строкой. Результаты на скрине - все считает, как надо.
Модератор, спасибо огромное)) оказывается у меня проблема была из-за SimpleToRound, заменил на строку
C++
1
StringGrid3->Cells[j][i] = String().sprintf("%0.2f", C[i][j]);
стало всё нормально. И спасибо большое за пример компактности)
Только можно ли "%0.2f" задавать во время программы?

Добавлено через 16 минут
и ещё я применил эту фишку, чтобы ограничить точность генератора случайных вещественных чисел, но он заполняет ячейки матрицы, используя в качестве разделителя точку, а надо запятую (а то не понимает вид "0.2", программе нужно "0,2")
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   double **A = new double *[row];
   double **B = new double *[row];
   for (i = 0; i < row; i++)
   {
      A[i] = new double [col];
      B[i] = new double [col];
      for (j = 0; j < col; j++)
      {
         A[i][j] = rand()/(float)32767*20-10;
         StringGrid1->Cells[j+1][i+1] = String().sprintf("%0.2f", A[i][j]);
         B[i][j] = rand()/(float)32767*20-10;
         StringGrid2->Cells[j+1][i+1] = String().sprintf("%0.2f", B[i][j]);
      }
   }
   delete [] A;
   delete [] B;
j+1 и i+1 - там просто шапка матрицы заполнена нумерацией строк и столбцов

Добавлено через 22 часа 24 минуты
программа полностью работоспособна
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
26.12.2016, 17:52
Цитата Сообщение от qazar Посмотреть сообщение
используя в качестве разделителя точку
если при вводе в стринггрид у тебя не понимает _ , _ запятую то надо сменить в региональных настройках винды (разделитель целой и дробной части) там значит у тебя точка поменяй на запятую.

Добавлено через 5 минут
или перед чтением из стрингрида подмени запятую на точку.
C++
1
2
// пример 
Err->Text = StringReplace(Err->Text,"," ,DecimalSeparator ,TReplaceFlags() << rfReplaceAll);
Добавлено через 10 минут
или в программе при инициализации напиши
C++
1
DecimalSeparator = ',';
Добавлено через 1 минуту
C++
1
2
3
4
5
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  DecimalSeparator = ',';
}
0
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,411
Записей в блоге: 3
27.12.2016, 09:09
Цитата Сообщение от qazar Посмотреть сообщение
можно ли "%0.2f" задавать во время программы?
Да, можно. Посмотри пример, там ничего хитрого, уверен, ты разберешься.
Там же и ответ на вопрос
Цитата Сообщение от qazar Посмотреть сообщение
не понимает вид "0.2", программе нужно "0,2"
Вложения
Тип файла: rar ChangeFormatFloat.rar (3.2 Кб, 2 просмотров)
0
 Аватар для qazar
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 26
29.12.2016, 15:36  [ТС]
Цитата Сообщение от qazar Посмотреть сообщение
программа полностью работоспособна
зачёт по дисциплине "программирование на языках высокого уровня" уже успешно получен, всем спасибо за помощь))

Добавлено через 8 минут
к слову, точность вычислений менял следующим способом:
C++
1
StringGrid3->Cells[j+1][i+1]=FloatToStrF(C[i][j], ffFixed, w, w);
w - устанавливается точность, я до конца не разобрался, зачем там две переменных требует программа, ffFixed - формат округления, там ещё другие варианты есть, тоже особо не вчитывался
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.12.2016, 15:36
Помогаю со студенческими работами здесь

В чем дело..?
скажите плиз в что не так с этой строкой if checkbox1.Checked:=true then edit2.Visible:=true; дает ошибку Unit1.pas(38): Type of...

В чем дело?
Почему в конце программы наибольшим числом определяется ноль, хотя его нет в получившемся перечне? Три часа пытался понять-не получилось:(...

В чём дело?
Здравствуйте, помогите пожалуйста разобратся в чем причина...у меня форум существует уже 3 месяца и до сих пор он никак не проиндексируется...

В чём дело???
5 дней не одного клика, общий объём посетителей за эти дни около 550, а в конце дня, откуда-то берётся 1 цент, что это значит?

В чем дело?
#include &lt;stdio.h&gt; int main() { float x,y,BMI; scanf(&quot;%f %f&quot;,&amp;x,&amp;y); x=x/100; BMI=y/(x*x); printf(&quot;BMI:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru