Jak uprościć program oraz dodać menu ze strzałkami (tablice dynamiczne, metoda Guassa-Seidela

0

Witam,
Po pierwsze chciałbym uprościć kod.
Po drugie, dodać menu (wiem, ze menu jest tu bez sensu, ale to program na zajęcia :( ) w którym można się poruszać strzałkami.

 
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>

using namespace std;


void open(ifstream & file){
	file.open("dane.txt");
	if (file.good()==false)
		cout<<"Nie udalo sie otworzyc pliku"<<endl;
}

void wypisz(double **matrix, int ilo){
	cout<<"Macierz: "<<endl;
	for (int i=0; i<ilo; i++)
		{for (int j=0; j<ilo+1; j++)
		cout<<setw(6)<<matrix[i][j];
	cout<<endl;}
}

void odczyt(ifstream & file,double **matrix, int ilo){
	for (int i=0; i<ilo; i++)
		for (int j=0; j<ilo+1; j++)
			file>>matrix[i][j];
}

double **tworzenie(int ilo){
	double **matrix = new double *[ilo];
	for (int i=0; i<ilo; i++)
		matrix[i]=new double [ilo+1];
	return matrix;
}


int zliczanie(ifstream & file, int &ilo){
	open (file);
	string znak;
	while(!file.eof())
	{
	getline(file, znak);
	++ilo;
	}
	cout<<"Ilosc wierszy: " <<	ilo<<endl;
	file.close();
	cin.ignore();
	return ilo;
}

void warunek_brak_zera_na_przekatnej(double **matrix, int ilo){
	for (int i=0; i<ilo; i++)
	{if (matrix[i][i] ==0)
	cout<<"Na przekatnej znajduje sie zero, popraw uklad";}
}

void wyswietl(double **tablica, int ilo)
{
for (int i=0; i<ilo; i++)
	{for (int j=0; j<ilo; j++)
	cout<<setw(6)<<tablica[i][j];
cout<<endl;
	}
cout<<endl;
}

void zerowanie_pod_przatkatna (double **U, int ilo){
	for (int i=0; i<ilo; i++)
		for (int j =0; j<=i; j++)
		{
			U[i][j]=0;
		}
		cout<<"Macierz U:"<<endl;
	wyswietl(U, ilo);	
}

void zerowanie_nad_przatkatna (double **L, int ilo){

	for (int i=0; i<ilo; i++)
		for (int j=i; j<ilo; j++)
		{
			L[i][j]=0;
		}
		cout<<"Macierz L:"<<endl;
	wyswietl(L, ilo);	
}

void nie_zerowanie_przekatnej (double **D, int ilo){
	for (int i=0; i<ilo; i++)
		for (int j=i+1; j<ilo; j++)
		{
			D[i][j]=0;
		}
		for (int i=0; i<ilo; i++)
		for (int j =0; j<=i-1; j++)
		{
			D[i][j]=0;
		}

	cout<<"Macierz D:"<<endl;
	wyswietl(D, ilo);	
}

void odwrotnoscD (double **D, int ilo)
{
for (int i =0; i<ilo; i++)
	D[i][i] = 1/(D[i][i]);

cout<<"Macierz D^(-1)"<<endl;
}

void mnoznik (double **cos, double **D, int ilo){

for (int i =0; i<ilo; i++)
	for (int j=0; j<ilo; j++)
	{
		cos[i][j] = cos[i][j] *D[i][i];
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
		
	ifstream file;
	int ilo=0;
	
	double **matrix=tworzenie(zliczanie(file, ilo));
	
	double **L=tworzenie(ilo);
	double **D=tworzenie(ilo);
	double **U=tworzenie(ilo);

//////////////////tworzenie i wyswietlanie 	
	open(file);
	odczyt( file, matrix, ilo);
	wypisz(matrix, ilo);
	file.close();

	open(file);
	odczyt(file, L, ilo);
	file.close();

	open(file);
	odczyt(file, D, ilo);
	file.close();

	open(file);
	odczyt(file, U, ilo);
	file.close() ;
	warunek_brak_zera_na_przekatnej(matrix, ilo);

	cout<<endl;
	zerowanie_pod_przatkatna(U, ilo);
	nie_zerowanie_przekatnej(D, ilo);
	zerowanie_nad_przatkatna(L, ilo);
	/////////////////////////////////////////////////////////////

	odwrotnoscD(D, ilo);
	wyswietl(D, ilo);
	
	mnoznik(L, D, ilo);
	cout<<"D-1L"<<endl;
	wyswietl(L,ilo);


	mnoznik(U, D, ilo);
	cout<<"D-1U"<<endl;
	wyswietl(U,ilo);

	
	
	
	
	////////wyrazy wolne////////////
	for (int i=0; i<ilo; i++)
		matrix[i][ilo]=matrix[i][ilo] * D[i][i];
	cout<<"Macierz wyniku: "<<endl;
	for (int i=0; i<ilo; i++)
		cout<<setw(6)<<matrix[i][ilo];
	cout<<endl;


	double *iksy = new double [ilo];
	for (int i=0; i<ilo; i++)
		iksy[i] =0;


	/////   x^(n+1) = D-1b - D-1Lx^(n+1) - D-1Ux^(n)    ////


	int iter;
cout<<"Ile iteracji algorytmu wykonac?\n";
cin>>iter;
 
for (int k=0; k<iter; k++)
		for (int i=0; i<ilo; i++)
		{
			iksy[i] = matrix[i][ilo];                       
		for (int j=0; j<i; j++)
			iksy[i] -= L[i][j]*iksy[j];    
		for (int j=i+1; j<ilo; j++)
			iksy[i] -= U[i][j]*iksy[j];   
		}
 

	cout<<"wynik:\n";
	for (int i=0; i<ilo; i++)
		cout<<setw(10)<<iksy[i];
	cout<<endl;
	system ("pause");
	return 0;
}


0

Zacząłbym od normalnego formatowania kodu...
#1:

if (file.good()==false)

Lepiej:

if (!file.good())
0

ja bym zrobił tak:
stwórz obiekt string reprezentujący powierzchnię całego ekranu wtedy będziesz mógł łatwo wstawiać znaki w to miejsce ekranu gdzie chcesz. Później musisz użyć conia aby wczytać kod ascii strzałki. Później tylko wstawiasz te strzałki(które podkreślają daną opcję w menu) w odpowiednie miejsce na ekranie.

0

Znalazłem taki kod, który umożliwia mi przemieszczanie się strzałkami, a do tego podświetla napisy:

 
#include <stdio.h>
#include <windows.h>
#include <conio.h>
/*--- Zmiana koloru napisów na biały ---*/
void bialy()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
/*--- Zmiana koloru napisów na czerwony ---*/
void czerwony()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
}

int main()
{
    int n=1,z;
    while(1)
    {
     system("cls");
      bialy();
      if(n==1){czerwony();}printf("menu 1\n");bialy();
      if(n==2){czerwony();}printf("menu 2\n");bialy();
      if(n==3){czerwony();}printf("menu 3\n");bialy();
      if(n==4){czerwony();}printf("menu 4\n");bialy();    
    z=getch();
//        GÓRNA STRZAŁKA
        if(z==72){if(n>1){n--;}} //ograniczenie z góry
//        DOLNA STRZAŁKA
        if(z==80){if(n<4){n++;}} //ograniczenie z dołu (jeśli masz więcej opcji w menu to edytujesz '4' na twoją wartość)         
    }
    
 return 0;   
}

Gdzie wstawić funkcję, by po najechaniu strzałkami na np: MENU 1 wykonało instrukcję. powiedzmy, ze po najechaniu MENU1 i kliknięciu na nie, niech wyświetli tablice matrix ( wywolanie funkcji: wypisz(matrix, ilo); )

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