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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2017, 08:12   #1
pocheto
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 23
По умолчанию Программа позволяющая вводить, хранить и обрабатывать информацию для учета участников Олимпиады. Формировать отчет количества участников по виду спорта.

Добрый вечер всем!)

Нужна ваша помощь, светлые головы. Есть программа позволяющая вводить, хранить и обрабатывать информацию для учета участников Олимпиады.

Вот код.




Необходимо подсказать, исправить, следующее. Что бы при выборе пункта 6. Формировался отчет количества участников по виду спорта. Сейчас это работает так, когда выбираем пункт 6 , то формируется отчет в котором указан вес участника.
Изображения
Тип файла: png 1.png (28.4 Кб, 145 просмотров)
Тип файла: png 2.png (37.4 Кб, 136 просмотров)
Тип файла: png 3.png (32.1 Кб, 130 просмотров)
Тип файла: png 4.png (22.8 Кб, 132 просмотров)
Тип файла: png 5.png (19.3 Кб, 58 просмотров)
Тип файла: png 6.png (20.1 Кб, 61 просмотров)
Тип файла: png 7.png (32.8 Кб, 57 просмотров)
Тип файла: png 8.png (27.6 Кб, 64 просмотров)
pocheto вне форума Ответить с цитированием
Старый 06.06.2017, 08:17   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Много букаф, приложите готовую программу, я Вам исправлю. Быстрее будет
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 06.06.2017, 08:31   #3
pocheto
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 23
По умолчанию

Вот программа в доке, не получается кинуть ее сюда на форум, слишком много символов.
Вложения
Тип файла: docx прога в доке.docx (16.8 Кб, 8 просмотров)
pocheto вне форума Ответить с цитированием
Старый 06.06.2017, 08:31   #4
pocheto
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 23
По умолчанию

Код:
#include <iostream>
#include <iomanip>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <conio.h>
#include <windows.h>

#define START_ID 1
#define STR_SIZE 1024
#define DATE_SIZE 11

using namespace std;

typedef struct node {
	int id;
	char Member_initials[STR_SIZE]; //ФИО участника олимпиады
	char Name_sport[STR_SIZE]; // Название вида спорта
	double Entire_participant; // Вес участника олмпиады 
	char Date_Birth[DATE_SIZE]; // Дата рождения участника
	struct node *link;
} node;

void show_menu();
node* add_node(node**, char*, char*, double, char*);
void clear_list(node**);
node* create_node(char*, char*, double, char*);
bool delete_node(node**, int);
bool is_date(char*);
void print_list(node*);
double get_report(node*, char*);
node* sortby_enterprise(node*);
int strcmpa(char*, char*);

int main(void) {
	char ch;
	char Member_initials[STR_SIZE], Name_sport[STR_SIZE], Date_Birth[DATE_SIZE];
	double Entire_participant;
	node *first = NULL;
	setlocale(LC_ALL,"rus");
	show_menu();
	cin >> ch;
	while (ch != '6') {
		switch (ch) {
		case '0':
			clear_list(&first);
			cout << "Создан новый список. Для продолжения нажмите любую клавишу.";
			break;
		case '1':
			cout << "Введите наименование ФИО участника олимпиады: ";
			cin >> Member_initials;
			cout << "Введите наименование вида спорта участника олимпиады: ";
			cin >> Name_sport;
			cout << "Введите вес участника олимпиады: ";
			cin >> Entire_participant;
			cout << "Введите дату рождения участника в формате DD.MM.YYYY: ";
			cin >> Date_Birth;
			if (!is_date(Date_Birth)) {
				cout << "Дата не распознана. Информация не добавлена. Для продолжения нажмите любую клавишу.";
				break;
			}
			if (add_node(&first, Member_initials, Name_sport, Entire_participant, Date_Birth) != NULL) {
				cout << "Новый участник олимпиады добавлен. Для продолжения нажмите любую клавишу.";
			} else {
				cout << "Не удалось добавить нового участника олимпиады. Работа программы будет завершена. Для продолжения нажмите любую клавишу.";
				return 0;
			}
			break;
		case '2':
			print_list(first);
			break;
		case '3':
			first = sortby_enterprise(first);
			cout << "Список упорядочен по полю \"ФИО участника\". Для продолжения нажмите любую клавишу.";
			break;
		case '4':
			int id;
			cout << "Введите id элемента, который должен быть удалён: ";
			cin >> id;
			if (delete_node(&first, id) == NULL) {
				cout << "Элемент с заданным id отсутствует в списке.";
			} else {
				cout << "Элемент с заданным id удалён.";
			}
			break;
		case '5':
			char e[STR_SIZE];
			cout << "Введите Фамилию участника, по которому необходимо сформировать отчёт: ";
			cin >> e;
			cout << "Итоговое колличество участников по виду спорта <" << e << "> за последний год составила: " << get_report(first, e);
			break;
		case '6': return 0;
		default:
			cout << "Операция с указанным номером не предусмотрена. Для продолжения нажмите любую клавишу.";
		}
		_getch();
		show_menu();
		cin >> ch;
	}
	return 0;
}

node* add_node(node **first, char *e, char *i, double c, char *d) {
	node *new_node = create_node(e, i, c, d);
	if (new_node != NULL) {
		if (*first == NULL) {
			new_node->id = START_ID;
			*first = new_node;
		} else {
			node *temp = *first;
			int max_id = (*first)->id;
			while (temp->link != NULL) {
				temp = temp->link;
				if (temp->id > max_id) {
					max_id = temp->id;
				}
			}
			new_node->id = max_id + 1;
			temp->link = new_node;
		}
		return new_node;
	} else {
		return NULL;
	}
}

void clear_list(node **first) {
	node *temp = *first;
	node *d;
	while (temp != NULL) {
		d = temp;
		temp = temp->link;
		delete d;
	}
	*first = NULL;
}

node* create_node(char *e, char *i, double c, char *d) {
	node *new_node = new node();
	if (new_node != NULL) {
		strcpy_s(new_node->Member_initials, e);
		strcpy_s(new_node->Name_sport, i);
		new_node->Entire_participant = c;
		strcpy_s(new_node->Date_Birth, d);
		new_node->link = NULL;
	}
	return new_node;
}

bool delete_node(node **first, int id) {
	if (*first == NULL) {
		return false;
	} else {
		node *temp = *first;
		if ((*first)->id == id) {
			(*first) = (*first)->link;
			delete temp;
			return true;
		} else {
			while (temp->link->link != NULL) {
				if (temp->link->id == id) {
					node *d = temp->link;
					temp->link = temp->link->link;
					delete d;
					return true;
				}
				temp = temp->link;
			}
			if (temp->link->id == id) {
				delete temp->link;
				temp->link = NULL;
				return true;
			} else {
				return false;
			}
		}
	}
}

double get_report(node *first, char *e) {
	node* temp = first;
	double total = 0.0;
	int last_year = 0, y;
	while (temp != NULL) {
		y = atoi(&(temp->Date_Birth[6]));
		if (y > last_year) {
			last_year = y;
		}
		temp = temp->link;
	}
	temp = first;
	while (temp != NULL) {
		y = atoi(&(temp->Date_Birth[6]));
		if (strcmp(temp->Member_initials, e) == 0 && y == last_year) {
			total += temp->Entire_participant;
		}
		temp = temp->link;
	}
	return total;
}

bool is_date(char *date) {
	int n = strlen(date);
	if (n == 10) {
		if (isdigit(date[0]) && isdigit(date[1]) && date[2] == '.' && isdigit(date[3]) && isdigit(date[4]) && date[5] == '.' && isdigit(date[6]) && isdigit(date[7]) && isdigit(date[8]) && isdigit(date[9])) {
			return true;
		} else {
			return false;
		}
	} else {
		return false;
	}
}

void print_list(node *t) {
	if (t == NULL) {
		cout << "Список участников олимпиады пуст.";
	} else {
		cout << setw(5) << "ID" << setw(22) << "ФИО" << setw(22) << "СПОРТ" << setw(10) << "ВЕС" << setw(12) << "ДАТА" << endl;
		do {
			cout << setw(5) << t->id << setw(22) << t->Member_initials << setw(22) << t->Name_sport << setw(10) << t->Entire_participant << setw(12) << t->Date_Birth << endl;
			t = t->link;
		} while (t != NULL);
	}
}

void show_menu() {
	system("cls");
	cout << "0. Сформировать новый список" << endl << "1. Добавление нового элемента списка" << endl << "2. Вывод всего списка на экране в виде таблицы" << endl <<
		"3. Упорядочивание списка по полю \"ФИО участника\"" << endl << "4. Удаление элементов по значению первичного ключа" << endl <<
		"5. Формирование отчета: итоговое количество участников по виду спорта, указанному пользователем." << endl << "6. Выход" << endl << endl << "Для выбора операции напечатайте её номер и нажмите Enter: ";
}

node* sortby_enterprise(node *first) {
	node *q, *result = NULL, *p, *pr;
	while (first != NULL) { 
		q = first; first = first->link; 
		for (p = result, pr = NULL; p != NULL && strcmpa(q->Member_initials, p->Member_initials)>0; pr = p, p = p->link);
		if (pr == NULL) { 
			q->link = result; result = q; 
		}
		else { 
			q->link = p; pr->link = q; 
		} 
	}
	return result;
}

int strcmpa(char *a, char *b) {
	int i, result = 0;
	for (i = 0; a[i] != 0 && b[i] != 0; i++) {
		if (tolower(a[i]) < tolower(b[i])) return -1;
		if (tolower(a[i]) > tolower(b[i])) return 1;
	}
	if (a[i] == 0) return -1;
	if (b[i] == 0) return 1;
	return 0;
}

Последний раз редактировалось Аватар; 06.06.2017 в 08:40.
pocheto вне форума Ответить с цитированием
Старый 06.06.2017, 09:37   #5
pocheto
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 23
По умолчанию

Что еще от меня требуется ?
pocheto вне форума Ответить с цитированием
Старый 06.06.2017, 09:45   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от pocheto Посмотреть сообщение
Сейчас это работает так, когда выбираем пункт 6 , то формируется отчет в котором указан вес участника.
Сейчас это работает совсем не так:

Код:
<< "6. Выход" << endl << endl << "Для выбора операции напечатайте её номер и нажмите Enter: ";
Я больше скажу - сейчас это вообще не работает:
Изображения
Тип файла: png Errors.PNG (18.0 Кб, 51 просмотров)
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 06.06.2017, 14:14   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Держите. Программа теперь рабочая

Цитата:
Сообщение от pocheto Посмотреть сообщение
Что бы при выборе пункта 6. Формировался отчет количества участников по виду спорта. Сейчас это работает так, когда выбираем пункт 6 , то формируется отчет в котором указан вес участника.
Так работал пункт 5, его и поменял. Пункт 6 по-прежнему работает выходом
Вложения
Тип файла: docx Работающая прога в доке.docx (18.0 Кб, 10 просмотров)
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 06.06.2017, 22:16   #8
pocheto
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 23
По умолчанию

Спасибо, стало лучше. Но, теперь при выборе пункта формировать отчет, после выводящей надписи "Итоговое количество участников по виду спорта (----) составило:" и все, дальше пусто. Мне вот и нужно что бы формировало количество.
Например. Составило: 3,4 и т.д
pocheto вне форума Ответить с цитированием
Старый 06.06.2017, 23:29   #9
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от pocheto Посмотреть сообщение
Мне вот и нужно что бы формировало количество.
Странно, у меня формировало прекрасно

UPDATE
Дабы не быть голословным - вот скриншот, как у меня это работает:
Изображения
Тип файла: png Console.PNG (20.9 Кб, 47 просмотров)
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

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

Спасибо большое, все работает!
pocheto вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задан список участников соревнований по фигурному катанию на коньках и их результаты. Расположить порядковые номера участников и р scarecrow_1 Паскаль, Turbo Pascal, PascalABC.NET 1 22.12.2015 09:59
Работа в Fortran-е. В файле хранится список участников олимпиады. Найти однофамильцев c0ach Помощь студентам 0 04.12.2013 01:04
При достижении определенного количества участников выскакивает окно (проблема) FleXik Общие вопросы Delphi 4 20.11.2012 05:41
Жюри олимпиады для подтверждения итогов должно выделить трех победителей в индивидуальном зачете из 24 участников и опре Botan747 Паскаль, Turbo Pascal, PascalABC.NET 2 16.06.2011 22:33
Информация к размышлению для всех участников форума NeshSoft Помощь студентам 19 06.11.2009 11:28