Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
5 / 5 / 3
Регистрация: 25.11.2010
Сообщений: 23

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

01.06.2012, 18:10. Показов 978. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.06.2012, 18:10
Ответы с готовыми решениями:

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

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

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

1
5 / 5 / 3
Регистрация: 25.11.2010
Сообщений: 23
03.06.2012, 11:52  [ТС]
Написал, возникли вопросы:

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


Интересно - как получить число элементов, чтобы задать размер массива? Проблема в том, что в 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.06.2012, 11:52
Помогаю со студенческими работами здесь

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

Ошибка ввода вывода: вместо введенной даты, выводит совсем другие числа
data vvod() //ввод элемента списка {data t; int flag; cout&lt;&lt;&quot;Enter day'&quot;&lt;&lt;endl; cin&gt;&gt;t.day;...

Динамический массив вместо свойств
Есть некая структура с множеством данных public struct man { private string sex; public string Name {...

Выравнивание вывода в stdout
Есть программа вывода квадратной матрицы на экран, как можно её исправить чтобы при воде размера от 1 до 100+ выравнивание по левому краю...

Перехват вывода приложений, не использующих stdout
Господа, возникла такая проблемка: требуется отловить вывод программ, которые выводят результаты не в stdout а сразу на экран, типа как gcc...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru