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

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

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

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

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

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

Код:
#include <fstream>
#include <cstdlib>
#include <windows.h>

#include "iostream"
#include <ctime>
#include <string>

using namespace std;

// Класс "кошелёк"
class Purse {

private: // Приватные поля (доступ к ним имеется только внутри класса) 

	int number; // Номер кошелька
	string owner; // Владелец кошелька
	int *banknotes; // Купюры
	int summ; // Общая сумма в кошельке
	
	Purse *Tail; //Первый на соседний

public: // Публичные поля (Доступ к ним можно получить из окружения класса)

	static int Instances; // Экземпляров создано
	static int TotalSumm; // Общая сумма на кошельках

private: // Приватные методы
	
	void computeSumm(){ // Вычисляет сумму на кошельке

		this->summ = 0; // Обнуляем старое значение суммы

		for (int i = 0; i < 9; i++){ // Перебираем все номиналы купюр
			this->summ += this->banknotes[i] * (i+1); // Умножаем номинал купюры на количество купюр и прибавляем к сумме кошелька
		}

	}
	void computeTotalSumm()  // Выводит сумму на кошельках
    {		
		Purse *tempHead = this->Tail; //Указываем на голову
		int temp = Instances; //Временная переменная равная числу элементов в списке
		Purse::TotalSumm = 0;
		while (temp != 0) //Пока не выполнен признак прохода по всему списку
		{	Purse::TotalSumm = Purse::TotalSumm + tempHead->summ;
			tempHead = tempHead->Tail; //Указываем, что нужен следующий элемент
			temp--; //Один элемент считан, значит осталось на один меньше
		}
	}
ura_111 вне форума Ответить с цитированием
Старый 25.05.2016, 14:28   #42
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Код:
public: // Публичные методы

	Purse() : Tail(NULL){ // Конструктор

		// инициализируем поля класса

		this->number = 0;
		this->owner = "";
		this->banknotes = new int[8];
		this->summ = 0;
		this->Tail = this;

		if (Purse::Instances < 20) // Проверяем сколько екземпляров. Если пытаются создать больше 20 выбрасываем исключение
		{
			Purse::Instances++;               // Добавляем единицу к счётчику экземпляров
			this->number = Purse::Instances;
			               
		}
		else{
			throw overflow_error("Недопустимо создавать больше 20 экземпляров"); // Исключение переполнения
		}

		fstream in1("C:/1.txt", ios_base::in);
		if (!in1.is_open())                       // Проверка открылся ли файл
			cout << "Ошибка чтения файла\n\n\n";
		else
		{
			int k = 0;
			char *a1 = new char[255];
			for (; in1.peek() != EOF;)
			{
				in1.getline(a1, 255, '\n');
				k++;
			}
			in1.seekg(0, ios::beg);
			for (int i = 0; i <= rand() % k; i++)
			{
				in1.getline(a1, 255, '\n');
				k++;
			}
			this->owner = a1;
			delete a1;
			in1.close();
		}

		for (int i = 0; i < 9; i++){      // количество купюр
			this->banknotes[i] = rand() % 10;
		}
		this->computeSumm();		
//		this->computeTotalSumm();
	}
	~Purse(){ // Деструктор
		Purse::Instances--; // Уменьшаем счётчик созданных экземпляров на 1
		for (int i = 0; i < 9; i++){ // Пересчёт общей суммы
			this->banknotes[i] = 0;
		}

//		this->ShowTotalSumm();
	}
	
	void Add()
	{
		Purse *temp = new Purse;
		Purse *temp1 = new Purse; //Указываем на голову

		temp1->Tail = this->Tail;
		this->Tail = temp->Tail;
		temp->Tail = temp1->Tail;
		cout << endl;
		delete temp1;
	}
	void Delite(int k)
	{
		Purse *tempHead = this->Tail; // Указываем куда копировать
		Purse *tempNULL = NULL;       // Указываем откуда копируем

		int temp = this->Instances; //Временная переменная равная числу элементов в списке

		if ((0 <= k) && (k < temp))
		{
			while (temp != 0) //Пока не выполнен признак прохода по всему списку
			{
				if (tempHead->number == k)
				{
					tempNULL = tempHead;
					break;
				}
				tempHead = tempHead->Tail;
				temp--; //Один элемент считан, значит осталось на один меньше
			}
			tempHead = tempHead->Tail;		
			for (int i = 0; i < this->Instances - 2; i++)
			{
				tempHead = tempHead->Tail;
			}	
			tempHead->Tail = tempNULL->Tail;
			tempNULL->~Purse();
		}


		
		Purse *tempHead1 = this->Tail;; //Указываем на голову

		temp = this->Instances; //Временная переменная равная числу элементов в списке
		for (int pp = 0; pp < this->Instances;pp++) //Пока не выполнен признак прохода по всему списку
		{
			tempHead1->number = pp+1;
			tempHead1 = tempHead->Tail; //Указываем, что нужен следующий элемент
		}				
		cout << endl;
	}
ura_111 вне форума Ответить с цитированием
Старый 25.05.2016, 14:28   #43
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Код:

	void Show()
	{
		Purse *tempHead = Tail; //Указываем на голову

		int temp = Instances; //Временная переменная равная числу элементов в списке
		while (temp != 0) //Пока не выполнен признак прохода по всему списку
		{

			cout << "\nНомер кошелька: " << tempHead->number << endl;
			cout << "Владелец кошелька: " << tempHead->owner << endl;
			cout << "Сумма в кошельке: " << tempHead->summ << endl;
			cout << "Банкноты: " << endl;

			for (int i = 0; i < 9; i++){
				cout << "Номинал: " << i + 1 << " Количество: " << tempHead->banknotes[i] << endl;
			}
			cout << endl;

			tempHead = tempHead->Tail; //Указываем, что нужен следующий элемент
			temp--; //Один элемент считан, значит осталось на один меньше
		}		
	}
	void Show_iz_zadanogo(int r)
	{
		Purse *tempHead = this->Tail; //Указываем на голову

		int temp = Instances; //Временная переменная равная числу элементов в списке

		if ((0 <= r) && (r <= temp))
		{
			while (temp != 0) //Пока не выполнен признак прохода по всему списку
			{
				if (tempHead->number == r)
				{
					break;
				}
				tempHead = tempHead->Tail;
				temp--; //Один элемент считан, значит осталось на один меньше
			}
			tempHead = tempHead->Tail;
			temp = Instances;
			while (temp != 0) //Пока не выполнен признак прохода по всему списку
			{
				cout << "\nНомер кошелька: " << tempHead->number << endl;
				cout << "Владелец кошелька: " << tempHead->owner << endl;
				cout << "Сумма в кошельке: " << tempHead->summ << endl;
				cout << "Банкноты: " << endl;
				for (int i = 0; i < 9; i++){
					cout << "Номинал: " << i + 1 << " Количество: " << tempHead->banknotes[i] << endl;
				}
				cout << endl;
				tempHead = tempHead->Tail; //Указываем, что нужен следующий элемент
				temp--; //Один элемент считан, значит осталось на один меньше
			}
		}
		else
			cout << "\nТакого кошелька нет.\n";
	}
	void ChangeBanknotes(int nominal, int count, int P){ // Смена количества банкнот. Принимает номинал купюры и количество.

		if (nominal > 8 || nominal < 0){
			throw invalid_argument("Номинал не может быть больше 8 или меньше 0");
		}

		if (count < 0){
			throw invalid_argument("Количество купюр не может быть отрицательно");
		}
		
		Purse *tempHead = this->Tail; //Указываем на голову
		int temp = Instances; //Временная переменная равная числу элементов в списке
		if (P <= temp)
		{
			while (true) //Пока не выполнен признак прохода по всему списку
			{
				if (tempHead->number == P)
				{
					break;
				}
				tempHead = tempHead->Tail; //Указываем, что нужен следующий элемент
				temp--; //Один элемент считан, значит осталось на один меньше

			}
			tempHead->banknotes[nominal] = count;
		}	
		tempHead->computeSumm();
	}
	void ShowAllFields(int k){ // Выводит все поля конкретного элемента

		Purse *tempHead = this->Tail; //Указываем на голову

		int temp = Instances; //Временная переменная равная числу элементов в списке
		if (k <= temp)
		{
			while (true) //Пока не выполнен признак прохода по всему списку
			{
				if (tempHead->number == k)
				{
					break;
				}
				tempHead = tempHead->Tail; //Указываем, что нужен следующий элемент
				temp--; //Один элемент считан, значит осталось на один меньше

			}
			cout << "\nНомер кошелька: " << tempHead->number << endl;
			cout << "Владелец кошелька: " << tempHead->owner << endl;
			cout << "Сумма в кошельке: " << tempHead->summ << endl;
			cout << "Банкноты: " << endl;
			for (int i = 0; i < 9; i++)
			{
				cout << "Номинал: " << i + 1 << " Количество: " << tempHead->banknotes[i] << endl;
			}
			cout << endl;
		}
		else
			cout << "\n Такого элемента нет.\n";
	}
	void ShowRichFields(double k){ // Выводит все поля конкретного элемента

		Purse *tempHead = this->Tail; //Указываем на голову
		bool s = false;
		int temp = Instances; //Временная переменная равная числу элементов в списке
		while (temp!=0) //Пока не выполнен признак прохода по всему списку
		{
			if (tempHead->summ >= k)
			{
				s = true;
				cout << "\nНомер кошелька: " << tempHead->number << endl;
				cout << "Владелец кошелька: " << tempHead->owner << endl;
				cout << "Сумма в кошельке: " << tempHead->summ << endl;
				cout << "Банкноты: " << endl;
				for (int i = 0; i < 9; i++)
				{
					cout << "Номинал: " << i + 1 << " Количество: " << tempHead->banknotes[i] << endl;
				}							
			}
			tempHead = tempHead->Tail; //Указываем, что нужен следующий элемент
			temp--; //Один элемент считан, значит осталось на один меньше
		}
		if (s == false)
			cout << "\nКошельков с суммой более " << k << " нет\n";

		cout << endl;
//		Purse::Number--;
	}
	void ShowTotalSumm(){     // Выводит сумму на кошельках	   
		this->computeTotalSumm();
		cout << "\nОбщая сумма во всех кошельках: " << Purse::TotalSumm << endl;
	}
};

// Инициализируем статические поля класса "кошелёк"
int Purse::Instances = 0;
int Purse::TotalSumm = 0;


int main()
{
	setlocale(LC_ALL, "Russian");
	int k = 0, p = 0;
	cout << "\n ФОРМИРОВАНИЕ КОШЕЛЬКОВ.\n\n";
	cout << " Введите количество кошельков (не более 20шт): ";
	cin >> k;
		
	if ((0 < k) && (k < 20))
	{
		Purse BCE;
		for (int i = 1; i < k; i++)
		{
			BCE.Add();						
		}		
		k = 0;
		while (true)
		{
						
			system("CLS");
			cout << "\n МЕНЮ:\n\n";
			cout << " 1) Ручная смена количества выбранных купюр в выбранном кошельке;\n";
			cout << " 2) Вывод на экран всех полей выбранного кошелька;\n";
			cout << " 3) Вывод на экран суммы денег во всех кошельках;\n";
			cout << " 4) Добавить элемент списка;\n";
			cout << " 5) Удалить элемент списка;\n";
			cout << " 6) Вывод всего списка;\n";
			cout << " 7) Вывод всех кошельков с количеством денег больше выбранного;\n";
			cout << " 8) Вывод всего списка, начиная с заданого;\n";
			cout << " 9) Выход;\n\n";
			cin >> k;
			if (k == 1)
			{
				cout << "\n Введите номер кошелька: ";
				cin >> k;
				BCE.ShowAllFields(k);
				cout << "\n Введите новые значения:\n";
				for (int i = 0; i < 9; i++)
				{
					cout << "Номинал: " << i + 1 << " Количество: ";
					cin >> p;	
					if ((1 <= k) && (k<=BCE.Instances))
						BCE.ChangeBanknotes(i, p, k);
				}
				cout << "\n";
				system("pause");
				k = 1;
			}
			if (k == 2)
			{		
				cout << "\n Введите номер кошелька: ";
				cin >> k;
				BCE.ShowAllFields(k);
				k = 2;
				cout << "\n";
				system("pause");			
			}
			if (k == 3)
			{
				BCE.ShowTotalSumm();
				cout << "\n";
				system("pause");
			}
			if (k == 4)
			{
				BCE.Add();
				system("pause");
			}
			if (k == 5)
			{
				cout << "\n Какой элемент удалить?: ";
				cin >> k;	
				BCE.Delite(k);
				k = 5;
				system("pause");
			}
			if (k == 6)
			{
				BCE.Show();
				system("pause");
			}
			if (k == 7)
			{
				double b = 0;
				cout << "\n Введите сумму для выборки: ";
				cin >> b;
				BCE.ShowRichFields(b);
				system("pause");
			}
			if (k == 8)
			{
				cout << "\n Введите номер кошелька: ";
				cin >> k;
				BCE.Show_iz_zadanogo(k);
				k = 8;
				system("pause");
			}
			if (k == 9)
			{
				cout << "\n";
				break;
			}
		}
	}
	else
	{
		cout << "\n Неверное кол-во кошельков\n\n";
		system("pause");
	}
	system("PAUSE");
	return 0;
}
ura_111 вне форума Ответить с цитированием
Старый 25.05.2016, 14:30   #44
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию



Собери программу и скомпелируй сейчас, чтобы я знал что ничего не потерялось

И ещё одно.
verdant322, я только пока ещё учусь программирования, поэтому предоставляю программу как есть, без претензий (в ней могут біть и ошибки).
Лучше перед здачей покажи её "более толковому программисту".

Последний раз редактировалось Аватар; 25.05.2016 в 15:11.
ura_111 вне форума Ответить с цитированием
Старый 25.05.2016, 14:58   #45
verdant322
Пользователь
 
Регистрация: 22.05.2016
Сообщений: 26
По умолчанию

засунь в текстовик и скинь код

хотя ненадо не увидел остальную часть

что б список правильно работал его нужно перевернуть

Не надо подряд кучу сообщений. Есть кнопка Правка
Модератор

Последний раз редактировалось Аватар; 25.05.2016 в 15:13.
verdant322 вне форума Ответить с цитированием
Старый 25.05.2016, 15:04   #46
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

В файле 1.txt фамилии. Скинь его на диск С

Какой список?
Это ты о чем?
Вложения
Тип файла: txt programma.txt (11.4 Кб, 128 просмотров)
Тип файла: txt 1.txt (130 байт, 149 просмотров)

Последний раз редактировалось Аватар; 25.05.2016 в 15:13.
ura_111 вне форума Ответить с цитированием
Старый 25.05.2016, 15:09   #47
verdant322
Пользователь
 
Регистрация: 22.05.2016
Сообщений: 26
По умолчанию

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

и как выбираеш добавить элемент списка ничего не происходит

Последний раз редактировалось Аватар; 25.05.2016 в 15:13.
verdant322 вне форума Ответить с цитированием
Старый 25.05.2016, 15:16   #48
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

После добавления нового элемента попробуй вывести все (Пунк 6) или вывести тот что вводил п.2.

А по поводу списка: считаю это лишним. Дело втом, что список кольцевой, а значит в нем нет начало и конца. p.s.: Смотри пункт вывод всего списка начиная с выбраного
ura_111 вне форума Ответить с цитированием
Старый 25.05.2016, 15:29   #49
verdant322
Пользователь
 
Регистрация: 22.05.2016
Сообщений: 26
По умолчанию

вроде нормально
я покажу одногрупнику он неплохо понимает
пусть посмотрит
verdant322 вне форума Ответить с цитированием
Старый 25.05.2016, 22:04   #50
verdant322
Пользователь
 
Регистрация: 22.05.2016
Сообщений: 26
По умолчанию

сделай пожалуйста это https://yadi.sk/i/IE_ID9QXrza4t
verdant322 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c# лабораторная nikitaivanov Фриланс 1 26.05.2012 15:05
лабораторная за $$$ djendalf Фриланс 0 26.12.2011 22:41
Лабораторная по C++ Mr.Voragus001 Помощь студентам 0 10.12.2011 13:02
Лабораторная asya92 Помощь студентам 4 20.12.2010 18:52
C# лабораторная Tase4ka Помощь студентам 1 09.12.2010 03:51