Тролль Опубликовано 28 ноября, 2011 Жалоба Поделиться Опубликовано 28 ноября, 2011 мда, ну никак не могу найти код для обратной матрицы. Решения СЛАУ методом Seidel( Зейделя )еше можно найти, а вот обратной матрицы нет.Спасибо за ссылку, но програма не работает, причем ошибок где-то 11 Проверил программу по ссылке. Ну, ей нехватает стандартных заголовочных файлов плюс в одном месте (компилятор указывает) нехватает объявления i как int. После этого она работает. Но она тоже для решения СЛАУ. Метод Зейделя, насколько я посмотрел, даже в теории используется только для решения систем уравнений, а не для обращения матриц. Ссылка на комментарий Поделиться на другие сайты Поделиться
Radu Опубликовано 28 ноября, 2011 Жалоба Поделиться Опубликовано 28 ноября, 2011 (изменено) по идее , метод простых итераций и метод Зейделя почти идентичны. ( http://tpdn.ru/library/articles/52/14014/#n3 ) Возможен ли метод простых итераций при обращения матриц? Вот, сегодня добавил в програм метод Гаусса — Жордана для обращения матриц. Остался только Зейдел или метод простых итераций Вот что получилось #include<stdio.h>#include<math.h>#include<conio.h>#include<ctype.h>#include<stdlib.h>#define NN 10int main(){clrscr();double a[NN][NN],A[NN][NN], X[NN][NN], t, det, sum;int i, j, n=3 , m, l , lt , k;char yn;for ( i=0; i<n; i++ )for( j=0; j<n; j++) A[i][j] = a[i][j];for (i=0; i<n; i++) { for(j=n; j<2*n; j++) a[i][j] = 0; a[i][i+n] = 1;}// <----Ввод квадратной матрицы---->do { printf("\n ранг матрицы (от 2 до %d): N=",NN); n = getche()-48;} while((n<2) || (n>NN));// <---- Ввод матрицы[NN][NN]---->printf("\n\n Случайные элементы матрицы? y/n: ");yn = getche();switch(tolower(yn)){ case 'y': for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=rand()%10; break; case 'n': printf("\n Ввод матрицы %dx%d\n",n,n); for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%lf", &a[i][j]); break; default: { for(i=0;i<n;i++) { for(j=0;j<n;j++) a[i][j]= 0; a[i][i] = (rand()%10) + 1; } } break;} // <----Исходная матрица---->printf("\n Исходная матрица \n");for(i=0;i<n;i++) { for(j=0;j<n;j++) printf(" %6.2lf", a[i][j]); printf("\n");} // <----определитель---->det = 1;for(l=0; l<n-1; l++){ if(a[l][l]==0) { m = l+1; while((a[m][l] == 0) && (m<n)) m++; if(m >= n) { printf("\n Det A = 0"); getch(); return 0; } for(j=0; j<n; j++) { t = a[m][j]; a[m][j] = a[l][j]; a[l][j] = t; det = -det; } } for (i=l+1; i<n; i++) { t = a[i][l]/a[l][l]; for(j=l+1; j<n; j++) a[i][j] = a[i][j] - a[l][j]*t; } for (i=l+1; i<n; i++) a[i][l] = 0; printf("\n Матрица на шаге %d \n", l+1); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf(" %6.2lf", a[i][j]); printf("\n"); }}//обратная матрица методом Gauss-Jordanfor(lt=0; lt<n; lt++){ X[n-1][lt] = a[n-1][n+lt] / a[n-1][n-1]; for (i=n-2; i>=0;i--) { sum = 0; for (j=i+1; j<n; j++) sum = sum + a[i][j] * X[j][lt]; X[i][lt] = (a[i][n+lt] - sum) / a[i][i]; }}printf("обратная матрица\n");for ( i=0; i<n; i++ ){ for(j=0;j<n;j++) printf(" %8.3lf", X[i][j]); printf("\n");}printf("\n Проверка: A*X = I? \n");for (i=0; i<n; i++){ for (j=0; j<n; j++) { sum = 0; for (k=0; k<n; k++) sum = sum + a[i][k] * X[k][j]; printf(" %10.3le", sum); } printf("\n");}for(i=0; i<n; i++) det *= a[i][i];printf("определитель =: %14.3f", det);getch();return det;;} Изменено 28 ноября, 2011 пользователем Radu Ссылка на комментарий Поделиться на другие сайты Поделиться
vampir4eg Опубликовано 28 ноября, 2011 Жалоба Поделиться Опубликовано 28 ноября, 2011 (изменено) Пусть А и B – две разреженные матрицы, реализованные посредством динамических списков. Размерность матрицы В по обоим измерениям не должна превосходить размерность матрицы А. Проверить, является ли матрица В частью матрицы А и определить координаты верхнего левого угла в матрице А, откуда начинается совпадение с матрицей В. Если матрица А не содержит в себе матрицы В – вернуть пару (–1,–1) Помогите пожайлусто. Вообще без понятия как делать. Среда разработки Pascal ABC. Заранее благодарен. Изменено 28 ноября, 2011 пользователем vampir4eg Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 28 ноября, 2011 Жалоба Поделиться Опубликовано 28 ноября, 2011 Radu по идее , метод простых итераций и метод Зейделя почти идентичны. Возможен ли метод простых итераций при обращения матриц Возможен, хотя мне ничего такого не попадалось, поскольку, вероятно, он очень неэффективен. В принципе обратная матрица может быть найдена решением n систем линейных уравнений с правыми частями, представляющими векторы с одной единицей и остальными нулями - http://coderov.net/vma/138-computation-of-determinants/854-matrix-inversion.html Эти системы можно решать методом прямых итераций, методом Зейделя и прочими. Но при нормальном обращении матрицы методом Гаусса-Жордана решения этих систем частично совмещены, поэтому получается намного короче и быстрее. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 28 ноября, 2011 Жалоба Поделиться Опубликовано 28 ноября, 2011 (изменено) vampir4eg Хранишь элементы матриц в двух списках, скажем, по строкам (тут могут быть варианты). А потом, перебирая последовательно элементы первого списка, для каждого из них ищешь, нет ли совпадения строки матрицы второго списка с частью строки матрицы первого списка. При совпадении запоминаешь индексы начала и конца части строки первого списка. Затем проверяешь совпадет ли соответствующий отрезок следующей строки матрицы в первом списке со следующей строкой матрицы во втором списке. И так так далее, пока не найдется несовпадение или не кончится вторая матрица (в этом случае печатаешь координаты элемента первой матрицы, с которого начинал сравнивать матрицы). Писать порядочно, но ничего логически сложного. P.S. Тут главное - писать комментарии в начале каждого блочка программы, чтобы не запутаться. Изменено 28 ноября, 2011 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
vampir4eg Опубликовано 29 ноября, 2011 Жалоба Поделиться Опубликовано 29 ноября, 2011 (изменено) Тролль спс конечно, что ответил ну я всёровно вообще не понимаю как её делать ( может потому,что не знаю как сделать разряженые матрицы и создать их при помощи динамического списка) не могли бы вы помочь с этим?? Изменено 29 ноября, 2011 пользователем vampir4eg Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 29 ноября, 2011 Жалоба Поделиться Опубликовано 29 ноября, 2011 (изменено) не знаю как сделать разряженые матрицы и создать их при помощи динамического списка Вот программа для ввода разреженной матрицы целых чисел с хранением ее в динамическом списке и контрольной выдачи элементов матрицы. Как я раньше заметил, для сравнения удобно хранить матрицу в списке не в порядке ввода ее элементов, а отсортированной по индексам строк и столбцов, поэтому после ввода элементы матрицы в списке сортируются по их индексам. #include <list> #include <iostream> using namespace std; class Data{public:int row,col,val; bool operator < (const Data& rhs){return row*10000L+col<rhs.row*10000L+col;}}; int main(){ // создаем динамический список list<Data> mylist; // вводим в список данные элементов матрицы Data dat; while(true){cout<<"Row(0 - exit): "; cin>>dat.row;if(dat.row==0)break; cout<<"Column: "; cin>>dat.col; cout<<"Value: "; cin>>dat.val; cout<<endl; mylist.push_back(dat);} // сортируем список mylist.sort(); // выводим элементы матрицы cout<<endl<<" Row Column Value"<<endl; for(list<Data>::const_iterator cit=mylist.begin();cit!=mylist.end();++cit) {cout.width(8); cout<<(*cit).row; cout.width(8); cout<<(*cit).col; cout.width(8); cout<<(*cit).val<<endl;} getchar(); getchar();} В программе вводятся индексы и значение для каждого элемента разреженной матрицы, они заносятся в динамический список, потом список сортируется и элементы матрицы выводятся на экран в порядке возрастания их индексов. P.S. По какой специальности ты учишься? Изменено 29 ноября, 2011 пользователем Тролль 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
vampir4eg Опубликовано 29 ноября, 2011 Жалоба Поделиться Опубликовано 29 ноября, 2011 (изменено) Программное обеспеченье. Можете этот код на паскале сделать? Как что качается матрицы у меня всё начинаются затупы ) i Уведомление: Нет ни малейшей нужды полностью цитировать предыдущее сообщение. Совершенно. То бишь - абсолютно... P.S. Это, конечно, не моё дело, и вообще... Но! Скажите, каким образом вы рассчитываете писать (нормальный) код, если даже в родном языке ляпаете столь чудовищные по нелепости ошибки? Изменено 29 ноября, 2011 пользователем Yezhishe Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 30 ноября, 2011 Жалоба Поделиться Опубликовано 30 ноября, 2011 (изменено) vampir4eg То же самое на PascalABC.NET. typenode=class row,col,val:integer; next:node; constructor(r,c,v:integer; n:node); begin row:=r; col:=c; val:=v; next:=n; end; end;var p,pn:node; row,col,val,t:integer; b:boolean;beginp:=nil;// вводим в список данные элементов матрицыwhile true do begin write('Row(0 - exit): '); readln(row); if row=0 then break; write('Column: '); readln(col); write('Value: '); readln(val); p:=new node(row,col,val,p); end; pn:=p; writeln;// сортируем списокrepeat p:=pn; b:=true; while p.next<>nil do begin if p.row*10000+p.col>p.next.row*10000+p.next.col then begin t:=p.row; p.row:=p.next.row; p.next.row:=t; t:=p.col; p.col:=p.next.col; p.next.col:=t; t:=p.val; p.val:=p.next.val; p.next.val:=t; b:=false end; p:=p.next end; until b;// выводим элементы матрицыwriteln(' Row Column Value');p:=pn; while p<>nil do begin writeln(p.row:8,p.col:8,p.val:8); p:=p.next; end;readlnend. Изменено 30 ноября, 2011 пользователем Тролль 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
andre! Опубликовано 30 ноября, 2011 Жалоба Поделиться Опубликовано 30 ноября, 2011 Всем Привет! помогите пожалуиста решить задачу на языке C++ Задача: решения СЛАУ(Система линейных алгебраических уравнений)методом Гаусса. Ссылка на комментарий Поделиться на другие сайты Поделиться
Форматцевт Опубликовано 30 ноября, 2011 Жалоба Поделиться Опубликовано 30 ноября, 2011 Решение СЛАУ методами Гаусса, Зейделя, простой итерацией, ортогонализацией. Исходники и exe на С++ ( Visual Studio 2008 ). ООП подход. Для систем размерности N на N+1, точность задается. Источник SLAU.rar P.S. Хотя стоило бы сначала поискать в инете... так на будущее ;) SLAU.rar 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 30 ноября, 2011 Жалоба Поделиться Опубликовано 30 ноября, 2011 стоило бы сначала поискать в инете...Тут ни прибавить, ни убавить... :)Вот еще один исходник, к примеру. Ссылка на комментарий Поделиться на другие сайты Поделиться
Форматцевт Опубликовано 30 ноября, 2011 Жалоба Поделиться Опубликовано 30 ноября, 2011 Тут ни прибавить, ни убавить... :) согласен, т.к. типовые задачи решались многократно и их можно спокойно найти по поиску.P.S. Странно я даже поборол свою лень и зарегистрировался, так просто скачать нельзя было, можно сказать одержал очередную победу над своей ЛЕНЬЮ :D Ссылка на комментарий Поделиться на другие сайты Поделиться
andre! Опубликовано 30 ноября, 2011 Жалоба Поделиться Опубликовано 30 ноября, 2011 Indomito, Тролль, всем огромное спасибо ! ! ! Ссылка на комментарий Поделиться на другие сайты Поделиться
Riki_Tiki_Tavi Опубликовано 30 ноября, 2011 Жалоба Поделиться Опубликовано 30 ноября, 2011 Помогите пожалуйста в Pascal написать программу: Записать каждое слово текстовой строки в отдельную строку экрана с большой буквы. Ссылка на комментарий Поделиться на другие сайты Поделиться
Форматцевт Опубликовано 30 ноября, 2011 Жалоба Поделиться Опубликовано 30 ноября, 2011 Помогите пожалуйста в Pascal написать программу: Записать каждое слово текстовой строки в отдельную строку экрана с большой буквы. можно пример? А так же где размещается текст и в каком формате. Задача то простая, просто не хочется переписывать её (программу) 10 раз - нужно более точное/подробное ТЗ на ПО. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 30 ноября, 2011 Жалоба Поделиться Опубликовано 30 ноября, 2011 (изменено) Да, тут толком не определено, что такое слово. Постараемся учесть латинские и русские буквы и цифры. var s:string; i:integer;beginwrite('string: '); readln(s); s:=' '+s;for i:=2 to length(s) do begin if(s[i-1]<'0')and(s[i]>='0')then begin writeln; if s[i]>='A' then s[i]:=chr(ord(s[i])-32*ord(ord(s[i])mod 64>=32)) end; if s[i]>='0' then write(s[i]) end;writeln; readlnend. Изменено 30 ноября, 2011 пользователем Тролль 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
veagat Опубликовано 1 декабря, 2011 Жалоба Поделиться Опубликовано 1 декабря, 2011 проблема - нужна сделать поиск по БД который на запрос 'зам' выдавал к отображению в DBGrid только те записи в которых слова начинаются на 'зам'. сам пробовал но не осилил. филтрация работает только с точным значением,а поиск отображет всю БД я использовал //поиск(Table1.Locate('tv', Edit13.Text,[loCaseInsensitive, loPartialKey]));//филтрацияTable1.Filter:='tg'+'='+AnsiQuotedStr(Edit13.Text,'''');end;Table1.Filtered:=true; бд и програмка простенькие - никаких серверов, сетей и т.д. ннужна часть кода на дэлфи которую можно вставить в кнопку и увидить нужный результат, и очень хоотелосьбы с указанием используемых компонентов и коментариями (извините, понимаю что все после работы) Ссылка на комментарий Поделиться на другие сайты Поделиться
Teddy_Bear Опубликовано 2 декабря, 2011 Жалоба Поделиться Опубликовано 2 декабря, 2011 (изменено) Можно использовать SQL шаблоны типа Table1.Filter:='SELECT * FROM tv WHERE tg LIKE 'зам%'' Изменено 2 декабря, 2011 пользователем Teddy_Bear Ссылка на комментарий Поделиться на другие сайты Поделиться
veagat Опубликовано 3 декабря, 2011 Жалоба Поделиться Опубликовано 3 декабря, 2011 Можно использовать SQL шаблоны типа Table1.Filter:='SELECT * FROM tv WHERE tg LIKE 'зам%'' пробовал использовать но ругается с начало на зам - заменил на эдит, потом нот фоунд на селект, потом на фром и тд и достаточно чтобы искало в 1 поле, как я пеонел можно просто убрать -WHERE имя поля Ссылка на комментарий Поделиться на другие сайты Поделиться
Riki_Tiki_Tavi Опубликовано 4 декабря, 2011 Жалоба Поделиться Опубликовано 4 декабря, 2011 В Pascal пожалуйста напишите программу: Вывести на экран все символы цифр заданного текстовой строки. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 4 декабря, 2011 Жалоба Поделиться Опубликовано 4 декабря, 2011 Riki_Tiki_Tavi var s:string; i:integer;beginwrite('string: '); readln(s); for i:=1 to length(s) do if(s[i]>='0')and(s[i]<='9')then write(s[i]);writeln; readln end. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Shatkovskiy Опубликовано 4 декабря, 2011 Жалоба Поделиться Опубликовано 4 декабря, 2011 Здравствуйте! Решите, пожалуйста, задачу! Язык: С++ Тема: Использование связных списков. Уровень написания задачи: Простой, Элементарный, Начальный. Условие: Использовать (линейные) однонаправленные списки без заглавного звена (рис.а) или с заглавным звеном (рис. б) при следующем их описании Параметр L обозначает список, а параметры E и E1 - данные типа TE, к которым можно применять операции присваивания и проверки на ровность. {TE = double} Определить функции, что объединяют два упорядоченных по возрастанию списка L1 и L2 (TE = double) в один упорядоченный по возрастанию список; а)построив новый список L; б)изменяя соответствующим способом ссылки в L1 и L2 и присвоив полученный список параметру L1. в)результат записывается в отдельный файл. Заранее, огромное спасибо! Ссылка на комментарий Поделиться на другие сайты Поделиться
AntonyDed Опубликовано 5 декабря, 2011 Жалоба Поделиться Опубликовано 5 декабря, 2011 Здравствуйте. Помогите пожалуйста. Такая задача: Разработайте алгоритм программы, которая считывает с клавиатуры Ф.И.О. и заменяет строчные буквы на прописные. Модернизируйте программу так, чтобы результаты не только выводились на экран, но и записывались в файл Сделал такую прогу: var S:string;i:integer;beginwrite('Введите строку : '); readln(S);for i:=1 to Length(S) do S[i-1]:=upcase(s[i-1]); S[i]:=upcase(S[i]);write('Результат ',S);readlnend. Но она меняет строчные на прописные только для английского алфавита. Как сделать для русского? Ссылка на комментарий Поделиться на другие сайты Поделиться
vampir4eg Опубликовано 5 декабря, 2011 Жалоба Поделиться Опубликовано 5 декабря, 2011 Задан целочисленный массив размера N. Отсортировать элементы массива в порядке возрастания количества разрядов установленных в «1» в двоичном представлении элементов массива. Например: 5 3 1 7 2 10 → 1 2 5 3 10 7 Как вывести уже отсортированый массив в десятичном исчислении?? Допустим дан массив в десятичном исчислении---> A [5 3 1 2 7 10] перевёл его в двоичное исчесление получилось--> B [2 2 1 1 3 2] (каждого цифра массива В это кол-во единиц каждой цифры в массиве А), отсортировал массив В получил--> В [1 1 2 2 2 3], как теперь сделать чтоб вывел массив В в десятичном приставлении?? тоесть B[1 1 2 2 2 3] ---> B [1 2 5 3 10 7] И объясните что ознаечает if (a & 1 ) count++; и a = a >> 1; Извеняюсь за кривую табуляцию язык С #include <stdio.h>int main(int argc, char *argv[]){int count = 0;int n; printf ("vvedite razmer massiva: "); scanf ("%d",&n); int a[n]; int b[n]; printf ("Vvedite elementi massiva: "); for ( int i=0;i<n;i++){ scanf ("%d",&a[i]); } printf("Ishodnii massiv: ");for ( int i=0;i<n;i++) { printf ("%d\t",a[i]); }printf ("\n");for ( int i=0;i<n;i++) { while ( a[i] != 0 ) { if (a[i] & 1 ) count++; a[i] = a[i] >> 1; b[i]=count ; } count=0; }printf ("Chislo edinic kajdogo elementa: ");for ( int i=0;i<n;i++) { printf ("%d\t",b[i]); }for (int i=0;i<n;i++) {for(int i=0;i<n-1;i++) if(b[i]>b[i+1]) { int r = b[i]; b[i] = b[i+1]; b[i+1] = r; } }printf("\n");printf("Rezult: "); for(int i=0;i<n;i++) printf("%d\t",b[i]);printf("\n"); return 0;} Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти