Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Помогите сделать курсовик


Автор: Stanley 28.5.2005, 21:51
Вот и сессия пришла а курсовик не могу сделать плиз помогите....
----------------------------------------------------------------------------------------------------------
Описать базовый класс СТРОКА.
Обязательные поля класса:
указатель на char — хранит адрес динамически выделенной памяти для размещения символов строки;
значение типа int — хранит длину строки в байтах.
Обязательные методы должны выполнять следующие действия:
конструктор без параметров;
конструктор, принимающий в качестве параметра Си-строку (заканчивается нулевым байтом);
конструктор, принимающий в качестве параметра символ;
конструктор копирования;
получение длины строки;
очистка строки (сделать строку пустой);
деструктор.
Описать производный от СТРОКА класс ДЕСЯТИЧНАЯ_СТРОКА.
Строки данного класса могут содержать только символы десятичных цифр и символы – и +, задающие знак числа. Символы – или + могут находиться только в первой позиции числа, причем символ + может отсутствовать, в этом случае число считается положительным. Если в составе инициализирующей строки будут встречены любые символы, отличные от допустимых, ДЕСЯТИЧНАЯ_СТРОКА принимает нулевое значение. Содержимое данных строк рассматривается как десятичное число.
Обязательные методы:
конструктор без параметров;
конструктор, принимающий в качестве параметра Си-строку (заканчивается нулевым байтом);
конструктор копирования;
деструктор;
метод, определяющий, можно ли представить данное число в формате int;
Переопределить следующие операции:
присваивание (=);
вычитание (–) — арифметическая разность строк;
операция > — проверка на больше (по значению);
операция < — проверка на меньше (по значению);
Разработчик вправе вводить любое (с обоснованием необходимости) число дополнительных полей и методов.
Написать тестовую программу, которая:
динамически выделяет массив указателей на базовый класс (4–6);
в режиме диалога заполняет этот массив указателями на производные классы, при этом экземпляры производных классов создаются динамически с заданием начальных значений;
для созданных экземпляров производных классов выполняет проверку всех разработанных методов с выводом исходных данных и результатов на дисплей.
Для конструкторов копирования каждого класса предусмотреть диагностическую печать количества его вызовов в определенное место дисплея (рекомендуется использовать статические члены класса).
Режим диалога обеспечивается с помощью иерархического меню.

Автор: Yanis 28.5.2005, 21:55
Цитата(Stanley @ 28.5.2005, 21:51)
Вот и сессия пришла а курсовик не могу сделать плиз помогите....

А ты пытался? Тут в принципе не очень сложно. Если у тебя есть лекции, то это вполне реально написать самому.

Автор: Stanley 28.5.2005, 22:11
В том то и проблема что лекции частично не посещались или наоборот частично посещались и поетому лекций нет... Я не много не догоняю до классов что это такое я представляю а с чем едят не очень...

Автор: kometa_triatlon 28.5.2005, 22:49
Какие-то у вас понтовые курсачи... У нас и лабы посерьезнее будут.
Ща попробую забацать, правда сделаю не все, надо еще перегрузку операторов вспоминать...
Цитата

Для конструкторов копирования каждого класса предусмотреть диагностическую печать количества его вызовов в определенное место дисплея (рекомендуется использовать статические члены класса).

Интересно, как это сделать?

ЗЫ. А вообще это надо в центр помощи, вот если бы ты что-то сам сделал, тогда другое дело.

Автор: Yanis 28.5.2005, 22:56
Цитата(kometa_triatlon @ 28.5.2005, 22:49)
нтересно, как это сделать?

ответ:
Цитата(kometa_triatlon @ 28.5.2005, 22:49)
рекомендуется использовать статические члены класса


Автор: Stanley 28.5.2005, 22:57
у меня есть похожий курсач... сейчас архив с почты скачаю...

Автор: kometa_triatlon 29.5.2005, 19:03
Цитата
Строки данного класса могут содержать только символы десятичных цифр и символы – и +, задающие знак числа

Получается, что строка может содержать только целые числа, так как запятая или точка не входит в разрешенные символы.
Тогда зачем:
Цитата
метод, определяющий, можно ли представить данное число в формате int;


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

Автор: chipset 29.5.2005, 19:08
Модератор: из C++:Общие вопросы

Автор: kometa_triatlon 29.5.2005, 20:42
Ну вот и перенесли темуsmile


Вобщем, я тут наваял частично.
Что НЕ сделал:
- не перегрузил операцию "-" (просто не допер как smile )
- не сделал метод, определяющий, можно ди представить число как int
(Потому что строка в любом случае содержит целые числа)

-
Цитата
Для конструкторов копирования каждого класса предусмотреть диагностическую печать количества его вызовов в определенное место дисплея

???

Тестовую програму попробуй написать сам, если нужны комментарии, скажешь
MyString.h
Код

#pragma once
#include <iostream>
using namespace std;
class CMyString
{
public:
    char* m_strString;
    int m_iStrLength;

public:
    CMyString(void);
    CMyString(char* newStr);
    CMyString(char newStr);
    CMyString(const CMyString& );
    ~CMyString(void);
    int GetLength();
    bool Clear();

private:
    friend ostream &operator << (ostream &, const CMyString &);
    friend istream &operator >> (istream &, CMyString &);

};



MyString.cpp
Код

#include "StdAfx.h"
#include ".\mystring.h"
#include <assert.h>
#include <string.h>
#include <iostream>
using namespace std;

CMyString::CMyString(void)
{
    m_strString = new char[256];
    m_iStrLength = 0;
}

CMyString::CMyString(char* newStr)
{
    m_strString = new char[256];
    strcpy(m_strString, newStr);
    m_iStrLength = strlen(newStr);
}

CMyString::CMyString(char newStr)
{
    m_strString = new char[256];
    strcpy(m_strString, &newStr);
    m_iStrLength = 1;
}
CMyString::CMyString( const CMyString &copy){
    m_iStrLength = copy.m_iStrLength;
    m_strString = new char[m_iStrLength+1];
    assert(m_strString != 0);
    strcpy(m_strString, copy.m_strString);

}

CMyString::~CMyString(void)
{
    delete [] m_strString;
}

int CMyString::GetLength(){
    return m_iStrLength;
}

bool CMyString::Clear(){
    m_iStrLength = 0;
    strcpy(m_strString,"");
    if (strcmp(m_strString,"")==0 && m_iStrLength == 0) return true;
    return false;
}
ostream &operator << (ostream &output, const CMyString &str){
    output<<str.m_strString;
    return output;
}

istream &operator >> (istream &input, CMyString &str){
    char buffer[256];
    input.getline(buffer,256);
    strcpy(str.m_strString, buffer);
    str.m_iStrLength = strlen(buffer);
    return input;
}


DecString.h
Код

#pragma once
#include "mystring.h"

class CDecString :
    public CMyString
{
public:
    CDecString(void);
    CDecString(char* newStr);
    CDecString(const CDecString& );
    ~CDecString(void);
    

private:
    bool IsDec(char* str);
    int GetNumber(const char* str);

    friend ostream &operator << (ostream &, const CDecString &);
    friend istream &operator >> (istream &, CDecString &);

public:
    const CDecString &operator = (const CDecString&);
    bool operator < (const CDecString&);
    bool operator > (const CDecString&);
};



DecString.cpp
Код

#include "StdAfx.h"
#include ".\decstring.h"
#include <assert.h>

CDecString::CDecString(void)
{
    m_strString = new char[256];
    strcpy(m_strString,"");
    m_iStrLength=0;
}
CDecString::CDecString(char *newStr){
    
    m_strString = new char[256];
    
    if( IsDec(newStr) ){
        strcpy(    m_strString, newStr);
        m_iStrLength = strlen(newStr);
    }
    else {
        strcpy(    m_strString, "");
        m_iStrLength = 0;
    }
}
CDecString::CDecString(const CDecString &copy){
    
    m_strString = new char[m_iStrLength+1];
    
    if(IsDec(copy.m_strString)){
        m_iStrLength = copy.m_iStrLength;
        assert(m_strString != 0);
        strcpy(m_strString, copy.m_strString);
    }
    else{
        strcpy(    m_strString, "");
        m_iStrLength = 0;
    }
}
CDecString::~CDecString(void)
{
}

bool CDecString::IsDec(char *str){
    bool flag = true;
    for( int i=0; i<strlen(str); i++){
        if( str[i] != '0' &&
            str[i] != '1' &&
            str[i] != '2' &&
            str[i] != '3' &&
            str[i] != '4' &&
            str[i] != '5' &&
            str[i] != '6' &&
            str[i] != '7' &&
            str[i] != '8' &&
            str[i] != '9' &&
            ( str[i] != '+' && i != 0) && 
            ( str[i] != '-' && i != 0) 
            )
            
            {
                flag = false;
                break;
            }
    }
    return flag;
}

ostream &operator << (ostream &output, const CDecString &str){
    output<<str.m_strString;
    return output;
}

istream &operator >> (istream &input, CDecString &str){
    char buffer[256];
    input.getline(buffer,256);
    
   if(str.IsDec(buffer)){
        strcpy(str.m_strString, buffer);
        str.m_iStrLength = strlen(buffer);
    }
    else {
        strcpy(str.m_strString,"");
        str.m_iStrLength = 0;
    }
    return input;
}

int CDecString::GetNumber( const char* str){
    char buf[256];
    strcpy(buf, str);
    switch(buf[0]){
        case '+':
            for(int i=0; i<strlen(buf)-1; i++)
                buf[i]=buf[i+1];
            buf[i]='\0';
            return atoi(buf);
            break;

        case '-':
            for(int i=0; i<strlen(buf)-1; i++)
                buf[i]=buf[i+1];
            buf[i]='\0';
            return (0 - atoi(buf));
            break;
        default:
            return atoi(buf);
    }
}

const CDecString &CDecString::operator = (const CDecString &rightValue){
    
    if(&rightValue != this){
        delete [] m_strString;
        m_iStrLength = rightValue.m_iStrLength;
        m_strString = new char[m_iStrLength+1];
        strcpy(m_strString, rightValue.m_strString);
    }

    return *this;
}

bool CDecString::operator < (const CDecString &rightValue){
    return (  GetNumber(m_strString) < GetNumber(rightValue.m_strString));
}
bool CDecString::operator > (const CDecString &rightValue){
    return (  GetNumber(m_strString) > GetNumber(rightValue.m_strString));
}


Кстати, я еще перегрузил операторы << >>, чтобы было удобнее работать.

Текст тестовой программы
Код

// STR.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "MyString.h"
#include "DecString.h"
#include <conio.h>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    CDecString str1("123"), str2("+120");
     
    cout<<(str1<str2?"1":"2");
    getch();
    return 0;
}



Автор: kometa_triatlon 29.5.2005, 23:06
Перегрузил минус...
Код

CDecString operator - ( CDecString &rightValue);


Код

CDecString CDecString::operator - (CDecString &rightValue){
    
    char buf[256];
    sprintf(buf,"%d", GetNumber(m_strString)-rightValue.GetNumber(rightValue.m_strString));
    return CDecString(buf);
}

Автор: Void 30.5.2005, 20:02
Цитата(kometa_triatlon @ 29.5.2005, 22:42)
Код
bool CDecString::IsDec(char *str){
    bool flag = true;
    for( int i=0; i<strlen(str); i++){
        if( str[i] != '0' &&
// поскипано
            str[i] != '9' &&
            ( str[i] != '+' && i != 0) && 
            ( str[i] != '-' && i != 0) 
            )
            
            {
                flag = false;
                break;
            }
    }
    return flag;
}

smile
Код

bool CDecString::IsDec(char *str) {
    if (*str == '+' || *str == '-') ++str;
    if (!isdigit(*str)) return false;
    while (*str && isdigit(*str)) ++str;
    return !*str;
}


Цитата(kometa_triatlon @ 29.5.2005, 22:42)
Код
int CDecString::GetNumber( const char* str){
...
    switch(buf[0]){
        case '+':
...
            return atoi(buf);
            break;
        case '-':
...
            return (0 - atoi(buf));
            break;
        default:
            return atoi(buf);
    }
}

atoi знаковые числа умеет...

По поводу операторов + и -: я подозреваю, что по условию надо работать со строкам, как с длинными целыми числами (массивом цифр), не ограничиваясь int.

Автор: kometa_triatlon 30.5.2005, 21:47
Void
Маньяк smile
IsDec() мне понравилось smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)