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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Glam_Man
6 / 6 / 0
Регистрация: 15.10.2011
Сообщений: 73
#1

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

27.08.2012, 19:46. Просмотров 394. Ответов 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[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++
Не могу понять почему не работает. Компилятор не выдаёт ошибок, но ничего не работает. Точнее работает только случай ввода 0000;. Проблема...

подбор делителей числа - C++
подскажите как написать подбор делителей числа, мне это нужно для решения этой задачи: найти все целые корни уравнения A*x^3+B*x^2+C*x+D=0,...

Построить стену из блоков - C++
Всем привет, интересует в какую сторону думать алгоритм: есть четыре кубика длиной в 1, один длиной в 2 и один длиной в 3. Нужно построить...

перестановка блоков матрицы - C++
надо обменять четверти матрицы по диагонали, с использованием двух массивов. вот часть кода t=(m)/2; k=(n)/2; for (i=0;i&lt;m;i++) { ...

Перестановка блоков матрицы - C++
1)Дано действительную квадратную матрицу порядка 2n. Получить новую матрицу, переставляя ее блоки розмером nxn рисунок и второе задание...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrCold
854 / 752 / 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 остаётся последний элемент, сравнение в цикле происходит именно с ним, остальные недоступны
Ошибка больше не вылезает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2012, 02:05     Подбор блоков в списке
Еще ссылки по теме:

Подбор графиков функций по эскизу - C++
Суть программы заключается в следующем: 1) Загружаем эскиз например.. электрогитары. 2) После нужно собственно разбить этот эскиз на...

Синтаксис и семантика блоков try… catch… - C++
Не могу понять что нужно написать

Подбор литературы. Для повышенного уровня - C++
Привет. Освоил книгу страуструпа для новичков. Подскажите куда двигаться дальше? Разработка приложений информационной безопасности....

Арканоид. Алгоритм отбивания шара от блоков - C++
Всем привет. Пишу арканоид на С++ с помощью winapi. Уже доделал, но никак не могу придумать нормальный алгоритм отбивания шара от блоков. У...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
MrCold
854 / 752 / 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     Подбор блоков в списке
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru