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

Разобраться в функции - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Компилятор С++ http://www.cyberforum.ru/cpp-beginners/thread638093.html
Скажите, пожалуйста, каким редактором для написания кода вы пользуетесь, и какой компилятор используете? Напишите недостатки и преимущества вашего выбора. Я начинающий программист, пишу и компилирую в оболочке DOSBox на Borland C++ 3.1 Преимущество выбора в том ("выбор" - это громко сказано, я больше не знаю с чем можно работать, а хочу узнать), что после написания кода можно его...
C++ Условие: если строка пустая - выполнить действие Здравствуйте, если можете, помогите создать такое условие: "Условие: если строка пустая - выполнить действие...", на основе этого кода: #include <iostream> using namespace std; int main() { http://www.cyberforum.ru/cpp-beginners/thread638087.html
C++ Сортировка слиянием (рекурсивный метод) текстовой строки
Привет всем. Возникла трудность не понимаю как отсортировать методом слияний (рекурсивным методом) текстовую строку. К примеру дана строка qwerty qwe qwert qwer И должно получиться следующее qwe qwer qwert qwerty Ребят помогите пожалуйста с алгоритмом
Ошибка: Stack was corrupted C++
Здравствуйте уважаемые программисты. Написал простейшую программу заполнения массива и вывода его на консоль. Но при запуске вылазит ошибка (см. прикреплённый файл). Объясните пожалуйста в чём дело? Вот код: #include <iostream> using namespace std; int main() { int mas1; //Получение простых чисел в диапазоне от 2 до 199. for (int i=0; i<=7; i++)
C++ Операторы ввода и вывода http://www.cyberforum.ru/cpp-beginners/thread638040.html
Допустим есть класс class Checked { public: private: double id; int *beg; std::pair<std::strin, std::strin> par;
C++ Деревья Знаю пару тройку фундаментальных структур на основе дерева: красно-черное дерево бинарное древо поиска AVL дерево 2 - 3, 2 - 3 - 4 дерево H дерево Вопрос: подскажите фундаментальные структуры на основе дерева, которые не входят в этот список, для дальнейшего рассмотрения. подробнее

Показать сообщение отдельно
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2012, 04:06     Разобраться в функции
Вариант без функции DestructArray(). В ней есть ошибки, ещё не разобрался. А так работает.
Код
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
#include<stdlib.h>
#include"stdio.h"
#include<conio.h>
 
// Прототипы своих функций
void PrintArray(double **p);
double ** ConstructArray();
void DestructArray(double **p);
 
//******************************************************************
 
void main(void)
{
 
// указатель на вектор указателей на строки
double **pA;
 
//clrscr(); // очистка экрана
 
// построит массив и вернет указатель на него
pA = ConstructArray();
 
// выведет массив на экран
PrintArray(pA);
 
// освободит память
//DestructArray(pA);
 
// подождет нажатия клавиши
getch();}
 
//******************************************************************
// Функция запрашивает необходимую информацию и строит рваный массив.
//   Возвращает   указатель   на   него.   Количество   строк   хранится   в   «минус первом» 
// элементе вектора указателей на строки, а в «минус первом» элементе каждой 
// строки – количество. Элементов в строке
 
double **ConstructArray()
{
    double **p = NULL;
    int N, M; // количество строк, элементов в строке
 
    // вводим корректное количество строк
    do
    {
        printf("\nProgram makes an array of N rows.\n");
        printf("Please, enter N (1<=N<=10): ");
        scanf("%d", &N);
    } while(N<1 || N>10);
 
    // выделяем память
    p = (double **)malloc( sizeof(double *) * N + sizeof(int));
    // запоминаем в «минус первом» элемент вектора указателя на строки
    ((int *)p)[-1] = N;
    // сдвигаем указатель
    //((int *)p)++;
    // Организуем построчный ввод
    for(int i = 0; i < N; i++)
    {
    // вводим корректное количество элементов в строке
        do
        {
            printf("\nEnter M - number of elements in %d-th row (1<=M<=10): ", i);
            scanf("%d", &M);
        } while(M < 1 || M > 10);
 
        // выделяем память
        p[i]=(double *)malloc( M * sizeof(double) + sizeof(int));
        // записываем в -1 элемент
        ((int *)(p[i]))[-1] = M; 
        // сдвигаем указатель
        //((int *)(p[i]))++;    
        for(int j = 0; j < M; j++) // вводим элементы
        {
            double m;
            do
            {
                printf("\nEnter A[%d][%d] (1<=A[%d][%d]<=10): ", i, j, i, j);
                scanf("%lf", &m);
            } while(m < 1 || m > 10);
            p[i][j] = m;
        }
    }
    return p; // вернуть указатель на сконструированный массив
}//
 
//void DestructArray(double **p)
//{
//  if(!p) return;// проверка корректности
//  int N; // количество строк
//  N = ((int *)p)[-1];
//  for(int i = 0; i < N; i++)
//  {
//      ((int *)(p[i]))--;
//      free(p[i]); // удалить каждую ненулевую
//  }
//  ((int *)p)--;  // смещаем указатель на место
//  free(p); // освобождаем память
//}
//******************************************************************// Функция выводит на экран рваный массив
void PrintArray(double **p)
{
    int N, M; // количество строк, столбцов
    N = ((int *)p)[-1];
    for(int i = 0; i < N; i++)
    {
        M = ((int *)(p[i]))[-1];
        for(int j = 0; j < M; j++) 
            printf("%-6.2lf", p[i][j]);
        printf("\n");
    }
}


Добавлено через 1 час 45 минут
Если с освобождением памяти, то вот так можно:
Код
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
#include<stdlib.h>
#include"stdio.h"
#include<conio.h>
 
// Прототипы своих функций
void PrintArray(double **p);
double ** ConstructArray();
void DestructArray(double **p);
 
//******************************************************************
 
void main(void)
{
 
// указатель на вектор указателей на строки
double **pA;
 
//clrscr(); // очистка экрана
 
// построит массив и вернет указатель на него
pA = ConstructArray();
 
// выведет массив на экран
PrintArray(pA);
 
// освободит память
DestructArray(pA);
 
// подождет нажатия клавиши
getch();}
 
//******************************************************************
// Функция запрашивает необходимую информацию и строит рваный массив.
//   Возвращает   указатель   на   него.   Количество   строк   хранится   в   нулевом  
// элементе вектора указателей на строки, а в нулевом элементе каждой 
// строки – количество элементов в строке
 
double **ConstructArray()
{
    double **p = NULL;
    int N, M; // количество строк, элементов в строке
 
    // вводим корректное количество строк
    do
    {
        printf("\nProgram makes an array of N rows.\n");
        printf("Please, enter N (1<=N<=10): ");
        scanf("%d", &N);
    } while(N < 1 || N > 10);
 
    // выделяем память
    p = (double **)malloc( sizeof(double *) * N + sizeof(int));
    // 
    ((int *)p)[0] = N; // количетсво строк будет находиться в p[0].
    
    // Организуем построчный ввод
    for(int i = 1; i < N + 1; i++)
    {
    // вводим корректное количество элементов в строке
        do
        {
            printf("\nEnter M - number of elements in %d-th row (1<=M<=10): ", i);
            scanf("%d", &M);
        } while(M < 1 || M > 10);
 
        // выделяем память
        p[i]=(double*)malloc( M  * sizeof(double) + sizeof(double));
        // записываем в 0 элемент количество элементов в строке
        ((int *)(p[i]))[0] = M; 
         for(int j = 1; j < M + 1; j++) // вводим элементы
        {
            double m;
            do
            {
                printf("\nEnter A[%d][%d] (1<=A[%d][%d]<=10): ", i, j, i, j);
                scanf("%lf", &m);
            } while(m < 1 || m > 10);
            p[i][j] = m;
        }
    }
    return p; // вернуть указатель на сконструированный массив
}//
 
void DestructArray(double **p)
{
    if(!p) return;// проверка корректности
    int N; // количество строк
    N = ((int *)p)[0];
    for(int i = 1; i < N + 1; i++) // освобождаем память под строками.
    {
        free(p[i]); 
    }
    
    free(p); // освобождаем память под указателями.
}
//******************************************************************// Функция выводит на экран рваный массив
void PrintArray(double **p)
{
    int N, M; // количество строк, столбцов
    N = ((int *)p)[0];
    
    for(int i = 1; i < N + 1; i++)
    {
        M = ((int *)(p[i]))[0];
        for(int j = 1; j < M + 1; j++) 
            printf("%-6.2lf", p[i][j]);
        printf("\n");
    }
}
Если с new, то так:
Код
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
#include<stdlib.h>
#include"stdio.h"
#include<conio.h>
 
// Прототипы своих функций
void PrintArray(double **p);
double ** ConstructArray();
void DestructArray(double **p);
 
//******************************************************************
 
int main()
{
 
// указатель на вектор указателей на массивы
double **pA;
 
//clrscr(); // очистка экрана
 
// построит массив и вернет указатель на него
pA = ConstructArray();
 
// выведет массив на экран
PrintArray(pA);
 
// освободит память
DestructArray(pA);
 
// подождет нажатия клавиши
getch();
return 0;
}
 
//******************************************************************
// Функция запрашивает необходимую информацию и строит двумерный динамический массив double.
//   Возвращает указатель на него. Количество одномерных массивов хранится в нулевом  
// элементе вектора указателей на массивы, а в нулевом элементе каждого 
// массива – количество элементов в массиве.
 
double **ConstructArray()
{
    double **p = NULL;
    int N, M; // количество одномерных массивов, элементов в массиве
 
    // вводим корректное количество одномереых массивов
    do
    {
        printf("\nProgram makes an array of N rows.\n");
        printf("Please, enter N (1<=N<=10): ");
        scanf("%d", &N);
    } while(N < 1 || N > 10);
 
    // выделяем память
    p = new double *[N + 1];
    // 
    ((int*)p)[0] = N; // количество массивов double будет находиться в p[0].
    
    // Организуем ввод элементов в массивы
    for(int i = 1; i < N + 1; i++)
    {
    // вводим корректное количество элементов в массиве
        do
        {
            printf("\nEnter M - number of elements in %d-th row (1<=M<=10): ", i);
            scanf("%d", &M);
        } while(M < 1 || M > 10);
 
        // выделяем память
        p[i] = new double[M + 1];
        // записываем в 0-элемент количество элементов в массиве
        p[i][0] = M; 
         for(int j = 1; j < M + 1; j++) // вводим элементы
        {
            double m;
            do
            {
                printf("\nEnter A[%d][%d] (1<=A[%d][%d]<=10): ", i, j, i, j);
                scanf("%lf", &m);
            } while(m < 1 || m > 10);
            p[i][j] = m;
        }
    }
    return p; // вернуть указатель на сконструированный массив 
}//
 
void DestructArray(double **p)
{
    if(!p) return;// проверка корректности
    int N; // количество массивов double
    N = ((int*)p)[0];
    for(int i = 1; i < N + 1; i++) // освобождаем память под массивами double.
    {
        delete [] p[i]; 
    }
    
    delete [] p; // освобождаем память под указателями на массивы double.
}
//******************************************************************// Функция выводит на экран двумерный динамический массив
void PrintArray(double **p)
{
    int N, M; 
    N = ((int *)p)[0]; // количество одномерных массивов.
    
    for(int i = 1; i < N + 1; i++)
    {
        M = p[i][0]; // количество элементов в одномерном массиве.
        for(int j = 1; j < M + 1; j++) 
            printf("%-6.2lf", p[i][j]);
        printf("\n");
    }
}
 
Текущее время: 14:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru