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

Списки. Стеки. Очереди - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ MPI и scanf в С++ http://www.cyberforum.ru/cpp-beginners/thread804252.html
Вобщем я делаю параллельную программу. Все процессы в этой программе должны узнать некоторое целое число X, которое пользователь вводит с клавиатуры. Я пока знаю только один способ это осуществить - некоторый один процесс (например с рангом 0) получает это число с помощью scanf у пользователя, а затем шлет его в сообщениях всем остальным процессам (см. код ниже). Вопрос - можно ли как-то...
C++ Ошибка в задаче про массивы Написал прогу,строго не судите,но какой то косяк здесь не знаю даже где,она должна Найти сумму элементов массива, которые находятся между максимальным и минимальным числами. В сумму включить и оба этих числа.Помогите плиз ошибку найти #include <stdio.h> #include <iostream> #include <conio.h> #include<math.h> using namespace std; http://www.cyberforum.ru/cpp-beginners/thread804251.html
Окружность C++
Господа! Как нарисовать систему координат (две оси Ох и Оу) круг с центром в начале координат, если известен максимум по одной из осей? Т.е. центр круга всегда начало коорд. (0) и известна одна точка на оси. Спасибо за внимание!
C++ Разворот строки через указатель
ну вообщем обычное задание развернуть строку наоборот, обычный метод я знаю а как реализвать черерз указатели? for example: char *p=" i love c++" написал но оно не работает ))) char *mas="12345678"; for(int i=0,p=strlen(mas)-1;p>i;i++,p--)
C++ Третий аргумент strrok_s http://www.cyberforum.ru/cpp-beginners/thread804214.html
Собственно, что значит 3 аргумент ? Видел уже на этом форуме ответы, но ничего не понял, пожалуйста, не надо давать ссылку мсдн. Объясните, что значит 3 аргумент.
C++ Ошибка во время исполнения При попытке запустить программу Visual Studio пишет: Unhandled exception at 0x011027ce in GLTore.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd. Кажется, что-то не то с памятью, но я не могу найти что именно, но вроде дело только в этой функцие. Подскажите пожалуйста, где у меня ошибка ? void InitTore(double R,double r,int m,int n,tore& t) { double stPhi,stPsy; int N =... подробнее

Показать сообщение отдельно
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
14.03.2013, 16:21     Списки. Стеки. Очереди
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
//Квадрат разбит на 4^k равновеликих квадратных клеток. Квадрат перегибается поочередно относительно вертикальной 
//(правая половина подкладывается под левую) и горизонтальной (нижняя половина подкладывается под верхнюю) 
//оси симметрии до тех пор, пока все клетки не будут расположены друг под другом. 
//Требуется занумеровать клетки исходного квадрата таким образом, 
//чтобы в результате выполнения операций перегиба номера клеток, расположенных друг под другом, 
//образовали числовую последовательность 1,2,3,...,4 ^ k, начиная с верхней клетки.
 
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cmath>
 
struct point
{
    int value;
    int x, y;
    point (int X, int Y) : x(X), y(Y), value(0) {}
    point (int X, int Y, int val) : x(X), y(Y), value(val) {}
};
 
size_t numberOfDigits(size_t n) {
    size_t count = 0;
    while (n != 0) {
        n /= 10;
        ++count;
    }
    return count;
}
 
// горизонтальный сгиб
void horizFold(std::vector<point>** mass, size_t curlen) {
    // добавляем точки
    for (size_t i = 0; i < curlen / 2; ++i) {
        for (size_t j = 0; j < curlen; ++j) {
            std::copy(mass[curlen - i - 1][j].rbegin(), mass[curlen - i - 1][j].rend(), back_inserter(mass[i][j]));
        }
    }
    // очищаем поля
    for (size_t i = curlen / 2; i < curlen; ++i) {
        for (size_t j = 0; j < curlen; ++j) {
            mass[i][j].clear();
        }
    }
}
 
// вертикальный сгиб
void vertFold(std::vector<point>** mass, size_t curlen) {
    // добавляем точки
    for (size_t i = 0; i < curlen; ++i) {
        for (size_t j = 0; j < curlen / 2; ++j) {
            std::copy(mass[i][curlen - j - 1].rbegin(), mass[i][curlen - j - 1].rend(), back_inserter(mass[i][j]));
        }
    }
    // очищаем поля
    for (size_t i = curlen; i < curlen; ++i) {
        for (size_t j = 0; j < curlen / 2; ++j) {
            mass[i][j].clear();
        }
    }
}
 
int main()
{
    size_t k;    // степень четвёрки
    std::cout << "Enter k" << std::endl;
    std::cin >> k;
    size_t len = (size_t)pow(2.0, 1.0 * k);  // длина стороны квадрата
 
    // подсчитаем количество цифр максимального номера квадрата, для читаемого вывода
    size_t numOfDig = numberOfDigits((size_t)pow(4.0, 1.0 * k));  
 
    int** originalMass = new int*[len];  // тот массив, который мы захотим получить
    for (size_t i = 0; i < len; ++i) {
        originalMass[i] = new int[len];
    }
 
    std::vector<point>** mass = new std::vector<point>*[len];  // создадим массив векторов точек
    for (size_t i = 0; i < len; ++i) {
        mass[i] = new std::vector<point>[len];
    }
 
    for (size_t i = 0; i < len; ++i) {
        for (size_t j = 0; j < len; ++j) {
            mass[i][j] = std::vector<point>(1, point(i, j));  // и каждый элемент этого массива инициализируем вектором
        }                                                 // из одной точки, 
    }                                              // в которую сохраним координаты текущего элемента массива
 
    size_t curlen = len;   // текущая длина
 
    while (curlen != 1) {               // "сгибаем" массив до тех пор, пока он не станет одной клеткой
        vertFold(mass, curlen);
        horizFold(mass, curlen);
        curlen /= 2;
    }
 
    // после всех сгибов у нас все точки окажутся в векторе, который хранится в верхнем левом элемента массива mass[0][0]
    for (size_t i = 0; i < mass[0][0].size(); ++i) {
        // придадим значение каждой точке этого вектора в обратном порядке, т.к. начальный элемент вектора находится "внизу"
        (mass[0][0])[i].value = mass[0][0].size() - i;  
        // заполняем наш исходный массив (заполнение элементов массива идёт в порядке расположения точек в векторе)
        originalMass[(mass[0][0])[i].x][(mass[0][0])[i].y] = (mass[0][0])[i].value;
    }
 
    // выводим искомый массив и получаем пронумерованный квадрат
    for (size_t i = 0; i < len; ++i) {
        for (size_t j = 0; j < len; ++j) {
            std::cout << std::setw(numOfDig + 1) << originalMass[i][j];
        }
        std::cout << std::endl;
    }
 
    system("PAUSE>0");
    return 0;
}
 
Текущее время: 05:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru