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

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


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

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

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

Micren
Статус: Практикант
Рейтинг: 102
∙ повысить рейтинг >>
Hubbitus
Статус: 8-й класс
Рейтинг: 93
∙ повысить рейтинг >>
Лысков Игорь Витальевич
Статус: Профессионал
Рейтинг: 35
∙ повысить рейтинг >>

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

Выпуск № 1277
от 06.04.2009, 06:35

Администратор:Dr_Andrew
В рассылке:Подписчиков: 507, Экспертов: 48
В номере:Вопросов: 3, Ответов: 3

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

Вопрос № 163754: <u><i><b>Здравствуйте, уважаемые эксперты!!! Если Вас не затруднит, помогите, пожалуйста, в написании програмы</b></i></u> <b>Тема:</b> <u>двумерные массивы.</u> <u><i>Условие выполнения:</i></u> Программа должна обеспечивать обмен с операт...


Вопрос № 163825: Здравствуйте, эксперты.Помогите, пожалуйста, решить задачу.Очень прошу. Даны вещественные массивы A[5][4], D[5][4]. Для каждого массива опpеделить количество элементов, значения котоpых меньше сpеднего аpифметического значения всех элемен...
Вопрос № 163828: Здравствуйте, Господа! Мне надо написать программу для подсчёта значения полинома, заданного как ряд пар коэффициентов и показателей степени. Для хранения исходных данных использовать класс list стандартной библиотеки шаблонов С++. Заранее спасибо! ...

Вопрос № 163.754
Здравствуйте, уважаемые эксперты!!! Если Вас не затруднит, помогите, пожалуйста, в написании програмы
Тема: двумерные массивы.
Условие выполнения:
Программа должна обеспечивать обмен с оператором, выдавая необходимые сообщения и позволяя вводить исходные данные и просмотреть результат выполнения программы. Матрицы больших размеров допускается заполнять без участия оператора.
Задание:
Задана матрица размером 10х10. Необходимо проверить, существуют ли вертикальная, горизонтальная или диагональная линия, состоящая из пяти элементов, равных нулю.

Microsoft Visual Studio 2008
Отправлен: 31.03.2009, 08:53
Вопрос задал: Redbull (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Micren
Здравствуйте, Redbull!
Код:

#include <locale>
#include <iostream>
#include <iomanip>
#include <vector>
#include <list>
#include <algorithm>
#include <cstdlib>

using namespace std;

// Размерность матрицы
const unsigned int N=10;

// Позиция
class position
{
public:
position(){}
position(unsigned int x,unsigned int y)
:X(x)
,Y(y)
{}
unsigned int X,Y;
};

typedef vector<position> posvec;
typedef list<posvec> resultlist;

// true если элементы с координатами positions равны 0
bool ifZeroes(int matrix[N][N],const posvec& positions)
{
int res=0;;
for(posvec::const_iterator it=positions.begin();it!=p ositions.end();++it)
{
if(res|=matrix[(*it).X][(*it).Y])break;
}
return !res;
}

// Поиск последовательностей нулевых элементов
resultlist findZeroes(int matrix[N][N],unsigned int len)
{
resultlist res;
if(len>0)
{
posvec checkPosV(len),checkPosH(len),checkPosD(len);
int endPos=N+1-len;
for(int i=0;i<endPos;++i)
{
for(int j=0;j<endPos;++j)
{
for(unsigned int k=0;k<len;++k)
{
checkPosV[k]=position(i+k,j);
checkPosH[k]=position(i,j+k);
checkPosD[k]=position(i+k,j+k);
}
if(ifZeroes(matrix,checkPosV))res.push_back(checkPosV);
if(ifZeroes(matrix,checkPosH))res.push_back(checkPosH);
if(ifZeroes(matrix,checkPosD))res.push_back(checkPosD);
}
}

}
return res;
}

// Печатает результат
void printPosVec(const posvec& pos)
{
for(posvec::const_iterator it=pos.begin();it!=pos.end();++it)
{
wcout<<L"["<<(*it).X<<L","<<(*it).Y<<L"] ";
}
wcout<<endl;
}

int main()
{
locale::global(locale("russian_russia.866"));
srand(static_cast<unsigned int>(time(0)));
try
{
int matrix[N][N];
// Заполним матрицу числами и вывод ее
for(unsigned int i=0;i<N;++i)
{
for(unsigned int j=0;j<N;++j)
{
matrix[i][j]=static_cast<int>(static_cast<double>(rand())/RAND_MAX*2);
wcout<<setw(3)<<matrix[i][j]<<L' ';
}
wcout<<endl;
}
// Считаем
resultlist resList=findZeroes(matrix,5);
// Если есть в списке
if(resList.size())
{
// Печатаем результат
wcout<<L"Найдены следующие последовательности нулевых элементов:"<<endl;
for_each(resList.begin(),resList.end(),&printPosVec);
}
else
{
wco ut<<L"Таких последовательностей нет"<<endl;
}
}
catch (bad_alloc)
{
wcout<<L"Ошибка выделения памяти"<<endl;
}
system("PAUSE");
return 0;
}

Пример работы:
Код:

0 0 1 1 0 0 0 1 1 1
1 0 1 1 0 1 0 0 0 0
0 0 0 0 0 1 0 1 1 0
0 1 1 0 1 0 1 0 1 1
1 0 0 0 1 1 0 0 1 1
0 1 1 0 0 1 1 0 0 0
1 0 1 0 1 0 0 1 0 1
1 1 0 1 1 0 0 0 0 0
0 0 1 1 0 1 0 0 1 0
1 1 1 0 0 1 0 1 1 1
Найдены следующие последовательности нулевых элементов:
[2 ,0] [2,1] [2,2] [2,3] [2,4]
[2,3] [3,3] [4,3] [5,3] [6,3]
[2,4] [3,5] [4,6] [5,7] [6,8]
[3,5] [4,6] [5,7] [6,8] [7,9]
[4,3] [5,4] [6,5] [7,6] [8,7]
Ответ отправил: Micren (статус: Практикант)
Ответ отправлен: 31.03.2009, 19:03

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

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


    Вопрос № 163.825
    Здравствуйте, эксперты.Помогите, пожалуйста, решить задачу.Очень прошу.
    Даны вещественные массивы A[5][4], D[5][4]. Для каждого
    массива опpеделить количество элементов, значения котоpых
    меньше сpеднего аpифметического значения всех элементов
    массива.

    Приложение:

    Отправлен: 31.03.2009, 21:22
    Вопрос задала: Сидорова Юлия Евгеньевна (статус: Посетитель)
    Всего ответов: 1
    Мини-форум вопроса >>> (сообщений: 0)

    Отвечает: realbustard
    Здравствуйте, Сидорова Юлия Евгеньевна!
    Код в приложении!
    Компилировано в MS VS 2005.

    Обратите внимание как матрицы передаются в ф-ии(адрес на первый элемент и размерности матрицы). Это потому, что многомерные массивы нельзя передать привычным способом(указатель на первый элемент и размерности). Матрицы можно было передать по значению, например:
    print(int m[5][5]), тогда в ф-ии можно будет обращаться к члену матрицы привычным способом, те m[i][j]. Но лучше использовать стандартный класс vector.

    Пример работы:
    Код:

    Содержание массива A:
    -36 34 12 -36
    48 18 4 47
    28 -22 1 9
    -13 26 32 50
    -21 -20 -28 47
    Содержание массива D:
    29 44 -13 -43
    -10 -17 8 -43
    -45 47 -44 -45
    -16 17 -29 -14
    -30 -41 -25 34

    Среднее арифметическое массива A равно: 9
    Среднее арифметическое массива D равно: -11.8

    Для массива A количество элементов, меньших среднего арифметического составляет:
    9
    Для массива D количество элементов, меньших среднего арифметического составляет:
    13

    Для продолжения нажмите любую клавишу . . .

    Будут вопросы по коду, задавайте в минифоруме.
    Удачи.

    Приложение:

    ---------
    Учись так, как-будто собираешься жить вечно; живи так, как-будто завтра умрешь (Отто фон Бисмарк)

    Ответ отправил: realbustard (статус: Студент)
    Ответ отправлен: 02.04.2009, 02:01

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

    Оценка за ответ: 5
    Комментарий оценки:
    Спасибо большое!


    Вопрос № 163.828
    Здравствуйте, Господа! Мне надо написать программу для подсчёта значения полинома, заданного как ряд пар коэффициентов и показателей степени. Для хранения исходных данных использовать класс list стандартной библиотеки шаблонов С++. Заранее спасибо!
    Отправлен: 31.03.2009, 21:30
    Вопрос задал: Андрюшка (статус: Посетитель)
    Всего ответов: 1
    Мини-форум вопроса >>> (сообщений: 1)

    Отвечает: Micren
    Здравствуйте, Андрюшка!
    Программа.
    Код:

    #include <limits>
    #include <locale>
    #include <iostream>
    #include <list>
    #include <string>

    using namespace std;

    // Класс-полином
    class polynom
    {
    public:
    // Добавляет член к многочлену
    void addMember(double coeff,int deg);
    // Вычисление значения многочлена
    double calc(double x);
    private:
    // Член многочлена
    class member
    {
    public:
    member(double coeff,int deg);
    private:
    double _coeff;
    int _deg;
    friend class polynom;
    };
    list<member> _members;
    };

    // Шаблон для ввода данных
    template<class T> T inputData(const wstring& msg);

    int main()
    {
    locale::globa l(locale("russian_russia.866"));
    // Вводим степень полинома
    unsigned int N=inputData<unsigned int>(L"Введите степень полинома:");
    polynom pol;
    // Вводим коэффициенты
    for(unsigned int i=0;i<=N;++i)
    {
    wchar_t buf[11];
    _itow_s(i,buf,10);
    pol.addMember(inputData<double>(static_cast<wstring>(L"Введите коэффициент при члене в степени ")+buf+L":"),i);
    }
    wcout<<L"Далее Вы можете вычислить значения полинома:"<<endl;
    while(true)
    {
    // Вводим x
    double x=inputData<double>(L"Введите x:");
    // Вычисляем и выводим результат
    wcout<<L"Для x="<<x<<L" значение полинома равно "<<pol.calc(x)<<endl;
    // Далее обработка запроса от пользователя на продолжение
    while(true)
    {
    wcout<<L"Желаете продолжить вычисления?(Д/Н|Y/N):";
    wchar_t ch=towu pper(_getwche());
    wcout<<endl;
    if(ch==L'Н'||ch==L'N')return 0;
    else if(ch==L'Y'||ch==L'Д')break;
    else wcout<<L"Будьте внимательней"<<endl;
    }
    }
    return 0;
    }

    polynom::member::member( double coeff,int deg ) :_coeff(coeff)
    ,_deg(deg)
    {
    }

    void polynom::addMember( double coeff,int deg )
    {
    // Ищем есть ли уже член с такой степенью
    for(list<member>::iterator it=_members.begin();it!=_members.end();++it)
    {
    if((*it)._deg==deg)
    {
    // Если есть то обновим только коэффициент
    (*it)._coeff+=coeff;
    return;
    }
    }
    _members.push_back(member(coeff,deg));
    }

    double polynom::calc( double x )
    {
    double res=0;
    // Перебираем члены и считаем сумму(чистая арифметика)
    for(list<member>::const_iterator it=_members.begin();it!=_members.end();++it)
    {
    res+=(*it)._coeff*pow(x,(*it)._deg);
    }
    return res;
    }

    template<class T>
    T inputData(const wstring& msg)
    {
    T data;
    while(true)
    {
    wcout<<msg;
    wcin>>data;
    if(wcin.fail())
    {
    wcout<<L"Ошибочный ввод"<<endl;
    wcin.clear();
    wcin.ignore(numeric_limits<streamsize>::max(),L' ');
    }
    else
    {
    wcin.ignore(numeric_limits<streamsize>::max(),L' ');
    return data;
    }
    }
    }

    Пример работы:
    Код:

    Введите степень полинома:3
    Введите коэффициент при члене в степени 0:-6
    Введите коэффициент при члене в степени 1:5
    Введите коэффициент при члене в степени 2:-10
    Введите коэффициент при члене в степени 3:3
    Далее Вы можете вычислить значения полинома:
    Введите x:10
    Для x=10 значение полинома равно 2044
    Желаете продолжить вычисления?(Д/Н|Y/N):y
    Введите x:32
    Для x=32 значение полинома равно 88218
    Желаете продолжить вычисления?(Д/Н|Y/N):

    В программе используются специфические для Microsoft имена функций _itow_s(), _getwche().
    Если Вы пользуетесь другим компилятором напишите в мини-форум.
    Ответ отправил: Micren (статус: Практикант)
    Ответ отправлен: 02.04.2009, 16:13

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

    Оценка за ответ: 3
    Комментарий оценки:
    Мне надо её написать на Turbo С++. Данный код к сожалению не работает... Но всё равно спасибо!


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

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

    Приложение (если необходимо):

    * Код программы, выдержки из закона и т.п. дополнение к вопросу.
    Эта информация будет отображена в аналогичном окне как есть.

    Обратите внимание!
    Вопрос будет отправлен всем экспертам данной рассылки!

    Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
    экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


    Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
    Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.

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

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

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

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

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


    © 2001-2009, Портал RusFAQ.ru, Россия, Москва.
    Авторское право: ООО "Мастер-Эксперт Про"
    Техподдержка портала, тел.: +7 (926) 535-23-31
    Хостинг: "Московский хостер"
    Поддержка: "Московский дизайнер"
    Авторские права | Реклама на портале

    ∙ Версия системы: 5.13 от 01.12.2008

    Яндекс Rambler's Top100
    RusFAQ.ru | MosHoster.ru | MosDesigner.ru
    RusIRC.ru | Kalashnikoff.ru | RadioLeader.ru

    В избранное