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...
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.
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;
}