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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2010, 21:30   #1
nikalerka
 
Регистрация: 24.11.2010
Сообщений: 6
Восклицание не могу найти ошибку в программе (С++) дискретная математика

Доброго времени суток!
помогите найти ошибку в программе.
сия программа должна брать матрицу смежности графа из g_graph.txt и выводить гамильтоновы циклы в g_cycle.txt. она запускается, но в g_cycle.txt ничего не выводится. не могу найти ошибку.
помогите пожалуйста!
заранее спасибо откликнувшимся)
Код:

#include<iostream.h>
#include <stdio.h>
typedef enum {false, true} bool;
FILE* fi=fopen("g_graph.txt","r");
FILE* fo=fopen("g_cycle.txt","w");
bool**graph;//Матрица смежности для хранения графа
int n;//Количество вершин в графе
const int vertex=1;//первая вершина при поиске
int *St;//Массив для хранения просмотренных вершин
int *Nnew;//Массив признаков: вершина просмотрена или нет
void out_way(int n)//Процедуры вывода Гамильтонова цикла
{
     for(int i=0;i<n;i++)
	 fprintf(fo,"%d", St[i]);
	 fprintf(fo,"%dn",vertex);
}
void gamilton_path(int k)
{
 int v=St[k-1];// текущая вершина
     for(int j=0;j<n;j++)
	 if(graph[v][j]==1)//есть ребро между v и j
	    if(k==n && j==vertex)
	       out_way(n);//прошли все вершины
	    else
	       if(Nnew[j])//вершина не просмотрена
		 {
		  St[k]=j;//добавляем ее к пройденому пути
		  Nnew[j]=false;//просмотрена
		  gamilton_path(k+1);//строим путь дальше
		  Nnew[j]=true;//возвращаемся назад и строим другие циклы
		 }
}
int main()
{
 fscanf(fi,"%d",&n);//считываем количество вершин
 St=new int[n];
 Nnew= new int[n];
    for(int i=0;i<n;i++)
	Nnew[i]=1;//нет просмотренных вершин
	graph=new bool*[n];
	  for(int i=0;i<n;i++)
	 graph[i]=new bool[n];//выделяем память под строку
	    for(int j=0;j<n;j++)
		{
		 fscanf(fi,"%d",&graph[i][j]);
		}

 Nnew[vertex]=false;//первая вершина уже просмотрена
 St[0]=vertex;//вершина с которой начали проход
 gamilton_path(1);//параметр означает количество пройденых вершин
 fcloseall();
 return(0);
}

Последний раз редактировалось Stilet; 25.11.2010 в 16:51.
nikalerka вне форума Ответить с цитированием
Старый 25.11.2010, 11:42   #2
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

файл с исходными данными пришли g_graph.txt
Как твою программу проверить без него ?
Может она и не считает никакие числа, потому и писать в файл нечего.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 25.11.2010, 12:27   #3
nikalerka
 
Регистрация: 24.11.2010
Сообщений: 6
По умолчанию

g_graph.txt содержит следующее (for example):

6
010111
011010
000111
111111
000110
010101

где 6-число вершин, а то, что ниже - матрица смежности соответственно.
nikalerka вне форума Ответить с цитированием
Старый 25.11.2010, 12:55   #4
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

ты матрицу смежности неправильно заполняешь.
Код:
for(int i=0;i<n;i++)
graph[i]=new bool[n];//выделяем память под строку
for(int j=0;j<n;j++)
{
fscanf(fi,"%d",&graph[i][j]);
}
Надо вот так.
Код:
for(int i=0;i<n;i++)
{
graph[i]=new bool[n];//выделяем память под строку
for(int j=0;j<n;j++)
{
fscanf(fi,"%d",&graph[i][j]);
}}
А дальше путь у тебя не находит. Смотри сам. Так что в файл выводить то и нечего.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 25.11.2010, 14:38   #5
nikalerka
 
Регистрация: 24.11.2010
Сообщений: 6
По умолчанию

"А дальше путь у тебя не находит" - в смысле путь в выходной файл? (Простите, если тупые вопросы задаю).

И еще,
Код:
for(int i=0;i<n;i++)
Nnew[i]=1;
graph=new bool*[n];
for(int i=0;i<n;i++)
{
graph[i]=new bool[n];
for( int j=0;j<n;j++)
{
fscanf(fi,"%d", &graph[i][j]);
}}
на выделенной строке выдает ошибку *Multiple declaration for 'i'*. Что это значит? Что с этим делать?

Последний раз редактировалось Stilet; 25.11.2010 в 16:52.
nikalerka вне форума Ответить с цитированием
Старый 25.11.2010, 14:42   #6
andrewpalkin
Форумчанин
 
Аватар для andrewpalkin
 
Регистрация: 23.11.2010
Сообщений: 458
По умолчанию

Цитата:
Сообщение от nikalerka Посмотреть сообщение
"А дальше путь у тебя не находит" - в смысле путь в выходной файл? (Простите, если тупые вопросы задаю).

И еще,

for(int i=0;i<n;i++)
Nnew[i]=1;
graph=new bool*[n];
for(int i=0;i<n;i++)
{
graph[i]=new bool[n];
for( int j=0;j<n;j++)
{
fscanf(fi,"%d", &graph[i][j]);
}}

