Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: Infinite Retrieval
Дата сообщения: 03.10.2009 23:31

Код:
#include <string>
#include <iostream>

#define MAX 6666
using namespace std;
class my_str
{
    char *str;
public:
    int lenth;
    bool lenth_active;
    int get_lenth();
    static int compare(my_str &some_string1, my_str &some_string2);
    int    concat();
    void init();
    my_str();
    ~my_str();
};

my_str::my_str()
{
    str = new char[MAX];
}
my_str::~my_str()
{
    delete str;
}

int my_str::get_lenth()
{
    int i;
    for(i=0; ((i<MAX)&&(str[i])); i++);
    lenth = i;
    lenth_active = true;
    return i;
}
int my_str::compare(my_str &s1, my_str &s2)
{
    if( (s1.lenth_active)&&(s2.lenth_active) )
        return s1.lenth==s2.lenth ? 0 : s1.lenth>s2.lenth ? 1 : -1 ;
    else
    {
        s1.get_lenth();
        s2.get_lenth();
        compare(s1, s2);
    }
}
void my_str::init()
{
    getline(cin, str, '\n');
}

int main()
{
    my_str in1, in2;
    int what;
    cout << "Enter the first string: ";
    in1.init();
    cout << "The lenth of the first string is " << in1.get_lenth() << "\n";
    
    cout << "Enter the second string: ";
    in2.init();
    cout << "The lenth of the second string is " << in2.get_lenth() << "\n";
    
    what = my_str::compare(in1, in2);
    if(what == 0)
        cout << "The lenths of both strings are the same.";
    else
        if(what == 1)
            cout << "The first string is longer.";
        else
            if(what == -1)
                cout << "The second string is longer.";

    return 0;
}
Автор: Abs62
Дата сообщения: 03.10.2009 23:45
Infinite Retrieval

Код: void my_str::init()
{
string sss;
getline(cin, sss, '\n');
strncpy(str,sss.c_str(),MAX);
}
Автор: Eminence
Дата сообщения: 04.10.2009 00:01
А можно так:
void my_str::init()
{
cin.getline(str,MAX);
}

Функция getline предназначена для ввода std-шной строки string.

и еще обрати внимание:
int my_str::compare(my_str &s1, my_str &s2)
{
if( (s1.lenth_active)&&(s2.lenth_active) )
return s1.lenth==s2.lenth ? 0 : s1.lenth>s2.lenth ? 1 : -1 ;
else
{
s1.get_lenth();
s2.get_lenth();
compare(s1, s2);
//НУЖНО ВЕРНУТЬ ЗНАЧЕНИЕ (по идее, компиллятор должен выдать Warning)
}
}
Автор: Infinite Retrieval
Дата сообщения: 04.10.2009 00:08
там надо написать return compare(s1, s2);

Цитата:

void my_str::init()
{
string sss;
getline(cin, sss, '\n');
strncpy(str,sss.c_str(),MAX);
}

Хм... меня принуждают к использованию класса string. А неклассовых функций считывающих до конца строки нет? Наверно есть считывание файла до конца строки, а за файл можно взять поток ввода, у него же есть дескриптор.
Автор: Abs62
Дата сообщения: 04.10.2009 00:21
Infinite Retrieval
А чем вариант от Eminence не нравится?
Есть, конечно, сишная scanf, но лаба-то по C++.
Автор: Infinite Retrieval
Дата сообщения: 04.10.2009 10:39

Цитата:
cin.getline(str,MAX);

Я просто такую конструкцию впервые в жизни вижу, надо бы разобраться в этой системе ввода\вывода, ведь выходит, что cin это не только поток, но и объект.
Автор: c0d3r
Дата сообщения: 04.10.2009 12:23
Infinite Retrieval



Цитата:
my_str::my_str()
{
str = new char[MAX];
}
my_str::~my_str()
{
delete str;
}


Здесь, вместо delete нужно вызывать delete[].

Abs62


Цитата:
void my_str::init()
{
string sss;
getline(cin, sss, '\n');
strncpy(str,sss.c_str(),MAX);
}


В данном коде есть шанс, что в str не будет нулевого символа, означающего конец строки (в случае, если пользователь введёт >= MAX символов).

Infinite Retrieval


Цитата:
Хм... меня принуждают к использованию класса string. А неклассовых функций считывающих до конца строки нет


Попробуйте cin.getline(): http://www.cppreference.com/wiki/io/getline
Автор: Infinite Retrieval
Дата сообщения: 07.10.2009 19:02
Подскажите, а как можно проверить выделенна ли память под данный указатель? Тобишь на входе я знаю адресс и размер, а на выходе я получаю ответ - вмещается ли массив в выделенную память, или нет?
Автор: Lyrik
Дата сообщения: 07.10.2009 22:21
Infinite Retrieval
документировано, и чтобы на все платформах - никак в винде правда можно узнать реальный размер используемой памяти, если конечно юзается ее апи.
Автор: x_under
Дата сообщения: 09.10.2009 22:00
ЗДравствуйте!! у меня вопрос. Я пытаюсь разобраться со средой Vigual Studio C++ 2005.
Я хочу чтоб программа вывела мне на табло самый обычный текст, и остановилась. Но она почему-то не останавливается... проходит на вылет!!!

Вот что я пишу:
===============
#include "stdafx.h"
#include "iosream.h"

void main()
{
    cout << "HEEEEKLLLLLLLOO";
    int x;
    cin >> x;
}

================
и еще, где можно посмотреть, какие ошибки я допускаю в написании... если таковые есть... а они обязательно врадутся но потом)
Автор: Lyrik
Дата сообщения: 10.10.2009 22:41
x_under
ошибки выводятся в Error List (View->Error List), а также полезная информация есть в Output (View->Output).
по поводу программы: на вскидку будут ерроры, что неизвестны cout и cin. напиши так:

Код: #include "stdafx.h"
#include <iostream>

using namespace std;

void main()
{
cout << "HEEEEKLLLLLLLOO";
int x;
cin >> x;
}
Автор: Dukat
Дата сообщения: 11.10.2009 07:48
x_under
Перед закрывающей фигурной скобкой добавь

Код: system("PAUSE");
Автор: Infinite Retrieval
Дата сообщения: 14.10.2009 16:51

Код:
#include <stdio.h>
int main()
{
char my1[33];
char my2[33];
scanf("%[a-z]", my1);
scanf(" %[a-z]", my2); // ПРОБЕЛ!!!
return 0;
}
Автор: x_under
Дата сообщения: 16.10.2009 19:20
Lyrik
Dukat

Огромное Вам спасибо! Попробовал сделать как вы сказали, все заработало! вот только я снова допустил ошибку(ну вроди ошибка все-таки)
написал тот же код для вывода сообщения, и просто набор символов... вот так в общем:

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

using namespace std;

void main()
{
cout << "Hello"; ghi;o
system("PAUSE");
}
//-----------------------------------

Но почему-то программа всего лишь вывела три ошибки в Error list, и спокойно вывела результат работы на экран. Она разве не должна была просто остановиться после выполненной компиляции? Ну дескать: "не буду работать, пока ошибку не исправишь")))))))
Автор: mazafakermazafaka
Дата сообщения: 16.10.2009 21:18
  
Автор: akaGM
Дата сообщения: 22.10.2009 15:38
два примитивных вопроса:

const double p;
что это за объявление?

const double& getVal() const;
что же возвращает эта функа? смысл этих const
и что означает последняя const? что-то типа static?
Автор: xterm
Дата сообщения: 22.10.2009 16:08
akaGM

Цитата:
const double p;

Объявляется переменная типа double, и все попытки изменить её значение будут пресекаться компилятором. Обычно пишется const double p = чему-то;


Цитата:
const double& getVal() const;

Возвращает reference (кажетсо "ссылка" на русском) на переменную типа double, при этом функция может быть использована даже для инициализации константы, то есть что-то типа
const double& someRef = someObject.getVal();
а последняя const говорит компилятору что эта функция не должна менять данные внутри класса, соответственно если такая попытка будет, вылезет ошибка компиляции. Вроде ничего не напутал.
Автор: akaGM
Дата сообщения: 22.10.2009 16:24
xterm

