Jump to content

Переношу PHP скрипт в консольное приложение на C


0nline
 Share

Recommended Posts

Собственно задача стоит такая: Регистрируем граф, выводим всевозможные пути обхода. Поскольку долго работал с сайтами, на PHP решил задачу быстро, но возникла необходимость написания программы на C( 
И тут я был повержен в шок, ибо строка тут не строка, а массив char, многих удобных функций, к которым я так привык тут нет.
В университете писал на C и на C++, но это было давно и после этого я очень сроднился с PHP...

Имеется двумерный массив - матрица смежности, в которой введены пропускные способности рёбер графа. Привожу свою функцию обхода в глубину на PHP

[code

#Выполняем рекурсивный обход в глубину и запись пути для конкретной вершины графа
#$connections - матрица смежности
#$num - размер матрицы смежности
#&$ar - путь для одной ветви обхода в глубину
#$n - текущий узел графа
#$k - счётчик путей одной ветви обхода в глубину
#&$c - счётчик всех путей
#&$tc - счётчик пропускных способностей
#&$result - массив всех путей
#&$temp_capacity - пропускные способности одной ветви обхода
#&$result_capacity - пропускные способности всех путей
function all_paths($connections, $num, &$ar, $n, $k, &$c, &$result, &$temp_capacity, &$result_capacity)
{
    $tc = 0;
    if ($k==0) 
    {
        $ar[$k]=$n;
    }
    for ($i=0; $i<$num; $i++)
    {
        if (($connections[$n-1][$i]!='') and (strpos($ar[$k], strval($i+1)) === false))
        {
            if ($temp_capacity[$tc]=='')
            {
                $temp_capacity[$tc] = $connections[$n-1][$i];
                $result_capacity[$c] = $temp_capacity[$tc];
                #echo 'k='.$k.', c='.$c.', cap='.$result_capacity[$c].'<br>';
            }
            elseif (strval($temp_capacity[$tc])>=strval($connections[$n-1][$i]))
            {
                $temp_capacity[$tc+1] = $connections[$n-1][$i];
                $result_capacity[$c] = $temp_capacity[$tc+1];
                #echo 'k='.$k.', c='.$c.', cap='.$result_capacity[$c].'<br>';
            }
            else
            {
                $temp_capacity[$tc+1] = $temp_capacity[$tc];
                $result_capacity[$c] = $temp_capacity[$tc+1];
                #echo 'k='.$k.', c='.$c.', cap='.$result_capacity[$c].'<br>';
            }
            $ar[$k+1] = $ar[$k].'.'.($i+1);
            $result[$c] = $ar[$k+1];
            $k++;
            $c++;
            $tc++;
            all_paths($connections, $num, $ar, ($i+1), $k, $c, $result, $temp_capacity, $result_capacity);
            $k--;
            $tc--;
            $temp_capacity[$tc] = '';
            
        }
    }
}

]

Тут все прекрасно(тут еще подсчитывается минимальная пропускная способность каждого пути, еще есть функция, которая удаляет зеркальные копии маршрутов обхода)

А в С я столкнулся с отсутствием понятия строки как такового(ЧТО?? НЕ КОНКАТЕНИРОВАТЬ СТРОКИ ТОЧКОЙ???) и многими другими трудностями, отсюда вся моя головная боль...
Матрицу смежности создаю, а дальше у меня ступор( CodeBlocks заваливает меня непонятными ошибками(

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define max_capacity_length 5
/**
Рекурсивный обход матрицы смежности в глубину
num - размерность матрицы
connections_array - передаваемая матрица
k - счетчик обхода в глубину одной ветви
c - счетчик количества путей
n - текущая вершина
path - массив путей для конкретной ветви
result_paths - массив всех путей
 */
 
void all_paths(int num, int c_ar[num][num],int n,int *k, int *c, char path[], char result_paths[])
{
    int i;
    char str[5];
    if (*k==0)
    {
        itoa(n, str, 10);
        strcat(path[*k], str);
    }
    else
        for (i=0; i<num; i++)
        {
            if (c_ar[n][i]!=0)
            {
                itoa(i, str, 10);
                strcat(path[*k], str);
                strcat(result_paths[*c], path[*k]);
                *c=*c+1;
                *k=*k+1;
                all_paths(num, c_ar, i, *k, *c, path, result_path);
                *k=*k-1;
            }
        }
}
 
 
int main()
{
    int node_num, i, j, t, capacity, c, k;
    printf("Enter delay(t): ");
    scanf("%d", &t);//Вводим задержку, используемую в формуле
    printf("\nEnter number of nodes: ");
    scanf("%d", &node_num);//Считываем количество узлов в сети
    char s[max_capacity_length], temp_path[100], glob_paths[100];
    int connections[node_num][node_num];
    for (i=0; i<node_num; i++)
    {
        for (j=0; j<node_num; j++)
        {
            connections[i][j] = 0;
            printf("[%d][%d]=%d ",i,j,connections[i][j]);
        }
        printf("\n");
    }
    printf("Enter connected nodes(FORMAT: NODE.CONNECTED_NODE.CAPACITY), when you enter all connections enter '0'\n");
    strcpy(s, "smth");
    while (strcmp(s,"0")!=0)
    {
        gets(s);
        strcat(s,".");
        i = atoi(strtok(s, "."))-1;
        j = atoi(strtok(NULL, "."))-1;
        capacity = atoi(strtok(NULL, "."));
        if (i!=-1 && j!=-1 && capacity!=-1)
        {
            printf("Element [%d]", i);
            printf("[%d]", j);
            printf("\nCapacity = %d\n", capacity);
            connections[i][j] = capacity;
            connections[j][i] = capacity;
        }
    }
    c=0;
    k=0;
    temp_path[0]="";
    for (i=0; i<node_num; i++)
    {
        printf("i = %d; ", i);
        all_paths(node_num, connections, i, &k, &c, temp_path, glob_paths);
    }
    getch();
    return 0;
}

Запутался я короче со всеми указателями и массивами строк, которые массивы символов на самом деле
А еще почему то нельзя инкрементировать и декрементировать значение переменной через указатель *к... Короче у меня программный шок после PHP, JS.

Если есть разбирающиеся люди - просьба помочь, объясните как правильно это писать, в принципе я понимаю в чём ошибка, скорее всего в передаче аргументов функции, но для меня визуально всё выглядит адекватно.

Вообще страшная штука С. Если начинать программировать, то лучше начинать именно с него. Только хардкор, никаких поблажек, жесткие указания типов переменных, отсутствие любимых функций, к которым я так привык в PHP(strpos, substr, strval, inttostr и другие).

После изучения PHP и JS сложно вникать в С, несмотря на то, что начинал программировать именно с него(около двух лет пописал на нём).

Edited by 0nline
Link to comment
Share on other sites

гуглите, что я могу сказать.   

с явой я тоже был в шоке насколько она отличается от всего что я видел. но ниче, разобрался. 

ищите библиотеки. полюбому есть то, что вам нужно. С - не ява, мануалов должно быть больше

впринципе и на яве можно найти классные библиотеки, которые решат любую проблемму... но не под андроид)) 

я выпал в осадок когда начал там xml разбирать - хардкор. ни одна библиотека нормально не работала. все с глюками

Link to comment
Share on other sites

Ну собственно всё получилось. Благо существует С++ и бесплатная Visual Studio Express 2015 от Микрософта)) 

Рекомендую попробовать, интересно написать свое оконное приложение)(Кстати работу зарегистрировали как научную в области оптимизации сетей связи и обмена данными, можете меня поздравить, 4 недели убил на 3 разных версии этого потрясного софта:facepalmxd:)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy