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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2013, 18:10   #1
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию с++ работа с классами

как работать с классами ? в с++ как создать динамическое количество классов , с параметрами вводимых в клавиатуры
Код:
 // ConsoleApplication63.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
#include <conio.h>


class Worker{

    int   YearOfEnter;
	char* Post       ;
	char* Name       ;
	
	Worker(char* n, char* p, int Y)
	{
		p = (char*)calloc(100,sizeof(char*));
		
		n = (char*)calloc(100,sizeof(char*));
		Post = p;
		Name = n;
	    YearOfEnter = Y;	
	}
	
int GetYear(){
return YearOfEnter;
}
char* GetName(){
return Name;
}
char* GetPost(){
return Post;
}
};

// Функция очищения памяти
void MemoryFree(char** N,...)
{
	va_list p;
	_crt_va_start(p,N);
while(_crt_va_arg(p,char**))
{
		
delete[] _crt_va_arg(N,char**);
	
	                        }
_crt_va_end(p);


}
int _tmain(int argc, _TCHAR* argv[])
{
int n;



std::cin>>n;
char **name;
char **post;
int *Year;
Year = new int[n];
name = new char*[n];
post = new char*[n];
for (int i =0;i<n;i++)
{
	name[i] = new char[100];
	post[i] = new char[100];

   
}
for (int i = 0;i<n;i++){
	Worker *a(name[i],post[i],Year[i]) = new Worker;}
for (int i = 0;i<n;i++){

}


	MemoryFree(post,name);
	free(Year);
	_getch();
	return 0;
}
так с ошибками

Последний раз редактировалось proef; 24.09.2013 в 18:20.
proef вне форума Ответить с цитированием
Старый 24.09.2013, 18:25   #2
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

может не совсем понятно
мне нужно чтобы количество элементов - классов
можно было вводить с клавиатуры , но так как я написал не катит
proef вне форума Ответить с цитированием
Старый 24.09.2013, 19:24   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Вектор желаете использовать или нет?
Без вектора:
Код:
MyClass *p;
int n;
cin >> n;
p = new MyClass[n];
for (int i = 0; i < n; ++i) {
  ...
}
...
delete[] p;
Если использовать Ваш класс:
Код:
#include <iostream>
#include <string.h>

using namespace std;

class Worker
{
    int YearOfEnter = 0;
    char* Post = nullptr;
    char* Name = nullptr;
public:
Worker() {}
Worker(char* n, char* p, int Y) {
    Name = new char[strlen(n) + 1];
    Post = new char[strlen(p) + 1];
    strcpy(Name, n);
    strcpy(Post, p);
    YearOfEnter = Y;
}
~Worker() {
    if (Post)
        delete[] Post;
    if (Name)
        delete[] Name;
}
const int
GetYear() const {
    return YearOfEnter;
}
void
SetYear(const int y) {
    YearOfEnter = y;
}
const char*
GetName() const {
    return Name;
}
void
SetName(const char *n) {
    if (Name)
        delete[] Name;
    Name = new char[strlen(n) + 1];
    strcpy(Name, n);
}
const char*
GetPost() const {
    return Post;
}
void
SetPost(const char *p) {
    if (Post)
        delete[] Post;
    Post = new char[strlen(p) + 1];
    strcpy(Post, p);
}
};

int
main()
{
    int n;
    cin >> n;
    Worker *p = new Worker[n];
    for (int i = 0; i < n; ++i) {
        char buf[100];
        int y;
        cin >> buf;
        p[i].SetName(buf);
        cin >> buf;
        p[i].SetPost(buf);
        cin >> y;
        p[i].SetYear(y);
    }
    for (int i = 0; i < n; ++i)
        cout << p[i].GetPost() << " " << p[i].GetName() << " " << p[i].GetYear() << endl;
    delete[] p;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 24.09.2013 в 19:48.
BDA вне форума Ответить с цитированием
Старый 24.09.2013, 20:21   #4
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

а как динамический с параметрами?
proef вне форума Ответить с цитированием
Старый 24.09.2013, 20:39   #5
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

вопрос исчерпан)
proef вне форума Ответить с цитированием
Старый 24.09.2013, 20:50   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include <iostream>
#include <vector>
#include <string.h>

