Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 10.09.2014, 19:19   #1
GraverYA
Пользователь
 
Регистрация: 10.09.2014
Сообщений: 13
По умолчанию Решении 4-х простых задач на СИ

Нужна помощь в решении 4-х простых (для меня не очень понятных) задач на СИ.
задания на фото: http://i.imgur.com/bxJreLJ.png

Заранее большое спасибо.
GraverYA вне форума
Старый 11.09.2014, 00:27   #2
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Код:
#include <stdio.h>
#include <math.h>
void main(){
float a, b,m; scanf("%f", &a); scanf("%f", &b);
m = sqrt(2.0*b*b+2.0*c*c - a*a) / (float) 2;
}
Код:
void main(){
int a;
int c = a%10;
int d = (a-c)/10;
int e = d%10;
int f = (d-e)/10;
int b = 10*f + c;
}
Код:
#include <math.h>
void main(){
float x1, y1, x2, y2, x3, y3, r1, r2, sum;
r1 = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
r2 = sqrt((x3-x2)*(x3-x2) + (y3-y2)*(y3-y2));
sum = r1+ r2;
}
Код:
#include <stdio.h>
void main(){
float a, b, c; scanf("%f", &a); scanf("%f", &b);
c = (a+b)/(float)2;
}
Примерно так.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума
Старый 11.09.2014, 01:01   #3
GraverYA
Пользователь
 
Регистрация: 10.09.2014
Сообщений: 13
По умолчанию

Огромное спасибо за помощь.
GraverYA вне форума
Старый 11.09.2014, 06:59   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Задачи описывать на форуме надо. Пройдет пол года, с хостинга удалят файл, не понятно будет что тут за решения лежат. Для форума ИМХО лучше описание задач текстом (чтобы поисковики {и поиск по форуму} тоже знали что именно за задачи тут описаны).

challengerr
Цитата:
Код:
m = sqrt(2.0*b*b+2.0*c*c - a*a) / (float) 2;
Не уверен, то ИМХО 2.0 - это double и поэтому все выражение (2.0*b*b+2.0*c*c - a*a) вычисляется с double числами. Т.е. когда ты 2.0 умножаешь на b, то b кастуется в double (изначально оно float), а это не очень оптимально, да?

/ (float) 2; // слева от знака деления уже стоит дробное число, поэтому результат деления будет в любом случае дробным, округления до целого не будет. Во float кастовать не обязательно, оно автоматически кастанется либо во float, либо в double. С другой стороны, ИМХО эстетичней писать
2.;// double
или
2.f; // float
Чем явное приведение типа. Ну это только для констант, конечно.
Изображения
Тип файла: jpg bxJreLJ.jpg (22.9 Кб, 116 просмотров)

Последний раз редактировалось Stilet; 20.09.2014 в 16:50.
rrrFer вне форума
Старый 11.09.2014, 07:37   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

rrrFer, можно и так, но лучше все функции оформить через библиотеку.
Код:
m = sqrt(2 * pow(b, 2) + 2 * pow(c,2) - pow(a, 2)) /2;
В этом случае, нет необходимости приводить всё к явной типизации т.к. верхня часть формулы вычисляется по правилам с плавающей точкой, то и деление на 2, будет осуществлено по этим же правилам.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума
Старый 11.09.2014, 07:55   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
rrrFer, можно и так, но лучше все функции оформить через библиотеку.
Не лучше.
Умножение b * b выполняется очень быстро - это лишь одна операция.
pow(b, 2) выполняется очень долго, т.к. pow приводит 2 к типу double и выполняет невероятно сложное возведение в дробную степень. pow(b, 2) и pow(b, 2.5) будут работать одинаково долго, но нам же очевидно, что первое можно выполнить гораздо быстрее.
rrrFer вне форума
Старый 11.09.2014, 09:34   #7
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

GraverYA - это очень плохо, что вы даже не пытаетесь решать задачи самостоятельно. Вы теряете возможность приобрести ценный опыт решения задач (если, конечно, вы хотите связать свою жизнь с разработкой ПО). Свои шишки запоминаются лучше

Немного попрактиковался на C++ Qt. Может кому-то пригодится что-то из кода

Медиана



Код:
void Dialog::on_resultButton_clicked()
{
        bool ok;

    // Input
    double a = ui->aLineEdit->text().toDouble( &ok );
    if ( !ok ) {
        QMessageBox::information( this, tr( "Ошибка" ), tr( "Вы ввели некорректные данные" ) );
        return;
    }
    double b = ui->bLineEdit->text().toDouble( &ok );
    if ( !ok ) {
        QMessageBox::information( this, tr( "Ошибка" ), tr( "Вы ввели некорректные данные" ) );
        return;
    }
    double c = ui->cLineEdit->text().toDouble( &ok );
    if ( !ok ) {
        QMessageBox::information( this, tr( "Ошибка" ), tr( "Вы ввели некорректные данные" ) );
        return;
    }

    // Result
    double exp1 = 2.0 * b * b + 2.0 * c * c;
    double exp2 = a * a;
    if ( exp2 > exp1 ) {
        QMessageBox::information( this, tr( "Ошибка" ), tr( "Выражение (2*b^2 + 2*с^2) должно быть больше или равно чем (a^2)" ) );
        return;
    }
    double m = std::sqrt( exp1 - exp2  ) / 2.0;

    // Output
    ui->mLineEdit->setText( QString::number( m ) );
}
Исходники: https://github.com/8Observer8/Median

Трёхзначное число



Код:
void Dialog::on_resultButton_clicked()
{
    bool ok;

    // Input
    int a = ui->aLineEdit->text().toInt( &ok );
    if ( !ok ) {
        QMessageBox::information( this, tr( "Ошибка" ), tr( "Вы ввели некорректные данные" ) );
        return;
    }

    // Result
    int b = ( a / 100 ) * 10 + a % 10;

    // Output
    ui->bLineEdit->setText( QString::number( b ) );
}
Исходники: https://github.com/8Observer8/Three-Digit

Сумма расстояний



Код:
void Dialog::on_resultButton_clicked()
{
    bool ok;

    // A
    double x1 = ui->x1LineEdit->text().toDouble( &ok );
    if ( !ok ) {
        QMessageBox::information( this, tr( "Ошибка" ), tr( "Вы ввели некорректные данные" ) );
        return;
    }
    double y1 = ui->y1LineEdit->text().toDouble( &ok );
    if ( !ok ) {
        QMessageBox::information( this, tr( "Ошибка" ), tr( "Вы ввели некорректные данные" ) );
        return;
    }

    // B
    double x2 = ui->x2LineEdit->text().toDouble( &ok );
    if ( !ok ) {
        QMessageBox::information( this, tr( "Ошибка" ), tr( "Вы ввели некорректные данные" ) );
        return;
    }
    double y2 = ui->y2LineEdit->text().toDouble( &ok );
    if ( !ok ) {
        QMessageBox::information( this, tr( "Ошибка" ), tr( "Вы ввели некорректные данные" ) );
        return;
    }

    // C
    double x3 = ui->x3LineEdit->text().toDouble( &ok );
    if ( !ok ) {
        QMessageBox::information( this, tr( "Ошибка" ), tr( "Вы ввели некорректные данные" ) );
        return;
    }
    double y3 = ui->y3LineEdit->text().toDouble( &ok );
    if ( !ok ) {
        QMessageBox::information( this, tr( "Ошибка" ), tr( "Вы ввели некорректные данные" ) );
        return;
    }

    // Result
    double abDistance = std::sqrt( std::pow( x2 - x1, 2 ) + std::pow( y2 - y1, 2 ) );
    double bcDistance = std::sqrt( std::pow( x3 - x2, 2 ) + std::pow( y3 - y2, 2 ) );
    double sum = abDistance + bcDistance;

    // Output
    ui->resultLineEdit->setText( QString::number( sum ) );
}
Исходники: https://github.com/8Observer8/SumOfDistances

Среднее арифметическое



Код:
void Dialog::on_resultButton_clicked()
{
    bool ok;

    // Input
    double a = ui->aLineEdit->text().toDouble( &ok );
    if ( !ok ) {
        QMessageBox::information( this, tr( "Ошибка" ), tr( "Вы ввели некорректные данные" ) );
        return;
    }
    double b = ui->bLineEdit->text().toDouble( &ok );
    if ( !ok ) {
        QMessageBox::information( this, tr( "Ошибка" ), tr( "Вы ввели некорректные данные" ) );
        return;
    }

    // Result
    double c = ( a + b ) / 2.0;

    // Output
    ui->cLineEdit->setText( QString::number( c ) );
}
Исходники: https://github.com/8Observer8/Average

Последний раз редактировалось 8Observer8; 11.09.2014 в 10:21.
8Observer8 вне форума
Старый 11.09.2014, 09:38   #8
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

8Observer8
Взял бы, да попробовал на этих задачах TDD (в подписи у тебя про это написано). Наверняка бы в первой задаче задумался и обработал случай когда 2b^2 +c^2 < a^2.
Сейчас твоя программа рухнет на таких данных .
rrrFer вне форума
Старый 11.09.2014, 10:15   #9
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
8Observer8
Взял бы, да попробовал на этих задачах TDD (в подписи у тебя про это написано). Наверняка бы в первой задаче задумался и обработал случай когда 2b^2 +c^2 < a^2.
Сейчас твоя программа рухнет на таких данных .
Точно! Поправил. Да, надо было сначала несколько "острых" тестов написать Хватило бы и одного

Просто если тест писать, то надо убрать расчёт в отдельную функцию и в отдельный файл.

Последний раз редактировалось Stilet; 20.09.2014 в 16:58.
8Observer8 вне форума
Старый 11.09.2014, 10:34   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Просто если тест писать, то надо убрать расчёт в отдельную функцию и в отдельный файл.
Ну можно было бы вместе с интерфейсом протестировать (Qt позволяет), хотя некоторые мастера TDD пишут что это не правильно - "один тест - одна сущность", но некоторые рекомендуют (ATDD, М. Гартнер - в начале книги они для тестирования приложения сначала клепают интерфейс, а потом смотрят как при тестировании программы тыкаются автоматически кнопки и т.п.).
rrrFer вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помощь в решении задач. (Pascal) Ignoree Помощь студентам 2 27.04.2014 20:27
Ошибки в решении задач с функциями Anwen Помощь студентам 1 04.12.2010 16:23
Помощь в решении задач на Pascal. Girl_night Помощь студентам 1 15.10.2009 16:39