Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 37
1

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

08.07.2013, 10:09. Показов 2156. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Начал учить Си недавно. ВРоде все идет более-менее нормально, но на списках я встал колом и не могу понять почему так происходит. Итак, задача состоит в том, чтобы по заранее введенным хапактеристикам выводить графики функций. В начале работы мы не знаем сколько их хочет ввести пользователь. Как можно реализовать список для данной задачи?
Вот все структуры, которые я использую в своей программе и кусок кода по выводу графика
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);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.07.2013, 10:09
Ответы с готовыми решениями:

Дублирование вхождения каждого элемента списка One и формирование из этих значений списка Double (пояснить условие)
Здравствуйте. Вот собственно само задание: В составе программы описать функцию, которая дублирует...

Формирование и просмотр списка и функция, которая изменяет каждое значение информационной части элемента списка на его квадрат
Написать программу, содержащую процедуры формирования и просмотра списка и функцию, которая...

Формирование упорядоченного списка из целых чисел; удаление из списка отрицательные чисел и удвоение положительных
Составить программу, которая: • обеспечивает первоначальный ввод целых чисел и формирует из них ...

Формирование списка из текстового файла
Люди объясните пожалуйста словесно выполнение функции ввода списка из текстового файла, желатено...

17
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2013, 10:25 2
Цитата Сообщение от Robbie4LFC Посмотреть сообщение
Как можно реализовать список для данной задачи?
А вообще, как списки реализовываются знаете?
0
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 37
08.07.2013, 10:32  [ТС] 3
Цитата Сообщение от alsav22 Посмотреть сообщение
А вообще, как списки реализовываются знаете?
В общих чертах. Но для данной задачи не получается никак вообще. Потому и прошу помощи, чтобы по готовому примеру разобраться детально. Ну или может хоть как-то помочь кто-то сможет
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2013, 10:45 4
Цитата Сообщение от Robbie4LFC Посмотреть сообщение
Но для данной задачи не получается никак вообще.
В чём сложность именно для этой задачи? Создавать, в цикле, новые point и добавлять их в список? Или нужно что-то другое?
0
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 37
08.07.2013, 10:57  [ТС] 5
Цитата Сообщение от alsav22 Посмотреть сообщение
В чём сложность именно для этой задачи? Создавать, в цикле, новые point и добавлять их в список? Или нужно что-то другое?
Все верно, нужно просто создавать новые point. Но так как я новичек, то я никак не могу въехать каким образом это происходит. То есть каким образом программа поймет, что мне больше не надо ничего создавать? Как это реализовать я не знаю, а другие примеры из интернета ничем не помогают мне.
0
5498 / 4893 / 831
Регистрация: 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 конец списка
 }
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
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);
  }
0
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 37
08.07.2013, 11:30  [ТС] 8
Цитата Сообщение от alsav22 Посмотреть сообщение
Цикл while(), после каждой итерации (добавления нового элемента в список) вопрос: продолжить? (y\n)? и ввод в char. Если вводится n, то выход из цикла.
Но я делаю эту программу в билдере. На форме, а не в консольном режиме, то есть мне надо будет сделать какую-то кнопку, нажав на которую, пользователь может продолжить ввод?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2013, 11:35 9
Цитата Сообщение от Robbie4LFC Посмотреть сообщение
На форме, а не в консольном режиме, то есть мне надо будет сделать какую-то кнопку, нажав на которую, пользователь может продолжить ввод?
С формами не знаком, это уж вам видней как сделать. По билдеру отдельные ветки форума есть.
0
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);
  }
Так тут же мы вводим заранее известное количество графиков. А я не знаю это число.
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
08.07.2013, 11:48 11
Цитата Сообщение от Robbie4LFC Посмотреть сообщение
Так тут же мы вводим заранее известное количество графиков. А я не знаю это число.
В определенный момент программы вы должны будете знать это число. Иначе это невозможно сделать будет. Алгоритм выделяющий ровно я_не_знаю_сколько памяти. )) Такого же не бывает.
Тут возможны два варианта:
1) Либо в определенный момент пользователю предлагается ввод общего количества;
2) Либо, что хуже, общее количество зануляется при старте программы и увеличивается на +1 на каждой итерации ввода.
Так что у вас?
0
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 37
08.07.2013, 11:53  [ТС] 12
Цитата Сообщение от SatanaXIII Посмотреть сообщение
В определенный момент программы вы должны будете знать это число. Иначе это невозможно сделать будет. Алгоритм выделяющий ровно я_не_знаю_сколько памяти. )) Такого же не бывает.
Тут возможны два варианта:
1) Либо в определенный момент пользователю предлагается ввод общего количества;
2) Либо, что хуже, общее количество зануляется при старте программы и увеличивается на +1 на каждой итерации ввода.
Так что у вас?
Ну тогда скорее всего второй вариант. Но как его реализовать в билдере?
А нельзя сделать например как-то так: пользователь вводит данные и нажимает кнопку "добавить". Программа записывает эти данные, затем пользователь вводит новые данные иповторно нажимает кнопку добавить и данные опять записываются. Ну к примеру в тот же список. Или так не получится?
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
08.07.2013, 12:19 13
Цитата Сообщение от Robbie4LFC Посмотреть сообщение
А нельзя сделать например как-то так: пользователь вводит данные и нажимает кнопку "добавить". Программа записывает эти данные, затем пользователь вводит новые данные иповторно нажимает кнопку добавить и данные опять записываются. Ну к примеру в тот же список.
Ага. В общем виде у вас есть форма, в которой заполняются поля будущего элемента списка, а по нажатию на какую-нибудь кнопочку типа "добавить новую", происходит добавление. Приблизительно так?
И вы хотите использовать именно списки? Не какие-нибудь там векторы или еще какие-нибудь контейнеры, а списки.
0
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;
        }
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2013, 22:19 15
Цитата Сообщение от SatanaXIII Посмотреть сообщение
В определенный момент программы вы должны будете знать это число. Иначе это невозможно сделать будет. Алгоритм выделяющий ровно я_не_знаю_сколько памяти. )) Такого же не бывает.
Для списка как раз и бывает (в чём одно из отличий от массивов). Память выделяется под один элемент, который и добавляется в список. Сколько таких элементов добавить - решает пользователь. Robbie4LFC, как один из вариантов, сделайте цикл добавления и кнопку, при нажатии на которую, происходит выход из цикла. В цикле, после добавления очередного элемента, проверяйте нажатие этой кнопки.
0
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));
        }   ;
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.07.2013, 01:47 17
Цитата Сообщение от Robbie4LFC Посмотреть сообщение
Реализовал следующим образом:
Вообще-то, сначала память под элемент списка выделяется, а потом данные вводятся в этот элемент. Под head где память выделяется? Конец списка как у вас определяется? А как выход из ввода сделали?
0
SatanaXIII
09.07.2013, 09:57     Формирование списка
  #18

Не по теме:

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

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2013, 09:57

Формирование символьного двухсвязного списка
нужна функция формирования символьного 2вусвязного списка!!! Хэлп!!!

Формирование списка и работа с ним
Задали написать программу на с++. Написал её, а точнее составил из разных кусков, которые были даны...

Формирование нового списка или из pascal -> с++
Добрый вечер всем! Друзья помогите пожалуйста решить задачу на языке С++. Комп содержит записи,...

Динамические структуры данных. Формирование линейного списка.
Текст помощи для некоторой программы организован в виде линейного списка. Каждая компонента...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru