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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2009, 22:56   #1
N1KeL
Пользователь
 
Аватар для N1KeL
 
Регистрация: 20.04.2009
Сообщений: 58
По умолчанию Проблема с задачей на использование классов (С++)

Всем доброго времени суток. Взялся написать программу на языке C++ в среде MS Visual Studio 2008, в которой использовался бы класс (структура), написал, откомпилировал, начал вводить данные, но когда нажал Enter, программа оборвалась и появилось сообщение об ошибке:

Unhandled exception at 0x7c812aeb in Вуз.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0012fb64..

Задача звучит так:

На вход программе подаются сведения об абитуриентах, поступающих на бюджетные места на факультет одного из вузов. Первая строка содержит количество поступающих (N). Каждая из следующих N строк содержит:
номер личного дела абитуриента (трехзначный), набранный им балл (100 - 300) и информация о льготах(тип bool: 1 - если льготник, 0 - если нет).
Все данные разделены пробелом. Абитуриенты зачисляются в вуз в порядке убывания набранных ими баллов, но в первую очередь зачисляются льготники, а затем (если остались места) - оставшиеся абитуриенты. Известно, что бюджетных мест 15. Требуется написать программу, которая выведет номера личных дел зачисленных абитуриентов. Следует учитывать, что N >= 20.

Вот мой код:
Код:
// Вуз.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
using namespace std;

int k;

class Data
{
public:
	int number;
	int ball;
	bool L;
};

void getData(Data& pupils);
int functionA1(Data& pupils);
int functionA2(Data& pupils);
int functionB1(Data& pupils);
int functionB2(Data& pupils);

int _tmain(int argc, _TCHAR* argv[])
{
	k = 0;
	int f = 0;
	int *A1;
	int *A2;
	int *B1;
	int *B2;
	int N;
	Data *pupils;
	cout << "vvedite kol-vo uchenikov:";
	cin >> N;
	pupils = new Data[N];
	for(int i = 0; i < N; i++)
		getData(pupils[i]);
	A1 = new int[N]; // Льготники (номер дела)
	A2 = new int[N]; // Льготники (балл)
	B1 = new int[N]; // Оставшиеся (номер дела)
	B2 = new int[N]; // Оставшиеся (балл)
	int P;
	for(int i = 0; i < N; i++)
	{
		P = functionA1(pupils[i]);
		if(P == 5)
			continue;
		else
		{
			A1[k] = P;
			k++;
		}
	}
	k = 0;
	for(int i = 0; i < N; i++)
	{
		P = functionA2(pupils[i]);
		if(P == 5)
			continue;
		else
		{
			A2[k] = P;
			k++;
		}
	}
	int g = 0;
	for(int i = 0; i < N; i++)
	{
		P = functionB1(pupils[i]);
		if(P == 5)
			continue;
		else
		{
			B1[g] = P;
			g++;
		}
	}
	g = 0;
	for(int i = 0; i < N; i++)
	{
		P = functionB2(pupils[i]);
		if(P == 5)
			continue;
		else
		{
			B2[g] = P;
			g++;
		}
	}
	// Сортировка методом пузырька
	int tmp, q = 0;
	for(int i = 0; i < k; i++)
	{
		for(int j = i + 1; j < k; j++)
		{
			if(A2[i] > A2[j])
			{
				tmp = A2[i];
				A2[i] = A2[j];
				A2[j] = tmp;
			}
			tmp = A1[q];
			A1[q] = A1[i];
			A1[i] = tmp;
			q++;
		}
	}
	q = 0;
	for(int i = 0; i < N - k; i++)
	{
		for(int j = i + 1; j < N - k; j++)
		{
			if(B2[i] > B2[j])
			{
				tmp = B2[i];
				B2[i] = B2[j];
				B2[j] = tmp;
			}
			tmp = B1[q];
			B1[q] = B1[i];
			B1[i] = tmp;
			q++;
		}
	}
	if(k >= 15)
		for(int i = 0; i < 15; i++)
			cout << A1[i] << endl;
	else
	{
		for(int i = 0; i < k; i++)
			cout << A1[i] << endl;
		for(int i = 0; i < 15 - k; i++)
			cout << B1[i] << endl;
	}
	system("pause");
	return 0;
}

void getData(Data& pupils)
{
	scanf("%d%d%d",&pupils.number,&pupils.ball,&pupils.L);
}

int functionA1(Data& pupils)
{
	if(pupils.L == 1)
		return pupils.number;
	else
		return 5;
}

int functionA2(Data& pupils)
{
	if(pupils.L == 1)
		return pupils.ball;
	else
		return 5;
} 

int functionB1(Data& pupils)
{
	if(pupils.L == 0)
		return pupils.number;
	else
		return 5;
}

int functionB2(Data& pupils)
{
	if(pupils.L == 0)
		return pupils.ball;
	else
		return 5;
}
Я не совсем уверен, что программа правильно выполнит свою задачу, но сейчас меня больше волнует, почему она вообще никак не выполняет поставленную ей задачу.
Ошибка появляется после заполнения N строк по нажатию Enter. Если у вас нет возможности разбираться в этой задаче и в моем коде, прошу хотя бы разъяснить, что значит та ошибка. Вообщем, буду рад любой помощи. Спасибо.

Последний раз редактировалось N1KeL; 25.07.2009 в 23:07.
N1KeL вне форума Ответить с цитированием
Старый 25.07.2009, 23:09   #2
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
По умолчанию

Ошибка выделения памяти. Скорее всего что-то когда-то неправильно выделили или не достаточно. А лучше сделайте функции методами класса, иначе смысл использовать класс отпадает, а также все преимущества тоже.
И зачем вам эти динамические переменные? Используйте вектор хотябы или другие коллекции пользуйтесь благами VS.
Страх это слабость и потому, кто испугался уже побежден.
Mixasik вне форума Ответить с цитированием
Старый 25.07.2009, 23:16   #3
N1KeL
Пользователь
 
Аватар для N1KeL
 
Регистрация: 20.04.2009
Сообщений: 58
По умолчанию

Видете ли, я состою в рядах "начинающих программистов", поэтому о благах VS знаю маловато и для написания программы использовал только свой запас знаний.
Очень заинтересовала вот эта фраза: "сделайте функции методами класса". Можно поподробнее?
N1KeL вне форума Ответить с цитированием
Старый 25.07.2009, 23:38   #4
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
По умолчанию

Приведу пример на простейшем классе:
Код:
class abiturient{
int id;
int ball;
bool lgot;
public:
      abiturient(int _id; int _ball; bool _lgot){
        id = _id;
        ball= _ball;
        lgot = _lgot;
      }
      bool IsGood(){
      // Здесь ты можешь напрямую обращаться к переменным класса таким как номер, бал и льготы,
      if ((ball>какого-то)|| lgot == true) зачислен;
      } 
      bool IsLgot(){
      return lgot;
      }
}
вот так например, создаешь класс задавая его параметры, а потом сможешь вызвать метод класса который находится внутри, метод это подпрограмма работающая с переменными класса.
Например вы создали массив так и берете первые 15 записей где IsLgot истина - то есть есть льготники а ели их меньше 15, то берете остальных недостающих удовлетворяющих параметры IsGood.
Насчет вектора - это класс коллеция С++, работать с ним очень просто - написано в хелпе хорошо.

Конечно надо учесть в классе получение значений переменных по отдельности, а также задачи их значения в классе. Все что находится не в секции public - по умолчанию является приватным и видимым только методам класса.
Страх это слабость и потому, кто испугался уже побежден.

Последний раз редактировалось Mixasik; 25.07.2009 в 23:40.
Mixasik вне форума Ответить с цитированием
Старый 25.07.2009, 23:58   #5
N1KeL
Пользователь
 
Аватар для N1KeL
 
Регистрация: 20.04.2009
Сообщений: 58
По умолчанию

Спасибо за информацию! Буду разбираться.
N1KeL вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прошу совета в проектировании классов Sergey82 Общие вопросы C/C++ 5 02.07.2009 20:09
Создание классов с использованием конструкторов различного типа Катюшенька Помощь студентам 0 30.04.2009 20:21
Очень прошу помочь! goggin Помощь студентам 1 15.12.2008 19:11
Прошу помочь. Оплачу. dreo Фриланс 8 22.12.2007 00:35
Прошу помочь с запросом MASTERKEY БД в Delphi 0 18.05.2007 15:15