Цитата:
Обычно пишется const double p = чему-то;

во-во...
в определении (дословно) стоит
Код:
const double* pD;
const string mName;
Автор: xterm
Дата сообщения: 22.10.2009 16:36
akaGM

Цитата:
const double* pD;

Это уже совсем другое, это указатель на double, который не позволит сделать *pD = что-то.
То есть сам pD можно изменить, а объект на который указывает pD, с помощью этого указателя компилятор изменить не даст.
Автор: akaGM
Дата сообщения: 22.10.2009 17:04
xterm
ясн...

ну а это?
const string mName;
чё здесь нельзя?
Автор: xterm
Дата сообщения: 23.10.2009 01:43
akaGM

Цитата:
const string mName;
чё здесь нельзя?

Не могу представить зачем такое нужно - пустой стринг, значение которого не может быть изменено. Разве что использовать вместо функции string::empty() для проверки других стрингов. Не понимаю.
А как он используется, есть код? Может там дальше ему const_cast делают?
Автор: akaGM
Дата сообщения: 23.10.2009 13:48
xterm

Цитата:
Не могу представить зачем такое нужно - пустой стринг, значение которого не может быть изменено.


оcобо ещё не смотрел, но вот как-то так:

Код: class aaa {
aaa(const string &name);
const string& GetName() const;
void Init(const string &name, ...);

const string mName;
}

в конструкторе
aaa::aaa(const string &name): mName(name)...

const string& aaa::GetName() const{ return mName;}
void aaa::Init(const string &name,...)
{
mName=name; //а так льзя?
}
Автор: xterm
Дата сообщения: 23.10.2009 14:32
akaGM

Цитата:
а так льзя?

В здравом уме и твёрдой памяти я бы сказал что нет. А это случайно не managed C++ под .Net? Там должен быть аналог шарповского readonly, который можно инициализировать в конструкторе класса, но даже там это нельзя сделать в любой другой функции. Если это он, то я не в курсе. Этот код компилируется? Что за компилятор?
Автор: akaGM
Дата сообщения: 23.10.2009 14:38
xterm
и тем не менее это так...
компилятор тут ни причём (это исходник библиотеки) -- межплатформа, mak'и под
bcc32, vc, gсс, cygwin и что-то под mac

хочешь, глянь:
код (25 кил)
Автор: xterm
Дата сообщения: 23.10.2009 15:08
akaGM
Я не могу это объяснить, мануал говорит что так нельзя.
Вот так aaa::aaa(const string &name): mName(name) можно, и больше никак.
Автор: akaGM
Дата сообщения: 23.10.2009 15:19
xterm
ок, спас за внимание...
главное, мне понятно _что_ делается, а уж как... разберёмся...
Автор: xterm
Дата сообщения: 23.10.2009 15:20
akaGM
Не за что. Я проверил на Visual Studio, он такое не компилирует, вываливает ошибку на месте присвоения значения константе
Автор: akaGM
Дата сообщения: 23.10.2009 15:29
xterm
хренасе...

под чем же это собиралось?
ага, под 2003, а это cl версии 7.0
Автор: Lyrik
Дата сообщения: 23.10.2009 15:32
akaGM

Цитата:
void aaa::Init(const string &name,...)
{
mName=name; //а так льзя?
}

нет есно. xterm прав. дополню по поводу:

Цитата:
const string& GetName() const;


Цитата:
а последняя const говорит компилятору что эта функция не должна менять данные внутри класса, соответственно если такая попытка будет, вылезет ошибка компиляции.

на самом деле в методе можно менять значение данных класса, но только mutable данных.

Добавлено:
akaGM
глянул код. там так меняется член данных mName класса RefinablePar, а не член данных класса RefParType, где и идет объявление const string mName.
Автор: akaGM
Дата сообщения: 23.10.2009 15:43
Lyrik
гы Зоркий Сокол, спасибо...
извиняйте, что напряг всех своим "знанием" С++
всё равно придётся всё конвертировать



ещё вопрос:

Код: #define Vector_long Vector<long>

Vector -- класс

int N = 30;
Vector_long swapIndex(N);

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.