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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2017, 03:36   #1
DWGOD
Новичок
Джуниор
 
Регистрация: 22.11.2017
Сообщений: 2
Печаль реализацию СТЕКА (ввод-вывод элементов из него). Изначально (в примере) был фиксированный лимит в 100 элементов, а лимита быть не должно по заданию

Бьюсь с этим уже который день, не сплю...
Переделываю готовую реализацию СТЕКА (ввод-вывод элементов из него). Изначально (в примере) был фиксированный лимит в 100 элементов, а лимита быть не должно по заданию, мол нужно самим установить размер (динамический тип). Я попытался это сделать разными способами, но куча ошибок каждый раз. Исправьте код, пожалуйста!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!
(Прошу прощения, если как-то вставил не так, я здесь впервые)

Код:
struct stack {
int n;
cin >> n;
int *elem = new int[n];
for (int i = 0; i < n; i++) {
        // Заполнение массива и вывод значений его элементов
        elem[i] = i;
        cout << "Value of " << i << " element is " << elem[i] << endl;
    }
    return 0;
}
int top;
}

//инициализация стека
void init(struct stack *stk) {
stk->top = 0;
}


//Помещение элемента в стек
void push(struct stack *stk, float f) {
stk->elem[stk->top] = f;
stk->top++;
} 

//Удаление элемента из стека
float pop(struct stack *stk) {
float elem;
if((stk->top) > 0) {
stk->top--;
elem = stk->elem[stk->top];
return(elem);
} else {
printf("Stek is empty!\n");
return(0);
}
}

//Извлечение вершины стека
float stkTop(struct stack *stk) {
if((stk->top) > 0) {
return( stk->elem[stk->top-1]);
} else {
printf("Stek is empty!\n");
return(0);
}
}

//Получение верхнего элемента стека без его удаления
int gettop(struct stack *stk) {
return(stk->top);}

//Определение пустоты стека
int isempty(struct stack *stk) {
if((stk->top) == 0) return(1);
else return(0);
}

//Вывод элементов стека
void stkPrint(struct stack *stk) {
int i;
i=stk->top;
if(isempty(stk)==1) return;
do {
i--;
printf("%f\n", stk->elem[i]);
}while(i>0);
}


int main() {
struct stack *stk;
int i,n;
float elem;
stk = (struct stack*) malloc(sizeof(struct stack));
init(stk);

/*printf("Enter the number of elements in the stek: ");
scanf("%d", &n);*/

for(i=0;i<n;i++) {
printf("Enter the element %d:", i);
scanf("%f", &elem);
push(stk,elem);
}
printf("In the stek is %d elements\n", gettop(stk));
printf("\n");
stkPrint(stk);
printf("Top element %f\n", stkTop(stk));
do {
printf("Extract element %f, ", pop(stk));
printf(" %d elements left in the stek\n", gettop(stk));
} while(isempty(stk)==0);
getchar(); getchar();
return 0;
}
DWGOD вне форума Ответить с цитированием
Старый 22.11.2017, 09:06   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Если человек ничего не знает (ты говоришь: "я скачал программу... не знаю что править..."), тогда здесь бабки за такое берут. Ну, а если ты платить не хочешь, тогда нужно пахать...

Я тебе писать ничего не буду (и врятли кто-то будет), а просто порассуждаю теоретически.

Но, сначала пять советов:
1) поищи на форуме примеры реализации стека - ты не первый кто подобным интересуешься;

2) не надо править уже готовую программу (ошибки, со временем, только очень быстро растут), а просто начни новую программу (с чистого "main") и по чуть-чуть переноси куски кода себе. Но, при этом, часто компилируй программу: написал одну функцию - скомпилируй, а если ошибка образовалась - сразу её поправь...
Понимаешь? Расправляться с ошибками по отдельности.

Но последний совет предполагает, что ты хоть немного умеешь программировать.

