Jak zoptymalizowac ten kod

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
2. Następnie wybiera jakimi wartościami pseudolosowymi ma się uzupełnic tablia, także są trzy opcje
3. 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

0

A o funkcjach nie słyszałeś ?

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.

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.

0

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

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

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

1

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

0

Agata zaatakowala tez sie z tym mecze ;p

0

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

0

Ja bym cos w ten desen szedl, jak na poczatkujacego:

#include <iostream>
#include <time.h>
#include <vector>

using namespace std;

void wypelnij_losowymi(vector<int>& t, int min, int max)
{
    int liczb_w_przedziale = max - min + 1;
    for (int i = 0; i < t.size(); i++)
    {
        t[i] = rand() % liczb_w_przedziale + min;
    }
}

void wyswietl_tablice(vector<int>& t)
{
    for (int i = 0; i < t.size(); i++)
    {
        cout << t[i] << " ";
    }
    cout << endl;
}

int main()
{
    srand(time(NULL));
 
    cout << "Program umozliwia dzialanie na wybranej tablicy" << endl;
    cout << "Wybierz rozmiar tablicy na której chcesz pracowac" << endl;
    cout << "1- Tablica 10 elementowa" << endl;
    cout << "2- Tablica 50 elementowa" << endl;
    cout << "3- Tablica 100 elementowa" << endl;
  
    int wybor_rozmiaru;
    cin >> wybor_rozmiaru;
    vector<int> tablica;
 
    switch (wybor_rozmiaru)
    {
        case 1: tablica.resize(10); break;
        case 2: tablica.resize(50); break;
        case 3: tablica.resize(100); break;
        default: cout << "Nieprawidlowy wybor" << endl; return -1;
    }

    cout << "Wybierz jak uzupelnic elementy tablicy" << endl;
    cout << "1. Liczby losowe z przedzialu [0;100]" << endl;
    cout << "2. Liczby losowe z przedzialu [50;100]" << endl;
    cout << "3. Liczby losowe z przedzialu [-1;1]" << endl;
    int wybor_losowosci;
    cin >> wybor_losowosci;
    
    switch(wybor_losowosci)
    {
        case 1: wypelnij_losowymi(tablica, 0, 100); break;
        case 2: wypelnij_losowymi(tablica, 50, 100); break;
        case 3: wypelnij_losowymi(tablica, -1, 1); break;
        default: cout << "Nieprawidlowy wybor" << endl; return -1;
    }

    
    cout << "Wybierz z której opcji chcesz skorzystac" << endl;
    cout << "1. Wyswietl tablice" << endl;
    cout << "2. Wyznacz sume oraz srednia arytmetyczna elementów w tablicy" << endl;
    cout << "3. wyznacz sume elementów zapisanych na parzystych pozycjach w tablicy" << endl;
    cout << "4. Posortuj tablice" << endl;
    cout << "5. Odwróc tablice" << endl;
    cout << "6. przesun wszystkie elementy w tablicy o jedna pozycje w prawo" << endl;
    cout << "7. przesun wszystkie elementy w tablicy o dwie pozycje w lewo" << endl;
    cout << "8. wyznacz dwie najmniejsze wartosci w tablicy oraz ich indeksy" << endl;
    cout << "9. wyznacz która wartosc pojawia sie w tablic najczesciej i ile razy" << endl;
    
    int wybor_opcji;
    cin >> wybor_opcji;
    cout << endl;

    switch(wybor_opcji)
    {
      case 1: wyswietl_tablice(tablica); break;
      // ...
      default: cout << "Nieprawidlowy wybor" << endl; return -1;
    }
    
    return 0;
}

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