Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
1234569
5 / 5 / 3
Регистрация: 25.11.2010
Сообщений: 23
1

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

01.06.2012, 18:10. Просмотров 500. Ответов 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;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2012, 18:10
Ответы с готовыми решениями:

Динамический массив вместо вектора
Добрый день. Мною ( не только ) была осуществлена программа, считающая значения функции y =...

Один большой динамический массив вместо нескольких меньшего размера
Уважаемые форумчане, Прошу помочь советом. Интересует ответы на вопросы: Возможно ли? Если...

Наследование, перегруженные операторы ввода-вывода, динамический массив
Суть задания - создать базовый класс - worker, в котором будут поля - имя, фамилия, отчество. В нём...

Нужно сохранить и прочитать динамический массив структур из бинарного файла
struct city{ char name_city; char metro; int year_city; int naselenie; };

Ошибка ввода вывода: вместо введенной даты, выводит совсем другие числа
data vvod() //ввод элемента списка {data t; int flag; ...

1
1234569
5 / 5 / 3
Регистрация: 25.11.2010
Сообщений: 23
03.06.2012, 11:52  [ТС] 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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2012, 11:52

Числа Фиббоначи через динамический массив
Среди первых N-чисел Фибоначчи найти такие, которые начинаются или заканчиваются на М....

Надо читать числа из файла в динамический массив
Доброго времени суток. Проблема такая- нужно читать числа из файла в динамический массив. Заранее...

Занести числа из текстового файла в динамический массив
Задача такова: 1). Нужно считать числа с файла (*.txt). Пример файла: 39 45 50...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru