Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> матрицы с++ 
:(
    Опции темы
mary1010
  Дата 22.2.2013, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.12.2012

Репутация: нет
Всего: нет



Я новичок в с++...поэтому оооочень нужна Ваша помощь!!!

Необходимо написать программу, которая удаляет столбец матрицы, содержащий максимальный ее элемент. Элементы 
вводятся с клавиатуры и еще нужно использовать функции.

У меня почему-то не получается вызвать функции и ошибки в DeleteColumn типа:
1.[C++ Error] Unit1.cpp(29): E2188 Expression syntax
2.[C++ Error] Unit1.cpp(46): E2451 Undefined symbol 'i'
.....
3.[C++ Warning] Unit1.cpp(71): W8004 't' is assigned a value that is never used
.....

вот собственно код:
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#pragma argsused
#include <iostream>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <ctime>
//---------------------------------------------------------------------------
using namespace std;
 
int** createMatrix(int);
void fillArray(int**, int);
void printArray(int**, int);
void DeleteColumn(int** inArray,  int width);
 
 int main()
{
int** matrix;
int length = 0;
 
matrix = createMatrix(length);
 
fillArray(matrix,length);
cout << "Matrix which is filled manually:" << endl;
printArray(matrix,length);
 
DeleteColumn(int** inArray,  int width);
cout << "New matrix:" << endl;
printArray(matrix,length);
system("pause");
}
 
int** createMatrix(int width)
{
int** matrix = new int*[width];
for (int i = 0; i < width; i++)
matrix [i] = new int[width];
return matrix;
}
//------------------------
void DeleteColumn(int** inArray,  int width )
{
 //searching max
 int l = inArray[i][j] ;
 int s=0;
 int t=0;
        for(i=0;i<width;i++)
           for(j=0;j<width;j++)
                if(inArray[i][j]>l)
                {
                l=inArray[i][j];
                t=i;
                s=j;
                }
        cout<<"max element=";
        cout<<l<<endl;
 
 //deleting column of a matrix
 for (j=0; j<width; j++)
   for (i=0;i<width; i++)
        if (inArray[i][j]=l)
               {
                       for (i=0; i<width; i1++)
                            for (i1=j; i1<(width-1); i1++)
                                 inArray[i][i1]=inArray[i][i1+1];
                       i=0;
                                         
                }
 }
//-------------------------
void fillArray(int** inArray, int width)
{
        for(int i = 0; i<width; i++)
           for(int j=0; j<width; j++)
{
 
cout << "Enter cell [" << i <<"," << j << "]"<< endl;
cin >> inArray[i][j];
}
 
}
 
void printArray(int** inArray, int width)
{
        for(int i = 0; i<width; i++){
          for(int j=0; j<width; j++)
{
cout << inArray[i][j] << " ";
}
cout << endl;
        }
 
}
 


Это сообщение отредактировал(а) mary1010 - 22.2.2013, 00:15
PM MAIL   Вверх
Arks
Дата 22.2.2013, 00:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



Доброго времени суток.
Внимательно смотрим:
на 29-ой строке вместо вызова функции Вы ввели её описание.
На 46-ой:
"Undefined symbol 'i'" переводится как "неопределённый символ i". И правда, ведь он неопределён ни в функции ни в глобальной области.

Лабу делаете?

По-моему, слишком сложно написано.
Если у Вас по заданию матрица квадратная, то мучиться с массивом массивов смысла нет.
Достаточно один массив int* matrix, вмещающий все её элементы.

Например matrix[2][3] (2-ая строка, 3-ий столбец) в данном случае можно получить так: matrix[N*2 + 3], где N - размерность матрицы. Понятно, как это получается?

Удалить столбец j тогда тоже просто:
Создаём новую матрицу на N элементов короче и проходим по старой матрице и копируем из неё в новую все элементы кроме matrix[N*i+j], осталось очистить память от старой матрицы и заменить указатель. И никаких вложенных друг в друга аж 4 раза циклов не надо.
PM MAIL ICQ Skype MSN   Вверх
mary1010
Дата 22.2.2013, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.12.2012

Репутация: нет
Всего: нет



Arks, спасибо Вам!
но функции не вызываются...те программа ничего не делает
PM MAIL   Вверх
Arks
Дата 22.2.2013, 09:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



mary1010, функции-то вызываются, не могут они тут не вызываться, другое дело что они у Вас делают.

Отлаживайте код: в дебагере по шагам, с просмотром значений переменных, или в уме, или на бумажке и сразу увидите почему функции не отрабатывают или делают не то, что Вы ожидали.

Удаление исправили? Оно в коде выше было страшным и неработоспособным монстром.

Если зануляете значения в удалённых столбцах, то достаточно один раз обойти матрицу и каждый раз проверять стоблец j равен искомому? Если да, то зануляем.

Если удалете столбец физически, то аналогично алгоритму, который я писал для одномерного массива в сообщении выше, только на сей раз надо будет создать новые массивы длинной меньше старых на 1 для каждой строки матрицы:
Код

// удаление столбца из двухмерной матрицы
int** m; int len;
...
for(int i = 0; i < len; i++) {
 int* c = new int[len-1];
 for(int j = 0, k = 0; j < len; j++) {
   if ( j != column_to_delete) { c[k] = m[i][j]; k++; }
 }
 int* old = m[i];
 m[i] = c;
 delete[] old;
}


//Ну и количество колонок новое возвращать придётся:
int DeleteColumn(int** inArray,  int  width);


Кстати, логически правильнее было бы вынести удаление столбца по индексу в отдельную функцию, тогда её  сможете отдельно от поиска проверить на работоспособность. Да и по смыслу удаление - отдельное от поиска действие.
PM MAIL ICQ Skype MSN   Вверх
mary1010
Дата 22.2.2013, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.12.2012

Репутация: нет
Всего: нет



Arks, спасибо)
функции действительно вызывались, только работали не корректно, а именно заполнение матрицы. Я забыла задать размерность
как-то не доганяю с удалением...по Вашему примеру:
Код

 int DeleteColumn(int** inArray,  int  width);
 {
        for(int i = 0; i < width; i++)
        {
          int* c = new int[width-1];
                for(int j = 0, k = 0; j < width; j++)
                {
                 if ( j != max[j])
                 {
                    c[k] = inArray[i][j];
                    k++;
                 }
                }
 int* old = inArray[i];
 inArray[i] = c;
 delete[] old;
        }
}


