Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » PeKa 06:31
 » Kenny 06:06
 » KHot 05:47
 » @GUTEK@ 05:45
 » cVas 03:21
 » elliot_pl 03:03
 » pwil2 02:23
 » Lucyferiu 02:20

 Dzisiaj przeczytano
 11920 postów,
 wczoraj 62174

 Szybkie ładowanie
 jest:
włączone.

 
ccc
TwojePC.pl © 2001 - 2026
A R C H I W A L N A   W I A D O M O Ś Ć
    

Algorytm wyznacznika macierz n X n , Piapia 22/05/03 14:04
Posiada ktos gotowy algorytm w obojetnie jakim jezyku programowania???

Pozdrawiam

"Człowiek się starzeje bo się
nie bawi" B&W
gg40609

  1. jaka metoda obliczania Cie interesuje? Jesli iteracyjna, to algorytm jest prosty. , bwana 22/05/03 14:16
    Kanoniczna metoda (rekurencyjna) moze byc trudna w programowaniu (sama istota rekursji + przepelnienia stosu), natomiast stosunkowo latwo zaprogramowac metode iteracyjna (Eulera?):

    do macierzy obliczanej z prawej strony dostawiasz macierz jedynkowa. przeksztalcasz wiersze uzyskanej macierzy korzystajac z odpowiednich twierdzen(*) tak, by po prawej stronie uzyskac macierz trojkatna. iloczyn elementow na przekatnej "prawej" macierzy jest poszukiwanym wyznacznikiem macierzy.

    (*) twierdzenia mowiace o tym, ze do dowolnego wiersza/kolumny macierzy mozna dodac dowolny iloczyn/iloraz innego wiersza/kolumny tej macierzy.

    taki oto algorytm jest juz calkiem prosty w implementacji.

    PS. Rekurencyjny tez nie jest trudny pod warunkiem, ze rozumie sie rekurencje. A zeby zrozumiec rekurencje trzeba najpierw zrozumiec rekurencje;-D

    "you don't need your smile when I cut
    your throat"

    1. omg , ViS 22/05/03 14:29
      j.w. :)

      I will not buy this record - it is
      scratched.

      1. oh my god? , bwana 22/05/03 14:30
        ;-D

        "you don't need your smile when I cut
        your throat"

        1. nie... , PrzeM 22/05/03 14:35
          ...Ona Ma Głowę...:)))))))

          PrzeM

          above the mind - powered by meat...

          1. z LO to pamietam , bwana 22/05/03 15:10
            jak widac moja glowa to smietnik przechowujacy roznorakie, najczesciej nieprzydatnie informacje, ktore wyskakuja w najmniej oczekiwanym momencie jak diabel z pudelka;-D

            "you don't need your smile when I cut
            your throat"

    2. no debeściarski sposób wytłumaczenia rekurencji! , Massai 22/05/03 22:37
      ;-)))))) bwana, chylę czoła!

      ...Bronchos znaczy Nieujarzmieni...
      Nigdy mnie nie złapiecie ;-))

  2. C++ , Norton 22/05/03 14:44
    * 1 */ #include <stdio.h>
    /* 2 */ #include <stdlib.h>
    /* 3 */ // stdio.h - procedury wejscia wyjscia
    /* 4 */ // stdlib.h - alokacja pamieci
    /* 5 */
    /* 6 */ typedef struct
    /* 7 */ {
    /* 8 */ int n; // Wymiar macierzy
    /* 9 */ long **m; // Tablica tablic (wierszy)
    /* 10 */ } matrix; // Definicja nowego typu matrix (struktury)
    /* 11 */
    /* 12 */
    /* 13 */ // Funkcja odczytujaca dwie macierze kwadratowe a i b.
    /* 14 */ // Wczesniej odczytywana jest informacja o wymiarze macierzy
    /* 15 */ // i alokowana jest stosowna pamiec.
    /* 16 */ void readmatrix (matrix * a, matrix * b)
    /* 17 */ {
    /* 18 */ int i, j;
    /* 19 */ scanf ("%d", &(a->n));
    /* 20 */ b->n = a->n;
    /* 21 */ // Alokacja pamieci na a;
    /* 22 */ a->m = (long **) malloc ((a->n) * sizeof (long *));
    /* 23 */ for (i = 0; i < a->n; i++)
    /* 24 */ {
    /* 25 */ a->m[i] = (long *) malloc ((a->n) * sizeof (long *));
    /* 26 */ }
    /* 27 */ // Alokacja pamieci na b;
    /* 28 */ b->m = (long **) malloc ((b->n) * sizeof (long *));
    /* 29 */ for (i = 0; i < b->n; i++)
    /* 30 */ {
    /* 31 */ b->m[i] = (long *) malloc ((b->n) * sizeof (long *));
    /* 32 */ }
    /* 33 */ for (i = 0; i < a->n; i++)
    /* 34 */ for (j = 0; j < a->n; j++)
    /* 35 */ scanf ("%ld", &(a->m[i][j])); // Odczytywanie wspolrzednych a
    /* 36 */ for (i = 0; i < b->n; i++)
    /* 37 */ for (j = 0; j < b->n; j++) // Odczytywanie wspolrzednych b
    /* 38 */ scanf ("%ld", &(b->m[i][j]));
    /* 39 */ }
    /* 40 */
    /* 41 */ // Funckja mnozaca macierze a i b
    /* 42 */ // zwracana jest macierz bedaca iloczynem
    /* 43 */ matrix mulmatrix (const matrix * a, const matrix * b)
    /* 44 */ {
    /* 45 */ matrix w;
    /* 46 */ int x, y, i;
    /* 47 */ long z;
    /* 48 */ w.n = a->n;
    /* 49 */ w.m = (long **) malloc ((w.n) * sizeof (long *));
    /* 50 */ for (i = 0; i < w.n; i++)
    /* 51 */ {
    /* 52 */ w.m[i] = (long *) malloc ((w.n) * sizeof (long *));
    /* 53 */ }
    /* 54 */
    /* 55 */ for (x = 0; x < w.n; x++)
    /* 56 */ for (y = 0; y < w.n; y++)
    /* 57 */ {
    /* 58 */ z = 0;
    /* 59 */ for (i = 0; i < w.n; i++)
    /* 60 */ z = z + a->m[x][i] * b->m[i][y];
    /* 61 */ w.m[x][y] = z;
    /* 62 */ }
    /* 63 */ return w;
    /* 64 */ }
    /* 65 */
    /* 66 */ // Prosta funckja wyswietlajaca macierz na ekranie
    /* 67 */ void wyswietl (matrix * m)
    /* 68 */ {
    /* 69 */ int i, j;
    /* 70 */ for (i = 0; i < m->n; i++)
    /* 71 */ {
    /* 72 */ for (j = 0; j < m->n; j++)
    /* 73 */ printf ("%8ld", m->m[i][j]);
    /* 74 */ printf ("\n");
    /* 75 */ }
    /* 76 */ printf ("\n\n");
    /* 77 */ }
    /* 78 */
    /* 79 */ matrix a, b, w;
    /* 80 */
    /* 81 */ // Macierze zczytywane sa ze standartowego wejscia
    /* 82 */ int main (void)
    /* 83 */ {
    /* 84 */ readmatrix (&a, &b);
    /* 85 */ printf ("Macierz A:\n\n");
    /* 86 */ wyswietl (&a);
    /* 87 */ printf ("Macierz B:\n\n");
    /* 88 */ wyswietl (&b);
    /* 89 */ w = mulmatrix (&a, &b);
    /* 90 */ printf ("Macierz A*B:\n\n");
    /* 91 */ wyswietl (&w);
    /* 92 */ return 0;
    /* 93 */ }



    --------------------------------------------------------------------------------
    Jak to działa?

    Aby zrozumieć istotę problemu, trzeba wiedzieć na czym polega mnożenie macierzy. Dla uproszczenia załóżmy, że mamy do czynienia z macierzami kwadratowymi (inne też czasem daje się mnożyć, jednak muszą spełaniać pewne dodatkowe założenia).

    A zatem wynikiem iloczynu dwóch macierzy A i B wymiaru n x n jest nowa macierz C wymiaru n x n, taka, że:

    C[i,j] = A[i,] * B[,j]

    Gdzie C[i,j] oznacza wartość w i-tym wierszu i j-tej kolumnie, zaś A[i,] oznacza i-ty wiersz macierzy A, B[,j] oznacza j-tą kolumnę macierzy B. Znak * oznacza tu iloczyn skalarny wektorów jakimi są wiersze i kolumny macierzy.

    UWAGA - Jak łatwo zauwarzyć iloczyn macierzy NIE jest przemienny !!!


    Gdy posiadamy już niezbędne podstawy matematyczne, możemy przystąpić do pisania programu:

    W linii 6 definiujemy nowy typ danych. Jest to strukura (matrix czyli po angielsku macierz), której polami jest "n" - rozmiar macierzy, oraz dynamicznie alokowana "tablica tablic elementów long", czyli istotnie nasza macierz. W języku C nie ma tablic wielowymiarowych!!! Uwaga pascalowcy: zapis

    T[12,3]

    Jest w C jak najbardziej poprawny, ale wcale nie oznacza wartości tablicy dwuwymiarowej!!! Operator przecinka zwraca w C określa kolejność obliczenia wyrażeń i zwraca wartość ostatniego obliczonego, zatem powyższy przykład będzie równoważny:

    T[3]

    Zupełnie inne znaczenie będzie miał zapis:

    T[12][3]

    Który oznacza wartość "tablicy tablic" czyli nieformalnie talicy dwuwymiarowej.

    Do pól struktury odwołujemy się podobnie jak w pascalowym rekordzie czyli struktura.pole . Inaczej ma się sytuacja gdy chcemy odwołać się do pola struktury wskazywanej przez wskaźnik. Operator kropki tu nie zadziała i musimy stosować strzałkę -> . Składnia jest zatem taka : wskaźnik_na_strukure->pole .

    Po tych uwagach prościej będzie zrozumieć program.
    Funkcja readmatrix (linia 16) pobiera jako argumenty dwa wskaźniki na matrix, w locie alokuje pamięć i odczytuje macierze ze standartowego wejścia. W pascalu przekazalibyśmy po prostu zmienne z atrubutem var. W C nie ma tak łatwo, trzeba przekazać wskaźnik jeśli chce się cokolwiek na zewnątrz modyfikować.
    Funkcja mulmatrix (linia 43) wykonuje całą czarną robotę związaną z mnożeniem macierzy. Jako argumenty przekazujemy wskaźniki (i choć nic nie modyfikujemy, to tak jest trochę szybciej). Tworzymy nową macierz "w", do której zapisujemy wynik iloczynu, a następnie zwracamy ją. Uwaga pascalowcy ! Spróbujcie zwrócić rekord lub tablicę jako wynik funkcjii !!!
    Funkcja wyswietl (linia 67) chyba nie wymaga szczególnego komentarza.
    W funkcji main aby uzyskać adres obiektu używamy operatora & (np linia 84). Operator ten zwraca wskaźnik na zmienną przed którą został użyty, a więc dokładnie to czego potrzebujemy!

    Przykładowe wejście do programu to : 3

    1 2 3
    4 5 6
    7 8 9

    3 2 1
    6 5 3
    9 8 7

    Na wyjsciu powinniśmy otrzymać:
    Macierz A:

    1 2 3
    4 5 6
    7 8 9

    Macierz B:

    3 2 1
    6 5 4
    9 8 7

    Macierz A*B:

    42 36 30
    96 81 66
    150 126 102

    Zmień swój podpis na Boardzie
    maks 100 znaków, 3 linie,
    zabroniony spam oraz reklama

    1. Copyright &copy; 2001 Filip Piękniewski. , Norton 22/05/03 14:45
      123

      Zmień swój podpis na Boardzie
      maks 100 znaków, 3 linie,
      zabroniony spam oraz reklama

    2. to wszystko prawda, tylko koledze chodzilo o wyznacznik macierzy, a nie o ich mnozenie:) , bwana 22/05/03 14:47
      no, chyba ze mam cos z oczmi;-D

      "you don't need your smile when I cut
      your throat"

      1. Oki , Norton 22/05/03 14:52
        #include <iostream.h>
        #include <math.h>
        #include <conio.h>

        double gaus1(double a /*tym zarujemy kolumne*/,double b /* co zerujemy*/)
        {
        return ((-1)*(b/a));
        }//koniec funkcji gaus1

        void main()
        {
        double wynik=1,bufor;
        double t[10][10];
        long wymiar=0;
        cout<<"Podaj wymiar macierzy A - ";
        cin>>wymiar;
        cout<<endl;
        for(long jx=0;jx<wymiar;jx++)
        for(long j2x=0;j2x<wymiar;j2x++)
        {
        cout<<"a"<<(jx+1)<<","<<(j2x+1)<<" = ";
        cin>> t[jx][j2x];
        cout<<endl;
        }
        double k2,znak=1;
        for(long i=0;i<wymiar;i++)//wiersze
        {

        if (i<=wymiar)
        for(long j=i+1;j<wymiar;j++)//wiersze
        for(long j2=wymiar-1;j2>i-1;j2--)//kolumny
        {
        k2=i; //to po to aby wiedziec ile kolumn zostalo
        while(t[i][i]==0) //zamiana kolumn ida -> strone
        {
        if(k2>wymiar)
        {
        cout <<"Det A = 0"<<endl;
        while(!kbhit());
        return;
        }
        znak*=-1;
        for (long k=0;k<wymiar;k++)
        {
        bufor=t[k][i];
        t[k][i]=t[k][i+1];
        t[k][i+1]=bufor;
        }
        k2++;
        }//koniec while

        t[j][j2]=t[j][j2]+gaus1(t[i][i],t[j][i])*t[i][j2];
        }
        wynik*=t[i][i];
        }//koniec for z i
        cout <<"Det A = "<<wynik*znak<<endl;
        while(!kbhit());
        }

        Zmień swój podpis na Boardzie
        maks 100 znaków, 3 linie,
        zabroniony spam oraz reklama

      2. i jeszcze , Norton 22/05/03 14:53
        // *LU decomposition & determinant at O(n^3)* by Krzysztof Bosak, 1998.12.05

        #include <iostream.h>
        #include <assert.h>
        #include <memory.h>

        #define OUTPUT

        #define TRANSTABSEMI(x, y) (tab[(x)+indexy[(y)]])
        // semi ==> possinle rows swapped, no columns swapping
        #define TRANSTABFULL(x, y) (tab[indexx[(x)]+indexy[(y)]])
        // full ==> possible rows and columns swapping

        void testout(const int size, const double*const tab, const int*const indexy, const int*const indexx)
        {
        for(int x, y=0; y<size; y++)
        {
        for(x=0; x<size; x++)
        cout<<TRANSTABFULL(x, y)<<'\t';
        cout<<endl;
        }
        }

        void paluout(const int size, const double*const src, const double*const tab, const int*const indexx, const int*const indexy)
        {
        int x, y;
        cout.precision(4);
        cout<<"--- swapped A matrix == right side of equation ---\n";
        for(y=0; y<size; y++)
        {
        for(x=0; x<size; x++)
        cout<<src[indexx[x]+indexy[y]]<<'\t';
        if(y<size-1)
        cout<<endl;
        }
        cout<<"P1==[";
        for(x=0; x<size; x++)
        cout<<(indexy[x]/size+1);
        cout<<"]\tP2==[";
        for(x=0; x<size; x++)
        cout<<(indexx[x]+1);
        cout<<"]\n";
        cout<<"--- P1*A*P2 == L*U - result ----------------------\n";
        for(y=0; y<size; y++) //P1
        {
        for(x=0; x<size; x++)
        {
        if(x*size==indexy[y])
        cout<<"1\t";
        else
        cout<<"0\t";
        }
        cout<<endl;
        }
        cout<<"*\n"; //A
        for(y=0; y<size; y++)
        {
        for(x=0; x<size; x++)
        cout<<src[x+y*size]<<'\t';
        cout<<endl;
        }
        cout<<"*\n";
        for(y=0; y<size; y++) //P2
        {
        for(x=0; x<size; x++)
        {
        if(y==indexx[x])
        cout<<"1\t";
        else
        cout<<"0\t";
        }
        cout<<endl;
        }
        cout<<"=\n";
        for(y=0; y<size; y++)
        {
        for(x=0; x<size; x++)
        {
        if(x>y)
        cout<<"0\t";
        if(x==y)
        cout<<"1\t";
        if(x<y)
        cout<<tab[indexx[x]+indexy[y]]<<'\t';
        }
        cout<<endl;
        }
        cout<<"*\n";
        for(y=0; y<size; y++)
        {
        for(x=0; x<size; x++)
        {
        if(x<y)
        cout<<"0\t";
        if(x>=y)
        cout<<tab[indexx[x]+indexy[y]]<<'\t';
        }
        cout<<endl;
        }
        }

        template<class typea, class typeb>
        void swap(typea &aa, typeb &bb)
        {
        typea temp=aa;
        aa=bb;
        bb=temp;
        }

        double DET(const int size, const double*const src)
        {

        if(size==1)
        return *src;
        const int max=size*size;
        bool sign=false;
        double*const tab=new double[max];
        memcpy(tab, src, max*sizeof(double));
        int*const indexy=new int[size<<1], *const indexx=indexy+size;
        int x, mul;
        for(x=0, mul=0; x<size; x++, mul+=size)
        {
        indexx[x]=x;
        indexy[x]=mul;
        }
        for(x=0; x<=size-2; x++)
        {
        ////////////////Axial factor semi-selection below
        double maxabs=0;
        int ybest=0xFFFF;
        for(int ytest=x; ytest<size; ytest++)
        {
        double value=TRANSTABSEMI(x, ytest);
        if(value<0)
        value=-value;
        if(value>maxabs)
        {
        maxabs=value;
        ybest=ytest;
        }
        }
        if(maxabs==0.0)
        return 0;
        if(x!=ybest)
        swap(indexy[x], indexy[ybest]);
        if(int(x)!=ybest)
        sign=!sign;
        //////////////comment this region to avoid axial factor semi-selection
        for(int y=x+1; y<size; y++)
        {
        TRANSTABSEMI(x, y)/=TRANSTABSEMI(x, x);
        for(int xx=x+1; xx<size; xx++)
        TRANSTABSEMI(xx, y)-=TRANSTABSEMI(x, y)*TRANSTABSEMI(xx, x);
        }
        }
        double result=TRANSTABSEMI(0, 0);
        for(x=1; x<size; x++)
        result*=TRANSTABSEMI(x, x);
        if(sign)
        return -result;
        return result;
        }

        double* PALU(const int size, const double*const src, const double*const vec=NULL)
        {
        const int max=size*size;
        double*const tab=new double[max];
        memcpy(tab, src, max*sizeof(double));
        int*const indexy=new int[size<<1], *const indexx=indexy+size;
        int x, mul;
        for(x=0, mul=0; x<size; x++, mul+=size)
        {
        indexx[x]=x;
        indexy[x]=mul;
        }
        for(x=0; x<=size-2; x++)
        {
        ////////////////Axial factor full selection below
        /*int xbest=0xFFFF, ybest=0xFFFF;
        double maxabs=0;
        for(int ytest=x; ytest<size; ytest++)
        {
        for(int xtest=x; xtest<size; xtest++)
        {
        double value=TRANSTABFULL(xtest, ytest);
        if(value<0)
        value=-value;
        if(value>maxabs)
        {
        maxabs=value;
        xbest=xtest;
        ybest=ytest;
        }
        }
        }
        assert(maxabs>0);
        if(x!=ybest)
        swap(indexy[x], indexy[ybest]);//row swapping (~P1)
        if(x!=xbest)
        swap(indexx[x], indexx[xbest]);//column swapping (~P2)*/
        //////////////comment this region to avoid axial factor full selection
        for(int y=x+1; y<size; y++)
        {
        TRANSTABFULL(x, y)/=TRANSTABFULL(x, x);
        for(int xx=x+1; xx<size; xx++)
        TRANSTABFULL(xx, y)-=TRANSTABFULL(x, y)*TRANSTABFULL(xx, x);
        }
        //testout(size, tab, indexy, indexx);
        //cout<<endl;
        }
        #ifdef OUTPUT
        paluout(size, src, tab, indexx, indexy);
        #endif
        if(vec)
        {
        double *semi=new double[size<<1], *result=semi+size;
        int x, y;
        for(y=0; y<size; y++)
        {
        semi[y]=vec[y];//[indexy[y]/size];
        for(x=0; x<y; x++)
        semi[y]-=TRANSTABFULL(x, y)*semi[x];
        }
        cout<<"Vector y: Ly=b (y=Ux)\n ";
        int i;
        for(i=0; i<size; i++)
        cout<<semi[i]<<endl;

        /*for(y=size-1; y>=0; y--)
        {
        result[y]=semi[y];
        for(x=y+1; x<size; x++)
        result[y]-=TRANSTABFULL(x, y)*result[x];
        result[y]/=TRANSTABFULL(y, y);
        }
        cout<<"Vector x: Ux=y (y=Ux)\n ";
        for(i=0; i<size; i++)
        cout<<result[i]<<endl;*/
        }
        return tab;
        }

        int main()
        {
        const double tab[]={1, 1, 1, 2, 5, 6, 7 ,8, 9}, vec[]={4, 2, 3};
        const int size=3;
        PALU(size, tab, vec);
        //cout<<"===========\n|A| = "<<DET(size, tab)<<endl;
        return 0;
        }

        Zmień swój podpis na Boardzie
        maks 100 znaków, 3 linie,
        zabroniony spam oraz reklama

      3. I ostatnie , Norton 22/05/03 14:54
        // *Wyznacznik - w/g definicji permutacyjnej*, Krzysztof Bosak 02.11.1998

        #include <iostream.h>
        #include <string.h>

        class det
        {
        char *tab, len;
        double *matrix, result;
        bool par;
        void per(int count)
        {
        if(count<len-1)
        {
        per(count+1);
        char temp;
        for(int xcount=count+1; xcount<len; xcount++)
        {
        temp=tab[count];
        tab[count]=tab[xcount];
        tab[xcount]=temp;
        par=!par;
        per(count+1);
        tab[xcount]=tab[count];
        tab[count]=temp;
        par=!par;
        }
        }
        else
        {
        double mul=matrix[len**tab];
        //cout<<"a[0,"<<long(tab[0])<<"]*";*/
        for(int z=1; z<len; z++)
        {
        //cout<<"a["<< z <<","<<long(tab[z])<<"]*";
        mul*=matrix[z+len*tab[z]];
        }
        if(par)
        result+=mul;
        else
        result-=mul;
        /* cout<<"="<<mul<<" "<<"\t"<<long(par)<<"\t";
        for(int i=0; i<len; i++)
        cout<<long(tab[i]);
        if(par)
        cout<<" P\n";
        else
        cout<<endl;*/
        }
        }
        public:
        det(char l, double *mat): len(l), matrix(mat), result(0), par(true)
        {
        tab=new char[len];
        for(char i=0; i<len; i++)
        tab[i]=i;
        per(0);
        cout<<result;
        }
        ~det()
        {
        delete []tab;
        }
        };

        main()
        {
        double mat[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 132, 1133, 114, 115, 119};//4x4 ==> 489600
        det p(2, mat);
        return 0;
        }

        Zmień swój podpis na Boardzie
        maks 100 znaków, 3 linie,
        zabroniony spam oraz reklama

        1. no, wlasnie, nie Eulera tylko Gaussa sie ta metoda nazywa:-D , bwana 22/05/03 15:09
          skleroza...;-D

          "you don't need your smile when I cut
          your throat"

  3. wymiękam , RaPToRR 22/05/03 14:55
    raaatunku leże i zdycham NIE NA WIDZE MATMY!!!

    ps. a ide na klase o profilu mat-fiz ;D

    http://www.krzysztofwasko.pl

    1. heheh, dobrze ze nie do klasy o profilu humanistycznym;-D , bwana 22/05/03 15:11
      bez urazy;-D

      "you don't need your smile when I cut
      your throat"

      1. no coż , RaPToRR 22/05/03 19:21
        bycie informatykiem wymaga poświęceń ;)

        http://www.krzysztofwasko.pl

      2. ekhm , ViS 23/05/03 08:45
        ja jestem po profilu spolecznym :)

        I will not buy this record - it is
        scratched.

  4. norton... , Tummi 22/05/03 15:42
    ...jak tak rzucasz zrodlami, to moze cos dla mnie znajdziesz? Potrzebuje progz do obslugi myszy za pomoca int13h - najlepiej, gdyby wszystkie dostepne funkcje w jakis sposob byly oprogramowane... narazie mam tyle:


    #include <iostream.h>
    #include <stdio.h>
    #include <conio.h>


    unsigned int wlaczmysz (void) {
    unsigned int x,y;
    asm mov ax, 0
    asm int 0x033
    asm mov x, ax
    asm mov y, bx
    if (y == 2)
    cout << "dwa przyciski\n";
    if (y == 3)
    cout << "trzy przyciski\n";

    return(x);
    }


    void getdata (void) {
    unsigned int status;
    unsigned char type, inter, mav, miv;
    asm mov ax, 0x0024
    asm int 0x033
    asm mov status, ax
    asm mov type, ch
    asm mov inter, cl
    asm mov mav, bh
    asm mov miv, bl
    if (status == 0xffff)
    cout << "ERROR";
    else {
    switch (type) {
    case 1:
    cout << "bus mouse\n";
    break;
    case 2:
    cout << "serial mouse\n";
    break;
    case 3:
    cout << "inport mouse\n";
    break;
    case 4:
    cout << "ps/2 mouse \n";
    break;
    case 5:
    cout << "hp mouse\n";
    break;
    }
    if (inter == 0)
    cout << "irq: ps/2 \n";
    else
    cout << "irq: " << inter;
    }
    }

    void pokaz (void) {
    asm mov ax, 0x01
    asm int 0x033
    }

    void ukryj(void) {
    asm mov ax, 0x02
    asm int 0x033
    }

    void stan (int *x, int *y, int *lb, int *mb, int *rb) {
    unsigned int stan, xx, yy;
    asm {
    mov ax, 0x03
    int 0x033
    mov yy, dx
    mov xx, cx
    mov stan, bx
    }

    *x=xx;
    *y=yy;
    *x /=8;
    *y /=8;
    *lb = (stan & 1);
    *mb = (stan & 4);
    *rb = (stan & 2);
    }

    int xpos (void) {
    int x, y, lb, mb, rb;
    stan (&x, &y, &lb, &mb, &rb);
    return(x);
    }

    int ypos (void) {
    int x, y, lb, mb, rb;
    stan (&x, &y, &lb, &mb, &rb);
    return(y);
    }

    int lb (void) {
    int x, y, lb, mb, rb;
    stan (&x, &y, &lb, &mb, &rb);
    if (lb) lb=1;
    return(lb);
    }

    int rb (void) {
    int x, y, lb, mb, rb;
    stan (&x, &y, &lb, &mb, &rb);
    if (rb) rb=1;
    return(rb);

    }

    int mb (void) {
    int x, y, lb, mb, rb;
    stan (&x, &y, &lb, &mb, &rb);
    if (mb) mb=1;
    return(mb);
    }



    void main (void) {

    clrscr();
    wlaczmysz();
    pokaz();
    getdata();
    while (!kbhit()) {
    gotoxy (55, 20);

    cout << "\nKolumna:\t\t"<< xpos() << "\nWiersz:\t\t\t" << ypos() << "\nLewy przycisk:\t\t " << lb() << "\nSrodkowy przycisk:\t " << mb() << "\nPrawy przycisk:\t\t " << rb();
    }
    ukryj();
    }

    T.

    www.skocz.pl/uptime :D

    1. Ups, ja tylko googluję. , Norton 22/05/03 15:56
      Na początek linki:
      http://venus.wsb-nlu.edu.pl/...old/biblioteki.html
      http://www.binboy.org/index.php?show=p13h.htm
      http://www.pckurier.pl/archiwum/art0.asp?ID=464








      I programik

      /*--------------------------------------------------------
      plik: MYSZ.CPP

      Przykładowe zastosowanie klasy mysz.

      Autor:
      Krzysztof Polito
      Nowa Sól
      --------------------------------------------------------*/

      #include <iostream.h>
      #include <conio.h>
      #include <stdlib.h>
      #include <mysz.h>


      void main(void)
      {
      mysz myszka;
      stan_myszy stan;
      if (!myszka) {
      cout < "Błąd podczas inicjalizacji !" < endl;
      exit(1);
      }

      clrscr();
      while (!kbhit()) {
      if (myszka.przycisk(1)) {
      stan = myszka.stan();
      myszka.ukryj_kursor();
      cout < stan.x < ", " < stan.y < endl;
      myszka.pokaz_kursor();
      }
      }
      getch(); //wyczyszczenie bufora klawiatury

      //a teraz to samo w trybie 13h - działa poprawnie tylko na
      //karcie VGA lub MCGA

      unsigned char tryb;

      asm {
      mov ah, 0x0F
      int 0x10;
      mov tryb, al //przechowanie aktualnego trybu wideo
      mov ax, 0x0013
      int 0x10
      }
      myszka.pokaz_kursor();

      while (!kbhit()) {
      if (myszka.przycisk(1)) {
      stan = myszka.stan();
      myszka.ukryj_kursor();
      cout < stan.x < ", " < stan.y < endl;
      myszka.pokaz_kursor();
      }
      }

      asm {
      mov ah, 0
      mov al, tryb
      int 0x10
      }
      getch(); //wyczyszczenie bufora klawiatury
      };

      Zmień swój podpis na Boardzie
      maks 100 znaków, 3 linie,
      zabroniony spam oraz reklama

    2. no widze, ze materialy cwiczeniowe w szkolach sie nie zmieniaja;-D , bwana 22/05/03 16:09
      gdzie, ach gdzie moje stare laborki z LO i studiow. opdowiedz? polecialy w kosmos;-D

      "you don't need your smile when I cut
      your throat"

    
All rights reserved ® Copyright and Design 2001-2026, TwojePC.PL