Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2015, 17:38   #1
Vitalyas
Пользователь
 
Регистрация: 25.11.2014
Сообщений: 47
По умолчанию Сортировка массива методом прямого включения

Всем привет!
Размер и элементы массива вводятся с клавиатуры.
Задачи следующие: 1) Упорядочить строки матрицы по возрастанию первого элемента строки методом прямого включения
2) Определить количество строк, не содержащих ни одного нулевого элемента
3) Определить максимальное из чисел, встречающееся в заданной матрице более одного раза.
4) Исходные данные и результаты вывести на экран.

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

Код:
#include <clx.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#pragma hdrstop

#pragma argsused
int main(int argc, char* argv[])
{
  int k,i,j,N,M,a[20][20];
  l1:
  cout<<"Enter number of rows\n"; //Ввод количества строк
  cin>>N;
  cout<<"Enter number of columns\n"; //Ввод количества столбцов
  cin>>M;
  cout<<"Input matrix A\n";
  //Цикл по переменной i, в которой перебираем строки матрицы
  for (i=0; i<N; i++)
  //Цикл по переменной j, в которой перебираем элементы внутри строки
  for (j=0; j<M; j++)
  cin>>a[i][j]; //Ввод очередного элемента матрицы
  cout<<"Matrix A \n";
  for (i=0; i<N; i++)
  {
    //Цикл по переменной i, в котором перебираем строки матрицы
    for (j=0; j<M; j++)
    cout<<a[i][j]<<"\t"; //Вывод очередного элемента матрицы
    cout<<endl; //Переход на новую строку после вывода всех элементов строки
  }
/*  {
    //Сортировка методом прямого включения
    for (j=1;j<8;j++){
        if (arr[j]< arr[j-1]) {
            //Чтобы значение j мы не меняли а работали с i
            i=j;
            //Меняем местами пока не найдем нужное место
            do{
                swap(arr[i],arr[i-1]);
                i--;
                //Защита от выхода за пределы массива
                if (i == 0) break;
            }
            while (arr[i]< arr[i-1]) ;
        }
        for (i=0;i<8;i++)
        cout << arr[i]<< ' ';
        cout << '\n';
    }
  }
*/
  {
    //Небольшая менюшка
    cout<<"\n1-Continue\n0-Exit\n";
    cin>>k;
    if (k!=0 && k!=1) {cout<<"\nEntered an incorrect value. The program automatically closes\n"; getch();}
    else {
          if (k==1) {goto l1;}
          else {goto l2;};
         }
    l2:
    exit(0);
  }
  getch();
}
Vitalyas вне форума Ответить с цитированием
Старый 23.03.2015, 10:50   #2
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
По умолчанию

Код:
#include <iostream>
#include <vector>
#include <map>

using namespace std;

typedef vector<vector<int>> matrix;

const int NROW = 5;
const int NCOL = 3;

void show_matrix(const matrix& mtx) {
    for(auto &row: mtx) {
        for(auto i: row) {
            cout << i << " ";
        }
        cout << endl;
    }
}

template<typename Iter>
void insertion_sort(Iter begin, Iter end) {
    if(end - begin <= 1) {
        return;
    }
    
    for(Iter st = begin; st != end; st++) {
        Iter p = st;
        while(p != begin && *p < *(p - 1)) {
            std::swap(*p, *(p - 1));
            p--;
        }
    }
}

// возвращает количество строк в матрице, в которых отсутсвует 0
int count_row_without_null(const matrix& mtx) {
    int count = 0;
    bool null_found = false;
    for(auto &row: mtx) {
        for(auto i: row) {
            if(i == 0) {
                null_found = true;
                break;
            }
        }
        if(!null_found) {
            count += 1;
        }
        else {
            null_found = false;
        }
    }
    return count;
}

// возвращает максимальное значение, встречающееся в матрице более 1 раза
int get_max(const matrix& mtx) {
    // ключ - число из матрицы, значение - число вхождений в матрицу
    map<int, int> numbers;
    for(auto &row: mtx) {
        for(auto i: row) {
            numbers[i] += 1;
        }
    }
    
    auto iter = numbers.begin();
    int max = iter->first;
    iter++;
    for(; iter != numbers.end(); iter++) {
        cout << iter->first << " : " << iter->second << endl;
        if(iter->second > 1 && iter->first > max) {
            max = iter->first;
        }
    }
    return max;
}

int main(int argc, char **argv) {
    
    matrix mtx_01;
    // init matrix by NROW x NCOL size
    mtx_01.resize(NROW);
    for(auto &row: mtx_01) {
        row.resize(NCOL);
        for(int i = 0; i < row.size(); i++) {
            row[i] = rand() % 10 + 1; // you can add input method here
        }
    }
    
    cout << "Matrix: \n";
    show_matrix(mtx_01);
    
    insertion_sort(mtx_01.begin(), mtx_01.end());
    
    cout << "\nSorted matrix: \n";
    show_matrix(mtx_01);
    
    cout << "\nRows without null: " << count_row_without_null(mtx_01) << endl;
    cout << get_max(mtx_01) << endl;
    return 0;
}
Компиляция с флагом -std=c++11.
Функция get_max() работает следующим образом: в ассоциативный массив записываются пары - (число, количество вхождений этого числа).
Т.к. std::map базируется на использовании сбалансированных деревьев, то ключи в нем будут в отсортированном порядке. Что это нам дает? Мы можем получить все ключи, для которых значение больше 1, тем самым найти максимальное значение не составляет труда. Это как раз делается в последнем цикле функции.
Возможно, данный способ - как из пушки по воробьям.

Также размер матрицы фиксорован значениями NROW, NCOL - количество строк и столбцов, соответсвенно. И матрица заполняется случайными значениями. Вы можете изменять размер матрицы по ходу ее заполнения.

Последний раз редактировалось halcyon; 23.03.2015 в 11:00.
halcyon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с задачей сортировка методом прямого включения Pascal jinos Паскаль, Turbo Pascal, PascalABC.NET 0 10.12.2014 21:06
Сортировка методом прямого включения ( исправление метода сортировки ) Turbo Pascal Marksman_SwAt Помощь студентам 1 06.05.2014 20:45
Сортировка массива (Exel, метод прямого включения) esage Microsoft Office Excel 5 14.01.2014 18:48
C# сортировка методом прямого включения Numphaulia Помощь студентам 1 29.11.2012 21:49
Сортировка методом прямого включения(паскаль) Cas01 Помощь студентам 1 17.03.2011 08:37