Но самое главное: тестируй те кусочки кода, над которыми только что работал. Именно тестируй - подавай в функцию разные значения переменных и смотри что она выводит. Иногда приходиться писать дополнительный/временный код, чтобы проверить этот кусочек программы...;

3) Активно пользуйся средствами отладки... Ты знаком с таким термином? Выполнять программу по шагам (и на каждом шаге смотреть как изменились переменные)?

4) прочитай мой пост 4-ре раза...
С первого раз, я по себе сужу, ты больше половины информации не воспримешь.

5) Я плохо знаю тему "стеков", поэтому критично относись к моим словам: можешь со мной спорить, высказывать своё мнение по разным вопросам (например, по поводу моих знаний и моей личности) и т.д. Это всё приветствуется.
___________________________________ ______________

Расскажи о коде...
Только не подробно, а в общем...
Своими словами...

Ты пишешь: "мне надо растущий/убывающий стек". Но, если исключить применение библиотечной технологии "STL stack", существует два вида подобной реализации: динамический массив и списки. Оба динамически управляемые, но во втором случае в описании структуры есть указатель (непосредственно, чтобы построить связи между узлами):


2.jpg



Но, ничего подобного я у тебя не наблюдаю... Вместо этого я вижу объединение определение структуры и функций (см. вывод "i" на экран)

Ты знаешь, что такое объединение (данных и функций в одном определении) называется классом. Может тебе нужен стек, который построен на экземплярах класса (а не на экземплярах структуры)?

___________________________________ ________________

Второе что меня смущает -использование в одной программе и оператор "new" и оператор "malloc". Ведь это одно и тоже, только первый более новый (С++), а второй более старый (Си).

___________________________________ ________________

Так вот, вернусь через один абзац выше, если тему "списков" не затрагивать, а остановиться исключительно на "динамическом массиве",
то создание такого массива делается в одну строчку:
Код:
int *elem = new int[n];
Следует отметить, что в философии С++ пользовательский тип данных "struct stack" приравнен к элементарному "int"... Т.е. ты с лёгкостью можешь создать динамический массив уже не целых чисел, а массив типа "stack".

Но, я советую, пока этого не делай,- а просто используй стек из массива простого типа "int". В конце сделаешь; если заработает на "int", то и заработает (с небольшими правками) и на "stack".
___________________________________ ________________

Но сначала скажи, как работает "стек"? И чем его работа (доступ к элементам) отличается от "очереди" и "дека"?

___________________________________ ________________

Ну наконец то, добрались до 1-го тебе задания: создай динамический стек, заполни его и выведи на экран. Но будь осторожен! Ведь недаром я
спрашивал у тебя "как работает стек" - хранение элементов и доступ к них должен соответствовать этому описанию (а не "абы как"). Нарисуй, у себя, пример стека.

Можешь использовать либо целый тип либо свой (пользовательский) - не принципиально.

Покажи скриншот - консоль на фоне кода. Только не всего экрана, а то ничего не видно будет, а только полезную информацию.
Ты умеешь делать скриншоты экрана?
___________________________________ ________________

p.s.1: ну всё, больше так много писать не буду.
p.s.2: ну всё, крутись! Сделаешь это - можно будет тебе дать "добавление" одного узла к уже сформированному стеку...
Ты же знаешь, что раз есть "new", то и есть "delete"?
Понимаешь?
Создаёшь дополнительный стек, у которого на 1-н больше элементов чем в основном; перебрасываешь туда всё из основного+дополнительный узел. Удаляешь основной (при "delete" освобождается только память, а сам указатель остаётся)..... и т.д. (по смыслу)... Жонглировать "new" и "delete"... Ну а других способов я не знаю, как в (уже сформированном) динамическом массиве добавить (или удалить) ещё один узел...

Последний раз редактировалось ura_111; 22.11.2017 в 09:10.
ura_111 вне форума Ответить с цитированием
Старый 22.11.2017, 09:44   #3
DWGOD
Новичок
Джуниор
 
Регистрация: 22.11.2017
Сообщений: 2
По умолчанию

Во-1, я не говорил "я скачал программу, не знаю, что править". Я сказал, что нужно форматировать готовый код под динамическую структуру (я остановился на массиве, а не списке).
Во-2, я не такой ДАУН, которым ты меня мнишь...Пипец просто. Про скриншот вообще убило.

Понимаешь, я пробовал ввести массив и через malloc и через new, я не знаю правда куда, в struct или в инициализацию стека (я пробовал по-разному), не знаю куда и когда нужно вводить элементы, т.к в примере это было в главной функции (взял как комментарий), пробовал по-разному, там что-то повторяется, где-то косяки с переменными, что-то не бьется, плюс разные ошибки в объявлении переменных - вообще мне не понятных, все как в примерах делал.
Мне на твои вопросы отвечать НЕКОГДА и НЕЗАЧЕМ, я попросил помощи, хотел увидеть КАК ЭТО ДОЛЖНО ВЫГЛЯДЕТЬ и увидеть, где я ошибался. Спецам вроде тебя это минут 10 максимум.
Мне нужно сдать это и забыть!
DWGOD вне форума Ответить с цитированием
Старый 22.11.2017, 11:05   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Мне на твои вопросы отвечать НЕКОГДА ... Спецам вроде тебя это минут 10 максимум.
Ну вот, ТС некогда, а спецам есть когда, и 10 минут вообще не время ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.11.2017, 11:33   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Мне на твои вопросы отвечать НЕКОГДА и НЕЗАЧЕМ, я попросил помощи, хотел увидеть КАК ЭТО ДОЛЖНО ВЫГЛЯДЕТЬ и увидеть, где я ошибался. Спецам вроде тебя это минут 10 максимум.
Мне обед готовить НЕКОГДА и НЕЗАЧЕМ, а вам на это минут 10 максиму. Поможем друг другу?
p51x вне форума Ответить с цитированием
Старый 22.11.2017, 13:39   #6
СтудПом
Форумчанин
 
Регистрация: 08.11.2017
Сообщений: 347
По умолчанию Помощь студентам

Попробуйте начать с создания типа "Элемент списка". Элемент списка д.б. такой же как и элемент массива, только ещё с одним полем - ссылкой.

И маленький совет - не мешайте C и C++, выберите что-нибудь одно.
СтудПом вне форума Ответить с цитированием
Старый 22.11.2017, 13:59   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ну вот, ТС некогда, а спецам есть когда, и 10 минут вообще не время ))
Ну в оправдание ТС: у спеца же нашлось время настрочить длинный поучительный пост (кстати, спасибо, мне тоже пригодился)

Сори за оффтоп.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 22.11.2017, 14:02   #8
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Мне обед готовить НЕКОГДА и НЕЗАЧЕМ
Ну некогда я еще могу понять, но незачем? Обед???
Black Fregat вне форума Ответить с цитированием
Старый 22.11.2017, 14:21   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ну да, лень мне ехать на обед домой, чтобы готовить...
p51x вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить элемент, находящийся в середине стека , если число элементов нечетное, или 2 средних элемента, если число элементов четное. Юлия1997 Помощь студентам 0 23.10.2016 22:28
Вычислить сумму элементов матрицы в заштрихованной области. Ввод и вывод матрицы оформить в виде процедур. KrokaKrola Помощь студентам 1 15.04.2015 15:17
[СИ] Ввод и вывод элементов структуры edw1n Помощь студентам 1 08.04.2013 22:50
Вывод на экран двух первых отрицательных элементов стека kwns Общие вопросы C/C++ 2 26.05.2010 10:57
TStringGrid - изначально мы видим одну ячейку в конце должно быть столько сколько заполнили. Ensoph Компоненты Delphi 5 18.10.2007 22:24