Jak zoptymalizowac ten kod

Odpowiedz Nowy wątek
2015-05-12 21:42
0

Witam, mam mały problem mianowicie mam do napisania program w którym użytkownik:
1.Najpierw wybiera rozmiar tablicy 10, 50 lub 100 elemetnowa

  1. Następnie wybiera jakimi wartościami pseudolosowymi ma się uzupełnic tablia, także są trzy opcje
  2. Wybiera jedną z dostępnych 9 opcji, którymi może pracować z tablicą

Mam przygotowane działanie wszystkich opcji, ale przy próbie zapisów Sittcha w switchu w switchu, wychodzi straszne zamieszania

#include <iostream>
#include <time.h>
using namespace std;

int main()
{
srand(time(NULL));
int i,wybor_rozmiaru,wybor_opcji,wybor_losowosci,j;

cout<<"Program umożliwia działanie na wybranej tablicy"<<endl;
cout<<"Wybierz rozmiar tablicy na której chcesz pracować"<<endl;
cout<<"1- Tablica 10 elementowa"<<endl;
cout<<"2- Tablica 50 elementowa"<<endl;
cout<<"3- Tablica 100 elementowa"<<endl;
cin>>wybor_rozmiaru;

switch(wybor_rozmiaru)
{
case 1:
    {
        cout<<"Wybierz jak uzupełnić elementy tablicy"<<endl;
        cout<<"1. Liczby losowe z przedziału [0;100]"<<endl;
        cout<<"2. Liczby losowe z przedziału [50;100]"<<endl;
        cout<<"3. Liczby losowe z przedziału [-1;1]"<<endl;
        cin>>wybor_losowosci;
        switch(wybor_losowosci)
        {
        case 1:
            {
                cout<<"Wybierz z której opcji chcesz skorzystać"<<endl;
                cout<<"1. Wyświetl tablicę"<<endl;
                cout<<"2. Wyznacz sumę oraz średnią arytmetyczną elementów w tablicy"<<endl;
                cout<<"3. wyznacz sumę elementów zapisanych na parzystych pozycjach w tablicy"<<endl;
                cout<<"4. Posortuj tablicę"<<endl;
                cout<<"5. Odwróć tablicę"<<endl;
                cout<<"6. przesuń wszystkie elementy w tablicy o jedną pozycję w prawo"<<endl;
                cout<<"7. przesuń wszystkie elementy w tablicy o dwie pozycje w lewo"<<endl;
                cout<<"8. wyznacz dwie najmniejsze wartości w tablicy oraz ich indeksy"<<endl;
                cout<<"9. wyznacz która wartość pojawia się w tablic najczęściej i ile razy"<<endl;
                cin>>wybor_opcji;
                cout<<endl;
                int tab10[10];
                for(i=0;i<10;i++) 
                    tab10[i]=rand()%101;
                switch(wybor_opcji)
                {
                case 1:
                    {
                    for(i=0;i<10;i++)
                    cout<<tab10[i]<<" ";
                    cout<<endl;
                    }
                    break;
                case 2:
                    {
                    double srednia;
                    int suma;
                    suma=0;
                    for(i=0;i<10;i++)
                        suma+=tab10[i];
                    srednia=suma/10.0;
                    cout<<"Suma elementów tablicy wynosi: "<<suma<<endl;
                    cout<<"Srednia wartosc elementu w tablicy wynosi: "<<srednia<<endl;
                    }
                    break;
                case 3:
                    { 
                    int suma;
                    suma=0;
                    for(i=0;i<10;i=i+2)
                        suma+=tab10[i];
                    cout<<"Suma elementów na parzystch pozycjach w tablicy jest równa: "<<suma<<endl;
                    }
                    break;
                case 4:
                    {
                    int zamiana;
                    for(j=9;j>0;j--)
                    {
                        for(i=0;i<j;i++)
                            if(tab10[i]>tab10[i+1])
                            {
                                zamiana=tab10[i];
                                tab10[i]=tab10[i+1];
                                tab10[i+1]=zamiana;
                            }
                    }
                    cout<<"Posortowana tablica"<<endl;
                    for(i=1;i<10;i++)
                        cout<<tab10[i]<<" ";
                    }
                    break;
                case 5:
                    {
                        cout<<"Tablica po odwroceniu: "<<endl;
                        for(i=9;i>=0;i--)
                            cout<<tab10[i]<<" ";
                    }
                    break;
                case 6:
                    {
                        cout<<"Tablica po przesunieciu: "<<endl;
                        for(i=0;i<10;i++)
                            cout<<tab10[((i%10)+9)%10]<<" ";
                    }
                    break;
                case 7:
                    {
                        cout<<"Tablica po przestawieniu: "<<endl;
                        for(i=0;i<10;i++)
                            cout<<tab10[(i+2)%10]<<" ";
                    }
                case 8:
                    {
                        int min,min2,w_min,w_min2;
                        min=101;
                        min2=101;
                        w_min=0;
                        w_min2=0;
                        for(i=0;i<10;i++)
                        {
                            if(tab10[i]<=min)
                            {
                                min2=min;
                                min=tab10[i];
                                w_min2=w_min;
                                w_min=i;
                            }
                            else if(tab10[i]<min2)
                            {
                                min2=tab10[i];
                                w_min2=i;
                            }
                        }
                        cout<<"Dwie najmniejsze liczby to:"<<endl;
                        cout<<min<<"  Indeks w tablicy "<<w_min<<endl;
                        cout<<min2<<"  Indeks w tablicy "<<w_min2<<endl;
                    }
                    break;
                case 9:
                    {
                        int licznik,wartosc,licznik_max,wartosc_max;
                        licznik_max=0;
                        for(i=0;i<10;i++)
                        {
                            wartosc=tab10[i];
                            licznik=0;
                            for(j=0;j<10;j++)
                                if(tab10[j]==wartosc)
                                    licznik++;
                            if(licznik>licznik_max)
                            {
                                licznik_max=licznik;
                                wartosc_max=wartosc;
                            }
                        }
                        cout<<"Najczesciej wystepujacym elementem jest: "<<wartosc_max<<endl;
                        cout<<"Wystepuje "<<licznik_max<<" razy"<<endl;

                    }
                    break;
                }
                break; 

Tu mam rozpisaną każdą możliwość dla tablicy 10 elemntowej o wartościach [0;100]
Chodzi o pomoc w ogarnięciu tych switchy, bo inaczej wychodzi 45 możliwości
Z góry dzięki za pomoc

edytowany 1x, ostatnio: Bartek07, 2015-05-12 21:43

Pozostało 580 znaków

2015-05-12 21:56
0

A o funkcjach nie słyszałeś ?

Pozostało 580 znaków

2015-05-12 22:02
0

O funkcjach słyszałem ale jeszcze ich nie przerabialiśmy, dlatego stwierdziłem, że pewnie da się to zrobić inaczej. A funkcję nie zmienią za dużo, bo dalej będę miał switch w switchu w switchu. One skrócą tylko zapis tego "najwewnetrzniejszego" switcha. A możliwości dalej będzie 339.

Możesz także to zrobić na if/else(if) - JMII89 2015-05-12 22:11
funkcje będą bardziej czytelne i to że nie mieliście ich to nie znaczy, że nie możesz skorzystać z nich - Niikelion 2015-05-12 22:38

Pozostało 580 znaków

2015-05-12 22:18
0

Generalnie zadanie jest, zeby to było na switchach. Na if/else if to wciąż będzie tyle samo opcji. Bo z pierwszego będe miał 3 if i wkażdym kolejne 3 i w każdym z nich znowu te 9 opcji. Bardziej chodziło mi o to, żeby np te ostatni switch wykonywał się zawsze co bym nie wybrał i sam niejako wybierał sobie wartośći ( rozmiar tablicy i przedział liczb) na podstawie dwóch poprzednich switchów.

Pozostało 580 znaków

2015-05-12 22:19
0

Chodzi Ci o optymalizację czy zrobienie tego czytelnym? :P
Bo temat mówi co innego, a Ty też co innego.


edytowany 1x, ostatnio: Patryk27, 2015-05-12 22:19

Pozostało 580 znaków

2015-05-12 22:23
0

Chodzi mi o to, zeby działało było czytelne i nie miało kilku tysięcy linijek kodu, bo przy tym moim sposobie, tak by wyszło

To nie ma nic wspólnego z optymalizacją kodu. - Patryk27 2015-05-12 22:40

Pozostało 580 znaków

2015-05-12 22:31
Pijany Kaczor
1

Generalnie kod, który podrzucam jest kiepskiej jakości, jednak skoro jeszcze nie czytałeś o funkcjach, to nie chciałem wybierać dużo do przodu.

Koniecznie musisz doczytać jeszcze o funkcjach i oczywiście cała dynamiczna alokacja pamięci (tutaj specjalnie trochę sztucznie ominąłem ten problem).

#include <iostream>
using namespace std;

int ustalRozmiar(int wybor_rozmiaru)
{
    if(wybor_rozmiaru==1)
         return 10;
    if(wybor_rozmiaru==2)
         return 50;
    return 100;
}

int main() 
{
    srand(time(NULL));
    int i,wybor_rozmiaru,wybor_opcji,wybor_losowosci,j;

    cout<<"Program umożliwia działanie na wybranej tablicy"<<endl;
    cout<<"Wybierz rozmiar tablicy na której chcesz pracować"<<endl;
    cout<<"1- Tablica 10 elementowa"<<endl;
    cout<<"2- Tablica 50 elementowa"<<endl;
    cout<<"3- Tablica 100 elementowa"<<endl;
    cin>>wybor_rozmiaru;

    cout<<"Wybierz jak uzupełnić elementy tablicy"<<endl;
    cout<<"1. Liczby losowe z przedziału [0;100]"<<endl;
    cout<<"2. Liczby losowe z przedziału [50;100]"<<endl;
    cout<<"3. Liczby losowe z przedziału [-1;1]"<<endl;
    cin>>wybor_losowosci;

    cout<<"Wybierz z której opcji chcesz skorzystać"<<endl;
    cout<<"1. Wyświetl tablicę"<<endl;
    cout<<"2. Wyznacz sumę oraz średnią arytmetyczną elementów w tablicy"<<endl;
    cout<<"3. wyznacz sumę elementów zapisanych na parzystych pozycjach w tablicy"<<endl;
    cout<<"4. Posortuj tablicę"<<endl;
    cout<<"5. Odwróć tablicę"<<endl;
    cout<<"6. przesuń wszystkie elementy w tablicy o jedną pozycję w prawo"<<endl;
    cout<<"7. przesuń wszystkie elementy w tablicy o dwie pozycje w lewo"<<endl;
    cout<<"8. wyznacz dwie najmniejsze wartości w tablicy oraz ich indeksy"<<endl;  
    cout<<"9. wyznacz która wartość pojawia się w tablic najczęściej i ile razy"<<endl;
    cin>>wybor_opcji;
    cout<<endl;

    const int stalyRozmiar=ustalRozmiar(wybor_rozmiaru); //ominiecie dymamicznej alokacji
    int tablica[stalyRozmiar];

    //teraz mamy smieci w tablicy

    switch(wybor_opcji)
     {
           case 1:
           {
               for(i=0;i<stalyRozmiar;i++)
                cout<<tablica[i]<<" ";
                cout<<endl;
            }
           break;
     }
    return 0;
}
int tablica[stalyRozmiar]; nie możesz tak zrobić w C++. - Patryk27 2015-05-12 22:40
stalyRozmiar musi byc znane na etapie kompilacji. Niektore kompilatory to przepuszcza i nawet zrobia to co chcesz, ale jest to niepoprawne i nie bedzie dzialac wszedzie. - krwq 2015-05-13 03:19

Pozostało 580 znaków

2015-05-12 22:32
0

poczytaj sobie o std::map
musisz zrobic pare klas/struktur i wpisac do nich dane. a do mapy przypisac swoje obiekty (ktore beda miec tez obiekty z wyborami i akcjami)
no i oczywiscie vector zeby nie miec tych rozmiarow.

Jezeli tych dwoch powyzszych nie chcesz robic to kodu na bardziej czytelny za bardzo nie da sie zrobic.

edytowany 1x, ostatnio: fasadin, 2015-05-12 22:33

Pozostało 580 znaków

2015-05-12 22:32
1

Nie ma co kombinować. Według mnie poznaj wpierw podstawy języka i wtedy możesz się zastanawiać co zmienić.

Pozostało 580 znaków

2015-05-12 23:15
#YOLO
0

Agata zaatakowala tez sie z tym mecze ;p

Pozostało 580 znaków

2015-05-12 23:24
#YOLO
0

juz tydzien i powiec Ci ze bez funkcji nic z tego nie bedzie

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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