Macierz - aplikacja okienkowa

0

Witam serdecznie , mam pewien problem otóż profesor zadał nam pewne zadanie do zrobienia w dowolnym języku programowania na razie w postaci konsolowej. Zadanie to pewne operacje na dynamicznych macierzach , blokada niektórych pól macierzy, sterowanie strzałkami po wierszach i kolumnach. To wszystko udało mi się zrobić w C++ . Do czasu kiedy profesor powiedział aby dodać do tego jakieś GUI, czyli np aplikacja okienkowa.. i tu zaczynają się schody bo nigdy nic nie tworzyłem na klasach i obiektach, i nie mam pojęcia jak się za to zabrać. Nie ma z tym chyba dużo roboty, wystarczy żeby na początku program pytał o rozmiar macierzy i generował ją automatycznie( z możliwością edycji) , po czym przedstawiał konkretne wyniki operacji w jakiejś historii - listingu . Czy ktoś byłby mi wstanie pomóc? Mogę zamieścić aktualny kod. Chciałbym aby kod nadal był w C++ np korzystając z Window Forms , chyba że da się to zrobić w czymś innym szybciej i sprawniej...

0

Możesz użyć WxWidgets lub Qt. Tworzysz okienko, w nim siatkę i w siatce umieszczasz np pola tekstowe. Następnie mapujesz klawisze tak by np. strzałka w dól przechodziła do niższego pola.
Blokowanie komórek wykonasz poprzez ustawianie edytowalny/nieedytowalny.
GUI Wx zaprojektujesz wstępnie np. w wxGlade (Platforma Linux) a dodawanie nowych pól jest dość przyjemne.

0

Wszystko fajnie , ściągnąłem sobie QT wraz QT Creatorem , i jakbym wiedział jak się za to zabrać to bym to zrobił... nie wiem nawet jakiego widgetu użyć do prezentacji konkretnych komórek macierzy i jak ją wygenerować tutaj tak jak w programie. Może zamieszczę kod niżej i pokaże ile już zrobiłem... chciałbym żeby to działało w podobny sposób tylko żeby było prezentowane w formie okienkowej.. Czy jest ktoś w stanie wdrożyć mnie w to jakoś pokazać od czego zacząć.

 
// macierz.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <time.h>
#include <windows.h>
using namespace std;


// zmiana koloru na biały
void bialy()
{
   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
// zmiana koloru na zolty
void zolty()
{
   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN |FOREGROUND_INTENSITY);
}

// zmiana koloru na czerwony
void czerwony()
{
   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
}

// zmiana koloru na zielony
void zielony()
{
   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
}

// zmiana pozycji kursora
void gotoxy(int xpozycja, int ypozycja)
{
 COORD scrn;

 HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);

 scrn.X = xpozycja; scrn.Y = ypozycja;

 SetConsoleCursorPosition(hOuput,scrn);
}

