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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2011, 18:59   #1
незнайка)
Подтвердите свой е-майл
 
Регистрация: 11.11.2011
Сообщений: 4
По умолчанию классы С++

помогите дописать прогу. вот условие: Ввести класс ИСТОРИЧЕСКОЕ СОБЫТИЕ с полями ЧИСЛО, МЕСЯЦ, ГОД, СОБЫТИЕ:
a)ввод исторического события;
b)вывод на экран списка исторических событий;
c)вычисляющую интервал в днях, прошедший между двумя заданными историческими событиями;
d)поиск по полю событие
Под a,b,d я сделала(приведено ниже), под "c" ни как не получается


Код:
#pragma once
#ifndef __History_H
#define __History_H
class History
{   int year;
    int month;
    int day;
    char event [30];
    int visokos(int year) const;//скрытый метод, проверяющий является ли год високосным 
public:
    History();//Конструктор преобразования
    int get_year() const {return year;}//метод,возвращающий год
    int get_month() const {return month;}
    int get_day() const {return day;} 
    char* get_event(){return & event[30];}
    void vvod();// метод , обеспечивающий ввод события
    void vivod() const; // константный метод, обеспечивающий вывод списка событий 
	void poisk(char * m, History * mas, int n);
};
#endif


Код:
#include "StdAfx.h"
#include "History.h"
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <ctime>
#include <conio.h>
using namespace std;
int tab_day [2][12]= {{31,28,31,30,31,30,31,31,30,31,30,31},
                    {31,29,31,30,31,30,31,31,30,31,30,31}};


History::History(){};

int History:: visokos(int year) const
{int k=year%4==0&&year%100!=0||year%400==0;
 return k;
}

///////////метод, обеспечивающий  ввод исторического события
void  History::vvod()
{
N: cout<<"Vvesti day, month, year, event:\n";
        cout<<"DAY: ";
        cin>>day;
        cout<<"MONTCH: ";
        cin>>month;
        cout<<"YEAR: ";
        cin>>year;
        cout<<"EVENT: ";
        cin>>event;
int k=visokos(year);
if (day<1||day>tab_day[k][month-1]||month<1||month>12||year<0||year>2012)
{cout<<"oschibka vvoda\n"; /*goto N*/ getch ();}
else {cout<<"Istor. event vvedeno\n"; getch ();}
}


////////////метод, обеспечивающий вывод исторического события
void History:: vivod () const
{cout<<setw(2)<<day<<'.'<<month<<'.'<<setw(2)<<year<<' '<<setw(2)<<event<<"\n"; getch (); }

//////////метод обеспечивающий поиск события
void History:: poisk (char * m, History * mas, int n)
{for (int i=0; i<n; i++)
{if (strcmp(m,mas[i].event)==0) mas[i].vivod();}
}
Код:
// 1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
# include <iostream>
# include <stdio.h>
# include <conio.h>
# include <stdlib.h>
# include "History.h"
using namespace std;

int _tmain()
{system ("cls");
	cout<< "Viberite function\n";
    cout<<" 1 = Vvoda Istor. event\n";
	cout<<" 2 = Vivoda na screen spiska Istor. event\n";
	cout<<" 3 = poisk\n";
	cout<<" 0 = Vihod iz programmi\n";
	int nom;
	cin>>nom;
	switch (nom)
{	case 0: exit(0);
	case 1: {History h; h.vvod(); break;}
	case 2: {History h; cout<<"\nVvesti kolichestvo date: \n";
                int n; cin>>n;
                History* mas = new History [n];
                for (int i=0; i<n; i++)
                mas[i].vvod(); 
                for (int i=0; i<n; i++)
                mas[i].vivod();break;}
	case 3:   {cout<<"\nvvedite kolichestvo event: ";
			  int n; cin>>n;
			  History* mas = new History [n];
			  for (int i=0; i<n; i++)
			  mas[i].vvod();
			  cout<<"\nvvedite event: ";
			  char p[30]; cin>>p;
			  mas[0].poisk(p,mas,n);
 		      getch();}
  default: cout<<"Ochibka vvoda:) ";}
  return 0;
}

Последний раз редактировалось незнайка); 11.11.2011 в 19:41.
незнайка) вне форума Ответить с цитированием
Старый 11.11.2011, 19:31   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Код:
char* get_event(){return & event[30];}//Возвращает название события
Что-что она возвращает? )

Разницу между двумя датами посчитать просто - берешь за точку отсчета нулевой год, например; считаешь, сколько дней прошло с него до обеих дат и берешь разницу между двумя полученными числами.

Да, и зачем такое адское смешение C и C++ в одной программе? )
Son Of Pain вне форума Ответить с цитированием
Старый 11.11.2011, 19:34   #3
настюх
Пользователь
 
Регистрация: 13.10.2011
Сообщений: 16
По умолчанию

Создать множество по принципу стека,перегрузить операторы объединения,пересечения и дополнения множеств.при компилировании выдает много ошибок.не исправляются...
Код:

