Задачка на C++, ПОМОГИТЕ ПОЖАЛУЙСТА НЕДОПРОГРАММИСТУ

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Если рассказывать нужно с самого начала, то я, пожалуй, просто не влезу в ограничение на количество символов в одном сообщении. Да и писать мне придётся, три дня и три ночи. Это бесполезная трата моего времени. Вероятно, вам проще всего (да и правильнее) будет взять любую книжку по С++, не обязательно даже Страуструпа, печатным вариантом которого легко убить, можно что-то банальное, типа "Как программировать на С++" и прочитать это. Займёт пару дней. После того, как вы перестанете плавать в основах, мы сможем продуктивно пообщаться.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Мария1501
Сообщения: 10
Зарегистрирован: 26 ноя 2013, 19:51

Вот программа какая получилась, что то еще не правильно?

Код: Выделить всё

#include <cstdlib>
#include <iostream>
#include <Windows.h>
 
using namespace std;
 
class String
{
private:
    char* str;
    int n; 
public:
    String(char* string = "")
    {
        n = strlen(string);
        str = new char[n + 1];
        strcpy(str, string);
    }
 
    String(char* string, size_t size)  //конструктор, позволяющий создать строку из size символов
    {
        n = size;
        str = new char[n + 1];      
        strncpy(str, string, n);
        if (strlen(string) > size)
             str[n] = '\0';
    }
 
    ~String()
    {
        if (str)
        delete [] str;
    }
 
    void print()
    {
        std::cout << str << std::endl;
    }
 
    int const getnum() //кол-во символов в строке
    {
        return n;
    }
 
    char const getchar(int n) // символ из позиции n
    {
        return str[n - 1];
    }
 
    void upper()  // в верхний регистр
    {
        for (int i = 0; i < n; i++)
            str[i] = toupper((unsigned char)str[i]);
    }
 
    int const punctuation() // кол-во знаков препинания
    {
        int count = 0;
        for (int i = 0; i < n; i++)
        if (ispunct((unsigned char)str[i]))
            count++;
        return count;
    }
};
 
int main()
{ 
    setlocale(0, "");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    char s[255];
    std::cin.getline(s, 255);
    String str(s);
    str.upper();
    str.print();
 
    std::cout << str.getnum() << std::endl;
    std::cout << str.punctuation() << std::endl;
    std::cout << str.getchar(1) << std::endl;
 
    String str2(s, 3); 
 
    str2.upper();
    str2.print();
 
    std::cout << str2.getnum() << std::endl;
    std::cout << str2.punctuation() << std::endl;
    std::cout << str2.getchar(1) << std::endl;
 
    system("PAUSE");
    return 0;
}

Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Уже лучше.

Не понятны только выражения "char const" и "inst const" в двух методах. Вероятно, const хотели поставить после имени метода, чтобы сделать метод константным, но втулили не туда. Оно, конечно, компилируется, но работает не так, как ожидается. Неправильность работы не видна за счёт того, что в программе нигде не создаётся константный объект типа Str.

Мария, я ожидаю вопрос не типа "Что тут не так". Что тут не так, вы сами должны знать, если запускали программу. Я ожидаю вопросы такого типа: "Хочу, чтобы работало вот так, а работет иначе. Как исправить?" Вы, наверное, не поверите, если я скажу, что у меня нет под рукой компилятора, так что я не могу проверить работоспобность вашей программы и не могу сказать, "что тут ещё не так".
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Мария1501
Сообщения: 10
Зарегистрирован: 26 ноя 2013, 19:51

Так дело в том, что я не знаю как конкретно должна работать эта программа, так как я ничего подобного еще не делала никогда, методы как я поняла работают все, и регистр меняется и считается число знаков припинания, но вот со свойствами я не разобралась, так ли всё как надо сделано
Вложения
Безымянный..jpg
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Перечитал внимательно задание и сравнил с кодом. Не работает самое последнее требование. Свойство getchar на данный момент позволяет только вернуть символ (то есть чтение), но никак не записать его. Для того, чтобы можно было записывать в тот символ, который мы вернули, символ нужно возвращать не по значению, а по ссылке. После этого в главной программе можно будет написать следующую строчку кода (и она будет работать):

Код: Выделить всё

str.getchar(1) = 'R';
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Мария1501
Сообщения: 10
Зарегистрирован: 26 ноя 2013, 19:51

Romeo писал(а):Перечитал внимательно задание и сравнил с кодом. Не работает самое последнее требование. Свойство getchar на данный момент позволяет только вернуть символ (то есть чтение), но никак не записать его. Для того, чтобы можно было записывать в тот символ, который мы вернули, символ нужно возвращать не по значению, а по ссылке. После этого в главной программе можно будет написать следующую строчку кода (и она будет работать):

Код: Выделить всё

str.getchar(1) = 'R';

У меня получилось вот так, а должно так выводиться первая R??

Код: Выделить всё

#include <cstdlib>
#include <iostream>
#include <Windows.h>
 
using namespace std;
 
class String
{
private:
    char* str;
    int n; 
public:
    String(char* string = "")
    {
        n = strlen(string);
        str = new char[n + 1];
        strcpy(str, string);
    }
 
    String(char* string, size_t size)  //конструктор, позволяющий создать строку из size символов
    {
        n = size;
        str = new char[n + 1];      
        strncpy(str, string, n);
        if (strlen(string) > size)
             str[n] = '\0';
    }
 
    ~String()
    {
        if (str)
        delete [] str;
    }
 
    void print()
    {
        std::cout << str << std::endl;
    }
 
    int const getnum() //кол-во символов в строке
    {
        return n;
    }
 
    char& getchar(int n) // символ из позиции n
    {
          
        return str[n - 1];
        
    }
 
    void upper()  // в верхний регистр
    {
        for (int i = 0; i < n; i++)
            str[i] = toupper((unsigned char)str[i]);
    }
 
    const int  punctuation() // кол-во знаков препинания
    {
        int count = 0;
        for (int i = 0; i < n; i++)
        if (ispunct((unsigned char)str[i]))
            count++;
        return count;
    }
};
 
int main()
{ 
    
    setlocale(0, "");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    char s[255];
    std::cin.getline(s, 255);
    String str(s);
    str.getchar(1) = 'R';
    str.upper();
    str.print();
    
 
    std::cout << str.getnum() << std::endl;
    std::cout << str.punctuation() << std::endl;
    std::cout << str.getchar(1) << std::endl;
 
    system("PAUSE");
    return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Похоже на правду, осталось только вот тут

Код: Выделить всё

int const getnum() //кол-во символов в строке
const переместить и поставить после имени метода и после скобок (так, чтобы он в конце строки оказался).

И в punctuation то же самое. Const должен быть в конце, что делает метод константным.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Мария1501
Сообщения: 10
Зарегистрирован: 26 ноя 2013, 19:51

[ATTACH]1838[/ATTACH]

Код: Выделить всё

#include <cstdlib>
#include <iostream>
#include <Windows.h>
 
using namespace std;
 
class String
{
private:
    char* str;
    int n; 
public:
    String(char* string = "")
    {
        n = strlen(string);
        str = new char[n + 1];
        strcpy(str, string);
    }
 
    String(char* string, size_t size)  //êîíñòðóêòîð, ïîçâîëÿþùèé ñîçäàòü ñòðîêó èç size ñèìâîëîâ
    {
        n = size;
        str = new char[n + 1];      
        strncpy(str, string, n);
        if (strlen(string) > size)
             str[n] = '\0';
    }
 
    ~String()
    {
        if (str)
        delete [] str;
    }
 
    void print()
    {
        std::cout << str << std::endl;
    }
 
    int  getnum()const //êîë-âî ñèìâîëîâ â ñòðîêå
    {
        return n;
    }
 
    char& getchar(int n) // ñèìâîë èç ïîçèöèè n
    {
          
        return str[n - 1];
        
    }
 
    void upper()  // â âåðõíèé ðåãèñòð
    {
        for (int i = 0; i < n; i++)
            str[i] = toupper((unsigned char)str[i]);
    }
 
    int  punctuation() const // êîë-âî çíàêîâ ïðåïèíàíèÿ
    {
        int count = 0;
        for (int i = 0; i < n; i++)
        if (ispunct((unsigned char)str[i]))
            count++;
        return count;
    }
};
 
int main()
{  
    setlocale(0, "");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    char s[255];
    std::cin.getline(s, 255);
    String str(s);
    
    str.upper();
    str.print();
    str.getchar(1) = 'R';
    
 
    std::cout << str.getnum() << std::endl;
    std::cout << str.punctuation() << std::endl;
    std::cout << str.getchar(1) << std::endl;
 
    system("PAUSE");
    return 0;
}
Надеюсь я правильно всё поняла?Только не поняла почему R выводится
Вложения
Безымянный..jpg
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Чтобы вставляемые комментарии были на русском языке, нужно перед копированием в буфер обмена переключить раскладку на "русскую"
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Да, теперь всё правильно. А R выводиться потому, что мы её присвоили вот в этой строке.

Код: Выделить всё

 str.getchar(1) = 'R';
Это была проверка записываемости свойства, если выражаться в той терминологии, которой придерживается преподаватель.

Но, как и в соседней теме, я заявлю, что никаких свойств в C++ нету. Не нужно путать C++ и C#.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить