Страница 2 из 2

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

Добавлено: 28 ноя 2013, 12:48
Romeo
Если рассказывать нужно с самого начала, то я, пожалуй, просто не влезу в ограничение на количество символов в одном сообщении. Да и писать мне придётся, три дня и три ночи. Это бесполезная трата моего времени. Вероятно, вам проще всего (да и правильнее) будет взять любую книжку по С++, не обязательно даже Страуструпа, печатным вариантом которого легко убить, можно что-то банальное, типа "Как программировать на С++" и прочитать это. Займёт пару дней. После того, как вы перестанете плавать в основах, мы сможем продуктивно пообщаться.

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

Добавлено: 28 ноя 2013, 13:31
Мария1501
Вот программа какая получилась, что то еще не правильно?

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

#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;
}


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

Добавлено: 28 ноя 2013, 15:04
Romeo
Уже лучше.

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

Мария, я ожидаю вопрос не типа "Что тут не так". Что тут не так, вы сами должны знать, если запускали программу. Я ожидаю вопросы такого типа: "Хочу, чтобы работало вот так, а работет иначе. Как исправить?" Вы, наверное, не поверите, если я скажу, что у меня нет под рукой компилятора, так что я не могу проверить работоспобность вашей программы и не могу сказать, "что тут ещё не так".

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

Добавлено: 28 ноя 2013, 17:13
Мария1501
Так дело в том, что я не знаю как конкретно должна работать эта программа, так как я ничего подобного еще не делала никогда, методы как я поняла работают все, и регистр меняется и считается число знаков припинания, но вот со свойствами я не разобралась, так ли всё как надо сделано

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

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

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

str.getchar(1) = 'R';

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

Добавлено: 28 ноя 2013, 21:20
Мария1501
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;
}

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

Добавлено: 29 ноя 2013, 01:42
Romeo
Похоже на правду, осталось только вот тут

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

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

И в punctuation то же самое. Const должен быть в конце, что делает метод константным.

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

Добавлено: 29 ноя 2013, 10:31
Мария1501
[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 выводится

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

Добавлено: 29 ноя 2013, 13:57
somewhere
Чтобы вставляемые комментарии были на русском языке, нужно перед копированием в буфер обмена переключить раскладку на "русскую"

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

Добавлено: 29 ноя 2013, 15:01
Romeo
Да, теперь всё правильно. А R выводиться потому, что мы её присвоили вот в этой строке.

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

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

Но, как и в соседней теме, я заявлю, что никаких свойств в C++ нету. Не нужно путать C++ и C#.