Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Лысков Игорь Витальевич
Статус: Младший модератор
Рейтинг: 254
∙ повысить рейтинг >>
Micren
Статус: Практикант
Рейтинг: 247
∙ повысить рейтинг >>
_Ayl_
Статус: 3-й класс
Рейтинг: 113
∙ повысить рейтинг >>

∙ / КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1322 от 04.06.2009, 00:05
Администратор рассылки: Dr_Andrew, Младший модератор
В рассылке: подписчиков - 626, экспертов - 142
В номере: вопросов - 5, ответов - 7

Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
оценить выпуск >>

Вопрос № 168512: Здраствуйте, Пробую использовать cin и cout в for цикле, в приложении код, компилируется нормально, но при выполннении выбрасывает ошибку на команде cin>>tmpChar; подскажите в чем проблема и как её решить? заранее спасибо. з.ы. Использ...


Вопрос № 168513: Пожалуйста,помогите с написанием кода сортировки массива простым подсчетом на С++Builder!Данные для сортировки вводятся случайным образом компьютером,но пользователь ограничивает их кол-во....
Вопрос № 168488: ПОМОГИТЕ С ДВУМЯ ПРОСТЕЙШИМИ ЗАДАЧАМИ.... *****1***** Билли Бонс положил в сундук некоторое количество золотых монет. На второй год он вынул из сундука сколько-то монет. Начиная с третьего года, он добавлял столько монет, сколько было в сундуке...
Вопрос № 168519: Здраствуйте, появился еще вопрос :( Создаю массив объектов, потом вызываю каждому объекту метод, но наверно чтото зделал нетак, т.к. все елементы массива указывают на тотже объект в приложе...
Вопрос № 168520: подскажите пожалуйста как составить строковую функцию num_to_str(n), где n-целое число(|n|<1000) возвращаемое значение должно быть строкой, в которой число n представлено словами. Я нашёл вот такой код, но похоже это не то......

Вопрос № 168512:

Здраствуйте,
Пробую использовать cin и cout в for цикле, в приложении код, компилируется нормально, но при выполннении выбрасывает ошибку на команде cin>>tmpChar; подскажите в чем проблема и как её решить?
заранее спасибо.
з.ы. Использую Dev-C++

Отправлен: 29.05.2009, 18:46
Вопрос задал: Станислав, 1-й класс
Всего ответов: 2
Страница вопроса >>


Отвечает AMV007, 2-й класс :
Здравствуйте, Станислав.
сначала надо бы выделить память для результата, например :
char* tmpChar = new char[255];
char* tmpChar2= new char[255];
-----
Работать, работать и еще раз работать (да не, шутка :) )

Ответ отправил: AMV007, 2-й класс
Ответ отправлен: 29.05.2009, 20:02

Оценка ответа: 5

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 250034 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Отвечает Micren, Практикант :
    Здравствуйте, Станислав.
    Вы объявили 2 указателя
    Код:

    char* tmpChar;
    char* tmpChar2;

    В C++ автоматические переменные не инициализируются ничем. Фактически в ваших переменных-указателях содержится "мусор", который был в памяти. Поэтому когда потоковый класс cin, которому Вы передали эти указатели как параметры, при попытке записи в память по адресу, который в этих указателях содержится, вызывает исключение. Т.к. приложение не может писать в память куда ему вздумается.

    Обязательно надо выделить память для хранения этих значений. Не обязательно делать это динамически используя new или malloc(). Для вашей задачи< br>вполне достаточно:
    Код:

    char tmpChar[100];
    char tmpChar2[100];

    Здесь тоже фактически объявляются два константных указателя. Но на область памяти размером в 100*sizeof(char) байт.
    Следует сказать, что это не застрахует Вас от ошибок если пользователь, от нечего делать, введет имя длиннее этого размера.
    Лучше пользоваться.
    Код:

    cin.get(tmpChar,100);

    Вторым параметром передается размер принимающего буфера .

    Учитывая, что Вы пишете на C++ лучше пользоваться вместо указателей на char строковым классом из STL string который избавит Вас от этих проблем.
    Код:

    #include <limits>
    #include <iostream>
    #include <string>

    using namespace std;

    int main(int argc, char *argv[])
    {
    int studCount;
    string firstName,lastName;
    cout<<"Count: ";
    cin>>studCount;
    for(int i = 0; i < studCount; ++i)
    {
    cout<<"Input "<<i+1<<" Firstname: ";
    cin>>firstName;
    cin.ignore(numeric_limits<streamsize>::max(),'\n');
    cout<<"Input "<<i+1<<&qu ot; Lastname: ";
    cin>>lastName;
    cin.ignore(numeric_limits<streamsize>::max(),'\n');
    cout<<endl;
    }
    system("PAUSE");
    return 0;
    }

    Ответ отправил: Micren, Практикант
    Ответ отправлен: 29.05.2009, 21:06

    Оценка ответа: 5

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 250037 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!



    Вопрос № 168513:

    Пожалуйста,помогите с написанием кода сортировки массива простым подсчетом на С++Builder!Данные для сортировки вводятся случайным образом компьютером,но пользователь ограничивает их кол-во.

    Отправлен: 29.05.2009, 19:54
    Вопрос задал: РЫЖОВА АЛИНА ИГОРЕВНА, Посетитель
    Всего ответов: 1
    Страница вопроса >>


    Отвечает Ross, Практикант :
    Здравствуйте, РЫЖОВА АЛИНА ИГОРЕВНА.

    Сортировка подсчетом:
    Код:
       /* Функция сортировки подсчетом.
    *
    * Параметры:
    * a - указатель на массив
    * N - номер последнего элемента
    * Заметка:
    * Элементы массива должны быть уникальны (ограничение алгоритма).
    */
    template <class Ty> void CountingSort(Ty* a, int N)
    {
    // выделяем вспомогательный массив
    Ty* tmp = new Ty[N+1];

    for (int i=0; i<=N; ++i)
    {
    // количество элементов меньших a[i]
    int k = 0;

    for (int j=0; j<i; ++j) if (a[j] < a[i]) ++k;
    for (int j=i+1; j<=N; ++j) if (a[j] < a[i]) ++k;

    // вставляем a[i] на место k+1
    tmp[k] = a[i];
    }

    // копируем значения из вспомогательного массива в основной
    memcpy(a, tmp, (N+1) * sizeof(Ty));
    delete [] tmp;
    }

    -----
    Доступно только то, что видимо (c) Б. Керниган

    Ответ отправил: Ross, Практикант
    Ответ отправлен: 01.06.2009, 00:32

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 250131 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!



    Вопрос № 168488:

    ПОМОГИТЕ С ДВУМЯ ПРОСТЕЙШИМИ ЗАДАЧАМИ....
    *****1*****
    Билли Бонс положил в сундук некоторое количество золотых монет. На второй год он вынул из сундука сколько-то монет. Начиная с третьего года, он добавлял столько монет, сколько было в сундуке два года назад.

    Требуется написать программу, которая определит, сколько монет было в сундуке в первый и во второй года, если в X-м году там оказалось ровно Y монет.
    Входные данные

    Входной файл INPUT.TXT содержит натуральные числа X и Y (3 <= X <= 20, 1 <= Y <= 32767).
    Выходные данные

    В выходной файл OUTPUT.TXT выведите через пробел количество монет в первый и второй года. Гарантируется, что решение задачи всегда существует.
    Пример
    № INPUT.TXT OUTPUT.TXT
    1 6 25 5 2

    Пояснение к примеру
    Если в первый год положить 5 монет, а во второй год вынуть 3 монеты, то начиная с первого года в сундуке будет 5, 2, 7, 9, 16, 25, ... монет.


    *****2*****
    Возьмем четырехзначное число, в котором не все цифры одинаковы, например 6264. Расположим цифры сначала в порядке убывания - 6642; затем, переставив их в обратном порядке, получим 2466. Вычтем последнее число из 6642. На следующем шаге с полученной разностью проделаем тоже самое. Через несколько таких действий получится число, переходящее само в себя и называемое постоянной Капрекара.

    Требуется написать программу, которая находит эту постоянную и количество шагов для ее получения из заданного четырехзначного числа.
    Входные данные

    Входной файл INPUT.TXT содержит одну строку, в которой записано четырехзначное число.
    Выходные данные

    В выходной файл OUTPUT.TXT записываются: в первой строке постоянная Капрекара, во второй – количество шагов для ее получения.
    Пример
    № INPUT.TXT OUTPUT.TXT
    1 1234 6174
    3

    Отправлен: 29.05.2009, 10:57
    Вопрос задал: jahon, Посетитель
    Всего ответов: 2
    Страница вопроса >>


    Отвечает Koзлов Валерий Викторович, 1-й класс :
    Здравствуйте, jahon.

    Могу помочь решить 1-ую задачу математически. Оформить программно не могу, т.к. работаю не на этой программе.
    Итак решение:
    (При решении учитывается что в Х-м году деньги Билли Бонс в сундук уже ложил)
    Чтобы узнать сколько денег было положено в первый год в сундук надо M1=(Y-1):X, от полученного результата извлечь целую часть, это и будет ответом сколько в 1-ый год положили денег в сундук. Сколько было в сундуке во второй год лучше узать так: M2=Y-M1*(Y-2)

    Ответ отправил: Koзлов Валерий Викторович, 1-й класс
    Ответ отправлен: 29.05.2009, 12:39

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 250012 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Отвечает Micren, Практикант :
    Здравствуйте, jahon.
    1я задача
    Код:

    #include <fstream>

    using namespace std;

    int main()
    {
    ifstream in("INPUT.TXT");
    ofstream out("OUTPUT.TXT");
    int X,Y;
    in>>X>>Y;
    int Cx=1,Cy=1,Year=X-2;
    while(--Year)
    {
    int tmp=Cx+Cy;
    Cx=Cy;
    Cy=tmp;
    }
    int x,y=0;
    do
    {
    int numerator=Y-y*Cy;
    x=numerator/Cx;
    if(numerator%Cx)continue;
    out<<x<<' '<<y<<endl;
    } while (y++<=x);
    return 0;
    }


    2я задача
    Код:

    #include <fstream>
    #include <vector>
    #include <algorithm>
    #include <functional>

    using namespace std;

    class result
    {
    public:
    result(int kaprecar,int steps)
    :_kaprecar(kaprecar)
    ,_steps(steps)
    {}
    int kaprecar()
    {
    return _kaprecar;
    }
    int steps()
    {
    return _steps;
    }
    private:
    int _kaprecar;
    int _steps;
    };

    result calc(int N)
    {
    typedef vector<char> dVector;
    dVector digits;
    int iterCount=0;
    while(true)
    {
    int oldN=N;
    int count=4;
    while(count-->0)
    {
    digits.push_back(N%10);
    N/=10;
    }
    sort(digits.begin(),digits.end(),less<int>());
    int N1=0,N2=0,mult=1;
    for(dVector::const_iterator it=digits.begin();it!=digits.end();++it)
    {
    N1=N1*10+*it;
    N2=*it*mult+N2;
    mult*=10;
    }
    digits.clear();
    N= N2-N1;
    ++iterCount;
    if(oldN==N)
    {
    return result(N,iterCount-1);
    }
    }
    }

    int main()
    {
    int N;
    ifstream in("INPUT.TXT");
    ofstream out("OUTPUT.TXT");
    in>>N;
    result r=calc(N);
    out<<r.kaprecar()<<endl
    <<r.steps()<<endl;
    return 0;
    }

    Ответ отправил: Micren, Практикант
    Ответ отправлен: 29.05.2009, 13:02

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 250013 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!



    Вопрос № 168519:

    Здраствуйте, появился еще вопрос :(
    Создаю массив объектов, потом вызываю каждому объекту метод, но наверно чтото зделал нетак, т.к. все елементы массива указывают на тотже объект в приложении файлы.
    Работа программы:
    Skolko studentov: 3
    vvedite 1 imia: 1

    vvedite 1 familiju: 2

    vvedite 2 imia: 3

    vvedite 2 familiju: 4

    vvedite 3 imia: 5

    vvedite 3 familiju: 6

    6
    6

    у первого и у второго студента показывает фамилию 6, хотя должно быть:
    2
    4
    Подскажите как это исправить?
    заранее спасибо.

    Отправлен: 29.05.2009, 20:01
    Вопрос задал: Станислав, 1-й класс
    Всего ответов: 1
    Страница вопроса >>


    Отвечает Micren, Практикант :
    Здравствуйте, Станислав.
    Надо понимать, что такое char*. Это не строка. Это указатель(адрес в памяти) где эта строка хранится. Поэтому в тех методах, где вы передаете char*
    и сохраняете в переменные-члены класса. Вы сохраняете адрес на строку. Фактически адрес памяти выделенный оператором new. Но этот адрес используется чисто для буфера, куда Вы вводите имена и фамилии. В итоге по этому адресу располагаются последние введенные данные. Отсюда и такой результат. Это не правильный(ошибочный) подход.

    Необходимо выделять память для строки, копировать ее и для всех классов использующих динамику обязательно определять деструктор, конструктор копирования и операцию присваивания.

    Вот Ваша программа:
    person.h
    Код:

    #pragma once

    class person
    {
    public:
    // Конструктор
    person(const char* const firstName=0,const char* const lastName=0);
    // Конструктор копирования
    person(const person& l);
    // Оператор присваивания
    person& operator=(const person& l);
    // Деструктор
    virtual ~person();
    const char* lastName() const;
    const char* firstName() const;
    private:
    void dispose();
    char* alloc(const char* const str);
    char* _firstName;
    char* _lastName;
    };

    person.cpp
    Код:

    #include <cstring>
    #include "person.h"

    const char* person::firstName() const
    {
    return _firstName;
    }

    const char* perso n::lastName() const
    {
    return _lastName;
    }

    person::~person()
    {
    dispose();
    }

    person::person( const char* const firstName,const char* const lastName )
    :_firstName(alloc(firstName))
    ,_lastName(alloc(lastName))
    {
    }

    person::person( const person& l ) :_firstName(alloc(l._firstName))
    ,_lastName(alloc(l._lastName))
    {

    }
    char* person::alloc( const char* const str )
    {
    if(str)
    {
    size_t len=strlen(str)*sizeof(char)+1;
    char* buffer=new char[len];
    strcpy(buffer,str);
    return buffer;
    }
    else return 0;
    }

    person& person::operator=( const person& l )
    {
    if(this!=&l)
    {
    dispose();
    _firstName=alloc(l._firstName);
    _lastName=alloc(l._lastName);
    }
    return *this;
    }

    void person::dispose()
    {
    if(_firstName)
    {
    delete[] _firstName;
    }
    if(_lastName)
    {
    delete[] _lastName;
    }
    }

    student.h
    Код:

    #pragma once

    #include "person.h"

    class student : public person
    {
    public:
    student(const char* const firstName=0, const char* const lastName=0,int rate=0);
    int rate() const;
    private:
    int _rate;
    };

    student.cpp
    Код:

    #include "student.h"

    student::student( const char* const firstName, const char* const lastName,int rate/*=0*/ )
    :person(firstName,lastName)
    ,_rate(rate)
    {

    }

    inline int student::rate() const
    {
    return _rate;
    }

    main.cpp
    Код:

    #include <limits>
    #include <cstdlib>
    #include <iostream>
    #include "student.h"

    using namespace std;

    int main(int argc, char *argv[])
    {
    int studCount;
    const size_t bufSize=25;
    char* firstName = new char[bufSize];
    char* lastName = new char[bufSize];

    cout<<"Students count: ";
    cin>>studCount;
    cin.ignore(numeric_limits<streamsize>::max(),'\n');
    student* students = new student[studCount];
    for(int i = 0; i < studCount; i++) {
    cout<<"Input "<<i+1<<" Firstname: ";
    cin.get(firstName,bufSize);
    cin.ignore(numeric_limits<streamsize>::max(),&# 39;\n');
    cout<<"Input "<<i+1<<" Lastname: ";
    cin.get(lastName,bufSize);
    cin.ignore(numeric_limits<streamsize>::max(),'\n');
    cout<<endl;
    students[i]=student(firstName,lastName);
    }
    delete[] firstName;
    delete[] lastName;
    for(int i=0;i<studCount;++i)
    {
    cout<<students[i].firstName()<<' '<<students[i].lastName()<<endl;
    }
    delete[] students;
    system("PAUSE");
    return EXIT_SUCCESS;
    }

    Ответ отправил: Micren, Практикант
    Ответ отправлен: 29.05.2009, 22:23

    Оценка ответа: 5

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 250041 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!



    Вопрос № 168520:

    подскажите пожалуйста как составить строковую функцию num_to_str(n), где n-целое число(|n|<1000) возвращаемое значение должно быть строкой, в которой число n представлено словами.

    Я нашёл вот такой код, но похоже это не то...

    Отправлен: 29.05.2009, 21:05
    Вопрос задал: Алексей3791, Посетитель
    Всего ответов: 1
    Страница вопроса >>


    Отвечает Piter, 3-й класс :
    Здравствуйте, Алексей3791.

    По - моему вот так больше подходит к условию

    Приложение:

    Ответ отправил: Piter, 3-й класс
    Ответ отправлен: 30.05.2009, 10:45

    Оценка ответа: 3
    Комментарий к оценке:
    k:\ïðîãðàììèðîâàíèå\mine\mine\kurs\kursovic\krac.cpp(27) : error C2065: 'CharToOEm' : undeclared identifier
    k:\ïðîãðàììèðîâàíèå\mine\mine\kurs\kursovic\krac.cpp(28) : error C2440: 'return' : cannot convert from 'char' to 'char *'
    почему у меня не запускается?

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 250056 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!



    Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
    оценить выпуск >>

    подать вопрос экспертам этой рассылки >>

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.0 beta от 24.05.2009

    В избранное