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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2009, 23:03   #11
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

ну я попробывал зделать, вроде вот так получилось... надеюсь это то, что вы просили...
Код:
void outMatr(int mas[100][100], int d)
{
	int i,j;
	for(i = 0 ; i < d ; i++)
	{
		for(j = 0 ; j < d ; j++)
			printf("%d ",mas[i][j]);
		printf("\n");
	}
	printf("\n");
}
void main(void)
{
	int d = 3;
	int i,j;
	int mas[100][100];
	for(i = 0 ; i < d ; i++)
		for(j = 0 ; j < d ; j++)
			mas[i][j] = 0;
	outMatr(mas,d);
	printf("\n");
	for(i = 0, j = 0 ; i < d-1 ; j++)
	{
		mas[i][j] = 1;
		i++;
		mas[i][j] = -1;
	}
	outMatr(mas,d);
}
Olejik вне форума Ответить с цитированием
Старый 16.12.2009, 23:09   #12
Rayman
 
Регистрация: 16.12.2009
Сообщений: 8
По умолчанию

Во общем смысл задачи такой, на входные данные задаются пары цифр(задача упрощена, цифры не повторяются) например 2-4, 3-1, 4-3, т.е. они означают следующее: 2 следует за 4, 3 следует за 1, 4 следует за 3. Исходя из этого мне нужно составить исходную последовательность, т.е.: 2-4-3-1.
В матрице слева(номера строк) обозначались просто номера пар цифр, сверху(столбцы) все цифры которые есть в этой очереди.
Rayman вне форума Ответить с цитированием
Старый 17.12.2009, 00:26   #13
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

ааа, так это легко, например эти пары цифр запишите в файлик, в самом начале типа надо написать скока вершин в графе всего, значит так, из файла считываете кол-во вершин, а потом проходите простым циклом, ну посчитаете скока строк в файле... ну скока ребер(2-4: это ребро, 3-1: это ребро), ну как то так...вот псевдокод:
Код:
int m1[100],m2[100];
int kolReb = 0;
int kolVer = 0;
открываем файл;
узнаем кол-во вершин и записываем:fscanf(file,"%d",kolVer);
while(!конец файла)
{
 считываем строку: fscanf(file,"%d-%d",&m1[kolReb],&m2[kolReb]);
 kolReb++;
}
вот я пока написал как и куда записать начальные данные, я конечно понял как дальше писать и что делать, ну чтобы реализовать Вашу программу, но пока дам Вам об этом подумать

Последний раз редактировалось Olejik; 17.12.2009 в 00:36.
Olejik вне форума Ответить с цитированием
Старый 17.12.2009, 00:53   #14
Rayman
 
Регистрация: 16.12.2009
Сообщений: 8
По умолчанию

Я тут кое что написал, программа строит матрицу инцидентности, и должна по ней находить для начала хотя бы первый элемент, этим элементом будет являться номер столбца в котором есть только -1, но почему то не получилось, мб найдете ошибку...

Цитата:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( ) {

char s[50]; // вспомогательная строка

FILE *fpin, *fpout; //файловые переменные
int m; // количество пар
int n; // количество вершин

int i,j;
int k; // вспомогательные переменные

int *b; // массив, который будет содержать отсортированные вершины
int *U; // массивы, которые будут содержать вершины
int *V;
int **M; // матрица инцидентности


if(!(fpin = fopen("input.txt", "r"))){ //связали файл с файловой переменной
printf("Ошибка при открытии файла. Возможно, файл input.txt не существует \n");
exit(1);
}

if(!(fpout = fopen("output.txt", "w"))){ //cвязали файл с файловой переменной
printf("Ошибка при открытии файла. Возможно, файл output.txt не существует \n");
exit(1);
}


fscanf(fpin, "%s", s); //"Количество пар"

fscanf(fpin, "%d", &m);

fscanf(fpin, "%s", s); //"Пары цифр"

n = m+1; // кол-во вершин

U = new int[n+1]; // массив содержит вершины из которых ребро "выходит"
V = new int[n+1]; // массив содержит вершины в которые ребро "входит"

for(i = 0; i < m; i++){ // считываем
fscanf(fpin,"%d", &U[i]);
fscanf(fpin,"%d", &V[i]);
}

M = new int*[m+1];

for(i = 0; i < m+1; i++){

M[i] = new int[n+1];
}

b = new int[n+1]; //обнуляем результируйщий массив

for(i = 1; i<=n; i++){
b[i] = 0;
}


for(i = 0; i < m+1; i++){ // Обнуляем матрицу инцидентности
for(j = 0; j < n+1; j++)
M[i][j] = 0;
}

for(i = 0; i < n; i++){ // составляем M
M[i][U[i]] = -1; // дуга исходит из вершины U[i]
M[i][V[i]] = 1; // дуга входит в вершину V[i]



}
k = 0;
for(j = 1; j <= n; j++){ // проходим по матрице A и находим первую вершину
for(i = 0; i < m; i++){

if( (M[i][j] == -1))
k--;
if( (M[i][j] == 1))
k++;
}

if(k == -1 ){ //нашли первую вершину

b[0] = U[i-1];
}

k = 0;

}
for(i = 0; i < m; i++){ // тестовый вывод М
for(j = 1; j <= n; j++){
fprintf(fpout, "%d \t", M[i][j]);
}
fprintf(fpout, "\n");
}
fprintf(fpout, "\n");
for(i = 1; i <= n; i++){ //тестовый вывод результирующей последовательности,
fprintf(fpout, "%d \t", b[i]); // пока только должен вывести первый элемент и остольное нулями,
} // но почему то выводит не правильно


if(fclose(fpin)){
printf("Ошибка при закрытии файла. Не удается закрыть файл input.txt\n");
exit(1);
}
if(fclose(fpout)){
printf("Ошибка при закрытии файла. Не удается закрыть файл output.txt\n");
exit(1);
}

return 0;

}

