Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2013, 19:05   #1
DerekXlive
Пользователь
 
Регистрация: 22.05.2013
Сообщений: 19
По умолчанию Программа на С++. Односвязный список.

Написал программу
Код:
#include<conio.h> 
#include<dos.h> 
#include<graphics.h> 
#include<iostream.h> 
#include<stdlib.h> 
class ind 
{ 
ind *next;
int g,t,f,c,x,y;//t-vremya ost,i-vremya sozd,f-vremya rabotu 
char s[10],r[10],p[10],z[10],v[10]; 
struct time i; 
public: 
ind() 
{ 
f=0; 
cout<<"V kakom meste razmestit indikator, vvedite koordinatu x,y"; 
cin>>x>>y; 
cout<<"vvedite vremya deystvia indikatora,VNIMANIE!PRI VUBORE VARIANTA 2 idikator uadlitsya posle 10 sekund posle vremeni jizni\n"; 
cin>>t; 
cout<<"chto vivodit? 1-vremya ost,2-vremya sozd(po nagatiu enter udalyaetsa,3-vremya rabotu\n"; 
cin>>c; 
gettime(&i); 
} 
void vremya() 
{ 
switch(c) 
{ 
case 1:{itoa(t,s,10);t=t-1;outtextxy(x,y,s);if(t==0)setcolor(0);break;} 
case 2: 
{ 
itoa(i.ti_hour,r,10); 
itoa(i.ti_min,z,10); 
itoa(i.ti_sec,v,10); 
outtextxy(x,y,r); 
outtextxy(x+20,y,z); 
outtextxy(x+40,y,v); 
break; 
} 
case 3:{itoa(f,p,10);f++;outtextxy(x,y,p);break;} 
default:cout<<"Oshibka"; 
} 
} 
}; 
list *head; 
void main() 
{ 
int j,GD=0,GM; 
initgraph(&GD,&GM,""); 
struct time tm1,tm2; 
????
for(;;) 
{ 
gettime(&tm1); 
do 
{ 
gettime(&tm2); 
if(kbhit()) if (getch()==8) 
{ 
closegraph();delete[]q;return; 
} 
}while(tm1.ti_sec==tm2.ti_sec); 
tm1=tm2; 
cleardevice(); 
for(j=0;j<n;j++)>vremya(); 
} 
}
Там где вопросительные знаки, не пойму как организовать последовательность объектов в односвязный список. Пользователь при начале работы программы по нажатию клавишу создаёт объект. Я не могу понять как это сделать. Посоветуйте что сделать.

Последний раз редактировалось DerekXlive; 23.05.2013 в 18:22.
DerekXlive вне форума Ответить с цитированием
Старый 23.05.2013, 06:56   #2
Akcentbek
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 38
По умолчанию

должен быть конструктор класса))
который срабатывает сразу при обьявлений обьекта ))
имя конструктора совпадает с именем класса
к имени диструктора в начале прикрепляется тильда ~а потом и имя класса ))

Мне кажеться выводить что либо в методах класса (если конечно это не метод вывода)
плохая идея ))
когда ты делаешь меню ты наверно еще и хочешь в констуркторе вызвать методы этого же класса ...

Последний раз редактировалось Stilet; 23.05.2013 в 07:59.
Akcentbek вне форума Ответить с цитированием
Старый 23.05.2013, 10:33   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Там где вопросительные знаки, не пойму как организовать последовательность объектов в односвязный список.
Должна быть функция наподобие add_to_list(list*, ind*).

Отвлекаясь от специфики класса ind, можете создать просто список целых чисел?
Abstraction вне форума Ответить с цитированием
Старый 23.05.2013, 18:21   #4
DerekXlive
Пользователь
 
Регистрация: 22.05.2013
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Должна быть функция наподобие add_to_list(list*, ind*).

Отвлекаясь от специфики класса ind, можете создать просто список целых чисел?
Abstraction нет, мне нужно создать список объектов,а не чисел.
То есть для каждого объекта класса выполняется нужный метод.

Изменил текст, удалил структуру и указатель на следующий элемент описал в самом классе. Что нужно указать в методе по созданию списка?
Поправка:Списки Я не очень сильно понял. Точнее не понял как создать список,а потом в основной программе использовать метод для объекта

Последний раз редактировалось Stilet; 23.05.2013 в 21:34.
DerekXlive вне форума Ответить с цитированием
Старый 23.05.2013, 19:59   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Abstraction нет, мне нужно создать список объектов,а не чисел.
То есть для каждого объекта класса выполняется нужный метод.
Я понимаю. Но если Вы не можете создать список целых чисел, то сразу пытаться создать список объектов - это прямо-таки просить мироздание о двойной порции граблей под ноги.

К слову, попытка объединить классы ind и list в один - плохая идея. Работу придётся проделать ту же, а шансов запутаться (заметно) больше. Давайте всё же на время забудем про ind вообще и сделаем структуру списка. Максимально упрощённая задача:
Код:
typedef int Data; 

//node - узел списка
struct node{
  Data data; //Это данные, хранящиеся в списке
  node* next; //указатель на следующий узел или NULL
};

typedef node* list; //Либо указатель на первый узел списка, либо NULL (для пустого списка)

void add_to_list(list* l, Data item){
  //Что здесь?
}

Последний раз редактировалось Abstraction; 23.05.2013 в 20:02.
Abstraction вне форума Ответить с цитированием
Старый 23.05.2013, 20:11   #6
DerekXlive
Пользователь
 
Регистрация: 22.05.2013
Сообщений: 19
По умолчанию

Abstraction Тогда объединю лучше в два класса. Один для выполнения действия над индикатором(у меня задание про индикаторы), а второй для списка.
Код:
void add_to_list(list* l, Data item){
  //Что здесь?
}
Думаю здесь нужно организовать добавление в список. Допустим Я хочу добавить в список с конца. Я знаю что указатель на следующий элемент смещается, но Я не могу понять как это написать.
DerekXlive вне форума Ответить с цитированием
Старый 23.05.2013, 20:38   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Думаю здесь нужно организовать добавление в список. Допустим Я хочу добавить в список с конца. Я знаю что указатель на следующий элемент смещается, но Я не могу понять как это написать.
Код:
void add_to_end_of_list(list* l, Data item){
  //Создать новый узел списка.
  //Заполнить его поле data.
  //Заполнить поле next (после вставки это будет последний элемент списка, так?)
 
  //Если список пуст,
    //то сделать его списком из одного узла
    //Закончили
  //Иначе...
  //Завести отдельную переменную-курсор, указатель на node
  //Пока курсор указывает не на последний элемент списка,
    //Сместить курсор на следующий элемент
  //Модифицировать поле next объекта под курсором - теперь оно указывает на добавляемый узел
  //Закончили
}
К каким комментариям Вы затрудняетесь написать соответствующий код? Напишите его к остальным.
Abstraction вне форума Ответить с цитированием
Старый 23.05.2013, 21:26   #8
DerekXlive
Пользователь
 
Регистрация: 22.05.2013
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Код:
void add_to_end_of_list(list* l, Data item){
  //Создать новый узел списка.
  //Заполнить его поле data.
  //Заполнить поле next (после вставки это будет последний элемент списка, так?)
 
  //Если список пуст,
    //то сделать его списком из одного узла
    //Закончили
  //Иначе...
  //Завести отдельную переменную-курсор, указатель на node
  //Пока курсор указывает не на последний элемент списка,
    //Сместить курсор на следующий элемент
  //Модифицировать поле next объекта под курсором - теперь оно указывает на добавляемый узел
  //Закончили
}
К каким комментариям Вы затрудняетесь написать соответствующий код? Напишите его к остальным.
Буду честен, Я вообще не понимаю эту тему. Можете на каком-нибудь примере показать использование списков? Я хочу понять как это делать.

Последний раз редактировалось DerekXlive; 23.05.2013 в 21:29.
DerekXlive вне форума Ответить с цитированием
Старый 24.05.2013, 00:33   #9
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Да собственно на этом же примере и...
Некоторые комментарии же соответствуют банальному коду:
Код:
void add_to_end_of_list(list* l, Data item){
  //Создать новый узел списка.
  node* newNode = new node;
  //Заполнить его поле data.
  newNode->data = item;
  //Заполнить поле next (после вставки это будет последний элемент списка, так?)
  newNode->next = NULL;
 
  //Если список пуст,
  if(*l == NULL){
    //то сделать его списком из одного узла
    *l = newNode;
    //Закончили
    return;
  }
  //Иначе...
  //Завести отдельную переменную-курсор, указатель на node
  node* cur = *l;
  //Пока курсор указывает не на последний элемент списка,
  while(cur->next != NULL)
    //Сместить курсор на следующий элемент
    cur = cur->next;
  //Модифицировать поле next объекта под курсором - теперь оно указывает на добавляемый узел
  cur->next = newNode;
  //Закончили
  return;
}
Обратите особое внимание вот на это:
Код:
  //Завести отдельную переменную-курсор, указатель на node
  node* cur = *l;
  //Пока курсор указывает не на последний элемент списка,
  while(cur->next != NULL)
    //Сместить курсор на следующий элемент
    cur = cur->next;
Этот цикл можно переписать как цикл for, добавив последний шаг:
Код:
for(node* cur = *l; cur != NULL; cur=cur->next){
}
Тело такого цикла выполнится один раз для каждого элемента списка, cur пробегает все узлы. К примеру (пока что мы говорим о случае, когда Data - это int), вот так можно увеличить значения всех элементов списка some_list на 3:
Код:
for(node* cur = some_list; cur != NULL; cur=cur->next){
  cur->data += 3;
}
Посмотрите на (весь) код этого поста внимательно. Что Вам непонятно, или не совсем понятно?
Abstraction вне форума Ответить с цитированием
Старый 24.05.2013, 14:14   #10
DerekXlive
Пользователь
 
Регистрация: 22.05.2013
Сообщений: 19
По умолчанию

Abstraction всё предельно понятно! Спасибо, а что мне нужно сделать в основной программе, чтобы объекты класса ind были в списке list?
DerekXlive вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать односвязный список и вывести его на экран. Из этого списка создать новый список по указанному ниже правилу и новый список San111 Паскаль, Turbo Pascal, PascalABC.NET 1 15.05.2012 22:08
Необходимо реализовать классы, односвязный список для хранения целых чисел, односвязный список для хранен lineico Помощь студентам 2 09.05.2011 17:45
C++. Односвязный список. Уничтожить список Olya90 Помощь студентам 2 10.06.2009 18:52
программа с использованием подпрограмм, создаёт односвязный список и вычисляет сумму положительных чисел LOVELY Паскаль, Turbo Pascal, PascalABC.NET 5 13.12.2008 01:27