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

Формирование списка - C++

Восстановить пароль Регистрация
 
Robbie4LFC
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 37
08.07.2013, 10:09     Формирование списка #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
typedef struct complex
{
        float real;
        float image;
}complex;
typedef struct properties
{
        float ampl;
        float freq;
        float phase;
}properties;
typedef struct point
{
        properties p;
        complex comp;
        point *next;
}point;
 point* newpoint = new point;
        newpoint->p.ampl = StrToFloat (Edit5->Text);
        newpoint->p.freq = StrToFloat (Edit4->Text);
        newpoint->p.phase = StrToFloat (Edit6->Text);
        newpoint->comp.real = cos(newpoint->p.phase)*newpoint->p.ampl;
        newpoint->comp.image = sin(newpoint->p.phase)*newpoint->p.ampl;
        Series4->Add(newpoint->comp.real);
        Series5->Add(newpoint->comp.image);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2013, 10:09     Формирование списка
Посмотрите здесь:

Динамические структуры данных. Формирование линейного списка. C++
C++ очень важно посмотрите формирование списка из текстового файла
Дублирование вхождения каждого элемента списка One и формирование из этих значений списка Double (пояснить условие) C++
Формирование списка и работа с ним C++
C++ Формирование нового списка или из pascal -> с++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2013, 10:25     Формирование списка #2
Цитата Сообщение от Robbie4LFC Посмотреть сообщение
Как можно реализовать список для данной задачи?
А вообще, как списки реализовываются знаете?
Robbie4LFC
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 37
08.07.2013, 10:32  [ТС]     Формирование списка #3
Цитата Сообщение от alsav22 Посмотреть сообщение
А вообще, как списки реализовываются знаете?
В общих чертах. Но для данной задачи не получается никак вообще. Потому и прошу помощи, чтобы по готовому примеру разобраться детально. Ну или может хоть как-то помочь кто-то сможет
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2013, 10:45     Формирование списка #4
Цитата Сообщение от Robbie4LFC Посмотреть сообщение
Но для данной задачи не получается никак вообще.
В чём сложность именно для этой задачи? Создавать, в цикле, новые point и добавлять их в список? Или нужно что-то другое?
Robbie4LFC
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 37
08.07.2013, 10:57  [ТС]     Формирование списка #5
Цитата Сообщение от alsav22 Посмотреть сообщение
В чём сложность именно для этой задачи? Создавать, в цикле, новые point и добавлять их в список? Или нужно что-то другое?
Все верно, нужно просто создавать новые point. Но так как я новичек, то я никак не могу въехать каким образом это происходит. То есть каким образом программа поймет, что мне больше не надо ничего создавать? Как это реализовать я не знаю, а другие примеры из интернета ничем не помогают мне.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2013, 11:11     Формирование списка #6
Цитата Сообщение от Robbie4LFC Посмотреть сообщение
То есть каким образом программа поймет, что мне больше не надо ничего создавать?
Цикл while(), после каждой итерации (добавления нового элемента в список) вопрос: продолжить? (y\n)? и ввод в char. Если вводится n, то выход из цикла.

Добавлено через 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
struct Node
{
   int it;
   struct Node *next;
};
 
Node *front = NULL; // начало списка
Node *rear  = NULL; // конец  списка
 
while (!f.eof())
{
    Node *add = new Node; // новый элемент списка
    if (add == NULL) return false; // если память не выделена
        
    f >> add -> it;
    add -> next = NULL;
        
    if (front == NULL) // если список пустой, то в начало
        front = add; // front начало списка
        
    else  rear -> next = add; // если список не пустой, то в конец
    rear = add; // rear конец списка
 }
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
08.07.2013, 11:16     Формирование списка #7
Может быть не совсем то, но
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int count = StrToInt(Edit->Text);
point *arrPoint = new point[count];
 
for(int i=0; i<count; i++)
  {
        arrPoint[i]->p.ampl = StrToFloat (Edit5->Text);
        arrPoint[i]->p.freq = StrToFloat (Edit4->Text);
        arrPoint[i]->p.phase = StrToFloat (Edit6->Text);
        arrPoint[i]->comp.real = cos(arrPoint[i]->p.phase)*arrPoint[i]->p.ampl;
        arrPoint[i]->comp.image = sin(arrPoint[i]->p.phase)*arrPoint[i]->p.ampl;
        Series4->Add(arrPoint[i]->comp.real);
        Series5->Add(arrPoint[i]->comp.image);
  }
Robbie4LFC
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 37
08.07.2013, 11:30  [ТС]     Формирование списка #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Цикл while(), после каждой итерации (добавления нового элемента в список) вопрос: продолжить? (y\n)? и ввод в char. Если вводится n, то выход из цикла.
Но я делаю эту программу в билдере. На форме, а не в консольном режиме, то есть мне надо будет сделать какую-то кнопку, нажав на которую, пользователь может продолжить ввод?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2013, 11:35     Формирование списка #9
Цитата Сообщение от Robbie4LFC Посмотреть сообщение
На форме, а не в консольном режиме, то есть мне надо будет сделать какую-то кнопку, нажав на которую, пользователь может продолжить ввод?
С формами не знаком, это уж вам видней как сделать. По билдеру отдельные ветки форума есть.
Robbie4LFC
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 37
08.07.2013, 11:36  [ТС]     Формирование списка #10
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Может быть не совсем то, но
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int count = StrToInt(Edit->Text);
point *arrPoint = new point[count];
 
for(int i=0; i<count; i++)
  {
        arrPoint[i]->p.ampl = StrToFloat (Edit5->Text);
        arrPoint[i]->p.freq = StrToFloat (Edit4->Text);
        arrPoint[i]->p.phase = StrToFloat (Edit6->Text);
        arrPoint[i]->comp.real = cos(arrPoint[i]->p.phase)*arrPoint[i]->p.ampl;
        arrPoint[i]->comp.image = sin(arrPoint[i]->p.phase)*arrPoint[i]->p.ampl;
        Series4->Add(arrPoint[i]->comp.real);
        Series5->Add(arrPoint[i]->comp.image);
  }
Так тут же мы вводим заранее известное количество графиков. А я не знаю это число.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
08.07.2013, 11:48     Формирование списка #11
Цитата Сообщение от Robbie4LFC Посмотреть сообщение
Так тут же мы вводим заранее известное количество графиков. А я не знаю это число.
В определенный момент программы вы должны будете знать это число. Иначе это невозможно сделать будет. Алгоритм выделяющий ровно я_не_знаю_сколько памяти. )) Такого же не бывает.
Тут возможны два варианта:
1) Либо в определенный момент пользователю предлагается ввод общего количества;
2) Либо, что хуже, общее количество зануляется при старте программы и увеличивается на +1 на каждой итерации ввода.
Так что у вас?
Robbie4LFC
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 37
08.07.2013, 11:53  [ТС]     Формирование списка #12
Цитата Сообщение от SatanaXIII Посмотреть сообщение
В определенный момент программы вы должны будете знать это число. Иначе это невозможно сделать будет. Алгоритм выделяющий ровно я_не_знаю_сколько памяти. )) Такого же не бывает.
Тут возможны два варианта:
1) Либо в определенный момент пользователю предлагается ввод общего количества;
2) Либо, что хуже, общее количество зануляется при старте программы и увеличивается на +1 на каждой итерации ввода.
Так что у вас?
Ну тогда скорее всего второй вариант. Но как его реализовать в билдере?
А нельзя сделать например как-то так: пользователь вводит данные и нажимает кнопку "добавить". Программа записывает эти данные, затем пользователь вводит новые данные иповторно нажимает кнопку добавить и данные опять записываются. Ну к примеру в тот же список. Или так не получится?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
08.07.2013, 12:19     Формирование списка #13
Цитата Сообщение от Robbie4LFC Посмотреть сообщение
А нельзя сделать например как-то так: пользователь вводит данные и нажимает кнопку "добавить". Программа записывает эти данные, затем пользователь вводит новые данные иповторно нажимает кнопку добавить и данные опять записываются. Ну к примеру в тот же список.
Ага. В общем виде у вас есть форма, в которой заполняются поля будущего элемента списка, а по нажатию на какую-нибудь кнопочку типа "добавить новую", происходит добавление. Приблизительно так?
И вы хотите использовать именно списки? Не какие-нибудь там векторы или еще какие-нибудь контейнеры, а списки.
Robbie4LFC
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 37
08.07.2013, 12:29  [ТС]     Формирование списка #14
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Ага. В общем виде у вас есть форма, в которой заполняются поля будущего элемента списка, а по нажатию на какую-нибудь кнопочку типа "добавить новую", происходит добавление. Приблизительно так?
И вы хотите использовать именно списки? Не какие-нибудь там векторы или еще какие-нибудь контейнеры, а списки.
Да, абсолютно верно. Записываем данные в первую ячейку. Ставим ссылку на следующую ячйеку и заново воодим данные. И так пока пользователь не введет все, что ему необходимо. Да, задача стоит построить это именно списком.
Я как-то так написал, но не уверен будт ли это работать
C++
1
2
3
4
5
6
7
8
9
point *newpoint = new point;
        {
                newpoint->p.ampl = StrToFloat (Edit5->Text);
                newpoint->p.freq = StrToFloat (Edit4->Text);
                newpoint->p.phase = StrToFloat (Edit6->Text);
                newpoint->comp.real = cos(newpoint->p.phase)*newpoint->p.ampl;
                newpoint->comp.image = sin(newpoint->p.phase)*newpoint->p.ampl;
                newpoint->next = newpoint;
        }
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2013, 22:19     Формирование списка #15
Цитата Сообщение от SatanaXIII Посмотреть сообщение
В определенный момент программы вы должны будете знать это число. Иначе это невозможно сделать будет. Алгоритм выделяющий ровно я_не_знаю_сколько памяти. )) Такого же не бывает.
Для списка как раз и бывает (в чём одно из отличий от массивов). Память выделяется под один элемент, который и добавляется в список. Сколько таких элементов добавить - решает пользователь. Robbie4LFC, как один из вариантов, сделайте цикл добавления и кнопку, при нажатии на которую, происходит выход из цикла. В цикле, после добавления очередного элемента, проверяйте нажатие этой кнопки.
Robbie4LFC
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 37
09.07.2013, 00:09  [ТС]     Формирование списка #16
Спасибо всем за помощь. Реализовал следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (n==0){
                head->p.ampl = StrToFloat (Edit5->Text);
                head->p.freq = StrToFloat (Edit4->Text);
                head->p.phase = StrToFloat (Edit6->Text);
                head->next = new point;
                current = head->next;
                Memo->Lines->Add(FloatToStr(head->p.ampl));
                n++;
                }
        else    {
 
                current->p.ampl = StrToFloat (Edit5->Text);
                current->p.freq = StrToFloat (Edit4->Text);
                current->p.phase = StrToFloat (Edit6->Text);
                n++;
                current->next = new point;
                current = current->next;
                Memo->Lines->Add(FloatToStr(newpoint->p.ampl));
        }   ;
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.07.2013, 01:47     Формирование списка #17
Цитата Сообщение от Robbie4LFC Посмотреть сообщение
Реализовал следующим образом:
Вообще-то, сначала память под элемент списка выделяется, а потом данные вводятся в этот элемент. Под head где память выделяется? Конец списка как у вас определяется? А как выход из ввода сделали?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2013, 09:57     Формирование списка
Еще ссылки по теме:

Формирование упорядоченного списка из целых чисел; удаление из списка отрицательные чисел и удвоение положительных C++
C++ Формирование и просмотр списка и функция, которая изменяет каждое значение информационной части элемента списка на его квадрат
формирование списка и функция C++

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

Или воспользуйтесь поиском по форуму:
SatanaXIII
09.07.2013, 09:57     Формирование списка
  #18

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
Для списка как раз и бывает (в чём одно из отличий от массивов). Память выделяется под один элемент, который и добавляется в список. Сколько таких элементов добавить - решает пользователь.
Перефразирую:
у нас сперва ноль памяти выделено, потом на плюс один элемент списка (известное значение), потом еще на плюс один... У нас всегда известно сколько нужно выделить. Это статические массивы работают по принципу "А выдели мне приблизительно двести пятьдесят байт под буфер, думаю хватит".

Yandex
Объявления
09.07.2013, 09:57     Формирование списка
Ответ Создать тему
Опции темы

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