на выделенной строке выдает ошибку *Multiple declaration for 'i'*. Что это значит? Что с этим делать?
В выделенной строке убери то что красным выделил for(int i=0;i<n;i++)
--- Если я вам помог , то помогите и вы мне . Не просто просите решить задачу , а пробуйте ее сами решить ! Я не пишу программы с нуля , я помогаю поправить код ! ---
andrewpalkin вне форума Ответить с цитированием
Старый 25.11.2010, 16:16   #7
nikalerka
 
Регистрация: 24.11.2010
Сообщений: 6
По умолчанию

Цитата:
Сообщение от andrewpalkin Посмотреть сообщение
В выделенной строке убери то что красным выделил for(int i=0;i<n;i++)
спасибо, помогло.

в итоге имеем запускающуюся, без явных ошибок, но не работающую программу. в выходной файл никакой информации не поступает.

что делать? в чем ошибка?
Код:
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
typedef enum {false, true} bool;
FILE* fi=fopen("graph.txt","r");
FILE* fo=fopen("cycle.txt","w");
bool **graph;
int n;
const int vertex=1;
int *St;
int *Nnew;
void out_way(int n)
{
for(int i=0;i<n;i++)
fprintf(fo,"%d ",St[i]);
fprintf(fo,"%d ", vertex);
}
void gamilton_path(int k)
{
int v=St[k-1];
for(int j=0; j<n; j++)
if(graph[v][j]==1)
if(k==n&&j==vertex)
out_way(n);
else
if(Nnew[j])
{
St[k]=j;
Nnew[j]=false;
gamilton_path(k+1);
Nnew[j]=true;
}
}
int main()
{
clrscr();
if(fi==0)
printf("file not foud\n");
else
{
fscanf(fi,"%d",&n);
St=new int[n];
Nnew=new int[n];
for(int i=0;i<n;i++)
Nnew[i]=1;
graph=new bool*[n];
for(i=0;i<n;i++)
{
graph[i]=new bool[n];
for(int j=0;j<n;j++)
{
fscanf(fi,"%d",&graph[i][j]);
}
}
Nnew[vertex]=false;
St[0]=vertex;
gamilton_path(1);
fcloseall();
getch();
}
return(0);
}

Последний раз редактировалось Stilet; 25.11.2010 в 16:52.
nikalerka вне форума Ответить с цитированием
Старый 26.11.2010, 12:11   #8
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

Код:
#include<iostream.h>
#include <stdio.h>

FILE* fi=fopen("g_graph.txt","r");
FILE* fo=fopen("g_cycle.txt","w");
bool **graph;//Матрица смежности для хранения графа
int n;//Количество вершин в графе
const int vertex=0;//первая вершина при поиске
int *St;//Массив для хранения просмотренных вершин
int *Nnew;//Массив признаков: вершина просмотрена или нет
char sym;

void out_way(int n)//Процедуры вывода Гамильтонова цикла
{
for(int i=0;i<n;i++)
 fprintf(fo,"%d", St[i]+1);
fprintf(fo,"\n");
//fprintf(fo,"vertex %d\n",vertex+1);
}

// Поиск гамильтонова пути
void gamilton_path(int k)
{
int v=St[k-1];// текущая вершина
for(int j=0;j<n;j++)
 if(graph[v][j]==1)//есть ребро между v и j
  if(k==n && j==vertex)
  {
   out_way(n);//прошли все вершины
  } 
  else
   if(Nnew[j])//вершина не просмотрена
   {
    St[k]=j;//добавляем ее к пройденому пути
    Nnew[j]=false;//просмотрена
    gamilton_path(k+1);//строим путь дальше
    Nnew[j]=true;//возвращаемся назад и строим другие циклы
   }
}

int main()
{
fscanf(fi,"%d",&n);//считываем количество вершин
St=new int[n+1];
Nnew= new int[n];

for(int i=0;i<n;i++)
 Nnew[i]=1;//нет просмотренных вершин

graph=new bool*[n];

for(i=0;i<n;i++)
{
 fscanf(fi,"%c",&sym); // Выбираем символ переноса строки
 graph[i]=new bool[n];//выделяем память под строку
 for(int j=0;j<n;j++)
 {
  fscanf(fi,"%c",&sym);
  if (sym == '1') {graph[i][j] = 1;} else {graph[i][j] = 0;}
 }
 }

Nnew[vertex]=false;//первая вершина уже просмотрена
St[0]=vertex;//вершина с которой начали проход
gamilton_path(1);//параметр означает количество пройденых вершин

for(i=0;i<n;i++)
{
 for(int j=0;j<n;j++)
 if (graph[i][j] == 1){printf("1 ");}else{printf("0 ");}
 printf("\n");
}
fcloseall();
return(0);
}
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 26.11.2010, 14:54   #9
nikalerka
 
Регистрация: 24.11.2010
Сообщений: 6
По умолчанию

СПАСИБО!!!!!!
ОГРОМНОЕ СПАСИБО!!!!
РАБОТАЕТ!!! УРА!!!
nikalerka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти ошибку в программе про рентабельность pergeot Паскаль, Turbo Pascal, PascalABC.NET 1 03.11.2009 14:46
Не могу найти ошибку в программе lioshenka Общие вопросы C/C++ 5 24.08.2009 11:38
Не могу найти ошибку в программе Dawystrik Общие вопросы Delphi 9 19.03.2009 21:19
Паскаль, не могу найти ошибку в программе Julinja Помощь студентам 2 17.11.2008 20:42