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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2012, 11:45   #11
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
А с какой целью тут вообще указатели передаются? Не проще ли сразу значения:

Код:
double lenght_of_segment(const int x2 ,const int x1 ,const int y2 ,const int y1)
{
    double a, b, c;

    a = fabs((double)(x2-x1));
    b = fabs((double)(y2-y1));
    c = sqrt(pow(a, 2) + pow(b, 2));
    return c;
}
Конечно проще. Цель надо у автора спросить. Вообще, это и мой тоже недочет, мне надо было указать на это автору.

beerouser, когда будите передавать параметры по значению, то не забудьте убрать символ (&)
Код:
lenght_of_segment( xy [i][0], xy[j][0], xy[i][1], xy[j][1]);
P.S. beerouser, честно, код у вас не очень хороший в целом (мягко говоря). Надо по-другому подойти к задаче. Когда найду время покажу, как сделать лучше. Хотя задача простая, но всё же вам удалось сделать её сложной

Последний раз редактировалось 8Observer8; 08.01.2012 в 12:10.
8Observer8 вне форума Ответить с цитированием
Старый 08.01.2012, 13:52   #12
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

beerouser, если договориться что входные данные берутся из файла. А формат данных следующий:

1) каждая строка представляет отрезок;
2) первые два числа (они могут быть вещественными) - это координаты начала отрезка, а последние два числа в строке - это конец отрезка;
3) начало следующего отрезка - это конец предыдущего;
4) последний отрезок должен замыкать n-угольник;
5) пользователь сам следит на корректностью входных данных. Программу нужно доработать, чтобы она это делала.

К примеру, координаты отрезков квадрата:
Код:
1 1 5 1
5 1 5 5
5 5 1 5
1 5 1 1
Следующая программа рассчитывает периметр n-угольника. Сейчас n ограничена сотней.
Код:
#include <stdio.h>
#include <math.h>
#include <locale.h>

#define MAXAPEXES 100
#define MAXSEGMENTS 100

double lenght_of_segment(struct segment* s);

// функция для инициализации координат отрезков
int init_segments(struct segment segments[], int max_segments, FILE* fp);

// функция для расчёта периметра
double calc_perimeter(struct segment segments[], int nsegments);

// точка с коордитатами x и y
struct point {
    double x;
    double y;
};

// отрезок с координатами начала и конца
struct segment {
    struct point begin_point;
    struct point end_point;
};

int main(int argc, char* argv[])
{
    // имя файла-программы (полный путь), для сообщений об ошибке
    char* prog = argv[0];

    // файл с входными данными (координаты точек)
    char* fname = "inputfile.txt";
    FILE* infp = fopen(fname, "r");

    // массив отрезков, у каждого отрезка есть координаты начала и конца
    struct segment segments[MAXSEGMENTS];

    // количество отрезков n-угольника
    int nsegments;

    double perimeter;

    setlocale(LC_ALL, "Russian");

    // проверяем открылся ли файл, если нет - то сообщаем об ошибке и выходим
    if (infp == NULL) {
        fprintf(stderr, "%s error: can't open file \"%s\"\n", prog, fname);
        return 1;
    }

     // инициализация координат отрезков
    nsegments = init_segments(segments, MAXSEGMENTS, infp);

    if (nsegments > 0) {
        // расчитываем периметр
        perimeter = calc_perimeter(segments, nsegments);
        printf("Периметр %d-угольника равен: %.3f\n", nsegments, perimeter);
    }
    else {
        fprintf(infp, "error: file \"%s\" empty or data is illegal\n", fname);
        return 1;
    }

    fclose(infp);
    return 0;
}

// calc_perimeter: расчёт периметра n-угольника
double calc_perimeter(struct segment segments[], int nsegments)
{
    int i;
    double sum;

    sum = 0;
    for (i = 0; i < nsegments; i++) {
        sum += lenght_of_segment(&segments[i]);
    }

    return sum;
}

// init_segments: инициализирует массив отрезков
int init_segments(struct segment segments[], int max_segments, FILE* fp)
{
    double x1, y1, x2, y2;
    int npoints, i;

    npoints = 0;
    for (i = 0; i < max_segments-1 && fscanf(fp, "%lf%lf%lf%lf", &x1, &y1, &x2, &y2) != EOF; i++) {
        segments[i].begin_point.x = x1;
        segments[i].begin_point.y = y1;
        segments[i].end_point.x = x2;
        segments[i].end_point.y = y2;
        npoints++;
    }

    return npoints;
}

// lenght_of_segment: вычисляет длину отрезка по координатам начала и конца
double lenght_of_segment(struct segment* s)
{
    double a, b, c;

    a = fabs(s->end_point.x - s->begin_point.x);
    b = fabs(s->end_point.y - s->begin_point.y);
    c = sqrt(pow(a, 2) + pow(b, 2));

    return c;
}

Последний раз редактировалось 8Observer8; 08.01.2012 в 13:59.
8Observer8 вне форума Ответить с цитированием
Старый 09.01.2012, 18:57   #13
beerouser
 
Регистрация: 07.01.2012
Сообщений: 7
По умолчанию

Если честно не ожидал такой активности, благодарю всех за помощь.
Касательно чрезмерного усложнения : это всеголишь мои эксперименты с
языком в целях обучения (как можно как нельзя, а что если так и т.д.).
Об эффективности и красоте можно задумыватся тогда, когда
освою базовые структуры языка.
В этом примере я учился работать с функциями (как вызывать что передавать).В процессе накопления знаний овладения новыми методами
можно будет эффективнее их комбинировать , но чтобы это делать хоть как-то, их надо изучить, а это лучше всего делать на практике , как в этом примере.
Тем более это первый язык программирования который я пытаюсь освоить.

Еще раз благодарю.
beerouser вне форума Ответить с цитированием
Старый 09.01.2012, 19:01   #14
beerouser
 
Регистрация: 07.01.2012
Сообщений: 7
По умолчанию

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В чем ошибка??? Севастьянов Microsoft Office Excel 3 17.08.2011 11:48
Люди обьясните в чем ошибка. FreeFire_a Помощь студентам 0 16.01.2011 23:53
Обьясните почему тут ошибка? Skorpion555 Помощь студентам 11 10.03.2010 08:28
Ошибка "не найден файл vc60.bpl" обьясните Нур C++ Builder 4 22.12.2009 23:12