Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Ответ
 
Опции темы
Старый 09.07.2012, 19:02   #1
ganster
Пользователь
 
Регистрация: 02.07.2012
Сообщений: 11
По умолчанию Коментарии к каждой строчке

Здравствуйте.
Интересует void swap(loc* l1, loc* l2) зачем оно?
Условие задачи:Создать файл, содержащий координаты точек в двумерном пространстве (вещественные числа типа double). записать все точи из первой координатной четверти в файл 1.dat, второй четверти - 2.dat, третьей четверти - 3.dat, четвертой четверти - 4.dat. Внутри каждого из 4 файлов упорядочить точки в порядке удаления от центра координат
Заранее спасибо!


Код:
#include <stdio.h>
#include <stdlib.h>
 
typedef struct {
    double x, y;
} loc;
 
/*Квадрат расстояния между двумя точками.*/
double sqdist(const loc* l) { return l->x * l->x + l->y * l->y; }
 
void swap(loc* l1, loc* l2) {
    /*Меняет параметры двух точек.*/
    double x = l1->x, y = l1->y;
    l1->x = l2->x;
    l1->y = l2->y;
    l2->x = x;
    l2->y = y;
}
 
void SortLocs(loc ar[ ], unsigned n) {
    /*Сортировка методом вставок.*/
   
    unsigned i, j;
    for (i = 1; i < n; i++)
        for (j = i; j && sqdist(&ar[j]) < sqdist(&ar[j - 1]); j--)
            swap(&ar[j], &ar[j - 1]);
}
 
void PrintLocs(const loc ar[ ], unsigned n) {
    FILE* f[4];
    unsigned i;
    char a;
    f[0] = fopen("1.dat", "w");
    f[1] = fopen("2.dat", "w");
    f[2] = fopen("3.dat", "w");
    f[3] = fopen("4.dat", "w");
    for (i = 0; i < n; i++) {
        /*Определяем координатную четверть.*/
        /*1 четверть => a=0; 2 => a=1 и т. д.*/
        a = ar[i].x < .0;
        if (ar[i].y < .0)
            a = 3 - a;
        fprintf(f[a], "%lf %lf\n", ar[i].x, ar[i].y);
    }
    fclose(f[0]);
    fclose(f[1]);
    fclose(f[2]);
    fclose(f[3]);
}
 
int main() {
    loc* ar;
    unsigned i, n;
    /*Создаем массив точек размером n.*/
    scanf("%u", &n);
    ar = (loc*)malloc(n * sizeof(loc));
    /*И заполняем его.*/
    for (i = 0; i < n; i++)
        scanf("%lf%lf", &ar[i].x, &ar[i].y);
    SortLocs(ar, n);
    PrintLocs(ar, n);
    free(ar);
}

Последний раз редактировалось MaTBeu; 09.07.2012 в 21:50.
ganster вне форума Ответить с цитированием
Старый 09.07.2012, 19:18   #2
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 5,429
По умолчанию

В коде же есть комментарии.
Разве не хватает пояснения /*Меняет параметры двух точек.*/?
Эта функция получает 2 структуры, содержащие координаты точкек, и меняет их местами.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.07.2012, 19:35   #3
ganster
Пользователь
 
Регистрация: 02.07.2012
Сообщений: 11
По умолчанию

так а зачем можете объяснить, а то сам не могу разобраться?
пжлст
ganster вне форума Ответить с цитированием
Старый 09.07.2012, 19:54   #4
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 5,429
По умолчанию

Эта функция нужна для сортировки.
Вот она используется ниже.
Код:
void SortLocs(loc ar[ ], unsigned n) {
/*Сортировка методом вставок.*/

unsigned i, j;
for (i = 1; i < n; i++)
for (j = i; j && sqdist(&ar[j]) < sqdist(&ar[j - 1]); j--)
swap(&ar[j], &ar[j - 1]);
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.07.2012, 20:10   #5
ganster
Пользователь
 
Регистрация: 02.07.2012
Сообщений: 11
По умолчанию

скажите пожалуйста а /*1 четверть => a=0; 2 => a=1 и т. д.*/ как там будет дальше?
и что такое sqdist из вставок?
ganster вне форума Ответить с цитированием
Старый 09.07.2012, 21:07   #6
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 5,429
По умолчанию

sqdist:
Код:
/*Квадрат расстояния между двумя точками.*/
double sqdist(const loc* l) { return l->x * l->x + l->y * l->y; }
Квадрат расстояния между точкой и началом координат.
1 четверть - а=0
2 четверть - а=1
3 четверть - а=2
4 четверть - а=3
, т.е. просто на единичку меньше (в си обычно счет начинается с 0).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.07.2012, 21:42   #7
ganster
Пользователь
 
Регистрация: 02.07.2012
Сообщений: 11
По умолчанию

Скажите а можно в этой проге сделать чтобы выводились надписи X=; и Y=;
вот исходная прога:
Буду благодарен за вашу помощь !!!
Вложения
Тип файла: zip Си.zip (29.0 Кб, 10 просмотров)

Последний раз редактировалось ganster; 09.07.2012 в 21:52.
ganster вне форума Ответить с цитированием
Старый 09.07.2012, 22:00   #8
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 5,429
По умолчанию

Во-первых, exe файл никому не нужен (его нельзя свободно редактировать).
Во-вторых, заменить строку fprintf(f[a], "%lf %lf\n", ar[i].x, ar[i].y); на fprintf(f[a], "X=%lf; Y=%lf;\n", ar[i].x, ar[i].y);.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.07.2012, 22:24   #9
ganster
Пользователь
 
Регистрация: 02.07.2012
Сообщений: 11
По умолчанию

Извини перепутал. Я заменил эту строку и ничего не произошло
Можешь ты посмотреть посмотреть
Вложения
Тип файла: zip qwerty.zip (50.9 Кб, 13 просмотров)
ganster вне форума Ответить с цитированием
Старый 09.07.2012, 22:32   #10
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 5,429
По умолчанию

Ну почему же ничего?
Вот, в одном из выходных файлов:
X=2.000000; Y=2.000000;
X=1.000000; Y=111.000000;

А если нужны эти надписи при вводе:
Вместо
Код:
for (i = 0; i < n; i++)
        scanf("%lf%lf", &ar[i].x, &ar[i].y);
Написать
Код:
for (i = 0; i < n; i++)
    {
        printf("X[%d]=",i+1);
        scanf("%lf",&ar[i].x);
        printf("Y[%d]=",i+1);
        scanf("%lf",&ar[i].y);
    }
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 09.07.2012 в 22:37.
BDA вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
H1 и ссылка на одной строчке Фибер Оптик HTML и CSS 4 15.03.2012 12:14
К каждой строчке добавляется фраза Dominatorsha Общие вопросы Delphi 1 30.05.2011 16:21
найти в каждой строчке найбольший и найменьший елемент и поставить их на первом и последнем месте строчки wlll Помощь студентам 1 08.11.2010 00:34
Замена символов в строчке на прописные zaraz Microsoft Office Excel 8 13.01.2010 15:07
Удаление отступов в последней ячейке каждой строки в каждой таблице Busine2009 Microsoft Office Word 7 06.06.2009 12:27