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

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


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

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

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

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

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

Номер выпуска:1406
Дата выхода:15.10.2009, 23:30
Администратор рассылки:Dr_Andrew, Модератор
Подписчиков / экспертов:642 / 168
Вопросов / ответов:3 / 6
IRC-канал по теме:#C

Вопрос № 173119: Здравствуйте уважаемые эксперты! Помогите пожалуйста написать программы .Нужно создать программы по следующим условиям: 1. Задать генератором случайных чисел три вещественных числа в диапазоне от 0 до 10.0, которые соответствуют длинам сторон тре...


Вопрос № 173120: Здраствуйте, у меня снова вопрос о работе со строками, Если есть строка: "#Fusername#filename#musor" как мне из неё получить такую строку: "#Ffilename#musor" т.е. выбросить username, мне на ум приходит только такой способ: <...
Вопрос № 173132: Добрый день уважаемые эксперты. У меня вопрос. Как расшифровать такого типа запись в printf ? %10.7lf ...

Вопрос № 173119:

Здравствуйте уважаемые эксперты! Помогите пожалуйста написать программы .Нужно создать программы по следующим условиям:
1. Задать генератором случайных чисел три вещественных числа в диапазоне от 0 до 10.0, которые соответствуют длинам сторон треугольника.
Нужно определить:
∙ можно ли их этих отрезков построить треугольник;
∙ какого вида треугольник (остроугольный, прямоугольный, тупоугольный, равносторонний, равнобедренный);
∙ определить величины углов треугольника.
Для проверки правильности работы программы предусмотреть возможность задания трёх чисел с клавиатуры. Вся информация о треугольника выводится на экран.
2. Найти корень нелинейного уравнения методом деления отрезка пополам
Деление отрезка пополам.
Пусть функция f(x) задана на отрезке [a,b] и имеет только один корень x*. ε, δ – малые значения.

Шаг1: Вычисляем значения функции f(x) на концах интервала - f(a), f(b).
Шаг2: Определяем середину интервала xср =(a+b)/2 и вычисляем в этой точке значение функции f(xср )
Шаг3: Вычисляем произведение - f(a)* f(xср ). Если f(a)* f(xср )<0, то присваиваем b=xср, иначе присваиваем a=xср
Шаг4: Признак завершения счета. Если значения функции на границах интервала f(b) и f(a )<δ, то перейти к шагу 5, иначе перейти к шагу 2.
Шаг5: Вычисляем x*=(a+b)/2 и f(x*)

Варианты функций
Аргумент x определен в диапазоне [0÷1]
1.f(x)=-cos(3.14x/2)+2x
2.f(x)=sin(3.14x/2)-(1-x)
3.f(x)=sh(x)-cos(3.14x)
4.f(x)=1-x-tg(3.14x/4)
5.f(x)=e**x-sin(3.14x/2)
6.f(x)=(1-x)**2-2x
7.f(x)=arcsin(x)-(1-x)**2
8.f(x)=ln(1+x)-(1-x)

Перед данными вариантами имеются два графика, кто сможет помочь пишите,тогда скину файл с ними.

ЗАРАНЕЕ БОЛЬШОЕ СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!!

Отправлен: 09.10.2009, 23:59
Вопрос задал: Magma, Посетитель
Всего ответов: 2
Страница вопроса »


Отвечает Micren, Бакалавр :
Здравствуйте, Magma.
Решение 1й задачи. C++. MS VS 2008.
Код:

#define _USE_MATH_DEFINES
#include <iostream>
#include <locale>
#include <limits>
#include <vector>
#include <algorithm>
#include <functional>
#include <ctime>
#include <cstdlib>
#include <cmath>

using namespace std;

typedef vector<double> double_vector;

// Оператор вывода для векторов
template<class _Elem,class _Traits,class _Item>
basic_ostream<_Elem,_Traits>& operator<<(basic_ostream<_Elem,_Traits>& stream,const vector<_Item>& vector)
{
for(double_vector::const_iterator it=vector.begin();it!=vector.end();++it)
{
stream<&l t;*it<<endl;
}
return stream;
}

// Выбор пользователя
enum menu_user_choice
{
MANUAL,
RANDOM,
QUIT
};

// Меню
menu_user_choice menu()
{
while(true)
{
cout<<"1 - Ручной ввод длин сторон"<<endl
<<"2 - Автоматическая генерация длин сторон"<<endl
<<"3 - Выход"<<endl
<<"Ваш выбор:";
wchar_t choice=_getwche();
cout<<endl;
switch(choice)
{
case L'1':
return MANUAL;
case L'2':
return RANDOM;
case L'3':
return QUIT;
default:
cout<<"Будьте внимательней"<<endl;
}
}
}

const size_t sides_num=3;
const double sides_max_length=10.0;

// Ввод сторон вручную
double_vector manual_sides()
{
double_vector sides(sides_num);
cout<<"Введите длины сторон вручную&quo t;<<endl;
for(size_t i=0;i<sides_num;++i)
{
while(true)
{
cout<<"Длина "<<i+1<<" стороны:";
cin>>sides[i];
if(cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cout<<"Ошибка"<<endl;
}
else
{
cin.ignore(numeric_limits<streamsize>::max(),'\n');
break;
}
}
}
return sides;
}

// Автоматическая генерация сторон
double_vector random_sides()
{
double_vector sides(sides_num);
for(size_t i=0;i<sides_num;++i)
{
sides[i]=static_cast<double>(rand())/RAND_MAX*sides_max_length;
}
return sides;
}

// Вычисление углов треугольника
double_vector calc_angles(const double_vector& sides)
{
double_vector angles(sides_num);
for(double_vector::size_type i=0;i<sides_num;++i)
{
const double& a=sides[i];
const double& b=sides[(i+1)%sides_num];
const double& c=sides[(i+2)%sides_num];
angles[i]=acos((b*b+c*c-a*a)/(2*b*c));
}
return angles;
}

// Классификация по углам
enum by_internal_angles_type
{
ACUTE,
RIGHT,
OBTUSE
};

// Возвращает тип треугольника по его углам
by_internal_angles_type by_internal_angles(const double_vector& angles)
{
for(double_vector::const_iterator it=angles.begin();it!=angles.end();++it)
{
if(*it==M_PI_2)
{
return RIGHT;
}
else if(*it>M_PI_2)
{
return OBTUSE;
}
}
return ACUTE;
}

// Классификация по длинам сторон
enum by_relative_length_of_sides_type
{
EQUILATERAL,
ISOSCELES,
SCALENE
};

// Возвращает тип треугольника по его сторонам
by_relative_length_of_sides_type by_relative_length_of_sides(double_vector& sides)
{
if(sides[0]==sides[1] && sides[1]==sid es[2])
{
return EQUILATERAL;
}
if(sides[0]==sides[1] || sides[1]==sides[2] || sides[0]==sides[2])
{
return ISOSC ELES;
}
return SCALENE;
}

// Решает задачу
void solve(double_vector& sides)
{
// Сортируем стороны
sort(sides.begin(),sides.end(),less<double>());
// Выведем их
cout<<"Получены следующие значения для сторон:"<<endl<<sides;
cout<<"Треугольник построить ";
// Проверка возможности построения треугольника
if(sides[0]+sides[1]>sides[2])
{
cout<<"возможно"<<endl;
// Вычислим углы
double_vector angles=calc_angles(sides);
// Выведем их
cout<<"Углы треугольника в радианах:"<<endl<<angles;
cout<<"По величине углов:";
// Определим тип треугольника по его углам
switch(by_internal_angles(angles))
{
case ACUTE:
cout<<"остроугольный";
break;
case RIGHT:
cout<<"прямоугольный";
break;
case OBTUSE:
cou t<<"тупоугольный";
break;
}
cout<<endl
<<"По числу равных сторон:";
// Определим тип треугольника по его сторонам
switch(by_relative_length_of_sides(sides))
{
case EQUILATERAL:
cout<<"равносторонний";
break;
case ISOSCELES:
cout<<"равнобедренный";
break;
case SCALENE:
cout<<"разносторонний";
break;
}
cout<<endl;
}
else
{
cout<<"не возможно"<<endl;
}
cout<<"-------------------------------------------"<<endl;
}

int main()
{
srand(static_cast<unsigned int>(time(0)));
setlocale(LC_ALL,"russian");
menu_user_choice choice;
while((choice=menu())!=QUIT)
{
double_vector sides;
switch(choice)
{
case MANUAL:
sides=manual_sides();
break;
case RANDO M:
sides=random_sides();
break;
}
solve(sides);
}
return 0;
}

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

1 - Ручной ввод длин сторон
2 - Автоматическая генерация длин сторон
3 - Выход
Ваш выбор:2
Получены следующие значения для сторон:
4.39009
5.49883
7.16941
Треугольник построить возможно
Углы треугольника в радианах:
0.658418
0.873212
1.60996
По величине углов:тупоугольный
По числу равных сторон:разносторонний
-------------------------------------------
1 - Ручной ввод длин сторон
2 - Автоматическая генерация длин сторон
3 - Выход
Ваш выбор:1
Введите длины сторон вручную
Длина 1 стороны:5
Длина 2 стороны:3
Длина 3 стороны:4
Получены следующие значения дл я сторон:
3
4
5
Треугольник построить возможно
Углы треугольника в радианах:
0.643501
0.927295
1.5708
По величине углов:прямоугольный
По числу равных сторон:разносторонний
-------------------------------------------
1 - Ручной ввод длин сторон
2 - Автоматическая генерация длин сторон
3 - Выход
Ваш выбор:2
Получены следующие значения для сторон:
2.63527
2.94259
5.69109
Треугольник построить не возможно
-------------------------------------------
1 - Ручной ввод длин сторон
2 - Автоматическая генерация длин сторон
3 - Выход
Ваш выбор:1
Введите длины сторон вручную
Длина 1 стороны:5
Длина 2 стороны:5
Длина 3 стороны:5
Получены следующие значения для сторон:
5
5
5
Треугольник построить возможно
Углы треугольника в радианах:
1.0472
1.0472
1.0472
По величине углов:остроугольный
По числу равных сторон:равносторонний
-------------------------------------------1 - Ручной ввод длин сторон
2 - Автоматическая генерация длин сторон
3 - Выход
Ваш выбор:1
Введите длины сторон вручную
Д лина 1 стороны:4
Длина 2 стороны:5
Длина 3 стороны:5
Получены следующие значения для сторон:
4
5
5
Треугольник построить возможно
Углы треугольника в радианах:
0.823034
1.15928
1.15928
По величине углов:остроугольный
По числу равных сторон:равнобедренный
-------------------------------------------
1 - Ручной ввод длин сторон
2 - Автоматическая генерация длин сторон
3 - Выход
Ваш выбор:

Ответ отправил: Micren, Бакалавр
Ответ отправлен: 10.10.2009, 15:04

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

    Код:

    max oshibka delta= 0.001
    1.[0.0000, 0.5000]
    2.[0.2500, 0.5000]
    3.[0.3750, 0.5000]
    4.[0.3750, 0.4375]
    5.[0.3750, 0.4063]
    6.[0.3906, 0.4063]
    7.[0.3984, 0.4063]
    8.[0.4023, 0.4063]
    9.[0.4023, 0.4043]
    10.[0.4023, 0.4033]

    koren x=0.4028 f(0.4028)=-0.0009

    Приложение:

    Ответ отправил: leonid59, Студент
    Ответ отправлен: 15.10.2009, 14:31

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


    Вопрос № 173120:

    Здраствуйте, у меня снова вопрос о работе со строками,
    Если есть строка: "#Fusername#filename#musor" как мне из неё получить такую строку: "#Ffilename#musor" т.е. выбросить username, мне на ум приходит только такой способ:

    Код:

    strcpy(tmp_buff, "#F");
    memcpy(&tmp_buff[2], &buff[strchr(&buff[2], '#') - buff], strchr(&buff[strchr(&buff[2], '#') - buff +1], '#') - &buff[strchr(&buff[2], '#') - buff] );

    в buff исходная строка, a tmp_buff результат. И то, у меня тут не до конца, у меня будет"#Ffilename"
    Подскажите как можно решить эту проблему более просто, чтобы код стал более читабельным?
    Зарамее спасибо.

    Отправлен: 10.10.2009, 01:05
    Вопрос задал: Станислав, 2-й класс
    Всего ответов: 1
    Страница вопроса »


    Отвечает Micren, Бакалавр :
    Здравствуйте, Станислав.
    Все зависит от того на каком именно языке Вам требуется ответ(C или C++), а так же от того какие возможности Вы хотите использовать. Вариантов более чем достаточно.
    Учитывая, что Вы использовали строковые функции C я остановился на них.
    Программа. С++. MS VS 2008.
    Код:

    #include <iostream>
    #include <cstring>

    using namespace std;

    // Функция выполняющая требуемое преобразование. Возвращает требуемый размер области памяти для размещения результата.
    // Если dst==0 на том и заканчивается. Иначе копирует согласно условия.
    size_t del_username(const char* const src,char* dst)
    {
    // Требуемый размер буфера
    size_t len=0;
    // Проверим начинается ли строка с "#F"
    if (!strncmp(src,"#F",2))
    {
    // Первый копируемый символ из filename
    const char* first=strchr(src+2,'#');
    // Если есть то
    if(first)
    {
    len=strlen(++first)+3;
    // Если dst!=0 то копируем
    if(dst)
    {
    strncpy(dst,src,2);
    strcpy(dst+2,first);
    }
    }
    }
    return len;
    }

    int main()
    {
    char src[]="#Fusername#filename#musor";
    try
    {
    // Вычисляем размер области и выделяем память
    char* dst=new char[del_username(src,0)];
    // Копируем
    del_username(src,dst);
    // Выводим для проверки
    cout<<dst<<endl;
    delete[] dst;
    }
    catch(...)
    {
    }
    return 0;
    }

    Вывод:
    Код:
    #Ffilenam
     e#musor

    Ответ отправил: Micren, Бакалавр
    Ответ отправлен: 10.10.2009, 03:04

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


    Вопрос № 173132:

    Добрый день уважаемые эксперты. У меня вопрос. Как расшифровать такого типа запись в printf ?
    %10.7lf

    Отправлен: 10.10.2009, 14:57
    Вопрос задал: Dimon4ik, 5-й класс
    Всего ответов: 3
    Страница вопроса »


    Отвечает Максим Юрьевич, 6-й класс :
    Здравствуйте, Dimon4ik.

    10.7 заставляет разместить число на 10 позициях, из них 7 выделяется под десятичную часть.
    Модификатор размера (l) указывает на то, что выводиться будет long int. Но указатель типа (f) указывает на то, что выводиться будет число с плавающей точкой. Видимо эта "конфликтная" ситуация разрешается в пользу указателя типа, что подтверждает пара проведённых экспериментов.

    Ответ отправил: Максим Юрьевич, 6-й класс
    Ответ отправлен: 10.10.2009, 17:28

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

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 255256 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Micren, Бакалавр :
    Здравствуйте, Dimon4ik.
    10 - минимальная ширина поля
    .7 - модификатор точности(знаков после десятичной точки)
    l - сие неизвестно зачем тут применено. Модификатор "L" может применяться для вывода long double("%Lf"), а "l" для вывода со спецификаторами d,i,o,u,x(т.е. целых)
    f - десятичное число с плавающей точкой.

    Итог:
    Выводится десятичное число с плавающей точкой. Займет минимум 10 знакомест и будет иметь 7знаков после точки. При форматировании вывода будет использовано выравнивание по правому краю.

    Ответ отправил: Micren, Бакалавр
    Ответ отправлен: 10.10.2009, 17:33

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

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 255257 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Иван Горбинко, 1-й класс :
    Здравствуйте, Dimon4ik!
    Каждая спецификация преобразования начинается с символа % и заканчивается символом преобразования, например как символ f.

    f – число с плавающей точкой, представляемое в виде десятичной дроби.

    Ответ отправил: Иван Горбинко, 1-й класс
    Ответ отправлен: 11.10.2009, 02:33

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


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

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

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

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

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

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

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


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

    В избранное