Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: матрицы с++  (Прочитано 20936 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
mary1010
Интересующийся

ua
Offline Offline
Пол: Женский

« : 21-02-2013 21:24 » 

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

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

У меня почему-то не получается вызвать функции и ошибки в 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
.....

вот собственно код:
Код: (C++)
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #pragma argsused
  5. #include <iostream>
  6. #include <math.h>
  7. #include <conio.h>
  8. #include <stdio.h>
  9. #include <ctime>
  10. //---------------------------------------------------------------------------
  11. using namespace std;
  12.  
  13. int** createMatrix(int);
  14. void fillArray(int**, int);
  15. void printArray(int**, int);
  16. void DeleteColumn(int** inArray,  int width);
  17.  
  18.  int main()
  19. {
  20. int** matrix;
  21. int length = 0;
  22.  
  23. matrix = createMatrix(length);
  24.  
  25. fillArray(matrix,length);
  26. cout << "Matrix which is filled manually:" << endl;
  27. printArray(matrix,length);
  28.  
  29. DeleteColumn(int** inArray,  int width);
  30. cout << "New matrix:" << endl;
  31. printArray(matrix,length);
  32. system("pause");
  33. }
  34.  
  35. int** createMatrix(int width)
  36. {
  37. int** matrix = new int*[width];
  38. for (int i = 0; i < width; i++)
  39. matrix [i] = new int[width];
  40. return matrix;
  41. }
  42. //------------------------
  43. void DeleteColumn(int** inArray,  int width )
  44. {
  45.  //searching max
  46.  int l = inArray[i][j] ;
  47.  int s=0;
  48.  int t=0;
  49.         for(i=0;i<width;i++)
  50.            for(j=0;j<width;j++)
  51.                 if(inArray[i][j]>l)
  52.                 {
  53.                 l=inArray[i][j];
  54.                 t=i;
  55.                 s=j;
  56.                 }
  57.         cout<<"max element=";
  58.         cout<<l<<endl;
  59.  
  60.  //deleting column of a matrix
  61.  for (j=0; j<width; j++)
  62.    for (i=0;i<width; i++)
  63.         if (inArray[i][j]=l)
  64.                {
  65.                        for (i=0; i<width; i1++)
  66.                             for (i1=j; i1<(width-1); i1++)
  67.                                  inArray[i][i1]=inArray[i][i1+1];
  68.                        i=0;
  69.                                          
  70.                 }
  71.  }
  72. //-------------------------
  73. void fillArray(int** inArray, int width)
  74. {
  75.         for(int i = 0; i<width; i++)
  76.            for(int j=0; j<width; j++)
  77. {
  78.  
  79. cout << "Enter cell [" << i <<"," << j << "]"<< endl;
  80. cin >> inArray[i][j];
  81. }
  82.  
  83. }
  84.  
  85. void printArray(int** inArray, int width)
  86. {
  87.         for(int i = 0; i<width; i++){
  88.           for(int j=0; j<width; j++)
  89. {
  90. cout << inArray[i][j] << " ";
  91. }
  92. cout << endl;
  93.         }
  94.  
  95. }
  96.  
« Последнее редактирование: 22-02-2013 03:10 от Алексей++ » Записан
mary1010
Интересующийся

ua
Offline Offline
Пол: Женский

« Ответ #1 : 21-02-2013 21:25 » 

прошу прощение за оформление...
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 21-02-2013 21:34 » 

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

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

У меня почему-то не получается вызвать функции и ошибки в 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
.....

вот собственно код:
Код: (C++)
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #pragma argsused
  5. #include <iostream>
  6. #include <math.h>
  7. #include <conio.h>
  8. #include <stdio.h>
  9. #include <ctime>
  10. //---------------------------------------------------------------------------
  11. using namespace std;
  12.  
  13. int** createMatrix(int);
  14. void fillArray(int**, int);
  15. void printArray(int**, int);
  16. void DeleteColumn(int** inArray,  int width);
  17.  
  18.  int main()
  19. {
  20.     int** matrix;
  21.     int length = 0;
  22.  
  23.     matrix = createMatrix(length);
  24.  
  25.     fillArray(matrix,length);
  26.     cout << "Matrix which is filled manually:" << endl;
  27.     printArray(matrix,length);
  28.  
  29.     DeleteColumn(int** inArray,  int width);
  30.     cout << "New matrix:" << endl;
  31.     printArray(matrix,length);
  32.     system("pause");
  33. }
  34.  
  35. int** createMatrix(int width)
  36. {
  37.     int** matrix = new int*[width];
  38.     for (int i = 0; i < width; i++)
  39.         matrix [i] = new int[width];
  40.     return matrix;
  41. }
  42. //------------------------
  43. void DeleteColumn(int** inArray,  int width )
  44. {
  45.      //searching max
  46.      int l = inArray[i][j] ;
  47.      int s=0;
  48.      int t=0;
  49.         for(i=0;i<width;i++)
  50.            for(j=0;j<width;j++)
  51.                 if(inArray[i][j]>l)
  52.                 {
  53.                     l=inArray[i][j];
  54.                     t=i;
  55.                     s=j;
  56.                 }
  57.     cout<<"max element=";
  58.     cout<<l<<endl;
  59.  
  60.      //deleting column of a matrix
  61.      for (j=0; j<width; j++)
  62.        for (i=0;i<width; i++)
  63.             if (inArray[i][j]=l)
  64.                {
  65.                        for (i=0; i<width; i1++)
  66.                             for (i1=j; i1<(width-1); i1++)
  67.                                  inArray[i][i1]=inArray[i][i1+1];
  68.                        i=0;
  69.                                          
  70.                 }
  71.  }
  72. //-------------------------
  73. void fillArray(int** inArray, int width)
  74. {
  75.         for(int i = 0; i<width; i++)
  76.            for(int j=0; j<width; j++)
  77. {
  78.  
  79. cout << "Enter cell [" << i <<"," << j << "]"<< endl;
  80. cin >> inArray[i][j];
  81. }
  82.  
  83. }
  84.  
  85. void printArray(int** inArray, int width)
  86. {
  87.         for(int i = 0; i<width; i++){
  88.           for(int j=0; j<width; j++)
  89.             {
  90.                 cout << inArray[i][j] << " ";
  91.             }
  92.             cout << endl;
  93.         }
  94. }
  95.  
Оформил код в цитате. В 29й строке - при вызове функции не нужно указывать типы аргументов, да и передавать туда нужно реально существующие переменные. Вторая ошибка - ну так i нигде не объявлена, компилятор про такую переменную не знает.

Вообще, от кода осталось ощущение копипасты. Как-то уж очень разношёрстно отформатированно, и ошибки странные. И где поиск столбца с максимальным элементом, нужный по заданию?
« Последнее редактирование: 21-02-2013 21:35 от Вад » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 22-02-2013 07:39 » 

mary1010, сам написал или взял готовый и подправлял? Потому что концы с концами не сходятся: программа довольно большая, во многом написана нормально, а твоя ошибка такого характера, что если ты не знаешь семантики синтаксических конструкций, ты бы всё остальное написать не смог.

Суть в том, что готовое решение тут тебе не дадут. Однако могут научить. Но чтобы научить (т.е. объяснить понятно и доходчиво для тебя), надо понимать твой текущий уровень.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
mary1010
Интересующийся

ua
Offline Offline
Пол: Женский

« Ответ #4 : 22-02-2013 10:02 » 

Dimka, учусь на 1 курсе, с 29 строкой разобралась и с переменными i,j,... тоже(вроде...)
части кода писали на лекции(ввод/вывод матрицы), а с остальным как-то плохо разобралась...матрицы вообще даются с трудом

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

вот немножко подправленный код:
Код: (C++)
//---------------------------------------------------------------------------
#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);
int DeleteColumn(int**,  int );
void findMax(int**,  int )  ;

 int main()
{
int** matrix;
int length = 0;

matrix = createMatrix(length);

fillArray(matrix,length);
cout << "Matrix which is filled manually:" << endl;
printArray(matrix,length);

findMax(matrix, length);
DeleteColumn(matrix, length);
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 findMax(int** inArray,  int width )
{ int i=0, j=0, i1=0;


 //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;

 int DeleteColumn(int** inArray,  int  width);
 //deleting column of a matrix
{
for(int i = 0; i < width; i++) {
 int* c = new int[width-1];
 for(int j = 0, k = 0; j < width; j++) {
   if ( j != СТОЛБЕЦ_ДЛЯ_УДАЛЕНИЯ) { c[k] = inArray[i][j]; k++; }
 }
 int* old = inArray[i];
 inArray[i] = c;
 delete[] old;
}
 }


//-------------------------
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;
        }
 
}
 
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 22-02-2013 11:00 » 

вот немножко подправленный код:

Но всё ещё не отформатированный:

А вот так сразу видны все огрехи:
Код: (C++)

//---------------------------------------------------------------------------
#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);
int DeleteColumn(int**,  int );
void findMax(int**,  int )  ;

int main()
{
        int** matrix;
        int length = 0;

        matrix = createMatrix(length);

        fillArray(matrix,length);
        cout << "Matrix which is filled manually:" << endl;
        printArray(matrix,length);

        findMax(matrix, length);
        DeleteColumn(matrix, length);
        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 findMax(int** inArray,  int width )
{
       
        int i=0, j=0, i1=0;


        //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;

                        int DeleteColumn(int** inArray,  int  width);
                        //deleting column of a matrix
                        {
                                for(int i = 0; i < width; i++) {
                                        int* c = new int[width-1];
                                        for(int j = 0, k = 0; j < width; j++) {
                                                if ( j != СТОЛБЕЦ_ДЛЯ_УДАЛЕНИЯ) { c[k] = inArray[i][j]; k++; }
                                        }
                                        int* old = inArray[i];
                                        inArray[i] = c;
                                        delete[] old;
                                }
                        }


                        //-------------------------
                        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;
                                }

                        }

 
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 22-02-2013 11:03 » 

mary1010, опять ощущение, что бездумно вставлен код. Одна функция объявлена внутри другой - видимо, потому что вставлена была туда при копировании по невнимательности.

Что касается поиска элемента - расскажи, что делает этот код, какие результаты от его работы:
Код: (C++)
int i=0, j=0, i1=0;
//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;
        }
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 22-02-2013 11:29 » 

Вад, я думаю, что просто не хватает закрывающей скобки ф-ции findMax, перед ф-ей DeleteColumn. Но это только предположение. Ага

Вот это конечно да!:

Код: (C++)
 if ( j != СТОЛБЕЦ_ДЛЯ_УДАЛЕНИЯ)

Хочу эту версию C++.

Помнится у меня один студент, на лабораторке по корреляционному анализу, долго и упорно искал на клаве кнопку с Σ - чисто тупо "перерисовывал" из конспекта формулы, один в один.
« Последнее редактирование: 22-02-2013 11:31 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 22-02-2013 11:37 » 

Джон, говорят, на машине МИР была такая кнопка Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 22-02-2013 11:54 » 

Код: (C++)
 if ( j != СТОЛБЕЦ_ДЛЯ_УДАЛЕНИЯ)

Хочу эту версию C++.
Ну а что, в Visual Studio 2008 код с кириллическими именами переменных компилируется, например.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 22-02-2013 11:58 » 

Джон, говорят, на машине МИР была такая кнопка Улыбаюсь

Нуу у нас тогда были "Искры" да "ЕСки". МИР я не видел. Да и студент, скорее всего, тоже. Ща глянул в вики:

"Алфавит входного языка ЭВМ МИР-1 составляют заглавные русские и латинские буквы, знаки операций (+, -, х, /, интеграл, =, <, >, квадратный корень, сумма), ..."

Так там ещё и радикал был. Круто.

Добавлено через 2 минуты и 12 секунд:
Ну а что, в Visual Studio 2008 код с кириллическими именами переменных компилируется, например.

Ну это наверное, если у тебя русский - неюникодный в системе. Ща проверю с немецким...

Ага, работает. Можно всякие там умлауты использовать.
« Последнее редактирование: 22-02-2013 12:01 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
mary1010
Интересующийся

ua
Offline Offline
Пол: Женский

« Ответ #11 : 22-02-2013 14:25 » 

Джон, все исправила,но не совсем доганяю удаление...
Код: (C++)
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
и еще, правильно ли так искать столбец?

Код: (C++)
if ( j != max[j])
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 22-02-2013 14:45 » 

Ну, во-первых, использовать русские слова, тем более кирилицей, в С++, как минимум необычно. Но даже, если компилятор и позволяет это делать, то, во-вторых, где определение "СТОЛБЕЦ_ДЛЯ_УДАЛЕНИЯ"?

Джон, все исправила,

Нееет, ты покажи сначала ф-ю findMax, с DeleteColumn потом разберёмся.

зы

Так, чтобы мы лучше друг друга поняли. Объясни пожалуйста вот эти две строчки по элементам, включая скобки, запятые и тд:

Код: (C++)
int DeleteColumn(int** inArray,  int  width);
{

зы зы Ошибка малюсенькая, но очень коварная. Я сам такие допускаю раз в месяц. Важно, чтобы ты понимала, что там происходит.
« Последнее редактирование: 22-02-2013 14:51 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
mary1010
Интересующийся

ua
Offline Offline
Пол: Женский

« Ответ #13 : 22-02-2013 14:50 » 

Джон, вот поиск максимального элемента
Код: (C++)

void findMax(int** inArray,  int width )
{

 int i=0, j=0;
//searching max

 int max = inArray[i][j] ;
        for(i=0;i<width;i++)
           for(j=0;j<width;j++)
                if(inArray[i][j]>max)
                {
                max=inArray[i][j];
                }
        cout<<"max element=";
        cout<<max<<endl;

  }
 

а СТОЛБЕЦ_ДЛЯ_УДАЛЕНИЯ - это не переменная)))просто пока не знала как описать столбец....черновой вариант, так сказать)
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 22-02-2013 14:55 » 

Отлично!!!

С этого и надо было начинать. А то ты вывалила простыню кода, типа, разбирайтесь. А вот СТОЛБЕЦ_ДЛЯ_УДАЛЕНИЯ, точнее НОМЕР_СТОЛБЦА_ДЛЯ_УДАЛЕНИЯ - это именно то, с чего надо начинать. Опиши алгоритм своими словами, как ты себе это представляешь. Без кода.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
mary1010
Интересующийся

ua
Offline Offline
Пол: Женский

« Ответ #15 : 22-02-2013 14:57 » new

вот
Код: (C++)
int DeleteColumn(int** inArray,  int  width);
 {
        for(int i = 0; i < width; i++)                      //цикл по строкам
        {
          int* c = new int[width-1];                      //новая матрица, в которой на 1 столбец меньше, чем в исходной
                for(int j = 0, k = 0; j < width; j++)   //цикл по столбцам
                {
                 if ( j != max[j])                                //если j не равно столбцу с максимальным элементом
                 {
                    c[k] = inArray[i][j];                      //копируем элемент в новую матрицу
                    k++;                                          
                 }
                }
 int* old = inArray[i];                                      
 inArray[i] = c;
 delete[] old;
        }
}
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #16 : 22-02-2013 15:10 » 

Неее, так не пойдёт. Опять с кодом Жаль Какие там j? Что такое j? Тем более с безобразным форматированием...

Если я не вижу, как ты понимаешь задачу, то не могу тебе помочь, ибо не знаю в чём твоя проблема. Что делает ф-я DeleteColumn? Удаляет столбец? Какой? Почему она получает какую-то width? Она удаляет последний столбец? Почему последний? .... и тд Представь, что ты хочешь объяснить свою задачу, человеку, который не знает С++.

В очередной раз отформатировал код и исправил ошибку из #11
(click to show)
Код: (C++)
//---------------------------------------------------------------------------
#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);
int DeleteColumn(int**,  int );
void findMax(int**,  int )  ;

int main()
{
        int** matrix;
        int length = 0;

        matrix = createMatrix(length);

        fillArray(matrix,length);
        cout << "Matrix which is filled manually:" << endl;
        printArray(matrix,length);

        findMax(matrix, length);
        DeleteColumn(matrix, length);
        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 findMax(int** inArray,  int width)
{
        int i=0, j=0, i1=0;

        //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;
}

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;
        }
}

//-------------------------
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;
        }
}
« Последнее редактирование: 22-02-2013 15:13 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
mary1010
Интересующийся

ua
Offline Offline
Пол: Женский

« Ответ #17 : 22-02-2013 15:35 » 

Если я не вижу, как ты понимаешь задачу, то не могу тебе помочь, ибо не знаю в чём твоя проблема. Что делает ф-я DeleteColumn? Удаляет столбец? Какой? Почему она получает какую-то width? Она удаляет последний столбец? Почему последний? .... и тд Представь, что ты хочешь объяснить свою задачу, человеку, который не знает С++.

DeleteColumn удаляет столбец с максимальным элементом
width - размерность матрицы
j - номер столбца исходной матрицы
i - номер строки
k - номер элемента новой матрицы

необходимо удалить столбец именно с МАКСИМАЛЬНЫМ элементом. Для этого с помощью циклов"пробегаю" по матрице в поиске элементов , НЕ находящихся в этом столбце, если элементы удовлетворяют условию, тогда копирую их в новую матрицу с (она на 1 столбец меньше, чем inArray), приравниваю полученную с и новую inArray(теперь получаю искомую матрицу и возвращаю ее значение)
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #18 : 22-02-2013 15:55 » 

О, уже лучше. Неплохое начало. В идеале, необходимо ф-ции давать более точное имя, чтобы не требовалось дополнительного описания. Итак, имеем некую матрицу, из которой необходимо удалить один, и только один, столбец. Условие удаления столбца - он должен содержать элемент, который является самым большим по величине среди всех элементов матрицы.

Вот это вот : "помощью циклов"пробегаю"... "  - никто не поймёт, каких циклов? как с их помощью можно пробегать? И тп. Формулируется проще: для выполнения основной задачи, разобьём её на две подзадачи: 1. поиск в матрице номера столбца с максимальным элементом и 2. удаление столбца с номером N из матрицы.
Те нам нужны две ф-ции. Наверное одна из них и есть findMax, только она должна возвращать какое-то значение. При этом надо оговорить условие, при котором матрица содержит одинаковые элементы, какой столбец будет считаться в этом случае искомым? Или же мы прекращаем выполнение дальнейшей задачи?
Вторая ф-я должна получать номер удаляемого столбца в качестве параметра. При этом эти две ф-ции можно отрабатывать независимо друг от друга, при этом в любом порядке. Итак, с какой начинаем?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
mary1010
Интересующийся

ua
Offline Offline
Пол: Женский

« Ответ #19 : 22-02-2013 16:28 » 

Джон, ох...начнем
1. какое значение должна возвращать функция findMax? номер столбца максимального элемента?как это сделать?
2. я думаю, если в разных столбцах содержится одинаковый максимальный элемент, тогда удалятся все столбцы с этим элементом. Мне      казалось, что я так и делаю...что тогда нужно изменить для удаления ВСЕХ столбцов с максимальным элементом??
3. как передать номер удаляемого столбца??
4. мне кажется , что не обязательно функции findMax и DeleteColumn должны работать "независимо друг от друга, при этом в любом порядке"....

Добавлено через 5 часов, 36 минут и 2 секунды:
Джон, самое важное для меня сейчас - это понять как из findMax поучить номер столбца с макс. элементом и передать его в DeleteColumn!!!
« Последнее редактирование: 22-02-2013 22:04 от mary1010 » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #20 : 23-02-2013 00:13 » 

Сорри, срочно надо было уходить с работы. Вот ща только до компа добрался.

Ок. Давай по-порядку. У тебя ещё много чего не работает. Если быть честным, то вобще ничего. Не только ф-ции поиска и удаления. Сама инициализация матрицы тоже не работает. Но этим мы займёмся позже. Ты главное не волнуйся, тут делов на полчаса разобраться с твоим заданием. Но, поскольку, "новичок в с++", то придётся повозиться подольше. Про многомерные массивы мы уже подробно разбирали на форуме, поищи и почитай, очень полезно будет.

Ближе к теме. Как я уже сказал, и что тебе там кажется - забудь, есть две абсолютно независимые друг от друга ф-ции. Одна ищет столбец с наибольшим элементом, другая - удалят любой столбец. Какая разница, для чего они будут использоваться? Вместе или раздельно? Это понятно?

Для простоты, введём ограничения для основной задачи: матрица квадратная, те число колонок равно числу строк; матрица содержит только положительные числа или ноль; имеет размерт отличный от нуля; хотя бы один столбец матрицы содержит максимальный элемент. Когда мы её решим, то снимем эти ограничения и расширим возможности программы. Но сначала, на простом варианте, разберёмся с принципом.

Сначала разберёмся с ф-ей поиска столбца.

Формулирую ещё раз задачу этой ф-ции: найти НОМЕР столбца, содержащего наибольший элемент в матрице. Само собой напрашиваетя разделение этой задачи на две подзадачи: 1. поиск наибольшего элемента в столбце и 2 непосредственно поиск столбца с наиболшим элементом. Ф-я в С++ имеет в общем виде след. структуру:

<тип возвращаемых данных>  <имя ф-ции> ( <список параметров ф-ции> )

Что ты написала (кстати сама придумывала или "друзья" подсказали? Ага ):

Код: (C++)
void findMax(int** inArray,  int width)

void - говорит, что ф-я не возвращает никакого значения. Имя ф-ции findMax - ничего не говорит, точнее непонятно хто такой этот Max и почему его надо найти? Ага Она получает два параметра: int** inArray и  int width. Второй наверняка подразумевает размер матрицы, подсказка на будущее, для не квадратной матрицы - таких размерностей нужно будет передавать две - для количества столбцов и строчек соответственно. А вот первый параметр представляет собой указатель на указатель тип int - почему? Потому, что: 1. передача параметра без указателя, означает, что в ф-ции будет использоваться копия значения. 2. просто указатель, означает, что ф-я может поменять объект по этому указателю, но сам указатель не изменится, либо это адрес первого элемента массива. А вот указатель, на указатель, может говорить о двух вещах: 1 - о том, что сам указатель может измениться; 2 - передаётся масив указателей, каждый из которых в свою очередь указывает на массив указателей - те наш случай.
Поскольку нам необходим номер, те целочисленный тип данных, ф-я поиска будет возвращать int. На имени тоже не будем экономить - так и назовём FindColumnWithMaxValue. Таким образом получаем:

Код: (C++)
int FindColumnWithMaxValue(int** matrix,  int nMatrixSize)
{
        int nColumnWithMaxValue = 0;

        ...

        return  nColumnWithMaxValue;
}

Обратимся к твоей версии ф-ции:  

Код: (C++)
        int i=0, j=0, i1=0;
        //searching max
        int l = inArray[i][j] ;
        int s=0;
        int t=0;

Ты (или не ты) объявляешь кучу переменных, которые никак не используются. Зачем? что делают i1, s,t? Мы их выбрасываем.
Конечно, можно предложить кучу способов поиска максимального значения, например отсортировать по возрастанию и взять последний элемент, но ты (или не ты) решила задачу проще. Начинаем с первого элемента и сравниваем его с последующими.

Так и сделаем:


Код: (C++)
int FindColumnWithMaxValue(int** matrix,  int nMatrixSize)
{
        int nColumnWithMaxValue = 0;
        int nMaxValue = GetMaxValueFromColumn(matrix,  nMatrixSize, 0);
        for(int nColumn = 1; nColumn < nMatrixSize; nColumn++)
        {
                int nBuffer = GetMaxValueFromColumn(matrix,  nMatrixSize, nColumn);
                if(nBuffer>nMaxValue)
                {
                        nMaxValue = nBuffer;
                        nColumnWithMaxValue = nColumn;
                }
        }
        return nColumnWithMaxValue;
}

Ф-я GetMaxValueFromColumn реализует вторую подзадачу - поиск максимального значения в столбце, номер которого передаётся в неё в качестве параметра.

Пришло время посмотреть на первые результаты. Я не буду критиковать и изменять остальную часть программы, пусть утечка памяти будет на твоей совести, но размер матрицы я определю равным 3, а не 0. Итак, вот что у нас получилось:
Код: (C++)
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #pragma argsused
  5. #include <iostream>
  6. #include <math.h>
  7. #include <conio.h>
  8. #include <stdio.h>
  9. //#include <ctime>
  10. //---------------------------------------------------------------------------
  11.  
  12. using namespace std;
  13.  
  14. int** CreateMatrix(int);
  15. void FillMatrix(int**, int);
  16. void PrintMatrix(int**, int);
  17.  
  18. int GetMaxValueFromColumn(int**,  int, int);
  19. int FindColumnWithMaxValue(int**,  int);
  20.  
  21. int main()
  22. {
  23.         int nMatrixSize = 3;
  24.         int** matrix = CreateMatrix(nMatrixSize);
  25.  
  26.         FillMatrix(matrix, nMatrixSize);
  27.         cout << "Matrix which is filled manually:" << endl;
  28.         PrintMatrix(matrix, nMatrixSize);
  29.        
  30.         int nColumnWithMaxValue = FindColumnWithMaxValue(matrix, nMatrixSize);
  31.         cout << "Number of column with max value:" << " " << nColumnWithMaxValue << endl;
  32.         system("pause");
  33.  
  34.         return 0;
  35. }
  36.  
  37. int GetMaxValueFromColumn(int** matrix,  int nMatrixSize, int nColumnNr)
  38. {
  39.         if( (nColumnNr < nMatrixSize) && (nColumnNr == 1)  ) return 100; // dummy
  40.         return 0;
  41. }
  42.  
  43. int FindColumnWithMaxValue(int** matrix,  int nMatrixSize)
  44. {
  45.         int nColumnWithMaxValue = 0;
  46.         int nMaxValue = GetMaxValueFromColumn(matrix,  nMatrixSize, 0);
  47.         for(int nColumn = 1; nColumn < nMatrixSize; nColumn++)
  48.         {
  49.                 int nBuffer = GetMaxValueFromColumn(matrix,  nMatrixSize, nColumn);
  50.                 if(nBuffer>nMaxValue)
  51.                 {
  52.                         nMaxValue = nBuffer;
  53.                         nColumnWithMaxValue = nColumn;
  54.                 }
  55.         }
  56.         return nColumnWithMaxValue;
  57. }
  58.  
  59. int** CreateMatrix(int width)
  60. {
  61.         int** matrix = new int*[width];
  62.         for (int i = 0; i < width; i++)
  63.         {
  64.                 matrix [i] = new int[width];
  65.         }
  66.         return matrix;
  67. }
  68.  
  69. void FillMatrix(int** inArray, int width)
  70. {
  71.         for(int i = 0; i<width; i++)
  72.         {
  73.                 for(int j=0; j<width; j++)
  74.                 {
  75.                         cout << "Enter cell [" << i <<"," << j << "]"<< endl;
  76.                         cin >> inArray[i][j];
  77.                 }
  78.         }
  79. }
  80.  
  81. void PrintMatrix(int** inArray, int width)
  82. {
  83.         for(int i = 0; i<width; i++)
  84.         {
  85.                 for(int j=0; j<width; j++)
  86.                 {
  87.                         cout << inArray[i][j] << " ";
  88.                 }
  89.                 cout << endl;
  90.         }
  91. }

Ф-я GetMaxValueFromColumn - "болванка", пустышка. В этом варианте, она возвращает "максимальное" значение - 100, для второго столбца.
Но она позволяет тестировать ф-ю FindColumnWithMaxValue. Запусти программу и проверь, что возвращает эта ф-я. Поменяй условие в "болванке", чтобы получить 0 и 2 столбцы. Если всё работает, то честь заполнить "болванку" GetMaxValueFromColumn настоящим кодом предоставляется... кому? Правильно - тебе. Ага Думаю справишься. Главное не бойся. Нечто подобное ты (или не ты) уже была сделала в findMax.
А GetMaxValueFromColumn, как минимум, в два раза проще.   findMax искала максимальное значение во всей матрице, а тебе надо только в одном столбце.
« Последнее редактирование: 23-02-2013 00:59 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
mary1010
Интересующийся

ua
Offline Offline
Пол: Женский

« Ответ #21 : 23-02-2013 16:49 » 

Джон, спасибо Вам огромное!!
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #22 : 23-02-2013 16:53 » 

Можно на "ты", но за что спасибо? Самое сложное впереди - удаление столбца.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines