IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Не получается реализовать код на С++)) Нужна помощь..
GelarX
сообщение 25.6.2011, 9:06
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 2
Регистрация: 18.6.2011
Город: Москва
Вы: студент



Условие звучит так:
Задана матрица целых чисел. Найти номера строк, элементы в каждой из которых одинаковы. Использовать функции.
..
Вроде бы и не сложная задача.. но вот уже часа полтора ее "кручу" и ничего не выходит..
С кодом блока проверки извращался по разному - даже встраивал туда новый создаваемый массив..и даже двумерный))
Вообще мысль была такая - берется 1 число из первой строчки. Подсчитывается количество таких же чисел в этой же строке. После ищется такое же количество символов в следующей строке, проверяется на сходность. Если нет - то ищется такое же количество символов в следующей строке.. и так до последней строки.. после чего результаты записываются.. выглядеть это должно было так: если скажем в первой строке 2 числа 3, в 3, и скажем в 9 - то это запоминается путем присваивания новой переменной. После чего берется следующий символ в 1-й строке(если такой есть).. ну и так далее..
В конце выводятся все результаты проверки..ну а в блоке вывода поставить фильтр.. У меня у меня уже мозг за разум выходит (IMG:style_emoticons/default/smile.gif)
И вообще мне кажется, что программа должна реализовываться несколько проще.. (IMG:style_emoticons/default/rolleyes.gif)
Короче - компилятор все пишет всякую ересь.. Может у кого получится - заранее благодарен ))

Код

#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#include <iomanip.h>

void generate_matrix(int a[10][10], int n, int m)
{
srand((unsigned)time(NULL));
for (int i = 0; i < n; i++)
  for (int j = 0; j < m; j++)
   a[i][j] = rand()%10;
}

void print_matrix(int a[10][10], int n, int m)
{
cout << endl;
for (int i = 0; i < n; i++)
  {
   for (int j = 0; j < m; j++)
    cout << setw(4) << a[i][j];
    cout << endl << endl;
  }
}

void check(int a[10][10], int n,int m)
{
int i,j,z,k,p,q;
  for(i=0;i<n;i++)
    {
    for(q=0;q<n;q++)
      {
      for(j=0;j<m;j++)
    {
    for(z=0;z<m;z++)
      {
      if(a[i][j]==a[i][z])
        {
        k++;
        }
      if(a[i][j]==a[q][z])
        {
        p++;
        }
          }
    if(p!=k)
      {
      break;
      break;
      }
    }
      if(p==k)
    {
    cout<<j<<" "<<z;
       cout>>checka);
    }
      }
    }
}

void main()
{
clrscr();
  int n,m;
  int k = 0;
  int a[10][10];
  cout << " Vvedite kol-vo strok matritzi: ";
  cin >> n;
  cout << " Vvedite kolichestvo stolbcov matritzi: ";
  cin >> m;
  generate_matrix(a,n,m);
  print_matrix(a,n,m);
  cout << endl << " Nomera strok, vse elementi kotorix odinakovi: " << endl;
  /*for (int i = 0; i < n; i++)
   if (check(a,n,m) !=0)
   {
    cout << i+1 << endl;
   }*/
   check(a,n,m);
   /*else
     cout <<"takix net.";*/
getch();
}
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
GelarX
сообщение 25.6.2011, 12:01
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 2
Регистрация: 18.6.2011
Город: Москва
Вы: студент



Появилась мысль вставки в блок проверки цикла сортировки элементов..скажем по возрастанию.. а потом можно символьно сравнить строки через strcmp ! И как я раньше то не дошел !?
попытаюсь реализовать..))
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
граф Монте-Кристо
сообщение 25.6.2011, 12:12
Сообщение #3


Доцент
******

Группа: Преподаватели
Сообщений: 3 840
Регистрация: 27.9.2007
Из: Старый Оскол
Город: Москва
Учебное заведение: МФТИ/МАИ
Вы: другое



На мой взгляд, нужно для каждой строки создать упорядоченный массив без повторений. Потом сравнить все массивы друг с другом.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 25.6.2011, 19:17
Сообщение #4


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



Хм... .
а строчки
1 4 6
и
6 4 1 - одинаковые?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
граф Монте-Кристо
сообщение 25.6.2011, 21:01
Сообщение #5


Доцент
******

Группа: Преподаватели
Сообщений: 3 840
Регистрация: 27.9.2007
Из: Старый Оскол
Город: Москва
Учебное заведение: МФТИ/МАИ
Вы: другое



Смотря что понимать под словом "одинаковые". Состоят из одних и тех же чисел - тогда да. Но они не равны в том смысле, под которым понимается равенство строк.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 27.6.2011, 14:00
Сообщение #6


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



Код
#include <conio.h>
#include <iostream> //originally "#include <iostream.h>"
#include <stdlib.h>
#include <time.h>
#include <iomanip> //originally "#include <iomanip.h>"

using namespace std;

void generate_matrix(int **a, int n, int m)
{
    srand((unsigned)time(NULL));
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            a[i][j] = rand()%10;
}

void print_matrix(int **a, int n, int m)
{
    cout << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        cout << setw(4) << a[i][j];
        cout << endl << endl;
    }
}

int compareIntegers(const void* a, const void* b) //сравнение целых для qsort
{
    return (*((int *)a)-*((int *)b));
}

bool isEqualStringsOfIntegers(int *a, int* b, int n) //сравнение массивов целых чисел (которые уже отсортированы)
{
    if(n==0) return true;
    if(*a!=*b) return false;
    return isEqualStringsOfIntegers(a+1,b+1,n-1);
}

void main()
{
    //clrscr(); - borland specific
    int n,m;
    int **a;
    cout << " Vvedite kol-vo strok matritzi: ";
    cin >> n;
    cout << " Vvedite kolichestvo stolbcov matritzi: ";
    cin >> m;
    a = new int *[n];
    for(int i=0;i<n;i++)
    {
        a[i] = new int[m];
    }
    generate_matrix(a,n,m);
    print_matrix(a,n,m);
    //теперь сортируем каждую строку, нам ведь не надо их больше выводить?
    //если же было бы нужно, то можно скопироать на новое место
    for(int i=0;i<n;i++)
    {
        qsort(a[i],m,sizeof(int),compareIntegers);
    }
    bool *marked = new bool[n]; //массив, в котором мы будем отмечать строки, которые уже вошли в какую-либо группу
    for(int i=0;i<n;i++)
    {
        marked[i] = false;
    }
    cout << endl << " Nomera strok, vse elementi kotorix odinakovi: " << endl;
    for(int i=0;i<n-1;i++)
    {
        if(marked[i]) continue;
        cout << i+1 << " ";
        for(int j=i+1;j<n;j++)
        {
            if(isEqualStringsOfIntegers(a[i],a[j],m))
            {
                marked[j] = true;
                cout << j+1 << " ";
            }
        }
        cout << endl;
    }

    for(int i=0;i<n;i++)
    {
        delete[] a[i];
    }
    delete[] a;

    getch();
    
    
}


Ну, как-то так.
1. Адаптировал под Visual Studio (заголовочные файлики смените обратно, если нужно, и clrscr() я оставил закоментированным).
2. Добавил динамическое выделение памяти. А то как-то нехорошо было.
3. Добавил 2 функции: одна для qsort, сравнивает два целых. Вторая сравнивает две строки целых (предполагается, что к моменту вызова они уже отсортированы).

Правда, сейчас она выводит даже те строки, у которых "похожих" нет, но это легко поправить. Перед циклом поиска идентичных строк обнуляем флажок, которые будет ответственным за наличие уже найденных повторных строк. Если нашли повторную строку и флажок опущен, то поднимаем флажок и выводим перед номером найденной строки, номер "базовой строки", то есть той, с которой мы всё сравниваем. Как-то так)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 25.5.2025, 21:48

Книжки в помощь: "Сборник заданий по высшей математике" Кузнецов Л.А., "Сборник заданий по высшей математике" Чудесенко В.Ф., "Индивидуальные задания по высшей математике" Рябушко А.П., и другие.




Зеркало сайта Решебник.Ру - reshebnik.org.ru