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, botów: 0