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

Подбор блоков в списке - C++

Восстановить пароль Регистрация
 
Glam_Man
6 / 6 / 0
Регистрация: 15.10.2011
Сообщений: 73
27.08.2012, 19:46     Подбор блоков в списке #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
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
#include <iostream>
#include <fstream>
#include <locale.h>
#include <stdio.h>
using namespace std;
struct Node
{
    int elem;           //элемент списка
    Node *next;     //указатель на следующий элемент списка
} *node;
int list_select(Node *node, int NumberOfElements, int node_counter)
{
    int minimum = 1;                                        //Единственный минимум
    int i = 0;
    while(i < node_counter)
    {
        if(NumberOfElements!=node[i].elem)                      //Если не подобран подходящий блок, сравниваем дальше
        {
            if(NumberOfElements<node[i].elem)
            {
                minimum = node[i].elem;                             //Присвоение минимума
            }
        }
        else
        {
            return node[i].elem;                            //Блок успешно подобран, возвращаем размер текущего блока
        }
        i++;
    }
    if (minimum = 1)
    {
        return 0;                                                   //Подходящий блок не найден
    }
    return minimum;                                                 //Возвращаем размер минимального блока
}
int input_form_file(Node *&node,  int &node_counter)
{
    ifstream f;
    char filename[100];                     //Память под имя файла
    int i = 0;                              //Счётчик цикла
    int temp;                               //Временная переменная для хранения размера блока в цикле
    Node *fir = 0;
    cout << "Введите номер теста" << endl;
    cin >> filename;
    f.clear();
    f.open(filename);
    if(!f)
    {
        return 0;
    }
    f >> node_counter;                      //Количество блоков в списке
    while(i < node_counter)
    {
        f >> temp;                          //Помещаем из файла во временную переменную текущий размер блока
        node = new Node;                    //Выделяем память для нового узла
        node[i].elem = temp;                    //Присваиваем узлу с индексом
        node -> next = fir;                 //Следующий узел указывает на fir
        fir = node;                         //Который является новым узлом
        i++;
    }
    f.close();
    return 1;
}
int menu()
{
    setlocale(LC_ALL,"russian");
    char c;
    int NumberOfElements;
    int node_counter;
    while(true)
    {
        system("cls");
        printf("Работа о списками\n\n");
        printf("1.Добавление списков из файла\n");
        printf("2.Подбор оптимального по размеру блока\n");
        printf("3.Выход из программы\n");
        fflush(stdin);
        scanf("%c", &c);
        switch(c)
        {
            case '1':
                if(input_form_file(node, node_counter))
                {
                    cout << "Файл введён" << endl;
                }
                else
                {
                    cout << "Некорректные данные в файле" << endl;
                }
                system("pause");                                        //На этом шаге вылезает ошибка
                break;
            case '2':
                cout << "Введите размер требуемого блока" << endl;
                cin >> NumberOfElements;
                if(list_select(node, NumberOfElements, node_counter))
                {
                    cout << "Блок подобран, его размер" << list_select(node, NumberOfElements, node_counter) << endl;
                }
                else
                {
                    cout << "Не удалось подобрать блок подходящего размера, ибо он превышает размер всех блоков" << endl;
                }
                system("pause");
                break;
            case '3':
                return 0;
                break;
        }
    }
}
int main()
{
    menu();
    return 0;
}
ОС Windows инициировала точку останова в Project.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в Project.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит Project.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
Не знаю, как устранить ошибку
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2012, 19:46     Подбор блоков в списке
Посмотрите здесь:

C++ подбор паролей
C++ Перестановка блоков матрицы
C++ перестановка блоков матрицы
C++ Построить стену из блоков
Проверка при помощи вложенных блоков try C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
28.08.2012, 00:03     Подбор блоков в списке #2
Что увидел:
1. Функция меню возвращает int,
сделайте возвращающей void ( строка 64 ):
C++
1
2
void menu()
{
и ( строка 106 )
ноль уберите
C++
1
2
3
   case '3':
                return;
                break;
2. Пытаетесь обратится к узлу по индексу,
в функции input_form_file
C++
1
 node[i].elem = temp;
здесь нет массива, нужно
C++
1
 node->elem = temp;
то же самое в функции list_select
уберите индексацию .
Glam_Man
6 / 6 / 0
Регистрация: 15.10.2011
Сообщений: 73
28.08.2012, 00:12  [ТС]     Подбор блоков в списке #3
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
#include <iostream>
#include <fstream>
#include <locale.h>
#include <stdio.h>
using namespace std;
struct Node
{
    int elem;       //элемент списка
    Node *next;     //указатель на следующий элемент списка
} *node;
int list_select(Node *node, int NumberOfElements, int node_counter)
{
    int minimum = 1;                                                //Единственный минимум
    int i = 0;
    while(i < node_counter)
    {
        if(NumberOfElements!=node->elem)                            //Если не подобран подходящий блок, сравниваем дальше
        {
            if(NumberOfElements<node->elem)
            {
                minimum = node->elem;                               //Присвоение минимума
            }
        }
        else
        {
            return node->elem;                                  //Блок успешно подобран, возвращаем размер текущего блока
        }
        i++;
    }
    if (minimum = 1)
    {
        return 0;                                                   //Подходящий блок не найден
    }
    return minimum;                                                 //Возвращаем размер минимального блока
}
int input_form_file(Node *&node,  int &node_counter)
{
    ifstream f;
    char filename[100];                                 //Память под имя файла
    int i = 0;                                          //Счётчик цикла
    int temp;                                           //Временная переменная для хранения размера блока в цикле
    Node *fir = 0;
    cout << "Введите номер теста" << endl;
    cin >> filename;
    f.clear();
    f.open(filename);
    if(!f)
    {
        return 0;
    }
    f >> node_counter;                                  //Количество блоков в списке
    while(i < node_counter)
    {
        f >> temp;                                      //Помещаем из файла во временную переменную текущий размер блока
        node = new Node;                                //Выделяем память для нового узла
        node -> elem = temp;                            //Присваиваем узлу с индексом
        node -> next = fir;                             //Следующий узел указывает на fir
        fir = node;                                     //Который является новым узлом
        i++;
    }
    f.close();
    return 1;
}
void menu()
{
    setlocale(LC_ALL,"russian");
    char c;
    int NumberOfElements;
    int node_counter;
    while(true)
    {
        system("cls");
        printf("Работа о списками\n\n");
        printf("1.Добавление списков из файла\n");
        printf("2.Подбор оптимального по размеру блока\n");
        printf("3.Выход из программы\n");
        fflush(stdin);
        scanf("%c", &c);
        switch(c)
        {
            case '1':
                if(input_form_file(node, node_counter))
                {
                    cout << "Файл введён" << endl;
                }
                else
                {
                    cout << "Некорректные данные в файле" << endl;
                }
                system("pause");                                        //На этом шаге вылезает ошибка
                break;
            case '2':
                cout << "Введите размер требуемого блока" << endl;
                cin >> NumberOfElements;
                if(list_select(node, NumberOfElements, node_counter))
                {
                    cout << "Блок подобран, его размер" << list_select(node, NumberOfElements, node_counter) << endl;
                }
                else
                {
                    cout << "Не удалось подобрать блок подходящего размера, ибо он превышает размер всех блоков" << endl;
                }
                system("pause");
                break;
            case '3':
                return;
                break;
        }
    }
}
int main()
{
    menu();
    return 0;
}
В node->elem остаётся последний элемент, сравнение в цикле происходит именно с ним, остальные недоступны
Ошибка больше не вылезает
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
28.08.2012, 02:05     Подбор блоков в списке #4
Проверьте, оно ?

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
int list_select(Node *node, int NumberOfElements, int node_counter)
{
 
    int minimum = 1;                                        
    int i = 0;
    while(i < node_counter)
    {
             if( NumberOfElements == node->elem )  
 
              return node->elem;  
   //             
            if( NumberOfElements > node->elem &&  minimum < node->elem && NumberOfElements > minimum )
           {
                minimum = node->elem;            
          }
                                                 
        node = node->next;
        i++;
    }
    if (minimum == 1)
    {
        return 0;                                                   
    }
    return minimum;                                                 
}
Yandex
Объявления
28.08.2012, 02:05     Подбор блоков в списке
Ответ Создать тему
Опции темы

Текущее время: 21:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru