Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Написать шаблонную функцию,которая вычислит сумму значений отрицательных элементов массива числового типа http://www.cyberforum.ru/cpp-beginners/thread593586.html
Помогите с задачей на шаблонные функции. Я их вообще не понимаю. Вот задание.Мне сказали, что решение не такое большое. Заранее спасибо. 1)напишите шаблонную функцию sum() ,которая вычислит...
C++ Почему код работает только когда делаешь запуск без отладки #include "stdafx.h" #include <iostream> #include "stdlib.h" #include <locale.h> using namespace std; int main(int argc, char* argv) { setlocale(LC_ALL,"RUS"); int n,m,i,j,k,tmp,p; http://www.cyberforum.ru/cpp-beginners/thread593575.html
Задача "поиск кратчайшего пути в графе обходом в ширину(волновой алгоритм)" C++
Помогите с задачей поиск кратчайшего пути в графе обходом в ширину(волновой алгоритм) Может у кого есть уже готовая? Или часть программы? Просто все что есть в интернете не понятно и сложно.. Вот...
произвидение матриц C++
ребят помогите получить зачёт. 3 задачки осталось здать.решите плиз вот эту. найти произвидение матриц А(m;n) и В(n;k) С(M;k)=А*В. матрици А,В,С описать как одномерные массивы, используя...
C++ Расположение данных в стеке и в куче http://www.cyberforum.ru/cpp-beginners/thread593538.html
Друзья, возник вопрос. Следующий код char length_buffer; ...заполнение length_buffer двоичным представлением целого числа 999... int length = *reinterpret_cast<int *>(&length_buffer); работает....
C++ Функция получает неотрицательную десятичную дробь и возвращает её представление в системе счисления с основанием р = 16 Написать и протестировать функцию. Функция получает неотрицательную десятичную дробь и возвращает её представление в системе счисления с основанием р = 16. Помогите пожалуйста) подробнее

Показать сообщение отдельно
1234569
5 / 5 / 1
Регистрация: 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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru