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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2018, 15:13   #1
DowL_HH4
Пользователь
 
Регистрация: 23.03.2018
Сообщений: 10
По умолчанию Двумерный массив + вектора

Привет друзья, нужна помощь. Абсолютно не представляю как решить эту задачу, может кто подскажет?
Задаётся двумерный массив с одинаковым количеством строки и столбцов не более 100 - размер массива. Элементами массива будут целые числа от -1000 то 1000. Если размер массива задан меньше 1, то количество элементов он считается равным 10, а элементы заполняются случайными числами. В противном случае, элементы задаются пользователем.
После заполнения массива программа должна выдать на экран содержимое массива. Затем произвести обработку, выдать результат.
Выдать все строки, для которых есть коллинеарные вектора (строки) в заданном массиве.
DowL_HH4 вне форума Ответить с цитированием
Старый 21.04.2018, 16:32   #2
DowL_HH4
Пользователь
 
Регистрация: 23.03.2018
Сообщений: 10
По умолчанию

НУ с первым я справился, как обработать этот массив?
Код:
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
using namespace std;

int main() {
	int n, a[100][100]; do {
		cout << "Enter n: "; cin >> n;
		if (n >= 100) cout << "n>=100, Repeat please...\n";
	} 
	while (n >= 100);
	if (n < 1) {
		n = 10;
		srand(time(NULL));
		for (int i = 0; i < n; i++)  
			for (int j = 0; j < n; j++)  
				a[i][j] = 1 + rand() % 100;  
		cout << "Massive: " << endl;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++)
				cout << setw(4) << a[i][j];
			cout << endl;
		}
		return 0;
	}
	else {
		for (int i = 0; i < n; i++) {
			cout << "Vvodim " << i + 1 << " stroku\n";
			for (int j = 0; j < n; j++) {
				cout << "Vvedite celoe chislo: ";
				cin >> a[i][j];
			}
		}
		cout << "Massive: " << endl;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++)
				cout << setw(4) << a[i][j];
			cout << endl;
		}
		return 0;
	}
}

Последний раз редактировалось DowL_HH4; 21.04.2018 в 16:36.
DowL_HH4 вне форума Ответить с цитированием
Старый 21.04.2018, 18:18   #3
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Выдать все строки, для которых есть коллинеарные вектора (строки) в заданном массиве.
http://www.mathforyou.net/online/vectors/collinearity/
alexzk вне форума Ответить с цитированием
Старый 21.04.2018, 21:00   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Я немножко изменил/усложнил ввод, что позволило использовать ввод из файла единообразно.
Например так
Цитата:
compiled.exe matrix.txt
Чтобы не париться с тестами от руки. От всех возможных ошибок я проверку не делал, но вводить можно почти произвольно.

Код:
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
#include <fstream>
#include <sstream>
#include <vector>
#include <limits>

inline int getArrIndex(const int row, const int column, const int n)
{
    return row * n + column;
}

void printRow(std::ostream& out, const int *a,  const int n) 
{
    for (int j = 0; j < n; ++j)
		 out << std::setw(4) << *(a + j);
    out << std::endl;
}

void printArr(std::ostream& out, const int *a,  const int n) 
{
    for (int i = 0; i < n; ++i)     
	    printRow(out,  a + getArrIndex(i, 0, n), n);            
}

inline bool isCin(const std::istream& src)
{
    return &src == &std::cin; 
}

std::string replaceAll( const std::string& str, const std::string& find, const std::string& replace)
{
    using namespace std;
    string result;
    int find_len = find.size();
    int pos,from=0;
    while ( string::npos != ( pos=str.find(find,from) ) ) {
        result.append( str, from, pos-from );
        result.append( replace );
        from = pos + find_len;
    }
    result.append( str, from , string::npos );
    return result;
}

//those can use as delimiters (not only space)
const static std::vector<std::string> delimiters = {
    "\t", ";",",","\\","/", " ","[","]",
};

void getData(std::istream& src, int *a,  int& n)
{
    const bool is_cin = isCin(src);
    
    //skipping most of newlines could be  present before quering rows
    src.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    
	if (n < 1) 
    {
		n = 10;		
		for (int i = 0; i < n; ++i)  
			for (int j = 0; j < n; ++j)  
				*(a + getArrIndex(i,j,n)) = 1 + rand() % 100;  		
	}
	else 
    {		                        
        for (int i = 0; i < n && !src.eof(); ++i) 
        {
			if (is_cin)                            
                std::cout << "Please enter full row space delimited: " << i + 1 << std::endl;//vvod srazu vesy stroki cherez probeli: 1 2 3 5 6 7
            std::string line;
            std::getline(src, line);
            
            for (int k = 0, sz = delimiters.size(); k < sz; ++k)
                line = replaceAll(line, delimiters.at(k),  "\n");
            
            if (line.empty())
            {
                --i;
                continue;
            }
            
            std::istringstream input(line);                        
            int j = 0;
            for (std::string nums; std::getline(input, nums) && j < n;)  
            {                                                
                if (nums.empty())
                    continue;                
                try
                {
                    *(a + getArrIndex(i, j++, n)) = std::stoi(nums);                
                }
                catch(std::invalid_argument& e)
                {                   
                    std::ostream& out = ((is_cin)?std::cout:std::cerr);
                    out << "Parsed invalid number: " << e.what() << std::endl;                   
                    out.flush();
                    break;
                }
            }
            if (j < n )
            {
                if (is_cin)
                {
                    std::cout << "Invalid  line entered, failed with j = " << j <<", please retry..." <<std::endl;
                    --i;                    
                }
                else
                {
                    std::cerr << "Invalid matrix line supplied: " << i + 1 << std::endl;
                    std::cerr.flush();
                    exit(255);
                }
            }
		}
	}
}

int getN(std::istream& src)
{
    //assuming  1st number met is N
    const bool is_cin = isCin(src);
    std::string line;
    int n = -1;
    if (is_cin)
        std::cout << "Enter N: ";
    while (src >> line)
    {         
        for (int k = 0, sz = delimiters.size(); k < sz; ++k)
                line = replaceAll(line, delimiters.at(k),  "\n");
        
         std::istringstream input(line);                        
         
         for (std::string nums; std::getline(input, nums);)  
         {                                                
                if (nums.empty())
                    continue;                
                try
                {
                    n = std::stoi(nums);                
                    if (n >=100 || n==1)
                    {
                        if (!is_cin)
                        {
                            std::cerr << "Invalid N parsed: " << n << std::endl;
                            std::cerr.flush();
                            exit(255);
                        }
                        if (n >= 100) 
                            std::cout << "n>=100, Repeat please...\n";
                        if (n == 1)
                            std::cout << "n == 1 and it is not a vector, has no sence, repeat please...\n";
                        break;
                    }
                    if (!is_cin)
                        std::cout << "Parsed from file N = " << n << std::endl;
                    return n;
                }
                catch(std::invalid_argument& e)
                {                   
                    std::ostream& out = ((is_cin)?std::cout:std::cerr);
                    out << "Parsed invalid number N: " << e.what() << std::endl;                   
                    out.flush();
                    if (!is_cin)
                        exit(255);
                }
         }         
    }
    return n;
}

inline bool equal(double a, double b)
{
    return std::abs(a-b) < std::numeric_limits<double>::epsilon();
}

//http://www.mathforyou.net/online/vectors/collinearity/
bool isCollRows(const int *r1, const int *r2, const int n)
{
    const double first = static_cast<double>(*r1) / static_cast<double>(*r2);
    for (int i = 1; i < n; ++i)
    {
        const double curr = static_cast<double>(*(r1 +i)) / static_cast<double>(*(r2+i));
        if (!equal(first, curr))
            return false;
    }
    return true;
}

void doCalculation(std::ostream& out, const int* a, const int n)
{
    //warning! if we allow n = 1 this will not work! but this case handled in getN
    bool had_print = false;
    for (int i = 0; i < n - 1; ++i)
    {
        for (int j = i + 1; j < n; ++j)
        {
            if (isCollRows(a + i *n, a + j * n, n))
            {
                out << "Row " << i + 1 << " is colliniar to " << j + 1 << std::endl;
                out << i + 1 << ":";printRow(out, a + getArrIndex(i, 0, n), n);
                out << j + 1 << ":";printRow(out, a + getArrIndex(j, 0, n), n);
                had_print = true;
            }
        }
    }
    if (!had_print)
        out << "Matrix has no collinear rows." << std::endl;
}

int main(const int argc, const char **argv) 
{
    std::istream *input = &std::cin;  
    srand(time(NULL));
	std::fstream fs;
    
    //checking if we have file name in commnand line, if so - load it instead asking user
    if (argc > 1)
    {
        std::string file_name(argv[1]);
        fs.open(file_name, std::fstream::in);
        input = &fs;
    }
    
    int n = getN(*input);
    int a[100 * 100];         	    
    getData(*input, a, n);
    std::cout << "Source Matrix: " << std::endl;
    printArr(std::cout, a, n);
    doCalculation(std::cout, a, n);
    
    return 0;
}
Вложения
Тип файла: txt test1.txt (38 байт, 129 просмотров)
alexzk вне форума Ответить с цитированием
Старый 21.04.2018, 21:14   #5
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Вводить можно таким макаром:

Цитата:
Enter n: 3
Please enter full row space delimited: 1
11 12 ;;;;;; 14
Please enter full row space delimited: 2
11 12 14
Please enter full row space delimited: 3
11 12;;;13;14
11 12 14
11 12 14
11 12 13
alexzk вне форума Ответить с цитированием
Старый 22.04.2018, 18:06   #6
DowL_HH4
Пользователь
 
Регистрация: 23.03.2018
Сообщений: 10
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
усложнил
Эх, понять бы весь этот код... Препод нихера не объясняет, а требует решать такую вот хрень... Возможно сделать это как-то проще и, если несложно, объяснить что к чему?
DowL_HH4 вне форума Ответить с цитированием
Старый 22.04.2018, 18:09   #7
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от DowL_HH4 Посмотреть сообщение
Эх, понять бы весь этот код... Препод нихера не объясняет, а требует решать такую вот хрень... Возможно сделать это как-то проще и, если несложно, объяснить что к чему?
Возможно. Лень. Мне з/п препода не платят за вас. В кратце, я изменил ввод на построчный, т.о. стало возможно тем же самым кодом читать ТЕКСТОВЫЙ файл (т.е. без дополнительных изысков, что клавиатура, что файл - одинаково). Далее, добавил разбор каждой строки (у вас был просто ввод a[i][j]). В каждой строке я меняю все символы-разделители (сделал много разных) на \n и получается из 1 строки много строк, или пустых, или содержащих число, и далее считываю.

Если будете чета менять, учтите, N=1 там не имеет смысла и задача не решается. Этот код оставьте.

Последний раз редактировалось alexzk; 22.04.2018 в 18:28.
alexzk вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переписывая все в новый массив,добавить в двумерный массив столбец с заданным номером. anasttb Общие вопросы C/C++ 0 24.05.2017 12:15
Программирование в VBA: двумерный массив M на N, нужно создать новый одномерный массив TheAnnihilyator Помощь студентам 1 04.06.2014 09:16
Даны два вектора b=(b1,b2,...,b6),x=(x1,x2,...,x6) и матрица А(6х6).написать программу вычисления длины вектора Ax-b. infern_o Паскаль, Turbo Pascal, PascalABC.NET 10 21.03.2013 10:50
дано 3 вектора. определить максимальный чётный элемент каждого вектора и упорядочить по убыванию 3Doleg Паскаль, Turbo Pascal, PascalABC.NET 0 04.12.2012 01:45
Вставка вектора в динамический массив iiunbreakableii Общие вопросы Delphi 6 14.12.2009 16:05