Форум программистов, компьютерный форум CyberForum.ru

Вместо вывода в stdout, сохранить числа в динамический массив - C++

Восстановить пароль Регистрация
 
1234569
5 / 5 / 1
Регистрация: 25.11.2010
Сообщений: 23
01.06.2012, 18:10     Вместо вывода в stdout, сохранить числа в динамический массив #1
Это алгоритм выборки элементов из двумерного массива. Нужно сохранить отобранные элементы в одномерный динамически создаваемый массив.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
void viewArray2DPath(int **pArr2D, const unsigned int cnRow, const unsigned int cnColumn)
{
    unsigned int nRow = cnRow - 1;
    int nColumn = nRow - 1;
    bool bUp = true;
 
    while (true)
    {
        [U]cout << pArr2D[nRow][nColumn] << "\t";[/U]
        
        if (bUp)
        {
            --nRow;
            --nColumn;
 
            if (nColumn == -1)
            {
                bUp = false;
 
                nRow += 2;
                ++nColumn;
            }
        }
        else
        {
            ++nRow;
            ++nColumn;
 
            if (nRow == cnRow)
            {
                bUp = true;
 
                --nRow;
                nColumn -= 2;
            }
        }
 
        if (nRow == cnRow || nColumn == -1)
            break;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2012, 18:10     Вместо вывода в stdout, сохранить числа в динамический массив
Посмотрите здесь:

Создать динамический массив из чисел, расположенных после первого отрицательного числа C++
C++ Динамический массив, много циклов и простые числа. Как ускорить работу программы ?
C++ Один большой динамический массив вместо нескольких меньшего размера
Переместить положительные числа двух массивов в динамический массив C++
Динамический массив скопировать числа которые повторились 2 раза C++
Файл: Считать все числа из файлав динамический массив C++
Надо читать числа из файла в динамический массив C++
Числа Фиббоначи через динамический массив C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
1234569
5 / 5 / 1
Регистрация: 25.11.2010
Сообщений: 23
03.06.2012, 11:52  [ТС]     Вместо вывода в stdout, сохранить числа в динамический массив #2
Написал, возникли вопросы:

Что дешевле по ресурсам - преобразовать буфер в строку(дублирование памяти) и вывести потоковым выводом, или вывести из получившегося массива в цикле?


Интересно - как получить число элементов, чтобы задать размер массива? Проблема в том, что в stringstream элементы хранятся по одному: исходный поток
C++
1
{"23" "\t" "17" "\t" "11" "\t" "5" "\t" "10" "\t" "16" "\t" "22" "\t" "21" "\t" "15" "\t" "20" "\0"}
пробелов нет, значащие элементы только внутри кавычек-"", значащих элементов - 20(с символом конца строки). А в stringstream получаем:
C++
1
{"2" "3" "\t" "1" "7" "\t" "1" "1" "\t" "5" "\t" "1" "0" "\t" "1" "6" "\t" "2" "2" "\t" "2" "1" "\t" "1" "5" "\t" "2" "0" "\0"}
, всего 29 элементов. При передаче в массив эти 29 элементов складываются обратно в 20, символы табуляции отбрасываются и выходит, что в массиве 10 чисел. Откуда мне взять это число 10, не считая количиства проходов цикла, без извлечения содержимого stringstream? tellp, tellg, lenght выдают 29 элементов.




Input.h
C++
1
int inputValue(const wchar_t *const cwsText = 0);

Array1D.h
C++
1
2
3
4
int* viewArray2DPath(int **pArr2D, const unsigned int cnRow, const unsigned int cnColumn, int &rArray1DSize);
void searchArray1D(int* pArray1D, const int rArray1DSize, const int elementToSearch);
int compare (const void * a, const void * b);
void binary_search(int* pArray1D, int elementToSearch, int high);

Array2D.h
C++
1
2
3
4
5
void createArray2D(int ***ppArr2D, const unsigned int cnRow, const unsigned int cnColumn);
void initializeArray2DIndex(int **pArr2D, const unsigned int cnRow, const unsigned int cnColumn);
void initializeArray2DRandom(int **pArr2D, const unsigned int cnRow, const unsigned int cnColumn);
void initializeArray2DManual(int **pArr2D, const unsigned int cnRow, const unsigned int cnColumn);
void viewArray2D(int **pArr2D, const unsigned int cnRow, const unsigned int cnColumn);


Array1D.cpp - вывод двумерного массива в соответствии с заданным порядком выборки, сохранение выбранных элементов в одномерный массив, линейный и бинарный поиск.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <sstream>
#include <iostream>
 
using std::cout;
using std::endl;
using std::wcout;
using std::stringstream;
using std::streambuf;
 
int* viewArray2DPath(int **pArr2D, const unsigned int cnRow, const unsigned int cnColumn, int &rArray1DSize)
{
    unsigned int nRow = cnRow - 1;
    int nColumn = nRow - 1;
    bool bUp = true;
 
    streambuf* oldCoutStreamBuf = cout.rdbuf();
    stringstream strCout;
    rArray1DSize=0;
    
    while (true)
    {
        cout.rdbuf( strCout.rdbuf() );
        cout << pArr2D[nRow][nColumn] << "\t";
        cout.rdbuf( oldCoutStreamBuf );
        ++rArray1DSize;
 
        if (bUp)
        {
            --nRow;
            --nColumn;
 
            if (nColumn == -1)
            {
                bUp = false;
 
                nRow += 2;
                ++nColumn;
            }
        }
        else
        {
            ++nRow;
            ++nColumn;
 
            if (nRow == cnRow)
            {
                bUp = true;
 
                --nRow;
                nColumn -= 2;
            }
        }
 
        if (nRow == cnRow || nColumn == -1)
            break;
    }
 
    cout<<strCout.str()<<endl;//что дешевле по ресурсам - преобразовать буфер в строку(дублирование памяти) и вывести потоковым выводом, или вывести из получившегося массива в цикле?
 
    int* Array1D = new int [rArray1DSize];// Интересно - как получить число элементов, чтобы задать размер массива? Проблема в том, что в stringstream элементы хранятся по одному: исходный поток {"23" "\t" "17" "\t" "11" "\t" "5" "\t" "10" "\t" "16" "\t" "22" "\t" "21" "\t" "15" "\t" "20" "\0"} пробелов нет, значащие элементы только внутри кавычек-"", значащих элементов - 20(с символом конца строки). А в stringstream получаем:{"2" "3" "\t" "1" "7" "\t" "1" "1" "\t" "5" "\t" "1" "0" "\t" "1" "6" "\t" "2" "2" "\t" "2" "1" "\t" "1" "5" "\t" "2" "0" "\0"}, всего 29 элементов. При передаче в массив эти 29 элементов складываются обратно в 20, символы табуляции отбрасываются и выходит, что в массиве 10 чисел. Откуда мне взять это число 10, не считая количиства проходов цикла, без извлечения содержимого stringstream? tellp, tellg, lenght выдают 29 элементов.
 
        for (int i=0;i<rArray1DSize;++i)
        {
             strCout>>Array1D[i];
        }
 
        /*for (int i=0; i<cnArray1DSize;++i)
        {
            cout<<Array1D[i]<<"\t";
        }*/
 
    return Array1D; 
}
 
 
void searchArray1D(int* pArray1D, const int rArray1DSize, const int elementToSearch)
{
    int cnArray1DelementFoundAt=-1, cnArray1DviewedElements;
    for (int j=0; j<rArray1DSize;++j)
    {
        if (pArray1D[j]==elementToSearch)
        {
            cnArray1DelementFoundAt=j;
        }
        else
        {
            cnArray1DviewedElements=j;
            ++cnArray1DviewedElements;
        }
    }
 
    if(cnArray1DelementFoundAt!=-1)
    {
        wcout<< L"Число найдено в массиве, просмотрено элементов: "<< cnArray1DelementFoundAt+1<<endl;
    }
    else wcout<< L"Число не найдено, просмотрено элементов: "<< cnArray1DviewedElements<<endl;
}
 
int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}
 
/*int comp(const int * a,const int * b) //альтернативный метод для unsigned
 {
   if (*a==*b)
     return 0;
   else
     if (*a < *b)
         return -1;
      else
       return 1;
 }*/
 
void binary_search(int* pArray1D, int elementToSearch, int high)
{ 
    int low=0;
    while (low < high)
    {
        unsigned int mid = (unsigned int)(low + high) >> 1;
        if (pArray1D[mid] < elementToSearch)
        {
        low = mid + 1;
        } 
        else high = mid;
    }
    if ((low == high) && (pArray1D[low] == elementToSearch))
    {
    wcout<< L"Число найдено в массиве, просмотрено элементов: "<<low+1<<endl;
    }
    else wcout<< L"Число не найдено"<<endl;
}

Array2D.cpp - работа с двумерными массивом: создание, инициализация, вывод.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "Array2D.h"
#include "Input.h"
 
#include <iostream>
 
using std::cout;
using std::endl;
 
void createArray2D(int ***ppArr2D, const unsigned int cnRow, const unsigned int cnColumn)
{
    *ppArr2D = new int*[cnRow];
    for (unsigned int nIndex = 0; nIndex < cnRow; ++nIndex)
        (*ppArr2D)[nIndex] = new int[cnColumn];
}
 
void initializeArray2DIndex(int **pArr2D, const unsigned int cnRow, const unsigned int cnColumn)
{
    int nIndex = 0;
    for (unsigned int nRow = 0; nRow < cnRow; ++nRow)
        for (unsigned int nColumn = 0; nColumn < cnColumn; ++nColumn)
            pArr2D[nRow][nColumn] = nIndex++;
}
 
void initializeArray2DRandom(int **pArr2D, const unsigned int cnRow, const unsigned int cnColumn)
{
    int nIndex = 0;
    for (unsigned int nRow = 0; nRow < cnRow; ++nRow)
        for (unsigned int nColumn = 0; nColumn < cnColumn; ++nColumn)
            pArr2D[nRow][nColumn] = rand()%100;
}
 
void initializeArray2DManual(int **pArr2D, const unsigned int cnRow, const unsigned int cnColumn)
{
    int nIndex = 0;
    for (unsigned int nRow = 0; nRow < cnRow; ++nRow)
        for (unsigned int nColumn = 0; nColumn < cnColumn; ++nColumn)
            pArr2D[nRow][nColumn] = inputValue(L"Введите значение: ");
}
 
void viewArray2D(int **pArr2D, const unsigned int cnRow, const unsigned int cnColumn)
{
    for (unsigned int nRow = 0; nRow < cnRow; ++nRow)
    {
        for (unsigned int nColumn = 0; nColumn < cnColumn; ++nColumn)
            cout << pArr2D[nRow][nColumn] << "\t";
        cout << endl;
    }
}

Input.cpp - безопасный ввод целых чисел
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "Input.h"
 
#include <iostream>
#include <limits>
 
int inputValue(const wchar_t *const cwsText /*= 0*/)
{
    int nResult = 0;
    while (true)
    {
        if (cwsText != 0)
            std::wcout << cwsText;
 
        std::cin >> nResult;
 
        if (std::cin.good() && std::cin.rdbuf()->in_avail() == 1)
        {
            std::cin.get();
            break;
        }
 
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), L'\n');
    }
 
    return nResult;
}

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "Array2D.h"
#include "Array1D.h"
#include "Input.h"
 
#include <iostream>
#include <conio.h>
 
using std::wcout;
using std::cin;
using std::endl;
 
int main()
{
    setlocale(LC_CTYPE, ".OCP");
 
    int cnArr2DSize = 5;
    cnArr2DSize=inputValue(L"Введите размер массива: ");;
 
    int** pArr2D = 0;
    createArray2D(&pArr2D, cnArr2DSize, cnArr2DSize);
    short int ArrInputMethod=0;
    ArrInputMethod = inputValue(L"Выберите способ заполнения массива: 0 - инкрементально, 1 - random, 2 - вручную ");
    if(ArrInputMethod==0)
    {
    initializeArray2DIndex(pArr2D, cnArr2DSize, cnArr2DSize);
    }
    else if(ArrInputMethod==1)
    {
    initializeArray2DRandom(pArr2D, cnArr2DSize, cnArr2DSize);
    }
    else if(ArrInputMethod==2)
    {
    initializeArray2DManual(pArr2D, cnArr2DSize, cnArr2DSize);
    }
    else wcout<<L"Ошибочный ввод"<<endl;
    
    wcout<<L"Вывести массив? y"<<endl;
    char doArrOutput;
    cin>>doArrOutput;
    if(doArrOutput=='y' || doArrOutput=='Y')
    {
    wcout << L"Инициализированный двухмерный массив " << cnArr2DSize << L"x" << cnArr2DSize << endl;
    viewArray2D(pArr2D, cnArr2DSize, cnArr2DSize);
    }
    else wcout<<L"Вывод отменён"<<endl; 
 
    int rArray1DSize, *pArray1D=NULL;
    wcout << L"\n\nЗначения двухмерного массива в соответствии с путем " << endl << endl;
    pArray1D=viewArray2DPath(pArr2D, cnArr2DSize, cnArr2DSize, rArray1DSize);
 
    wcout << L"Поиск линейным методом " << endl;
    int elementToSearch;
    elementToSearch=inputValue(L"Введите число для поиска в массиве: ");;
    searchArray1D(pArray1D, rArray1DSize, elementToSearch);
 
    qsort(pArray1D,rArray1DSize,sizeof(int),compare);
    /*for (int i=0;i<rArray1DSize;++i)
     {
      cout<<pArray1D[i]<<"\t";
    }*/
    
    wcout << L"\nПоиск двоичным методом " << endl;
    wcout<< L"Введите число для поиска в массиве: ";
    elementToSearch=inputValue(L"Введите число для поиска в массиве: ");;
    binary_search(pArray1D, elementToSearch, rArray1DSize);
 
    wcout << L"\nДля продолжения нажмите любую клавишу . . .\n";
    _getch();
    return 0;
}
Yandex
Объявления
03.06.2012, 11:52     Вместо вывода в stdout, сохранить числа в динамический массив
Ответ Создать тему
Опции темы

Текущее время: 05:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru