Вход на сайт
Программирование в С
976
NEW 29.05.15 18:48
Здравствуйте, обращаюсь за помощью снова....В этот раз вообще не знаю с чего начать. Подскажите, с какого шага легче начать. и, самое главное, как....Заранее благодарна за любой совет и посильную помощь.
NEW 29.05.15 19:14
1. Программа должна уметь интерпретировать командную строку своего вызова, с которой ей передаются параметры. Для этого использовать стандартную функцию getopt.
2. Программа должна уметь прочесть структуру графа, как указано в 2.2. Я, правда, не нашел, откуда программа должна уметь это считывать :) Возможно, из текстового файла, имя которого передается
в командной строке.
Вывести базовую инфу о графе, как это указано: кол-во вершин, ребер итд.
3. Посчитать вектор PageRank путем
a) Многократного случайного "серфинга" по графу, с использованием генератора случайных чисел.
б) Вторым методом, путем многократного умножения вектора на матрицу M, как в пункте 1.2.
Программа должна посчитать матрицу М. как в пункте 1.2, по структуре графа и по вероятности P.
Результаты должны быть похожими :)
5. Нужно делать вывод результатов работы в формате, который требуется.
2. Программа должна уметь прочесть структуру графа, как указано в 2.2. Я, правда, не нашел, откуда программа должна уметь это считывать :) Возможно, из текстового файла, имя которого передается
в командной строке.
Вывести базовую инфу о графе, как это указано: кол-во вершин, ребер итд.
3. Посчитать вектор PageRank путем
a) Многократного случайного "серфинга" по графу, с использованием генератора случайных чисел.
б) Вторым методом, путем многократного умножения вектора на матрицу M, как в пункте 1.2.
Программа должна посчитать матрицу М. как в пункте 1.2, по структуре графа и по вероятности P.
Результаты должны быть похожими :)
5. Нужно делать вывод результатов работы в формате, который требуется.
NEW 31.05.15 15:23
в ответ lisenkalejka 31.05.15 14:16
Точно нужных алгоритмов Вы не найдете.
Это ведь всего лишь конкретное задание.
Например, относительно чтения структуры графа из файла, я бы все строки до "заголовка" считывал командой getline, а непосредственно строки типа X->Y, как Вам указали, удобно будет считывать командой n=scanf(filestream, "%c->%c", &c1, &c2);
Еще вопрос, это ведь у Вас задание на чистом C, не С++? Просто в С некоторые вещи чуть замороченнее :)
Это ведь всего лишь конкретное задание.
Например, относительно чтения структуры графа из файла, я бы все строки до "заголовка" считывал командой getline, а непосредственно строки типа X->Y, как Вам указали, удобно будет считывать командой n=scanf(filestream, "%c->%c", &c1, &c2);
Еще вопрос, это ведь у Вас задание на чистом C, не С++? Просто в С некоторые вещи чуть замороченнее :)
NEW 31.05.15 15:29
в ответ Murr 31.05.15 15:10
Спасибо большое за ответ. Но у меня вопрос, что я лично вам такого сделала, что вы постоянно язвите? Я перед вами чем то провинилась? Вы скажите, может где-то на форуме обидела, по незнанию. Прошу прощения, если это так. Но с начала создания тем, вы ни разу ничего путного не подсказали, а лишь подкалываете. Я не отрицаю, что я полная дура в информатике, но я пытаюсь научиться, вы же тоже не с пеленок сразу все знали и умели. Я лишь просила посильной помощи и наводок, а не готовых решений....
NEW 31.05.15 21:02
в ответ lisenkalejka 31.05.15 15:29
что вы постоянно язвите?
------
Я таки просто такой есть...
но я пытаюсь научиться
-----
Увы, но то, что было описано как программа обучения либо рассчитано на гениев, способных осваивать все еще до начала лекции, либо не позволяет обучить чему-либо путевому в программировании. С той скоростью, с которой предполагается давать материал, можно проскочить, галопом-по-европам, ознакомительно, по всему массиву и... спокойно забыть об том что было сделано. Все одно забудется со временем т.к. закрепления пройденного не происходит - слишком частые переключения на другой язык/инструмент. Смысл - пытаться что-либо обьяснить (тебе) в той ситуации - отсутствует.
Я лишь просила посильной помощи и наводок
-----
А что такое Граф вам обясняли? Основные проблемы/вопросы/ситуации, решение которых сводится к определению Графа и применению более-мение стандартных методов нахождения решения на Графе (3 курс советского университета), группе давали? Ограничения и допустимость методик разьясняли? Думаю, что нет. Как, в этой ситуации дать "наводку" решения на Графе?
С точки зрения программирования на Си... ну скажем так - ребро графа соответствует функции перехода между вершинами... так вот решение в лоб - определяй в ребре указатель на функцию, определяй саму функцию перехода и навигацию по Графу вызывая функции и набирая требуемую статистику. Опсс... до понимания термина "указатель на функцию" еще месяца 3-4 изучения языка Си по методике полного погружения и не факт что будет понято...
Это Я еще не рассматривал варианты определения/представления Графа в языке Си - в зависимости от методики определения некоторые моменты делаются проще...
вы же тоже не с пеленок сразу все знали и умели.
-----
Ты помните чем когда и как у тебя развивали мелкую моторику пальчиков?
По современным методикам это делается в школе, во втором классе... иногда - позднее.
У меня же это происходило в возрасте 4.5 лет - те игрушки, которые мне покупали, требовали ее наличия... или не позволяли себя использовать. Помимо моторики игрушки еще требовали не совсем тривиального мышления. Сейчас такие игрушки просто не делают - заменили кастрированным вариантом.
Ну а к тому моменту когда начали обучать программированию - уже лет 15 как был неплохо знаком с паяльником и схемотехникой... и имел высшее образование в области матеметики.
Так что - да, начали - с пеленок.
------
Я таки просто такой есть...

но я пытаюсь научиться
-----
Увы, но то, что было описано как программа обучения либо рассчитано на гениев, способных осваивать все еще до начала лекции, либо не позволяет обучить чему-либо путевому в программировании. С той скоростью, с которой предполагается давать материал, можно проскочить, галопом-по-европам, ознакомительно, по всему массиву и... спокойно забыть об том что было сделано. Все одно забудется со временем т.к. закрепления пройденного не происходит - слишком частые переключения на другой язык/инструмент. Смысл - пытаться что-либо обьяснить (тебе) в той ситуации - отсутствует.
Я лишь просила посильной помощи и наводок
-----
А что такое Граф вам обясняли? Основные проблемы/вопросы/ситуации, решение которых сводится к определению Графа и применению более-мение стандартных методов нахождения решения на Графе (3 курс советского университета), группе давали? Ограничения и допустимость методик разьясняли? Думаю, что нет. Как, в этой ситуации дать "наводку" решения на Графе?
С точки зрения программирования на Си... ну скажем так - ребро графа соответствует функции перехода между вершинами... так вот решение в лоб - определяй в ребре указатель на функцию, определяй саму функцию перехода и навигацию по Графу вызывая функции и набирая требуемую статистику. Опсс... до понимания термина "указатель на функцию" еще месяца 3-4 изучения языка Си по методике полного погружения и не факт что будет понято...
Это Я еще не рассматривал варианты определения/представления Графа в языке Си - в зависимости от методики определения некоторые моменты делаются проще...
вы же тоже не с пеленок сразу все знали и умели.
-----
Ты помните чем когда и как у тебя развивали мелкую моторику пальчиков?
По современным методикам это делается в школе, во втором классе... иногда - позднее.
У меня же это происходило в возрасте 4.5 лет - те игрушки, которые мне покупали, требовали ее наличия... или не позволяли себя использовать. Помимо моторики игрушки еще требовали не совсем тривиального мышления. Сейчас такие игрушки просто не делают - заменили кастрированным вариантом.
Ну а к тому моменту когда начали обучать программированию - уже лет 15 как был неплохо знаком с паяльником и схемотехникой... и имел высшее образование в области матеметики.
Так что - да, начали - с пеленок.
NEW 01.06.15 09:07
в ответ Murr 31.05.15 21:02
Очень рада за Вас,маленький гений. Я с паяльником в руках не родилась. Материал дается галопом по Европам, согласна абсолютно. Поэтому и помощи попросила,а Вы с высоты своего опыта и полета только плюете. Взрослый мужчина, с высшим образованием, гений с пеленок,а просто совет дать,надломитесь. В любом случае, спасибо Вам и за это,как никак ценный урок в жизни,что не стоит ожидать помощи от таких вот гениев,ибо спуститься к нам смертным выше Вашего положения и оскорбляет Вашу воодухотворенную гениальную натуру. Но что же теперь делать? Бросать? Не в моих правилах. Буду дальше биться.
01.06.15 09:36
Я бы предложил следующий алгоритм, пока только для прочтения графа из файла.
В C неудобно создавать массивы (вершин, ребер) по ходу 1-го чтения файла,
т.к. неизвестно, каких размеров будет итоговый массив. Поэтому мне кажется, проще всего считать этот
файл дважды:
1-й раз: просто прочесть имя графа (GraphBezeichner) и количество ребер (строк с ->). После этого мы получаем это значение NKanten и закрываем файл командой fclose();
Создаем массивы (т.е. выделяем память командами malloc для ребер array_kanten (тип самого ребра я бы задал так struct Kante {int ausgangsKnote, eingangsKnote;}; ) размера NKanten и array_knoten вершин -- тут мы точного кол-ва пока не знаем (будет посчитано после 2-го прочтения файла), но можем взять по максимуму размера 2*NKanten. Тип элемента этого массива, например struct Knote{char name[257]; int ausgangsZahl, eingangsZahl;};)
2-й раз: каждое из ребер считываем командой n=scanf("%s%s%s", s1, s2, s3), где s1 и s3 -- массивы char размера 258 (под имена вершин), а s2 -- просто техническая ненужная вещь, куда сохраняется "стрелочка".
От s3 с конца нужно не забыть убрать лишний символ ";"
После прочтения каждого ребра нужно установить, встречались ли эти 2 вершины раньше (т.е. их имена сохранены в массиве array_knoten), или это новая/ые вершины, которые туда нужно сохранить (и при этом увеличить счетчик кол-ва вершин). В любом случае,
у нас получается соответствие между индексом(номером) вершины в массиве array_knoten и ее именем (которое сохраняется в поле name структуры Knote). Необходимо также для прочитанного ребра сохранить его
информацию, т.е. ausgangsKnote, eingangsKnote в соотв. элементе массива array_kanten.
Снова закрыть файл fclose();
После этого можно для каждой из сохраненных вершин в массиве array_knoten посчитать кол-во исходящих и входящих в нее ребер. Для этого просто пройти циклом по массиву ребер и проверить, где номер начальной
или конечной вершины совпадает с номером той, которую мы сейчас анализируем. Эти числа нужно сохранить в элемент массива array_knoten[ i ].ausgangsZahl и
array_knoten[ i ].eingangsZahl.
Уже сейчас можно вывести информацию, как первый Meilenstein, про кол-во ребер, вершин, и макс/мин исходящих/входящих ребер.
Пока все с этой частью алгоритма.
В C неудобно создавать массивы (вершин, ребер) по ходу 1-го чтения файла,
т.к. неизвестно, каких размеров будет итоговый массив. Поэтому мне кажется, проще всего считать этот
файл дважды:
1-й раз: просто прочесть имя графа (GraphBezeichner) и количество ребер (строк с ->). После этого мы получаем это значение NKanten и закрываем файл командой fclose();
Создаем массивы (т.е. выделяем память командами malloc для ребер array_kanten (тип самого ребра я бы задал так struct Kante {int ausgangsKnote, eingangsKnote;}; ) размера NKanten и array_knoten вершин -- тут мы точного кол-ва пока не знаем (будет посчитано после 2-го прочтения файла), но можем взять по максимуму размера 2*NKanten. Тип элемента этого массива, например struct Knote{char name[257]; int ausgangsZahl, eingangsZahl;};)
2-й раз: каждое из ребер считываем командой n=scanf("%s%s%s", s1, s2, s3), где s1 и s3 -- массивы char размера 258 (под имена вершин), а s2 -- просто техническая ненужная вещь, куда сохраняется "стрелочка".
От s3 с конца нужно не забыть убрать лишний символ ";"
После прочтения каждого ребра нужно установить, встречались ли эти 2 вершины раньше (т.е. их имена сохранены в массиве array_knoten), или это новая/ые вершины, которые туда нужно сохранить (и при этом увеличить счетчик кол-ва вершин). В любом случае,
у нас получается соответствие между индексом(номером) вершины в массиве array_knoten и ее именем (которое сохраняется в поле name структуры Knote). Необходимо также для прочитанного ребра сохранить его
информацию, т.е. ausgangsKnote, eingangsKnote в соотв. элементе массива array_kanten.
Снова закрыть файл fclose();
После этого можно для каждой из сохраненных вершин в массиве array_knoten посчитать кол-во исходящих и входящих в нее ребер. Для этого просто пройти циклом по массиву ребер и проверить, где номер начальной
или конечной вершины совпадает с номером той, которую мы сейчас анализируем. Эти числа нужно сохранить в элемент массива array_knoten[ i ].ausgangsZahl и
array_knoten[ i ].eingangsZahl.
Уже сейчас можно вывести информацию, как первый Meilenstein, про кол-во ребер, вершин, и макс/мин исходящих/входящих ребер.
Пока все с этой частью алгоритма.
NEW 01.06.15 11:03
в ответ lisenkalejka 01.06.15 09:07
Но что же теперь делать?
------
А что в такой ситуации должен делать нормальный инженер? Правильно - анализировать проблему,
делать оценку ситуации и прогнозировать результат. И искать способ получения более приемлемого
результата.
Буду дальше биться.
-----
Не проблема. Проблема - результативность. Она, априори, будет никакая. Почему так - обьяснено выше.
а просто совет дать
-----
Рекомендации были приведены. Так же был задан вопрос об том, понятны ли данные рекомендации.
По реакции на рекомендации понятно, что, как и предполагалось и обосновывалось, в них ничего не
понятно. А ведь рекомендации, с учетом ситуации, были предельно упрощены. Остается только язвить,
что Я и делаю изначально...
------
А что в такой ситуации должен делать нормальный инженер? Правильно - анализировать проблему,
делать оценку ситуации и прогнозировать результат. И искать способ получения более приемлемого
результата.
Буду дальше биться.
-----
Не проблема. Проблема - результативность. Она, априори, будет никакая. Почему так - обьяснено выше.
а просто совет дать
-----
Рекомендации были приведены. Так же был задан вопрос об том, понятны ли данные рекомендации.
По реакции на рекомендации понятно, что, как и предполагалось и обосновывалось, в них ничего не
понятно. А ведь рекомендации, с учетом ситуации, были предельно упрощены. Остается только язвить,
что Я и делаю изначально...
NEW 01.06.15 11:16
в ответ BorisL0 01.06.15 09:36
s2 -- просто техническая ненужная вещь, куда сохраняется "стрелочка".
-----
Стоило бы написать и опробовать реальный код.
Спецификация для %s - Any number of non-whitespace characters, stopping at the first whitespace character found. A terminating null character is automatically added at the end of the stored sequence.
-----
Стоило бы написать и опробовать реальный код.
Спецификация для %s - Any number of non-whitespace characters, stopping at the first whitespace character found. A terminating null character is automatically added at the end of the stored sequence.
NEW 01.06.15 11:23
Опробовал. Работает. Дело в том, что в задании указано, что вокруг "стрелочки" стоят пробелы.
Так что все Ок: в s1 сохраняется имя исходящей вершины, s2 -- стрелочка, s3 -- имя вершины-цели плюс символ ";" который еще нужно убрать.
Так что все Ок: в s1 сохраняется имя исходящей вершины, s2 -- стрелочка, s3 -- имя вершины-цели плюс символ ";" который еще нужно убрать.