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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2018, 13:21   #1
alexboliam
Пользователь
 
Регистрация: 10.10.2017
Сообщений: 44
По умолчанию Не выходит передать параметры в функции

Здравствуйте, надо было создать и считать с файла стек, инвертировать его и вывести начальный и ,собственно, инвертированный. Я сделал это с глобальными переменными, но так дублируются функции и выглядит всё не красиво , поэтому хочу переделать с передачей указателей из main как параметров. Но постоянно или ошибки, или функции не работают, хелп
Код:
#include <iostream>
#include <fstream>
#include <conio.h>
#define TAB "-------------------------------------\n"
using namespace std;
struct Item {//тип указателя на компонент списка
    int data; //число
    Item* next;//               
};
Item *head,*current;//указатель на  вершину стека, на текущий элемент
Item *headinv, *currentinv;//указатели для инверсии
Item *headcopy, *currentcopy;//указатели для копии
void push(int& );//вставить новый элемент в стек
void pushinv(int&);//вставить новый элемент в инвертированный стек
void pushcopy(int&);//копия входного стека
void pop(int& );//удалить и вывести элемент
void popinv(int&);// -||-
void popcopy(int&);// -||-
void invert(int&,int );//инверсия копии в выходной стек
int main() {
    char key; //переменная для меню
    int n, integer, perev = 0, perev2 = 0; // кол-во элементов в стеке, число которое вводится, переменные проверки для меню
    head = NULL,headcopy = NULL ; // стеки пустые
    do {
        system("cls");
        cout << "    STACK\n";
        cout << endl;
        cout << " 1.  Add elements to stack\n";
        cout << " 2.  Invert stack\n";
        cout << " 3.  Output and delete stacks\n";
        cout << "Esc. Exit\n";
        key = _getch();
        switch (key) {
            case '1':
            {
                system("cls");
                char key1;
                cout << "Add from file? [1] | Add from console? [2]\n";
                key1 = _getch();
                if (key1 == '2') {
                    cout << "Enter stack length: "; cin >> n; // вводим размер стека
                    for (int i = 0; i < n; i++) {
                        cout << "Enter data item " << i + 1 << " : ";
                        cin >> integer;
                        push(integer);//вставляем число во входной
                        pushcopy(integer);//вставляем число в копию стека для последующей инверсии
                    }
                    perev = 1;//проверка на введение данных
                }
                else if (key1 == '1') {
                    cout << "Enter stack length: "; cin >> n;
                    char buff[100];
                    char name[255];
                    cout << "Enter file path or file name: ";
                    cin >> name;
                    ifstream fin(name);
                    for (int i = 0; i < n; i++) {
                        fin >> buff;
                        integer = atoi(buff);   
                        push(integer );//то же что и в варианте с вводом в консоли
                        pushcopy(integer );//
                    }
                    fin.close();
                    cout << "File was read!\n";
                    system("pause");
                    perev = 1;//проверка на введение данных
                }
                else {
                    cout << "Wrong symbol\n";
                }
                break;
            }
            
            case '2':
            {
                system("cls");
                if (perev == 0) {//наща проверочка
                    cout << "Enter stack first\n";
                    system("pause");
                    break;
                }
                invert(integer, n );//инвертирование
                cout << "Stack inverted!\n";
                system("pause");
                perev2 = 1;//проверка для вывода на экран п.3
                break;
            }
            case '3':
            {
                
                system("cls");
                if (perev2 == 0) {//проверочка
                    cout << "Invert stack first\n";
                    system("pause");
                    break;
                }
                cout << TAB;
                cout << "First stack contents:\n";
                while (head != NULL) {//пока стек не пустой 
                    pop(integer );//удалить элемент из стека
                    cout << integer << "  ";//вывести этот элемент на экран
                }
                cout << endl;
                cout << "First stack is empty\n";
                cout << TAB;
                cout << "Inverted stack contents:\n";
                while (headinv != NULL) {//пока инвертированный стек не пуст
                    popinv(integer );//удалить эл.
                    cout << integer << "  ";//вывести этот эл.
                }
                cout << endl;
                cout << "Inverted stack is empty\n";
                cout << TAB;
                system("pause");
                break;
            }
        }
    } while (key != 27);//пока не Esc
    system("pause");
    return 0;
}
 
void invert(int &integer,int n ) {//инверсия
    while (headcopy != NULL) {
        popcopy(integer );//удаляем элемент и присваиваем integer его значение
        pushinv(integer );//вставляем его в инвертированный
    }
}
void push(int &integer ) {//передаю адрес чтобы значение элемента менялось (для invert)
    current = new(Item);//создаем новый элемент
    current->data = integer;//инициализируем data
    current->next = head;//связываем элементы стека
    head = current;//устанавливаем новую вершину стека
}
void pop(int &integer ) {//удаление и присваиваение integer значения для вывода
    current = head;//сохраняем адрес вершины стека
    integer = head->data;// сохраняем значение что выводится
    head = current->next;//перестим вершину на другой элемент
    delete current;//чистим память
}
//тут идут копии ////////////////////////////
void pushinv(int &integer) {
    currentinv = new(Item);
    currentinv->data = integer;
    currentinv->next = headinv;
    headinv = currentinv;
}
void pushcopy(int &integer) {
    currentcopy = new(Item);
    currentcopy->data = integer;
    currentcopy->next = headcopy;
    headcopy = currentcopy;
}
void popinv(int &integer) {
    currentinv = headinv;
    integer = headinv->data;
    headinv = currentinv->next;
    delete currentinv;
}
void popcopy(int &integer) {
    currentcopy = headcopy;
    integer = headcopy->data;
    headcopy = currentcopy->next;
    delete currentcopy;
}
P.S. Делать надо было стек через структуру, не используя шаблон stack или как там он называется.
alexboliam вне форума Ответить с цитированием
Старый 25.03.2018, 16:54   #2
alexboliam
Пользователь
 
Регистрация: 10.10.2017
Сообщений: 44
По умолчанию

Пробежался отладчиком по переделанному и заметил, что в указателях не сохраняются внутренности (число data и адрес next) и ,похоже, структуры выходят пустыми, но как это исправить?
Передаю вот так:
Код:
struct Item {//тип указателя на компонент списка
	int data; //число
	Item* next;//				
};

void push(int&,Item*,Item*);//вставить новый элемент в стек
void pop(int&,Item*,Item*);//удалить и вывести элемент
void invert(int&,int, Item*, Item*, Item*, Item*);//инверсия копии в выходной стек
//void pushinv(int&);//вставить новый элемент в инвертированный стек
//void pushcopy(int&);//копия входного стека
//void popinv(int&);// -||-
//void popcopy(int&);// -||-

int main() {
	Item *head ,*current = new(Item);//указатель на	вершину стека, на текущий элемент
	Item *headinv, *currentinv = new(Item);//указатели для инверсии
	Item *headcopy, *currentcopy = new(Item);//указатели для копии
	char key; //переменная для меню
	int n, integer, perev = 0, perev2 = 0; // кол-во элементов в стеке, число которое вводится, переменные проверки для меню
	head = NULL, headcopy = NULL, headinv = NULL; // стеки пустые
	do {
		system("cls");
		cout << "    STACK\n";
		cout << endl;
		cout << " 1.  Add elements to stack\n";
		cout << " 2.  Invert stack\n";
		cout << " 3.  Output and delete stacks\n";
		cout << "Esc. Exit\n";
		key = _getch();
		switch (key) {
			case '1':
			{
				system("cls");
				char key1;
				cout << "Add from file? [1] | Add from console? [2]\n";
				key1 = _getch();
				if (key1 == '2') {
					cout << "Enter stack length: "; cin >> n; // вводим размер стека
					for (int i = 0; i < n; i++) {
						cout << "Enter data item " << i + 1 << " : ";
						cin >> integer;
						push(integer,head,current);//вставляем число во входной
						push(integer,headcopy,currentcopy);//вставляем число в копию стека для последующей инверсии
					}
					perev = 1;//проверка на введение данных
				}
				else if (key1 == '1') {
					cout << "Enter stack length: "; cin >> n;
					char buff[100];
					char name[255];
					cout << "Enter file path or file name: ";
					cin >> name;
					ifstream fin(name);
					for (int i = 0; i < n; i++) {
						fin >> buff;
						integer = atoi(buff);	
						push(integer,head,current );//то же что и в варианте с вводом в консоли
						push(integer,headcopy,currentcopy);//
					}
					fin.close();
					cout << "File was read!\n";
					system("pause");
				    perev = 1;//проверка на введение данных
				}
				else {
					cout << "Wrong symbol\n";
				}
				break;
			}
			
			case '2':
			{
				system("cls");
				if (perev == 0) {//наща проверочка
					cout << "Enter stack first\n";
					system("pause");
					break;
				}
				invert(integer, n,headcopy,currentcopy,headinv,currentinv);
				cout << "Stack inverted!\n";
				system("pause");
				perev2 = 1;
				break;
			}
			case '3':
			{
				
				system("cls");
				if (perev2 == 0) {//проверочка
					cout << "Invert stack first\n";
					system("pause");
					break;
				}
				cout << TAB;
				cout << "First stack contents:\n";
				while (head != NULL) {//пока стек не пустой 
					pop(integer, head,current );//удалить элемент из стека
					cout << integer << "  ";//вывести этот элемент на экран
				}
				cout << endl;
				cout << "First stack is empty\n";
				cout << TAB;
				cout << "Inverted stack contents:\n";
				while (headinv != NULL) {//пока инвертированный стек не пуст
					pop(integer,headinv,currentinv);//удалить эл.
					cout << integer << "  ";//вывести этот эл.
				}
				cout << endl;
				cout << "Inverted stack is empty\n";
				cout << TAB;
				system("pause");
				break;
			}
		}
	} while (key != 27);//пока не Esc
	system("pause");
	return 0;
}

void invert(int &integer,int n, Item* headcopy, Item* currentcopy, Item* headinv, Item* currentinv) {//инверсия
	while (headcopy != NULL) {
		pop(integer,headcopy,currentcopy);//удаляем элемент и присваиваем integer его значение
		push(integer,headinv,currentinv);//вставляем его в инвертированный
	}
}
void push(int &integer, Item*head, Item*current ) {//передаю адрес чтобы значение элемента менялось (для invert)
	current = new(Item);//создаем новый элемент
	current->data = integer;//инициализируем data
	current->next = head;//связываем элементы стека
	head = current;//устанавливаем новую вершину стека
}
void pop(int &integer, Item*head, Item*current) {//удаление и присваиваение integer значения для вывода
	current = head;//сохраняем адрес вершины стека
	integer = head->data;// сохраняем значение что выводится
	head = current->next;//перестим вершину на другой элемент
	delete current;//чистим память
}

Последний раз редактировалось alexboliam; 25.03.2018 в 17:05.
alexboliam вне форума Ответить с цитированием
Старый 25.03.2018, 19:18   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от alexboliam Посмотреть сообщение
Пробежался отладчиком по переделанному и заметил, что в указателях не сохраняются внутренности (число data и адрес next) и ,похоже, структуры выходят пустыми, но как это исправить?
1.
взять в руки букварь и подучить тему "что такое ссылки"

2.
вместо: Item*
использовать: Item*&

с другими указателями - аналогично.
_Bers вне форума Ответить с цитированием
Старый 25.03.2018, 21:55   #4
alexboliam
Пользователь
 
Регистрация: 10.10.2017
Сообщений: 44
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
1.
взять в руки букварь и подучить тему "что такое ссылки"

2.
вместо: Item*
использовать: Item*&

с другими указателями - аналогично.
Так всё таки можно?? А я пробовал что-то вроде Item &*[...] ... Спасибо большое!
alexboliam вне форума Ответить с цитированием
Старый 25.03.2018, 23:08   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Указатель на ссылку и ссылка на указатель все-таки разные вещи.
p51x вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передать параметры в функцию Sterben Помощь студентам 5 09.12.2015 02:14
Передать параметры R71MT Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 21.09.2015 12:21
Не выходит, принять по человечий параметры. VintProg Работа с сетью в Delphi 6 13.12.2011 10:45
Как передать в поток параметры? И как из потока параметры достать? Anekdot Общие вопросы Delphi 2 19.02.2010 22:40
Как передать параметры функции в ДЛЛ????? Zerone Общие вопросы Delphi 3 01.06.2009 09:27