using namespace std;

class Worker
{
    int YearOfEnter = 0;
    char* Post = nullptr;
    char* Name = nullptr;
public:
explicit Worker();
Worker(char* n, char* p, int Y) {
    Name = new char[strlen(n) + 1];
    Post = new char[strlen(p) + 1];
    strcpy(Name, n);
    strcpy(Post, p);
    YearOfEnter = Y;
}
Worker(const Worker &a) {
    Name = new char[strlen(a.Name) + 1];
    Post = new char[strlen(a.Post) + 1];
    strcpy(Name, a.Name);
    strcpy(Post, a.Post);
    YearOfEnter = a.YearOfEnter;
}
~Worker() {
    if (Post)
        delete[] Post;
    if (Name)
        delete[] Name;
}
const int
GetYear() const {
    return YearOfEnter;
}
void
SetYear(const int y) {
    YearOfEnter = y;
}
const char*
GetName() const {
    return Name;
}
void
SetName(const char *n) {
    if (Name)
        delete[] Name;
    Name = new char[strlen(n) + 1];
    strcpy(Name, n);
}
const char*
GetPost() const {
    return Post;
}
void
SetPost(const char *p) {
    if (Post)
        delete[] Post;
    Post = new char[strlen(p) + 1];
    strcpy(Post, p);
}
};

int
main()
{
    int n;
    cin >> n;
    vector<Worker> p;
    for (int i = 0; i < n; ++i) {
        char buf1[100], buf2[100];
        int y;
        cin >> buf1 >> buf2 >> y;
        p.push_back(Worker(buf1, buf2, y));
    }
    for (auto i : p)
        cout << i.GetPost() << " " << i.GetName() << " " << i.GetYear() << endl;
}
Не видел последнее Ваше сообщение. Скажите, как "исчерпали"?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 24.09.2013 в 20:55.
BDA вне форума Ответить с цитированием
Старый 24.09.2013, 21:24   #7
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

Код:
#include <iostream>
#include <locale.h>
#include <Windows.h>
typedef unsigned short WORD;
void Color(WORD BackGround,WORD ForeGround)
{
	HANDLE HOUT = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(HOUT,BackGround|ForeGround);
}

class Worker{

public:
	int YearOfEnter;
	char * NameOfWorker;
	char *post;

	Worker()
	{
	MemoryLock();
	}
	void MemoryLock()
	{
	  NameOfWorker = new char[100];
	  post = new char[100];
	}
		
	void ColorWrite( unsigned int BackGround,unsigned int Foreground)
	{
	HANDLE G = GetStdHandle(STD_OUTPUT_HANDLE);
	std::cout<<"________________________________________________________________________________"
	<<std::endl;
    SetConsoleTextAttribute(G,(WORD)(BackGround|Foreground));
	
	std::cout<<"должность    "<<post<<std::endl;
	std::cout<<"имя          "<<NameOfWorker<<std::endl;
	std::cout<<"год          "<<YearOfEnter<<std::endl;
	SetConsoleTextAttribute(G,15|0);
	std::cout<<"________________________________________________________________________________"
	<<std::endl;
	
	}
	
		


};

int main(int argc, _TCHAR* argv[])
{
	Color(15,0);
	setlocale(LC_CTYPE,"rus");
	int CountOfCompare = 0;
	int n;
	int CurrentYear;
	std::cout<<"количество"<<std::endl;
	std::cin>>n;
	

	Worker *a = new Worker[n];
	for (int i = 0;i<n;i++){
	std::cout<<"имя рабочего   "<<std::endl;
	std::cin>>a[i].NameOfWorker;
    
	std::cout<<"должность      "<<std::endl;
	std::cin>>a[i].post;
    std::cout<<"год поступления"<<std::endl;
	std::cin>>a[i].YearOfEnter;
	

	


	}
	// ищем работника по заданному году
	
	std::cout<<"нужный год";
	std::cin>>CurrentYear  ;
	for (int i = 0;i<n;i++)
	{
		if (CurrentYear == a[i].YearOfEnter)
		{
	    std::cout<<CountOfCompare+1<<"совпадение  найдено"<<std::endl;
		  a[i].ColorWrite(12,0);
		  CountOfCompare++;
		  
		 }
	}
	if (CountOfCompare==0) MessageBox(0,"ничего не найдено","",MB_ICONINFORMATION);
	getchar();
	getchar();



free(a);
	return 0
		;
}
сначала забросил потом доделал)
proef вне форума Ответить с цитированием
Старый 24.09.2013, 22:14   #8
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

не правильно пишет имена в конце
Код:
#include <iostream>
#include <locale.h>
#include <Windows.h>
#include <string.h>
typedef unsigned short WORD;
void Color(WORD BackGround,WORD ForeGround)
{
	HANDLE HOUT = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(HOUT,BackGround|ForeGround);
}

class Worker{
protected:
	int YearOfEnter;
    char  * NameOfWorker;
	char *post;
public:
       
 Worker()
		{
	       MemoryLock();
	     }
	    
         void SetYear( int Year)
         {
             YearOfEnter =Year; 
         }
         void SetName(char*Name)
         {
              
              Name = new char[strlen(Name)+1];
            strcpy(NameOfWorker,Name);  
              }
              void SetPost( char *Post)
              {
                   Post = new char[100];
                  strcpy(post,Post); 
                   
              }
              const 
              int GetYear() const{
                 return YearOfEnter; 
                  }
	void MemoryLock()
	{
	  NameOfWorker = new char[100];
	  post = new char[100];
	}
	
	void MemoryFree(char *j,...)
    {
         va_list p;
         va_start(p,j);
         while(va_arg(p,char*))
         {
             delete[] va_arg(j,char*);                  
                               }
         va_end(p);
         
         }
    ~Worker()
    {
         MemoryFree(post,NameOfWorker);
         
         }	
	void ColorWrite( WORD BackGround,WORD Foreground)
	{
	HANDLE G = GetStdHandle(STD_OUTPUT_HANDLE);
	std::cout<<"________________________________________________________________________________"
	<<std::endl;
    SetConsoleTextAttribute(G,(BackGround|Foreground));
	
	std::cout<<"äîëæíîñòü    "<<post<<std::endl;
	std::cout<<"èìÿ          "<<NameOfWorker<<std::endl;
	std::cout<<"ãîä          "<<YearOfEnter<<std::endl;
	SetConsoleTextAttribute(G,15|0);
	std::cout<<"________________________________________________________________________________"
	<<std::endl;
	
	}
	
		


};


int main(int argc, _TCHAR* argv[])
{
    char Buffer[100];
    int Year;
	Color(15,0);
	setlocale(LC_CTYPE,"rus");
	int CountOfCompare = 0;
	int n;
	int CurrentYear;
	std::cout<<"количество"<<std::endl;
	std::cin>>n;
	

	Worker *a = new Worker[n];
	for (int i = 0;i<n;i++){
	std::cout<<"имя рабочего  "<<std::endl;
	std::cin>>Buffer;
    a[i].SetName(Buffer);
   
	std::cout<<"должность      "<<std::endl;
	std::cin>>Buffer;
	a[i].SetPost(Buffer);
    std::cout<<"год поступления"<<std::endl;
	std::cin>>Year;
	a[i].SetYear(Year);
	
	

	


	}
	// èùåì ðàáîòíèêà ïî çàäàííîìó ãîäó
	
	std::cout<<"нужный год";
	std::cin>>CurrentYear  ;
	
	for (int i = 0;i<n;i++)
	{
        
        if (a[i].GetYear() == CurrentYear)
		{
	    std::cout<<CountOfCompare+1<<"найдено совпадение"<<std::endl;
		  a[i].ColorWrite(12,0);
		  CountOfCompare++;
        }
	     }
	if (CountOfCompare==0) MessageBox(0,"íè÷åãî íå íàéäåíî","",MB_ICONINFORMATION);
	getchar();
	getchar();




	return 0;
}
Изображения
Тип файла: jpg pd.jpg (49.7 Кб, 34 просмотров)

Последний раз редактировалось proef; 24.09.2013 в 22:26.
proef вне форума Ответить с цитированием
Старый 24.09.2013, 22:45   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include <iostream>
#include <locale.h>
#include <Windows.h>
#include <string.h>

typedef unsigned short WORD;

void Color(WORD BackGround,WORD ForeGround)
{
    HANDLE HOUT = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(HOUT,BackGround|ForeGround);
}

class Worker
{
protected:
    int YearOfEnter;
    char *NameOfWorker;
    char *post;
public:
    Worker()
    {
        MemoryLock();
    }
    void
    SetYear(int Year)
    {
        YearOfEnter = Year;
    }
    void
    SetName(char *Name)
    {
        strcpy(NameOfWorker, Name);
    }
    void
    SetPost(char *Post)
    {
        strcpy(post, Post);
    }
    const
    int GetYear() const
    {
        return YearOfEnter;
    }
    void
    MemoryLock()
    {
        NameOfWorker = new char[100];
        post = new char[100];
    }

    void
    MemoryFree(char *j,...)
    {
        va_list p;
        va_start(p,j);
        while(va_arg(p, char *))
        {
            delete[] va_arg(j, char *);
        }
        va_end(p);
    }
    ~Worker()
    {
        MemoryFree(post,NameOfWorker);
    }
    void ColorWrite( WORD BackGround,WORD Foreground)
    {
        HANDLE G = GetStdHandle(STD_OUTPUT_HANDLE);
        std::cout<<"________________________________________________________________________________"
                 <<std::endl;
        SetConsoleTextAttribute(G,(BackGround|Foreground));

        std::cout<<"äîëæíîñòü    "<<post<<std::endl;
        std::cout<<"èìÿ          "<<NameOfWorker<<std::endl;
        std::cout<<"ãîä          "<<YearOfEnter<<std::endl;
        SetConsoleTextAttribute(G,15|0);
        std::cout<<"________________________________________________________________________________"
                 <<std::endl;

    }
};

int
main(int argc, _TCHAR* argv[])
{
    char Buffer[100];
    int Year;
    Color(15,0);
    setlocale(LC_CTYPE,"rus");
    int CountOfCompare = 0;
    int n;
    int CurrentYear;
    std::cout<<"количество"<<std::endl;
    std::cin>>n;

    Worker *a = new Worker[n];
    for (int i = 0; i<n; i++)
    {
        std::cout<<"имя рабочего  "<<std::endl;
        std::cin>>Buffer;
        a[i].SetName(Buffer);
        std::cout<<"должность      "<<std::endl;
        std::cin>>Buffer;
        a[i].SetPost(Buffer);
        std::cout<<"год поступления"<<std::endl;
        std::cin>>Year;
        a[i].SetYear(Year);
    }
    // èùåì ðàáîòíèêà ïî çàäàííîìó ãîäó

    std::cout<<"нужный год";
    std::cin>>CurrentYear  ;

    for (int i = 0; i<n; i++)
    {
        if (a[i].GetYear() == CurrentYear)
        {
            std::cout<<CountOfCompare+1<<"найдено совпадение"<<std::endl;
            a[i].ColorWrite(12,0);
            CountOfCompare++;
        }
    }
    if (CountOfCompare==0) MessageBox(0,"íè÷åãî íå íàéäåíî","",MB_ICONINFORMATION);
    delete[] a;
    getchar();
    getchar();
    return 0;
}
Вообще, мне такой подход не нравится. Какие-то полумеры. Лучше задействовать тип string и больше не мучаться с выделением памяти под char, так как пока весь код получается кривоватым
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 24.09.2013 в 22:49.
BDA вне форума Ответить с цитированием
Старый 25.09.2013, 00:04   #10
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

спасибо)
proef вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с классами cooper30 C# (си шарп) 9 05.11.2013 16:57
Работа с классами RomiKon Помощь студентам 4 26.03.2013 21:21
Работа с классами АндрейBAN C# (си шарп) 4 17.12.2012 13:10
Работа с классами petrovich2005 Помощь студентам 2 24.06.2011 17:32
Работа с классами Superlotles Общие вопросы C/C++ 6 16.06.2010 17:15