Последний раз редактировалось Rayman; 17.12.2009 в 01:34.
Rayman вне форума Ответить с цитированием
Старый 17.12.2009, 00:59   #15
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

Код:
fscanf(fpin, "%s", s); //"Количество пар"
...
fscanf(fpin, "%s", s); //"Пары цифр"
Вы вот таким методом считываете строку из файла, записываете ее в массив, потом там мутите, потом опять считываете из файла строку и перезаписываете это в массив, а то что в прошлый раз писали в него - пропадает.
По коду, Вы считываете кол-во пар, переходите на следующую строчку, считываете что то из нее,записываете в m (в переменную которая должна иметь кол-во пар),а потом опять записываете в вспомогательную величину пары цифр... может для начала то место надо изменить? Тем более пар, может быть у Вас и в 2 раза больше чем вершин, если пар будет 20, это не значит что у вас вершин 21, вершин может быть 10.
Вот например у Вас данные в файле:
3
1-2
2-3
3-1
первый элемент у Вас кол-во вершин,а дальше пары. Здесь вершины и пары не связаны ни как, можно еще 4 строчку добавить в парах. Значит примерно такой код делаем:
Код:
int m1[100],m2[100];
int kolVer;
int kolPar = 0;
fscanf(file,"%d", &kolVer);
while(!feof(file))
{
 fscanf(file,"%d-%d",&m1[kolPar],&m2[kolPar]);
 kolPar++
}
таким способом Вы спокойно узнаете кол-во вершин и кол-во пар. Если Вы посмотрите сложность работы с матрицей инцидентности, то увидите, что кол-во пар не зависит от кол-ва вершин, ну кроме как узнать максимальное кол-во пар и все.
тем более у Вас косяк в строчке:
Код:
fscanf(fpin, "%s", s);
забыли символ
Код:
&
перед
Код:
s

Последний раз редактировалось Olejik; 17.12.2009 в 01:09.
Olejik вне форума Ответить с цитированием
Старый 17.12.2009, 01:19   #16
Rayman
 
Регистрация: 16.12.2009
Сообщений: 8
По умолчанию

В s у нас хранится просто текст, который идет в файле перед нужными данными, в m всё нормально записывается, и дальше по коду я уже пишу M а это уже другая переменная, а m по моему уже нигде не меняется.
Цитата:
3
1-2
2-3
3-1
такого быть не может, т.к. не получится представить такую последовательность цифр, без повторений и замкнутой соответсвенно она тоже быть не может.
Rayman вне форума Ответить с цитированием
Старый 17.12.2009, 01:38   #17
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

не поверите, в m Вы записываете 1
я Вам еще раз говорю, вот по коду который Вы кинули, Вы в s записываете 3, а потом в m записываете 1, а потом в s Вы записываете -3
так, измените строчки
Код:
fscanf(fpin, "%s", s); //"Количество пар"

fscanf(fpin, "%d", &m);

fscanf(fpin, "%s", s); //"Пары цифр"

n = m+1; // кол-во вершин 

U = new int[n+1]; // массив содержит вершины из которых ребро "выходит" 
V = new int[n+1]; // массив содержит вершины в которые ребро "входит"

for(i = 0; i < m; i++){ // считываем
fscanf(fpin,"%d", &U[i]);
fscanf(fpin,"%d", &V[i]);
}
на
Код:
fscanf(fpin, "%d", &m);
n = m+1; // кол-во вершин 
U = new int[n+1]; // массив содержит вершины из которых ребро "выходит" 
V = new int[n+1]; // массив содержит вершины в которые ребро "входит"
for(i = 0; i < m; i++)
{ // считываем
	fscanf(fpin,"%d-%d", &U[i], &V[i]);
}
и уже небольшой резудьтат получите, все занесется как нужно.
а вот еще одну строчку измените и программа нормально закончит работу:
Код:
n = m+1; // кол-во вершин
на
Код:
n = m; // кол-во вершин

Последний раз редактировалось Olejik; 17.12.2009 в 02:02.
Olejik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TurboPascal: графы, матрицы смежности и матрицы инцидентности. ulala Помощь студентам 1 03.03.2011 19:28
Непонятки с DirectX (матрица поворота, камера, матрица проекции) ROD Общие вопросы C/C++ 2 17.09.2010 17:00
TurboPascal: граф, матрица смежности и матрица инцидентности. ulala Помощь студентам 0 02.12.2009 10:11
Матрица Almost456 Паскаль, Turbo Pascal, PascalABC.NET 11 07.12.2008 02:04