Массивы в С-Builder

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Katharina Luci
Сообщения: 1
Зарегистрирован: 08 дек 2007, 12:28

08 дек 2007, 12:42

вот уже сколько пытаюсь реализовать задачу преобразования матриц в c-builder (6 версия, если это важно), использую компоненту StrinGrid. Задача вроде не такая сложная: в матрице А найти строку с максимальным средним арифметическим отрицательных элементов, сформировать матрицу Д, исключив из А найденную строку и заменив все нулевые элементы на средние арифметические значения строк с этими нулевыми элементами
запуталась окончательно, наверняка накосячила по-мелочи, но не могу найти(( помогите, пожалуйста((
вот код:

Код: Выделить всё

        Form2->Show();

        Form2->StringGrid1->RowCount=StrToInt(Edit2->Text);
        Form2->StringGrid1->ColCount=StringGrid1->ColCount;

//o4istka komponent na 2 forme
        for (int i=0; i<Form2->StringGrid1->ColCount; i++)
                for (int j=0; j<Form2->StringGrid1->RowCount; j++)
                        Form2->StringGrid1->Cells[i][j]=" ";
        Form2->Edit1->Text="";

        float p, max_el=-100000000.0; 
        int l, max_n=0, j, m, n; //l - kol-vo otric. elementov
        float *s, **matrix; //s - vector-stolbec srednix arifmeti4eskix

        n=StringGrid1->ColCount;
        m=StringGrid1->RowCount;

        s=new float[m];
        matrix=new float *[m];

// poisk nomera stroki s max srednearifmeti4eskim i formirovanie vector-stolbca s       
        for(int j=0; j<m; j++)
        {       l=1;
                p=0.0;
                for(int i=0; i<n; i++)
                        {
                           if(StrToFloat(StringGrid1->Cells[i][j])<0)
                                {p+=StrToFloat(StringGrid1->Cells[i][j]); l++;}
                         }
                s[j]=p/l;
                if (s[j]>max_el)
                        {max_el=s[j]; max_n=j;}
         }

//formirovanie matrici matrix
        for(int j=0; j<m; j++)
        {       if (j!=max_n)
                for(int i=0; i<n; i++)
                        {
                         if(StrToFloat(StringGrid1->Cells[i][j])!=0)
                                matrix[j][i]=StrToFloat(StringGrid1->Cells[i][j]);
                         else
                                matrix[j][i]=s[j];
                        }

         }

//vivod v komponenty StrinGrid matrici matrix
        for(int j=0;j<m;j++)
        {
                for(int i=0;i<n;i++)
                        Form2->StringGrid1->Cells[i][j]=FloatToStr(matrix[j][i]);
        }
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

13 дек 2007, 10:14

Сходу вижу одну логическую ошибку: То есть, если в строке будет только одно отрицательное число, то после цикла в p запишется его значение, а l станет равным 2. Таким образом в s[j] уйдёт p/2, что есть не верно.

Исправление состоит в инизиализации l нулём. После цикла нужно не забыть перед делением на l проверить, что l не равно нулю.

Кстати, условия задачи не содержат инструкций что делать, если в строке нет ни одного отрицательного значения (это как раз случай когда l равно нулю). Предлагаю уточнить у преподавателя. Один из возможных вариантов уточнения задания, записывать в этом случае в s[j] ноль, так как он является верхней границей всех средних арифметическх любых отрицательных чисел.

На будущее советую пользоваться дебагером для обнаружения подобных ошибок. Он позволяет исполнять программу пошагово, просматривая на каждом шаге значения переменных.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить