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

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

01.06.2012, 18:10. Показов 993. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru