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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2017, 08:43   #11
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Вот немного переделал:

0.jpg

теперь, основываясь на этом коде, можно сделать "а) начальное формирование списка;". Помнишь я говорил:
Код:
Сколько вводить элементов - 6
head.....
ведите фамилию:_
.......
.......
for(i=5)
.......
ведите фамилию:_
......
......
посмотри, что у меня в коде повторяется, чтобы запаковать это в цикл "for".

Сделай это.
Покажи скриншот.
ura_111 вне форума Ответить с цитированием
Старый 30.03.2017, 10:02   #12
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Не дописал в программе комментарий (это важно):

temp = head;

//head настолько важен, что я создаю отдельный указатель "temp" чтобы "не тревожить" (не изменять) "head" (лучше изменять "temp" - дальше в программе)!!! Этот принцип будешь всегда придерживаться
// при написании программы: "head" - это указатель на начало списка чтобы не произошло в программе (добавления/ удаления узлов списка)... Аналогично делаю здесь: "accounting *vuvod = head;"....
//И если "head=NULL", то это значит, что список удалён полностью.

0.jpg

Последний раз редактировалось ura_111; 30.03.2017 в 10:10.
ura_111 вне форума Ответить с цитированием
Старый 30.03.2017, 18:35   #13
pocheto
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 23
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Не дописал в программе комментарий (это важно):

temp = head;

//head настолько важен, что я создаю отдельный указатель "temp" чтобы "не тревожить" (не изменять) "head" (лучше изменять "temp" - дальше в программе)!!! Этот принцип будешь всегда придерживаться
// при написании программы: "head" - это указатель на начало списка чтобы не произошло в программе (добавления/ удаления узлов списка)... Аналогично делаю здесь: "accounting *vuvod = head;"....
//И если "head=NULL", то это значит, что список удалён полностью.

Вложение 87156




Спасибо вам огромное!


Вопрос. Как мне с односвязными списками реализовать что то подобное как в этом примере массива структур.

#include<iostream>
#include<windows.h> // для system("cls");
using namespace std;

struct Size
{
int breast;
int waist;
int hips;
};

struct WonderfulWoman
{
char name[64];
int age;
int height;
int weight;
Size volume;
bool engKnowledge;
};

void showData(const WonderfulWoman Obj[], int amount);

int main()
{
setlocale(LC_ALL, "rus");

const int amountOfGirl = 7;
WonderfulWoman Woman[amountOfGirl] = {};

for (int i = 0; i < amountOfGirl; i++)
{
cout << "Имя: ";
cin.getline(Woman[i].name, 32);
cout << "Возраст: ";
cin >> Woman[i].age;
cout << "Рост: ";
cin >> Woman[i].height;
cout << "Вес: ";
cin >> Woman[i].weight;
cout << "Английский (1 - да, 0 - нет): ";
cin >> Woman[i].engKnowledge;
cout << "Объемы (грудь, талия, бедра): ";
cin >> Woman[i].volume.breast;
cin >> Woman[i].volume.waist;
cin >> Woman[i].volume.hips;
cin.get(); // считывает из потока Enter который пользователь нажимает после ввода возраста
cout << endl;
}

showData(Woman, amountOfGirl);

return 0;
}

void showData(const WonderfulWoman Obj[], int amount)
{
system("cls"); // сработает только для windows
cout << "№\t" << "Имя\t" << "Возраст\t" << "Рост\t" << "Вес\t" << "Объёмы\t\t" << "Английский" << endl;
cout << "================================== ================================" << endl;
for (int i = 0; i < amount; i++)
{
cout << i + 1 << '\t' << Obj[i].name << '\t' << Obj[i].age
<< '\t' << Obj[i].height << '\t' << Obj[i].weight << '\t'
<< Obj[i].volume.breast << '/' << Obj[i].volume.waist << '/' << Obj[i].volume.hips
<< '\t' << Obj[i].engKnowledge << endl;
}
}

Как мне реализовать что то типа такого же меню и что бы у меня все так же реализовалось в таблицу.
Изображения
Тип файла: jpg 12.jpg (34.1 Кб, 28 просмотров)
Тип файла: jpg 13.jpg (43.1 Кб, 29 просмотров)
pocheto вне форума Ответить с цитированием
Старый 30.03.2017, 18:37   #14
pocheto
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 23
По умолчанию

Попробовал сделать что то подобное, получилось следующим образом

#include <iostream>
#include<windows.h> // для system("cls");
using namespace std;

struct accounting { //учёт участников олимпиады
char *surname;
accounting *next; //ссылка на следующий элемент
};

int main(int argc,const char * argv[])
{
accounting *head;
accounting *temp, *h;

head = new accounting; //указатель на голову списка
head ->surname = "Andrey Petrov";

temp = head; //head настолько важен, что я создаю отдельный указатель "temp" чтобы "не тревожить" (не изменять) "head" (лучше изменять "temp" - дальше в программе)

h = new accounting;
h ->surname = "Vlad Ivanov";
h->next = NULL;
temp->next = h;
temp = h;//переход по списку


h = new accounting;
h ->surname = "Jenya Sidorov";
temp->next = h;
temp = h;//переход по списку

h = new accounting;
h ->surname = "Dima Volkov";
h->next = NULL;
temp->next = h;
temp = h;//переход по списку


//Выводим на экран.

accounting *vuvod = head;
while (vuvod !=NULL)
{
void showData(const accounting Obj[], int amount);

system("cls"); // сработает только для windows
cout << "name\t" << "Vozrast\t" << "Rost\t" << endl;
cout << "================================== ================================" << endl;
cout << vuvod ->surname << " ";

vuvod = vuvod -> next; //переход к следующиму узлу.
}
cin.get(); // что бы консоль не закрывалаьс.
return 0;
}
Изображения
Тип файла: png 14.png (37.2 Кб, 29 просмотров)
pocheto вне форума Ответить с цитированием
Старый 30.03.2017, 20:50   #15
pocheto
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 23
По умолчанию

Попробовал сделать все по заданию, получилось следующее.

#include <cstdlib>
#include <iostream>
#include "conio.h"
using namespace std;
int main()
{
setlocale(LC_ALL, "rus");
// Выбранный вариант меню
int variant;
cout << "Выберите вариант\n" << endl;
cout << "1. Начальное формирование списка\n"
<< "2. Добавление нового элемента списка\n"
<< "3. Вывод всего списка на экран в виде таблицы\n"
<< "4. Упорядочивание списка по полю «ФИО участника\n"
<< "5. Удаление элементов по значению первичного ключа\n"
<< "6. формирование отчета: итоговое количество участ¬ников по виду спорта, указанному пользователем\n"
<< "7. выйти\n" << endl;
cout << " >> ";
cin >> variant;
return variant;
_getch;
struct accounting { //учёт участников олимпиады
char *surname;
accounting *next; //ссылка на следующий элемент
};

{
accounting *head;
accounting *temp, *h;

head = new accounting; //указатель на голову списка
head->surname = "Andrey Petrov";

temp = head; //head настолько важен, что я создаю отдельный указатель "temp" чтобы "не тревожить" (не изменять) "head" (лучше изменять "temp" - дальше в программе)

h = new accounting;
h->surname = "Vlad Ivanov";
h->next = NULL;
temp->next = h;
temp = h;//переход по списку


h = new accounting;
h->surname = "Jenya Sidorov";
temp->next = h;
temp = h;//переход по списку

h = new accounting;
h->surname = "Dima Volkov";
h->next = NULL;
temp->next = h;
temp = h;//переход по списку


//Выводим на экран.

accounting *vuvod = head;
while (vuvod != NULL)

cout << vuvod->surname << " ";

vuvod = vuvod->next; //переход к следующиму узлу.
}
cin.get(); // что бы консоль не закрывалаьс.
return 0;
}

Не знаю только как теперь связать меню со всем остальным, как сделать сортировку по ФИО и вывод в виде таблицы.

Последний раз редактировалось pocheto; 30.03.2017 в 20:57.
pocheto вне форума Ответить с цитированием
Старый 30.03.2017, 21:20   #16
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Меню должно быть бесконечное (с возможностью выхода). Вот тебе шаблон меню:
Код:
#include <iostream>
using namespace std;

int main(int argc, const char * argv[])
{
	setlocale(LC_ALL, "rus");
	
	int meniu = 6;

	while (1)
	{
		if ((1 <= meniu && meniu <= 7))
		{
			if (meniu == 1)
			{
				cout << "---------------------------------\n\n\nProsmotr vsego spiska\nnegotovo\n\n---------------------------------\n";
			}
			if (meniu == 2)
			{
				cout << "------------------------\n\n\nDobavit element\nnegotovo\n\n------------------------\n";
			}
			if (meniu == 3)
			{
				cout << "------------------------\n\n\nUdalit element\nnegotovo\n\n------------------------\n";
			}
			if (meniu == 4)
			{
				cout << "------------------------\n\n\nOTCHET\nnegotovo\n\n------------------------\n";
			}
			if (meniu == 5)
			{
				cout << "------------------------\n\n\nSORTirovka spiska\nnegotovo\n\n------------------------\n";
			}
			if (meniu == 6)
			{
				system("cls");
				cout << " МЕНЮ:\n";
				cout << "  1.Просмотр всего списка\n";
				cout << "  2.Добавить узел\n";
				cout << "  3.Удалить узел\n";
				cout << "  4.Отчёт в файл\n";	
				cout << "  5.SORTировка списка\n";
				cout << "  6.Очистить консоль\n";
				cout << "  7.ВЫХОД\n\n";
			}
			if (meniu == 7)
			{
				break;
			}
		}
		else
		{
			cout << "  ERROR! \n\n";
		}
		cout << "меню ";
		cin >> meniu;
	}
	cin.get(); // чтобы консоль не закрывалаьс.
	return 0;
}
Оно работает так: пользователь работает с меню (выбирает разные пункты), а если программа не нужна - п.меню "7". Если надо очистить консоль - п.меню "6".
Поиграйся с ним (пока там данные-заглушки).
___________________________________ ______

Ты можешь сказать: а где сформировать первоначальный список?
Я предлагаю его Я предлагаю его сделать только один раз ДО МЕНЮ! (эта операция делается только один раз, а если она будет как пункт меню, то пользователь может выбрать его повторно...)

Но если считаешь, что я не прав- ты всегда можешь поменять у себя.

___________________________________ ________________________

Бог с ним с меню. На данном этапе тебя должно волновать вопрос: как работают списки? (а не меню).

Я тебя спрашивал: в какой среде программируешь?
ura_111 вне форума Ответить с цитированием
Старый 30.03.2017, 21:29   #17
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Только сейчас заметил: если пользователь выбрал закрыть программу, то и задерживать её (перед закрытием) ни к чему, т.е. эта строчка не нужна:
Код:
cin.get(); // чтобы консоль не закрывалаьс.
ura_111 вне форума Ответить с цитированием
Старый 30.03.2017, 21:30   #18
pocheto
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 23
По умолчанию

Спасибо! Считаю, что ты прав! Программирую в Visual Studio 2012.
pocheto вне форума Ответить с цитированием
Старый 30.03.2017, 21:41   #19
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Отлично, там есть "точки останова".
Бери программу, где первый раз встречается "head" (кстате, как переводится с английского?) и поставь точку останова (после формирования списка):

0.jpg

запускаешь при "Debug"

1.jpg

когда программа остановиться - наведи мышкой на "head".
Чему оно равно?
(сделай скриноты).
ura_111 вне форума Ответить с цитированием
Старый 30.03.2017, 22:00   #20
pocheto
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 23
По умолчанию

Сделал как вы сказали, head у меня ничему не равно, все как на скриншоте.
Изображения
Тип файла: jpg 00.jpg (81.0 Кб, 115 просмотров)
pocheto вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структуры данных на С. art1es23 Общие вопросы C/C++ 3 05.11.2015 14:42
Динамические структуры данных, списковые структуры (надо разобраться что делает программа) _4Alex4_ Помощь студентам 1 14.11.2012 07:39
Структуры данных LimPIK49 Паскаль, Turbo Pascal, PascalABC.NET 6 17.03.2012 00:07
Структуры данных alex-soft Паскаль, Turbo Pascal, PascalABC.NET 0 17.01.2012 19:10
Структуры данных Shadow94 Общие вопросы C/C++ 8 22.04.2011 11:50