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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2010, 01:49   #1
ApXoH
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 11
По умолчанию Массив структур(Ввод из файла)

У меня небольшая загвоздка - я немного новичек в си так что рассчитываю на вашу помощь!
Проблема такая есть код на алгоритм дейкстры(сразу признаюсь не мой).
Нужно переделать на ввод с файла вот эту часть:

Код:
struct
{
    char points[ 2 ][ 50 ]; //от пункта к пункту
    int distance;           //расстояние км

    }inf[ ]={
    {{ "A", "B" }, 65 },
    {{ "B", "C" }, 40 },
    {{ "C", "D" }, 60 },
    {{ "D", "E" }, 68 },
    {{ "E", "A" }, 32 },
    {{ "A", "F" }, 45 },
    {{ "B", "F" }, 25 },
    {{ "C", "F" }, 40 },
    {{ "D", "F" }, 60 },
    {{ "E", "F" }, 50 },
    };
Как заставить inf этот заводится с файла? =(
у меня нечего не выходит( Для справки - обозначение "A","B" - путь от точки А до B где 65 - вес дуги. Вся проблема в этом "A","B" - это как один элемент идет - я этого не пойму...?

Вот код всей программы:
Код:
#include<iostream.h> 
#include<conio.h>
#include<string.h> 
#define M ( sizeof(cities)/sizeof(cities[ 0 ]) )
#define N ( sizeof(inf)/sizeof(inf[ 0 ]) ) 
//якобы бесконечность, данное число должно быть больше
//максимального расстояния (по правилам алгоритма)
#define INFINITY 10000
//от какой точки пляшем :)
#define dance 2 
//пункты
char cities[ ][ 50 ]={ "A", "B", "C", "D", "E", "F" };
struct
{
    char points[ 2 ][ 50 ]; //от пункта к пункту
    int distance;           //расстояние км
    }inf[ ]={
    {{ "A", "B" }, 65 },
    {{ "B", "C" }, 40 },
    {{ "C", "D" }, 60 },
    {{ "D", "E" }, 68 },
    {{ "E", "A" }, 32 },
    {{ "A", "F" }, 45 },
    {{ "B", "F" }, 25 },
    {{ "C", "F" }, 40 },
    {{ "D", "F" }, 60 },
    {{ "E", "F" }, 50 },
    };
struct range
{
    char *point;    //пункт
    int distance;   //расстояние от начальной точки
    };  
int main() 
{
int i, j, c, current_distance, q, p, real_p;
char *current_city=NULL; 
range *xr=new range[ M ];
//расстояние от стартовой точки до остальных изначально
//равно бесконечности
for( i=0; i<M; i++ )
{
    xr[ i ].point=NULL;
    xr[ i ].distance=INFINITY;
    }
//а начальная имеет значение ноль
xr[ 0 ].distance=0;
xr[ 0 ].point=cities[ dance ];
for( i=0, c=0, p=1; i<M; i++ )
{
    current_city=xr[ i ].point;
    for( j=0, real_p=1; j<N; j++ )
    {
        current_distance=xr[ i ].distance;
        if( strcmp(inf[ j ].points[ 0 ], current_city)==0
        ||  strcmp(inf[ j ].points[ 1 ], current_city)==0 )
        {
            //проверка не проверяли ли эту точку ранее
            for( q=0; q<i; q++ )
                if( strcmp(inf[ j ].points[ 0 ], xr[ q ].point)==0
                ||  strcmp(inf[ j ].points[ 1 ], xr[ q ].point)==0 )
                    break;
            if( q<i )
                continue;
           //находим какая точка сейчас явл соседом с той которую
           //проверяем т.е до какой точки смотрим расстояние
           for( q=0; q<2; q++ )
              if( strcmp(inf[ j ].points[ q ], current_city)!=0 )
                  break;
           //i -- текущий пункт
           //p -- всего соседей(уже посещенных) 
           //real_p -- сосед текущего пункта который сейчас проверяется
           //j -- текущий отрезок
           for( c=0; c<p; c++ )
               if( strcmp(xr[ c ].point, inf[ j ].points[ q ])==0 )
                   break;
           if( c<p )
               real_p=c; //пункт посещался сверяться будем с ним  
           else
           {   //пункт не посещался
               xr[ p ].point=inf[ j ].points[ q ]; //запоминаем пункт
               real_p=p; //вносим свежие данные по нему
               ++p;
               }
           current_distance+=inf[ j ].distance;
           if( current_distance<xr[ real_p ].distance )
               //запоминаем расстояние
               xr[ real_p ].distance=current_distance;
              }
          }
      }
cout << endl << "---------------------" << endl
     << "Beeline from " << xr[ 0 ].point << endl;
for( q=1; q<p; q++ )
    cout << "to: " << xr[ q ].point << " = " << xr[ q ].distance << endl;
delete [] xr; 
getch();
return 0; 
}
ApXoH вне форума Ответить с цитированием
Старый 03.06.2010, 13:42   #2
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

перегрузи оператор >> и потом считывай с помощью ifstream как в обычную переменную.
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 04.06.2010, 00:19   #3
ApXoH
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 11
По умолчанию

ок спс попробую
ApXoH вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив структур AndreyT Общие вопросы C/C++ 2 01.06.2010 19:19
массив структур MichaelRED Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 18.05.2010 22:55
массив структур klykovka Общие вопросы C/C++ 4 19.04.2010 16:17
массив структур Help_me_please Помощь студентам 3 16.01.2010 02:19
Массив структур velvetdust Общие вопросы C/C++ 0 21.03.2009 13:18