Форум языка CPP

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Форум языка CPP » Код домашнего задания » Работа с 2мя массивами (статистика совпадений, сортировка)


Работа с 2мя массивами (статистика совпадений, сортировка)

Сообщений 1 страница 3 из 3

1

Код:
void myFunc2(void)
{
	const int iARRSIZE = 5;
	
	int iArrayNumbersOne[iARRSIZE],    iArrayNumbersTwo[iARRSIZE*2];	
	int iArrayStatistic[iARRSIZE*3] = {0};	int iArrayNumsMem[iARRSIZE*3] = {0};
	bool iFlags = true;
	int iPressKey = 1, iRandomNums = 5;

	for(bool bDraw;; bDraw = false)
	{
    
    /*
    *Resetting the resulting array
    */
    for(int i = 0; i < (sizeof(iArrayStatistic)/sizeof(int)); ++i)
    {
    	iArrayStatistic[i] = 0;
    	iArrayNumsMem[i] = 0;
    }

    
    /*
    *Fill array ONE with random numbers
    */	
    for(int i = 0; i < (sizeof(iArrayNumbersOne)/sizeof(int)); ++i)
    {
    	iArrayNumbersOne[i] = rand()%iRandomNums+1;
    }

    
    /*
    *Fill array TWO with random numbers
    */	
    for(int i = 0; i < (sizeof(iArrayNumbersTwo)/sizeof(int)); ++i)
    {
    	iArrayNumbersTwo[i] = rand()%iRandomNums+1;
    }
    
    
    /*
    *Making a report on matching numbers
    */
    for(int i = 0; i <= (sizeof(iArrayNumbersOne)/sizeof(int)); ++i)
    {
    	for(int j = i; j <= (sizeof(iArrayNumbersTwo)/sizeof(int)); ++j)
    	{	
        if(iArrayNumbersOne[i] == iArrayNumbersTwo[j])
        {
        	for(int k = 0; k <=(sizeof(iArrayNumsMem)/sizeof(int)); ++k)
        	{
            /*
            *Check if there was any calculated the number of
            */
            if(iArrayNumbersOne[i] == iArrayNumsMem[k])
            {
            	iFlags = false;
            	break;            
            }
            else
            {
            	iFlags = true;
            }
        	}
        	if(iFlags)
        	{
            iArrayNumsMem[i] = iArrayNumbersOne[i];
        	}
        	
        	if(iArrayNumsMem[i])
        	{
            ++iArrayStatistic[i];
        	}
        }
    	}
    }

    
    /*
    *Menu selection
    */
    
    std::cout<<"Enter the type of sorting"<<std::endl;
    std::cout<<std::endl;
    std::cout<<"\"1\" Sort by largest number of matched"<<std::endl;
    std::cout<<std::endl;
    std::cout<<"\"2\" Sorting and matching numbers"<<std::endl;
    std::cout<<std::endl;
    std::cout<<"\"Any key\" No Sorting"<<std::endl;
    std::cout<<std::endl;
    std::cout<<"\"Esc\" Exit"<<std::endl;
    std::cout<<std::endl;

    iPressKey = _getch();


    switch(iPressKey)
    {
    	case 224:
        ;
        break;
    	case 49:
        /*
        *Sort by largest number of matched
        */	
        for(int i = 0; i < (sizeof(iArrayNumsMem)/sizeof(int)); ++i)
        {
        	for(int j = 0, temp; j < (sizeof(iArrayNumsMem)/sizeof(int)); ++j)
        	{
            if(iArrayNumsMem[i] > iArrayNumsMem[j])
            {
            	temp = iArrayNumsMem[j];
            	iArrayNumsMem[j] = iArrayNumsMem[i];
            	iArrayNumsMem[i] = temp;

            	temp = iArrayStatistic[j];
            	iArrayStatistic[j] = iArrayStatistic[i];
            	iArrayStatistic[i] = temp;
            }
        	}
        }
        bDraw = true;
    	break;
    	case 50:
        /*
        *Sorting and matching numbers
        */	
        for(int i = 0; i < (sizeof(iArrayStatistic)/sizeof(int)); ++i)
        {
        	for(int j = 0, temp; j < (sizeof(iArrayStatistic)/sizeof(int)); ++j)
        	{
            if(iArrayStatistic[i] > iArrayStatistic[j])
            {
            	temp = iArrayStatistic[j];
            	iArrayStatistic[j] = iArrayStatistic[i];
            	iArrayStatistic[i] = temp;
        	
            	temp = iArrayNumsMem[j];
            	iArrayNumsMem[j] = iArrayNumsMem[i];
            	iArrayNumsMem[i] = temp;
            }
        	}
        }
        bDraw = true;
    	break;
    	
    	case 27:
        exit(0);
    	break;
    	
    	default:
        bDraw = true;
    	break;


    }

    if(bDraw)
    {
    	system("cls");
    	/*
    	*Output results
    	*/	
    	std::cout<<"The values recorded in the array"<<std::endl;
    	std::cout<<std::endl;
    	
    	std::cout<<std::setw(7)<<"Arr ONE"<<' ';
    	for(int i = 0; i < (sizeof(iArrayNumbersOne)/sizeof(int)); ++i)
    	{
        std::cout<<std::setw(3)<<iArrayNumbersOne[i]<<' ';
    	}
    	
    	std::cout<<std::endl;
    	std::cout<<std::endl;

    	std::cout<<std::setw(7)<<"Arr TWO"<<' ';
    	for(int i = 0; i < (sizeof(iArrayNumbersTwo)/sizeof(int)); ++i)
    	{
        std::cout<<std::setw(3)<<iArrayNumbersTwo[i]<<' ';
    	}

    	std::cout<<std::endl;
    	std::cout<<std::endl;
    	std::cout<<"*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"<<std::endl;
    	std::cout<<std::endl;
    	
    	std::cout<<std::setw(6)<<"Numers"<<' ';
    	std::cout<<std::setw(6)<<"SumNum"<<' ';
    	std::cout<<std::setw(6)<<"Percent"<<std::endl;
    	for(int i = 0, result, counter=0; i < (sizeof(iArrayNumbersTwo)/sizeof(int)); ++i)
    	{
        /*
        *Getting the total number of matches
        */
        for(int j = 0; j < (sizeof(iArrayStatistic)/sizeof(int)) && !i; ++j)
        {
        	if(iArrayStatistic[j])
        	{
            counter += iArrayStatistic[j];
        	}
        }
        
        if(iArrayNumsMem[i])
        {
        	result = iArrayStatistic[i] * 100 /	counter;	
        	std::cout<<std::setw(3)<<iArrayNumsMem[i]<<' ';
        	std::cout<<std::setw(6)<<iArrayStatistic[i]<<' ';
        	std::cout<<std::setw(7)<<result<<'%'<<std::endl;
        }
    	}
    }
	}

}

0

2

for(int i = 0; i < (sizeof(iArrayNumbersOne)/sizeof(int)); ++i)

Как выяснилось здесь содержится ошибка, правильно вот так:

for(int i = 0, iSizeArr = (sizeof(iArrayNumbersOne)/sizeof(int)) ; i < iSizeArr ; ++i)

Почему так?

Если вспомнить порядок выполнения условий цикла FOR, а именно:

1я секция выполняется 1 раз, при вхождении в тело цикла;

2я  секция выполняется (проверяется), каждый раз при новой итерации цикла;

3я секция выполняется, каждый раз в конце итерации цикла;

С чего выплывает что вычисление размера массива выполняется при каждой новой итерации (что значительно замедляет программу). А объявляя переменную в 1й секции цикла и присваивая ей значение размера массива, мы выполняем вычисление всего 1 раз, а переменная существует только в теле цикла.

0

3


Вы здесь » Форум языка CPP » Код домашнего задания » Работа с 2мя массивами (статистика совпадений, сортировка)