Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/2: Рейтинг темы: голосов - 2, средняя оценка - 5.00
Glam_Man
6 / 6 / 3
Регистрация: 15.10.2011
Сообщений: 73
1

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

27.08.2012, 19:46. Просмотров 438. Ответов 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

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

Подбор блоков питания к модемам ADSL
Добрый день! Такая вот проблема: Есть три вида модемов Comtrend CT-507, Comtrend CT-320, Comtrend...

Создать круг разделенный на 6 блоков, в центре логотип, при наведении на один из блоков он увеличивается
Доброго времени суток. Не знаю, как даже искать похожее. В общем нужно создать круг разделен на 6...

Выделить последовательно пять блоков памяти. Высвободить второй блок, после чего вывести информацию о цепочке блоков
Выделить последовательно пять блоков памяти. Высвободить второй блок, после чего вывести информацию...

Посчитать количество атомов в многоуровневом списке (в списке со вложенными списками)
Здравствуйте! Нужно написать программу, которая бы вычисляла, сколько всего атомов в списке...

Определить первый атом в списке, а если такого в списке нет, вывести nil
Помогите с написанием функции на lisp. 1. Функция которая определяет первый атом в списке, а если...

3
MrCold
864 / 762 / 174
Регистрация: 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
уберите индексацию .
0
Glam_Man
6 / 6 / 3
Регистрация: 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 остаётся последний элемент, сравнение в цикле происходит именно с ним, остальные недоступны
Ошибка больше не вылезает
0
MrCold
864 / 762 / 174
Регистрация: 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;                                                 
}
0
28.08.2012, 02:05
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2012, 02:05

Найти в одном списке максимальный элемент, а в другом списке соответствующий ему по индексу
Здравствуйте! Помогите решить задачу - есть два cписка a = и b = . Необходимо найти из списка 'a'...

Словарь в списке. Последний элемент словаря в списке
Есть следующий список: namelis=( Как можно обратиться к последнему элементу данного списка? ...

В списке есть вложенные списки,если все числа во вложенном списке положительные,то вывести сумму этих чисел
есть список ,в нём вложенные подсписки,если во вложенном подсписке все элементы положительные то...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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