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

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


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

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

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

_Ayl_
Статус: Студент
Рейтинг: 1384
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 1130
∙ повысить рейтинг »
Micren
Статус: Бакалавр
Рейтинг: 972
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / C/C++

Номер выпуска:1417
Дата выхода:02.11.2009, 15:30
Администратор рассылки:Dr_Andrew, Старший модератор
Подписчиков / экспертов:646 / 167
Вопросов / ответов:3 / 5
IRC-канал по теме:#C

Вопрос № 173765: Здравствуйте уважаемые эксперты! Прошу помощи у тех кто разбирается как в Си так и в Си++. Мне нужно перевести код с С++ на Си (чтобы скомпилировать в Turbo C). Сколько не пытался сам перевести, все никак не хочет компилироваться. Ниже задание и ...


Вопрос № 173773: здравствуйте, помогите пожалуйста, чуток додумать программу не могу: надо составить массив А из 2n, затем из него создать два массива В и С по n элементов. Составлять так: выбираются два близкие по значению числа, меньшее в массив В большее в масс...
Вопрос № 173775: Здравствуйте! Уважаемые эксперты, необходима ваша помощь в реализации вот такой задачи: числовой ребус: перемножение двух любых (до5 знака ) чисел. Вместо каких-то чисел символ звездочка КАК РЕализовать??? ПРИМЕР: 4*58 *(умножить) ...

Вопрос № 173765:

Здравствуйте уважаемые эксперты! Прошу помощи у тех кто разбирается как в Си так и в Си++. Мне нужно перевести код с С++ на Си (чтобы скомпилировать в Turbo C). Сколько не пытался сам перевести, все никак не хочет компилироваться.
Ниже задание и готовое решение на "borland c++ builder 6". Буду ОЧЕНЬ рад если удастся это сделать и скажу Большооое спасибо :).


Задача.
1. Построить хэш-таблицу методом линейных проб для слов заданного текста. Текст находится в некотором файле (примерно 200 слов). Экспериментально определить минимально необходимый объем хэш-таблицы и число коллизий при построении.
2. Построить хэш-таблицу методом квадратичных проб для слов заданного текста. Файл с текстом должен быть тот же, что и п.1. Экспериментально определить минимально необходимый объем хэш-таблицы и число коллизий при построении.

Отправлен: 27.10.2009, 18:41
Вопрос задал: Slayder, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает Ashotn, Х Заблокирован :
Здравствуйте, Slayder.
Кроме потоков, о которых говорил первый эксперт, в С есть и другие отличия от С++.
У компиляторов обычно есть опция - компилировать на С, поэтому можете проверить свою программу таким образом.
* в С++ можно задавать значения по умолчанию
* в С++ появились inline функции, в Си роль которых играли макросы
* в С++ появился спецификатор const (в Си константы определялись директивой define)
* в С++ появились операторы new/delete
* в С++ появились шаблоны
* в С++ появились пространства имен
* в С++ комментарии другие :D
* в С++ появились ссылки

объявление переменных только в начале функции..
конструкции типа for(int i=0... не допускаются
У вас есть такое
for (unsigned int i=0; i<strlen(s); i++)
надо заменить на
int i=0;
for (int i=0; i<strlen(s); i++)
Хотя в современной версии С это допускается.
Нельзя объявлять перменные не в начале функции.
Опять-т аки сейчас это можно. Зависит от того, насколько старый компилятор.
В С не было ключевого слова const. Сейчас есть.

Ответ отправил: Ashotn, Х Заблокирован
Ответ отправлен: 28.10.2009, 10:38

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


    Вопрос № 173773:

    здравствуйте, помогите пожалуйста, чуток додумать программу не могу:
    надо составить массив А из 2n, затем из него создать два массива В и С по n элементов. Составлять так: выбираются два близкие по значению числа, меньшее в массив В большее в массив А
    (выдает только два самых близких числа, не знаю как дальше )

    Отправлен: 27.10.2009, 21:31
    Вопрос задал: Ишмаков Рустем Ильшатович, Посетитель
    Всего ответов: 2
    Страница вопроса »


    Отвечает amnick, 4-й класс :
    Здравствуйте, Ишмаков Рустем Ильшатович.
    Иначе говоря, требуется неявно отсортировать массив и поместить четные (нумерация с 0) элементы в массив B, а нечетные — в массив C. Программа в приложении. Пример прогона:

    Enter 8 elements...

    A[0] = ? 2
    A[1] = ? 6
    A[2] = ? 8
    A[3] = ? 1
    A[4] = ? 3
    A[5] = ? 7
    A[6] = ? 5
    A[7] = ? 4
    2 6 8 1 3 7 5 4
    B[0]=1
    B[1]=3
    B[2]=5
    B[3]=7

    C[0]=2
    C[1]=4
    C[2]=6
    C[3]=8

    Успехов!

    Приложение:

    Ответ отправил: amnick, 4-й класс
    Ответ отправлен: 27.10.2009, 22:38

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 255935 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Ashotn, Х Заблокирован :
    Здравствуйте, Ишмаков Рустем Ильшатович.
    Программа написана при условии, что если есть числа одинаковой близости, то какие брать, неважно.
    После того, как найдены близкие элементы, они удаляются из вектора. Ваш массив при этом остается, если он нужен. После этого ищется близкое значение уже среди оставшихся. Когда остаются 2 элемента, они сразу же идут в два массива.
    Программа оптимизирована по скорости, поэтому в векторе сначала обменивается член с последним, потом стирается последний. Дело в том, что из вектора удалять долго, а последний элемент удаляется быстро.


    #include <iostream>
    #include <limits.h>
    #include <stdlib.h>

    #include <vector>

    int const n=4;

    using namespace std;

    void main()
    {
    int i,j,i1,i2,k,A[2*n],B[n],C[n],m,l;

    vector<int> a;
    m=0;

    cout<<"Enter "<<n*2<<" elements..."<<endl<<endl;
    for(i=0;i<2 *n;i++)
    cin>>A[i];

    for(i=0;i<2*n;i++)
    {
    cout<<A[i]<<" ";
    a.push_back(A[i]);
    }

    for(i=0;i<2*n;i++)
    {
    cout<<a[i]<<" ";
    }
    cout<<endl;
    while(m<n-1)
    {
    for(i=0,k=INT_MAX;i<2*n-2*m;i++)
    {
    for(j=i+1;j<2*n-2*m;j++ )
    if(k>abs(a[i]-a[j])&&i!=j)
    {
    k=abs(a[i]-a[j]);
    i1=i;
    i2=j;
    }
    }
    if(a[i1]<a[i2])
    {
    B[m]=a[i1];
    C[m]=a[i2];
    }
    else
    {
    B[m]=a[i2];
    C[m]=a[i1];
    }
    swap(a[i1],a[2*n-1-2*m]);
    a.pop_back();
    swap(a[i2],a[2*n-2*m-2]);
    a.pop_back();
    m++;
    }
    B[n-1]=min(a[0],a[1]);
    C[n-1]=max(a[0],a[1]);
    for(m=0;m<n;m++)
    cout<<endl<<"B["<<m<<"]="<<B[m]<<" ";
    cout<<endl<<endl;
    for(l=0;l<n;l++)
    cout<<"C["<<l<<&quo t;]="<<C[l]<<" "<<endl;
    cin>>i;
    }

    Ответ отправил: Ashotn, Х Заблокирован
    Ответ отправлен: 28.10.2009, 13:10

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


    Вопрос № 173775:

    Здравствуйте!
    Уважаемые эксперты, необходима ваша помощь в реализации вот такой задачи:
    числовой ребус: перемножение двух любых (до5 знака ) чисел. Вместо каких-то чисел символ звездочка
    КАК РЕализовать???
    ПРИМЕР: 4*58 *(умножить) 564* = * 6275*78

    Помогите пожалуйста
    СПАСИБО!!!

    Отправлен: 27.10.2009, 21:48
    Вопрос задал: Озерова Елена Сергеевна, Посетитель
    Всего ответов: 2
    Страница вопроса »


    Отвечает Лысков Игорь Витальевич, Модератор :
    Здравствуйте, Озерова Елена Сергеевна.
    Программа в приложении.
    Примерный вывод программы:
    Код:
    Введите первый множитель: 123*
    Введите второй множитель: 2*
    Введите произведение: 246**
    Найденные числа:
    1230 * 20 = 24600
    1231 * 20 = 24620
    1232 * 20 = 24640
    1233 * 20 = 24660
    1234 * 20 = 24680
    Удачи!

    Приложение:

    -----
    Удачи!

    Ответ отправил: Лысков Игорь Витальевич, Модератор
    Ответ отправлен: 28.10.2009, 01:18
    Украина, Кировоград
    Тел.: +380957525051
    ICQ # 234137952
    Mail.ru-агент: igorlyskov@mail.ru
    Абонент Skype: igorlyskov

    Оценка ответа: 5
    Комментарий к оценке:
    Спасибо огромное ,Игорь Витальевич!
    Код скомпилирован-успешно-я очень рада!

    СПАСИБО!!!!

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 255942 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Micren, Бакалавр :
    Здравствуйте, Озерова Елена Сергеевна.
    Программа. C++. MS VS 2008.

    Код:
    #include <iostream>
    #include <locale>
    #include <limits>
    #include <vector>
    #include <string>
    #include <sstream>
    #include <algorithm>

    using namespace std;

    // Класс число
    class number
    {
    public:
    number(){};
    // Следующая подстановка
    bool next();
    // Операторы
    bool operator==(const number& right) const;
    number operator*(const number& right) const;
    private:
    typedef unsigned char _itemType;
    typedef vector<_itemType> _byteVector;
    explicit number(_byteVector digits);
    // Цифры числа
    _byteVector _digits;
    // Позиции звездочек
    _byteVector _stars;
    template<class _Elem,class _Traits> friend basic_istream<_Elem,_Traits>& operator>>(basic_istream<_Elem,_Traits>& stream,number& right);
    template<class _Elem,class _Traits> friend basic_ostream<_Elem,_Traits>& operator<<(basic_ostream<_Elem,_Traits>& stream,const number& right);
    };

    // Оператор ввода
    template<class _Elem,class _Traits>
    basic_istream<_Elem,_Traits>& operator>>(basic_istream<_Elem,_Traits>& stream,number& right)
    {
    typedef basic_string<_Elem,_Traits> _strType;
    _strType str;
    stream>>str;
    if(!stream.fail())
    {
    const ctype<_Elem>& facet=use_facet<ctype<_Elem> >(stream.getloc());
    const _Elem zero=facet.widen('0');
    _strType::size_type notZero=str.find_first_not_of(zero);
    if(notZero==_strType::npos)
    {
    notZero=str.length()-1;
    }
    str.erase(0,notZero);
    _strType::size_type index =str.length();
    number::_byteVector digits,stars;
    bool success=true;
    while(index-- && success)
    {
    _Elem ch=str[index];
    if(facet.is(facet.digit,ch))
    {
    digits.push_back(ch-zero);
    }
    else if(ch==facet.widen('*'))
    {
    digits.push_back(index==0);
    stars.push_back(digits.size()-1);
    }
    else
    {
    success=false;
    }
    }
    if(success)
    {
    right._digits=digits;
    right._stars=stars;
    }
    else
    {
    stream.setstate(stream.badbit);
    }
    }
    return stream;
    }

    // Оператор вывода
    template<class _Elem,class _Traits>
    basic_ostream<_Elem,_Traits>& operator<<(basic_ostream<_Elem,_Traits>& stream,const number& right)
    {
    basic_stringstream<_Elem,_Traits> sstr;
    for(number::_byteVector::const_reverse_iterator it=right._digits.rbegin(),end=right._digits.rend();it!=end;++it)
    {
    sstr<<static _cast<unsigned int>(*it);
    }
    return stream<<sstr.str();
    }

    number input(const char* const msg);

    int main()
    {
    setlocale(LC_ALL,"russian");
    // Вводим данные
    number num1=input("Первый множитель:"),
    num2=input("Второй множитель:"),
    num3=input("Произведение:");
    // Счетчик найденных решений
    size_t count=0;
    do
    {
    do
    {
    // Умножаем
    number mult=num1*num2;
    // Сравниваем
    if(mult==num3)
    {
    // Решение найдено - выводим
    cout<<num1<<'*'<<num2<<'='<<mult<<endl;
    ++count;
    }
    }while(num2.next()); // Следующий вариант
    }while(num1.next()); // Следующий вариант
    if(count)
    {
    cout<<"Найдено "<<count<<" вариантов ответов"<<endl;
    }
    else
    {
    cout<<"Решение не найдено"<<en dl;
    }
    system("PAUSE");
    return 0;
    }

    // Ввод числа
    number input(const char* const msg)
    {
    while(tru e)
    {
    cout<<msg;
    number result;
    cin>>result;
    if(cin.fail())
    {
    cout<<"Ошибочный ввод"<<endl;
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(),'\n');
    }
    else
    {
    cin.ignore(numeric_limits<streamsize>::max(),'\n');
    return result;
    }
    }
    }

    // Генерирует следующий вариант.
    // Возвращает false когда все варианты перебраны
    bool number::next()
    {
    for(_byteVector::const_iterator it=_stars.begin(),end=_stars.end();it!=end;++it)
    {
    _itemType digit=_digits[*it]+1;
    if(digit>9)
    {
    _digits[*it]=*it==(_digits.size()-1);
    }
    else
    {
    _digits[*it]=digit;
    return true;
    }
    }
    return false;
    }

    // Оператор равенства
    bool number::operator==(const number& right) const
    {
    _byteVector::size_type size=_digits.size(),index=0;
    if(size!=right._digits.size()) {
    return false;
    }
    bool result=true;
    while(index<size && result)
    {
    // Не учитываем места расположения звездочек
    if(find(_stars.begin(),_stars.end(),index)==_stars.end() &&
    find(right._stars.begin(),right._stars.end(),index)==right._stars.end())
    {
    result=_digits[index]==right._digits[index];
    }
    ++index;
    }
    return result;
    }

    number::number(number::_byteVector digits)
    :_digits(digits)
    {
    }

    // Оператор умножения
    // Использует длинную арифметику
    number number::operator*(const number& right) const
    {
    _byteVector resultData(_digits.size()+right._digits.size(),0);
    for(_byteVector::size_type i=0,end=right._digits.size();i<end;++i)
    {
    _itemType digit=right._digits[i];
    _byteVector tmpVector(_digits.size());
    unsigned int carry=0;
    for(_byteVector::size_type j=0,end=_digits.size();j<end;++j)
    {
    unsigned int tmp=_digits[j]*digit+carry;
    c arry=tmp/10;
    tmpVector[j]=tmp%10;
    }
    if(carry)
    {
    tmpVector.push_back(carry);
    carry=0;
    }
    for(_byteVector::size_type j=0,end=tmpVector.size();j<end;++j)
    {
    unsigned int tmp=resultData[i+j]+tmpVector[j]+carry;
    carry=tmp/10;
    resultData[i+j]=tmp%10;
    }
    if(carry)
    {
    _byteVector::size_type index=tmpVector.size()+i;
    if(index<resultData.size())
    {
    resultData[index]=carry;
    }
    else
    {
    resultData.push_back(carry);
    }
    }
    }
    // Удалим ведущие нули. Если есть.
    while(!resultData.back() && resultData.size()>1)
    {
    resultData.pop_back();
    }
    return number(resultData);
    }

    Пример работы:
    Код:
    Первый множитель:4*58
    Второй множитель:564*
    Произведение:*6275*78
    4658*5641=26275778
    Найдено 1 вариантов ответов

    Ответ отправил: Micren, Бакалавр
    Ответ отправлен: 29.10.2009, 11:14

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


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

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

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

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

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

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

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


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

    В избранное