ошибка во 2 строке:[C++ Error] Unit1.cpp(62): E2040 Declaration terminated incorrectly
и еще, правильно ли так искать столбец?
Код

 if ( j != max[j])

PM MAIL   Вверх
mary1010
  Дата 23.2.2013, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.12.2012

Репутация: нет
Всего: нет



Arks,  самое важное для меня сейчас - это понять как из findMax поучить номер столбца с макс. элементом и передать его в DeleteColumn!!!
PM MAIL   Вверх
Arks
Дата 24.2.2013, 20:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



Мда, уведомление при ответах не включил... Если ещё актуально, отвечаю.

Про ошибку "во 2 строке:[C++ Error] Unit1.cpp(62): E2040 Declaration terminated incorrectly":
Компилятор c++ (visual studio по крайней мере) практически всегда ругается не на ту строку, в которой ошибка, а на следующую или даже через на много строк позже.
Я сам давно не писал на c++ и, например, получил подобную ошибку на строке:
static std::ofstream file("filename.txt"); // ошибка: использование переменной не полностью определённого типа
Оказалось (спасибо поиску в инете), что я в начале файла забыл включить нужный заголовок: #include <fstream>.

Так что смотрите выше. (В данном случае, в строке 1).
Если не знаете, что сообщение об ошибке значит, сами не можете найти, то в первую очередь попробуйте поиск в интернете: declaraion terminated incorrectly - первая же ссылка из гугла идёт на форум, где есть ответ на Вашу проблему.

Цитата

как из findMax поучить номер столбца с макс. элементом и передать его в DeleteColumn

Как-нибудь по-проще: например, findMax может возвратить номер столбца, а DeleteColumn принять третьим параметром, который я забыл указать в описании функции smile

Цитата

правильно ли так искать столбец?
Код

 if ( j != max[j])


Это зависит от контекста... Если max[j] - это глобально определённый массив булевых значений (что-то вроде bool max[width]), где для каждого столбца j выполняется следующее условие:
Код

max[j] == j, если столбец j содержит первый элемент с максимальным значением в матрице, найденный при проходе матрицы построчно, начиная с 0-ой строки и 0-го столбца.
max[j] != j, в иных случаях.

Другой вопрос, зачем так сложно?
PM MAIL ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0857 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.