#include <conio.h>
#include <stdio.h>
# include <iostream>
using namespace std;
class set
{
class element
{
public:
	const int a;
	element *next;
	element(int _a):a(_a), next(NULL) { }
} *e;

int count;
public:
	set():e(NULL), count(0) { }
	~set()
	{
		element *temp;
		while (e != NULL) 
		{
			temp = e;
			e = e->next;
			delete temp;
		}
		count = 0;
	}

void set::add(int b)
{ 
	element*i=e;
	if(!i)
	{
		i=new element(b);
		count++;
		return;
	}
	if (b>=i->a)
	{
		if (i->a==b) return;
		else
		{
			while (!(i->next==NULL)&&(b>=i->next->a))
				i=i->next;
			element*temp=new element(b);
			temp->next=i->next;
			i->next=temp;
			count++;
			return;
		}
	}
	else
	{
		element*temp=new element(b);
		temp->next=e;
		e=temp;
		return;
	}
}
void draw()
{
	element *temp=e;
	while(e!=NULL)
	{
		cout<<e->a;
		e=e->next;
	}
	e=temp;
	cout<<"колличество:"<<count;
}
void set::del(int a)//удаление
{
	element * temp = new element (a);
	element  * t = new element  (a);
	t=e;//доп.переменную
	temp=e->next;
	if (e->a==a) {e=e->next; return;}//по всему списку идем и удаляем
	while (temp)
	{
		if (temp->a==a)
		{
			t->next=temp->next;
			delete temp;
			return;
		}
		temp=temp->next;
		t=t->next;
	}
}


set*set::operator && (const set B)
{
	set C;
	element*ia=this->e;
	element*ib=B.e;
	while (ia!=NULL)
	{
		while (ib!=NULL)
		{
			if(ia->a==ib->a)
			{
				C.add(ia->a);
				ia=ia->next;
			}
			else 
			{
				if (ia->a>ib->a)
					ib=ib->next;
				else

					ia=ia->next;
			}
		}
	}
}
set*set::operator || (const set B)
{
	set D;
	element*ia=this->e;
	element*ib=B.e;
	while (ia!=NULL)
	{
		while (ib!=NULL)
		{
			if(ia->a==ib->a)
			{
				D.add(ia->a);
				ia=ia->next; 
			}
			else 
				ia=ia->next;

		}
	}
}
set * operator / (const set B) 
{
	element*ia=this->e;
	element*ib=B.e;
	while (ia!=NULL)
	{\
	while (ib!=NULL)
	{
		if(ia->a==ib->a)
			while (e)
			{
				this->del.set(e->a);
				e=e->next;
			}
	}
	}
}
};
void main()
{
	setlocale(LC_ALL, "Russian");
	set A,B,C;
	int a;
	a=1;
	cout<<"введите первое множество"<<"\n";
	while (a)
	{ 
		cin>>a;
		A.add(a);
	}
	a=1;
	cout<<"введите второе множество"<<"\n"; 
	while(a)
	{
		cin>>a;
		B.add(a);
	}
	cout<<"\n-----------------\n";
	A.draw();
	cout<<"\n-----------------\n";
	B.draw();
	set *C=A&&amp;B;
	cout<<"объединение(&&)";
	C.draw();
	set *C=A||B;
	cout<<"пересечение(||)";
	C.draw();
	set *C=A/B;
	cout<<"дополнение(/)";
	C.draw();
	getch();
}
настюх вне форума Ответить с цитированием
Старый 11.11.2011, 19:35   #4
незнайка)
Подтвердите свой е-майл
 
Регистрация: 11.11.2011
Сообщений: 4
По умолчанию

почему адское смешение С и С++? вроде все нормально))) сначала прочитала теорию, потом пыталась что то сделать по примеру.
а можно как по подробнее объяснить насчет даты? что то я не понимаю. для меня программирование это темный лес))
незнайка) вне форума Ответить с цитированием
Старый 11.11.2011, 20:17   #5
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Цитата:
Сообщение от незнайка) Посмотреть сообщение
почему адское смешение С и С++? вроде все нормально)))
Потому что в c++ вместо пришедших к нам еще из эпохи мамонтов символьных массивов принято использовать готовый тип string. Вместо обычных динамических массивов принято использовать вектор. Вместо циклов принято писать for_each или другие подобные алгоритмы. Это очень заметно сокращает код; делает его более читаемым, надежным и устойчивым к ошибкам. Для этого c++ и был придуман, тащем )

Цитата:
а можно как по подробнее объяснить насчет даты?
Я не знаю, как можно подробнее ) Проще всего взять за точку отсчета нулевой год; посчитать количество дней, прошедших с его начала до обеих дат и взять разницу.
Son Of Pain вне форума Ответить с цитированием
Старый 11.11.2011, 20:22   #6
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Потрясающе.
Код:
#pragma once
#ifndef __History_H
#define __History_H
//....
#endif
И условная компиляция, и pragma once - всё вместе. Так, конечно, делать можно, и даже Википедия в статье под названием pragma once говорит
Цитата:
Можно использовать обе команды, #pragma once и include guards, для написания переносимого кода, что также может принести выгоду от применения #pragma once при оптимизации (если компилятор её поддерживает)
Но всё-таки мне кажется, что include guards будет достаточно.
_-Re@l-_ вне форума Ответить с цитированием
Старый 11.11.2011, 20:23   #7
незнайка)
Подтвердите свой е-майл
 
Регистрация: 11.11.2011
Сообщений: 4
По умолчанию

до типа string мы еще к сожалению не дошли( пользуемся тем что есть
незнайка) вне форума Ответить с цитированием
Старый 11.11.2011, 21:09   #8
незнайка)
Подтвердите свой е-майл
 
Регистрация: 11.11.2011
Сообщений: 4
По умолчанию

ну может хоть кто нибудь объяснит(
незнайка) вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы с++ sv777 Помощь студентам 2 01.06.2011 09:06
Классы Kukkk Компоненты Delphi 2 26.12.2009 13:00
классы Sined121 Общие вопросы C/C++ 3 22.12.2009 20:29
Классы с++. ahab Помощь студентам 4 19.12.2009 12:43