// wczytywanie danych do macierzy[i][j]
void wczytaj_dane_macierz(int **tab, int wiersz, int kolumna)
{
   int ** macierz = tab;
   int x = 0; // pozycja x
   int y = 8; // pozycja y
   int i = 0; // wiersz macierzy
   int j = 0; // kolumna macierzy
   int lwiersz = wiersz;
   int lkolumna = kolumna;
   gotoxy(0,28);
                   zielony();cout << "Klawisz 'Q' lub 'q' spowoduje domyslne ustawienie niewypelnionych pol wartoscia 0 i kontynuuje prace programu.";bialy();
   gotoxy(0,8);
   char znak = _getch();
   while(znak != 'q' && znak != 'Q')
   {
       switch(znak){
           case 77:
               {
                   if(j < lkolumna-1) // zakres strzalek
                   {
                   if(lwiersz >= 2 && lkolumna == 2) // przypadek dla macierzy typu i >= 2 , j = 2
                   {
                   i = i + 1;
                   y = y + 2;
                   gotoxy(x,y);
                   }
                   if(i == 0 && j+1 == lkolumna-1) // elementy stale macierzy
                       break;
                   if(i > j+1) // elementy stale macierzy
                       break;
                   j = j + 1;
                   x = x + 8;
                   gotoxy(x,y);
                   }
                   break;
               }

           case 75:

               {
                   if(j > 0) // zakres strzalek
                   {
                   if(lwiersz >= 2 && lkolumna == 2) // przypadek dla macierzy typu i >= 2 , j = 2
                   {
                   i = i - 1;
                   y = y - 2;
                   gotoxy(x,y);
                   }
                   if(i > j-1) // elementy stale macierzy
                       break;
                   j=j-1;
                   x = x - 8;
                   gotoxy(x,y);
                   }
                   break;
               }
           case 72:
               {
                   if(i > 0) // zakres strzalek
                   {
                   if(i-1 == 0 && j == lkolumna-1) // elementy stale macierzy
                       break;
                   if(i-1 > j) // elementy stale macierzy
                       break;
                   i = i - 1;
                   y = y - 2;
                   gotoxy(x,y);

                   }
                   break;
               }

           case 80:

               {
                   if(i < lwiersz - 1 ) // zakres strzalek
                   {
                   if(i+1 > j) // elementy stale macierzy
                       break;
                   i= i+1;
                   y = y + 2;
                   gotoxy(x,y);
                   }
                   break;

               }
           case 13:

                   cin >> macierz[i][j]; // wczytywanie wartosci do macierzy
                   gotoxy(x,y);
                   while(cin.fail()) // kontrola wartosci
                   {
                   macierz[i][j] = -1 ; // domyslne ustawienie wartosci
                   cin.clear(); // czyszczenie flag bufora
                   cin.get(); // pobranie znakow z bufora
                   }
                   while(macierz[i][j] > 1 || macierz[i][j] < 0){ // sprawdzanie wartosci z przedzialu
                   gotoxy(0,30);
                   czerwony();cout << "Podaj wartosc macierzy z zakresu 0-1 ";bialy();
                   gotoxy(x,y);
                   cin >> macierz[i][j];
                   while(cin.fail())  // ponowna kontrola
                   {
                   macierz[i][j] = -1 ;
                   cin.clear();
                   cin.get();
                   }
                   gotoxy(x,y);
                   }

   }
   znak = _getch(); // operacje na strzalkach
   }
   system("cls"); // czyszczenie ekranu
}

// wczytywanie danych do macierzy jednostkowej
void wczytaj_dane_macierz(int *tab,int kolumna)
{

   int * macierz = tab;
   int lkolumna = kolumna;
   int x = 0; // pozycja x na ekranie
   int y = 3; // pozycja y na ekranie
   int j = 0;
   gotoxy(0,23);
                   zielony();cout << "Klawisz 'Q' lub 'q' spowoduje domyslne ustawienie niewypelnionych pol wartoscia 0 i kontynuuje prace programu.";bialy();
   gotoxy(0,y);
   char znak = _getch();
   while(znak != 'q' && znak != 'Q')
   {
       switch(znak){
           case 77:
               {
                   if(j < lkolumna-1) // zakres strzalek
                   {
                   j = j + 1;
                   x = x + 8;
                   gotoxy(x,y);
                   }
                   break;
               }

           case 75:

               {
                   if(j > 0) // zakres strzalek
                   {
                   j=j-1;
                   x = x - 8;
                   gotoxy(x,y);
                   }
                   break;
               }

           case 13:

                   cin >> macierz[j];
                   gotoxy(x,y);
                   while(cin.fail()) // kontrola wartosci
                   {
                   macierz[j] = -1 ;
                   cin.clear();
                   cin.get();
                   }
                   while(macierz[j] > 1 || macierz[j] < 0){ // zakres wartosci macierzy
                   gotoxy(0,20);
                   czerwony();cout << "Podaj wartosc macierzy z zakresu 0-1 ";bialy();
                   gotoxy(x,y);
                   cin >> macierz[j];
                   while(cin.fail()) // kontrola wartosci
                   {
                   macierz[j] = -1 ;
                   cin.clear();
                   cin.get();
                   }
                   gotoxy(x,y);
                   }

   }
   znak = _getch();
   }
   system("cls"); // czyszczenie ekranu
}


int main()
{
   bialy(); // zmiana koloru tekstu na bialy
   int wiersz, kolumna; // deklaracja zmiennych

   // deklaracja macierzy
   int *macierz_jednostkowa_wynikowa ;
   int *macierz_jednostkowa;
   int *macierz_przypisania;
   int **macierz ;

   //koniec deklaracji

   //deklaracja zmiennych pomocniczych
   bool sprawdzenie = false;
   int krok;
   int wynik;
   char powtorz = 'N';
   //koniec deklaracji

   // ustalenie wielkosci macierzy
   do{
   krok = 0;
   system("cls"); // czyszczenie ekranu
   cout << "Podaj ilosc wierszy macierzy nie mniejsza niz 2 i nie wieksza niz 9 : " << endl;
   cin >> wiersz;
   while(cin.fail()) // kontrola wartosci
   {
   wiersz = 0 ;
   cin.clear();
   cin.get();
   }
   while(wiersz < 2 || wiersz > 9){
       cout << "Podaj ilosc wierszy macierzy nie mniejsza niz 2 i nie wieksza niz 9:  " << endl;
       cin >> wiersz;
       while(cin.fail()) // kontrola wartosci
       {
           wiersz = 0 ;
           cin.clear();
           cin.get();
       }
   }
   //cout << "Podaj ilosc kolumn macierzy nie mniejsza niz 0 i nie wieksza niz 9:  " << endl;
   //cin >> kolumna;
   //while(cin.fail()) // kontrola wartosci
   //{
   //    wiersz = 0 ;
   //    cin.clear();
   //    cin.get();
   //}
  // while(kolumna <= 0 || kolumna > 9){
   //    cout << "Podaj ilosc kolumn macierzy nie mniejsza niz 0 i nie wieksza niz 9:  " << endl;
   //    cin >> kolumna;
   //    while(cin.fail()) // kontrola wartosci
   //    {
   //        wiersz = 0 ;
   //        cin.clear();
   //        cin.get();
   //    }
  // }
   system("cls"); // czyszczenie ekranu
   // koniec
   kolumna = wiersz;
   macierz_przypisania = new int[kolumna]; // okreslenie dynamicznie wielkosci macierzy
   macierz_jednostkowa_wynikowa = new int[kolumna]; // okreslenie dynamicznie wielkosci macierzy
   macierz_jednostkowa = new int[kolumna]; // okreslenie dynamicznie wielkosci macierzy
   macierz = new int*[wiersz]; // okreslenie dynamicznie wielkosci macierzy (tablica wskaźników)
   for(int i = 0; i < wiersz; i++){
       macierz[i] = new int[kolumna];
   }
   cout << endl << "Macierz jednostkowa : " << endl << endl;
   for(int i = 0; i < kolumna ; i++){
       macierz_jednostkowa[i] = 0;
       cout << "_" << "\t";
   }

  wczytaj_dane_macierz(macierz_jednostkowa,kolumna); // wywołanie funkcji wczytującej dane

   //koniec wprowadzania
   system("cls"); // czyszczenie ekranu
   // wyswietlenie macierzy jednostkowej
   cout << endl << "Macierz jednostkowa : " << endl << endl;
   for(int i = 0; i < kolumna ; i++){
       cout << macierz_jednostkowa[i] << "\t";
   }
   // koniec wyswietlania
   cout << endl << endl;

   // przypisanie wartosci macierzy jednostkowej do macierzy_przypisania
   for(int i = 0; i < kolumna; i++){
        macierz_przypisania[i] =   macierz_jednostkowa[i];
   }
   //koniec petli

   // wyswietlenie macierzy pierwotnej
   cout << endl << "Macierz pierwotna : " << endl << endl;
   for(int i = 0; i < wiersz ; i++){ // ustawienie domyslnych wartosci macierzy
       for(int j = 0; j < kolumna ; j++)
       {

           if(i > 0 && j < i){
               macierz[i][j] = 1;
               if(j < i-1)
                   macierz[i][j] = 0;
           }else
               if(i == 0 && j == (kolumna-1))
                   macierz[i][j] = 1;
               else
                   macierz[i][j] = 0;
               if(i > j){
                   zolty();cout << macierz[i][j] << "\t";bialy();
               }
               else
                   if(i == 0 && j == (kolumna-1)){
                       zolty();cout << macierz[i][j] << "\t";bialy();
                   }
                   else
                       cout << "_" << "\t";
       }
   cout << endl << endl;
   }
   // koniec wyswietlania

   wczytaj_dane_macierz(macierz, wiersz, kolumna); // wczytywanie danych do macierzy

   // wyswietlenie macierzy po edycji
   cout << endl << "Macierz po edycji : " << endl << endl;
   for(int i = 0; i < wiersz ; i++){
       for(int j = 0; j < kolumna ; j++)
           cout << macierz[i][j] << "\t";
   cout << endl << endl;
   }
  // koniec wyswietlania

  // wyswietlenie macierzy po edycji
   cout << endl << "* Macierz jednostkowa : " << endl << endl;
   for(int i = 0; i < kolumna ; i++){
       cout << macierz_jednostkowa[i] << "\t";
   }
   cout << endl;
   // koniec wyswietlania

   cout << "Nacisnij dowolny klawisz aby przejsc dalej " << endl;
  system("pause");// zatrzymanie wyswietlenia wynikow

   // operacje na macierzach
   do{
       sprawdzenie = false; //wartosc domyslna - macierze sa sobie rowne
       for(int i = 0; i < wiersz ; i++){
           for(int j = 0 ; j < kolumna ; j++){
              if(j == 0) // przypisanie wartosci do macierzy wynikowej przy pierwszej operacji
                   macierz_jednostkowa_wynikowa[i] =  macierz[i][j] * macierz_jednostkowa[j];
              if(j != 0){ // przypisanie wartosci macierzy przy kolejnych operacjach
                   wynik = macierz[i][j] * macierz_jednostkowa[j]; // zmienna pomocnicza na przechowywanie wartosci
                   macierz_jednostkowa_wynikowa[i] =  (!(macierz_jednostkowa_wynikowa[i]) * wynik) + (macierz_jednostkowa_wynikowa[i] * !wynik); // operacja modulo na wartosciach
              }
           }
       }
   for(int i = 0; i < kolumna; i++){
        macierz_jednostkowa[i] =  macierz_jednostkowa_wynikowa[i]; // przypisanie nowych wartosci macierzy jednostkowej
   }
   // wyswietlenie macierzy jednostkowej
   krok = krok + 1; //zliczanie krokow operacji
   cout << endl << "Macierz wynikowa krok "<< krok << " : " <<endl;
   for (int i = 0; i < kolumna ; i++)
       cout << endl << "x[" << i << "] = " << macierz_jednostkowa_wynikowa[i] << "\t" ;
   cout << endl;

   for (int i = 0; i < kolumna ; i++)
   {
       if(macierz_przypisania[i] != macierz_jednostkowa_wynikowa[i]) // sprawdzenie czy macierze jednostkowe sa sobie rowne jesli nie zwraca wartosc true
           sprawdzenie = true;
   }
   //koniec

}while(sprawdzenie && krok != 30); // wykonuj petle dopoki macierze jednostkowe sa rozne

if(krok == 30)
       cout << endl << "Okreslenie wartosci macierzy jednostkowej jest niemozliwe" << endl;

// koniec operacji

//delete [] macierz_przypisania; // usuwanie wskaźnika na zaalokowaną pamięć
//delete [] macierz_jednostkowa_wynikowa; // usuwanie wskaźnika na zaalokowaną pamięć
//delete [] macierz_jednostkowa; // usuwanie wskaźnika na zaalokowaną pamięć
//for(int i = 0; i < wiersz; i++){
//    delete macierz[i]; // usuwanie wskaźnika wskaźników na zaalokowaną pamięć
//}
//delete [] macierz; // usuwanie wskaźnika na zaalokowaną pamięć

cout << "Powtorzyc dzialanie programu ? T/N :";
cin >> powtorz;
while(powtorz != 'T' && powtorz != 't' && powtorz != 'N' && powtorz != 'n')
{
   cout << "Zly klawisz sproboj jeszcze raz  T/N "<< endl;
   cin >> powtorz;
}
}while(powtorz == 'T' || powtorz == 't');

   system("pause"); // zatrzymanie konsoli
   return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1