Официальный сайт студ.городка НГТУ
Программирование и БД » [C++] Нужна помощь с функциями 

#1  22.03.10 20:03

[C++] Нужна помощь с функциями

Код::

include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int FillArray(int iFrom, int iTo, int* Range) 
{
   int   iSize = 0, iIndex;

   for ( iIndex = iFrom; iIndex <= iTo; iIndex++ )
      Range[iSize++] = iIndex;

   return iSize;
}

int *Function(int *Range, int iNumbers[], int Size)
{
	int iIndex;
	for(iIndex = 0; iIndex < Size; iIndex++)
	{
		if (*Range%iNumbers[iIndex] == 0)
			*Range = 0;
	}
	return Range;
}

int main() 
{
	int iIndex, iFrom, iTo; 
	int iSize;       
	int* Range;
	int Summa;
	int iNumbers[5] = {3,5,2,6,7};

	printf("Please enter Range: ");
	scanf("%d - %d", &iFrom, &iTo);

	Range = (int*)malloc((iTo-iFrom+1)*sizeof(int));

	iSize = FillArray( iFrom, iTo, Range );

	printf("The Range: ");
	for(iIndex = 0; iIndex < iSize; iIndex++)
	{
	   printf("%d ", Range[iIndex]);
	}
	printf( "\n" );

	for(iIndex; iIndex < iSize; iIndex++)
	{
		Range = Function(Range, iNumbers, 5);
	}


	for(iIndex = 0; iIndex < iSize; iIndex++)
	{
	   printf("%d ", Range[iIndex]);
	}
	

	free(Range);
	_getch();
	return 0;
}

Нужно чтобы все число из вводимого диапазона которые делятся нацело, на вводимые числа  занулялись, но он у меня зануляет только первое число(если оно делится нацело). И дальше указатель не перемещает..

И ещё как сделать так чтобы массив iNumbers надо было вводить, а не задавать.

Offline

#2  22.03.10 21:50

$up
Профиль

Re: [C++] Нужна помощь с функциями

for(iIndex; iIndex < iSize; iIndex++)

iIndex не инициализирован

if (*Range%iNumbers[iIndex] == 0)
здесь ты берёшь только первое значение Range
нужен цикл вложенный с перебором Range[j]

Offline

#3  22.03.10 22:03

$up
Профиль

Re: [C++] Нужна помощь с функциями

Код: cpp:

	int c = 0;
	printf("Count of numbers: ");
	scanf("%d", &c);
	int* iNumbers = new int[c];
	printf("Input values:\n");
	for(int i = 0; i < c; i++)
	{
		scanf("%d", &iNumbers[i]);
	}

Offline

#4  23.03.10 11:15

Re: [C++] Нужна помощь с функциями

$up написал(а):

for(iIndex; iIndex < iSize; iIndex++)

iIndex не инициализирован

if (*Range%iNumbers[iIndex] == 0)
здесь ты берёшь только первое значение Range
нужен цикл вложенный с перебором Range[j]

То есть в функции должен прибавлять j?

Offline

#5  23.03.10 11:23

$up
Профиль

Re: [C++] Нужна помощь с функциями

Код: cpp:

	for(iIndex = 0; iIndex < Size; iIndex++)
	{
			for(int j = 0; j < sizeof(Range)/sizeof(int); j++)
	                          {
		                if (Range[j]%iNumbers[iIndex] == 0)
			                Range[j] = 0;
	                          }
	}

Исправлено $up (23.03.10 11:27)

Offline

#6  23.03.10 11:34

Re: [C++] Нужна помощь с функциями

Код::

int FillArray(int iFrom, int iTo, int* Range) 
{
   int   iSize = 0, iIndex;

   for ( iIndex = iFrom; iIndex <= iTo; iIndex++ )
      Range[iSize++] = iIndex;

   return iSize;
}

int *Function(int *Range, int iNumbers[], int Size)
{
	int iIndex;
	for(iIndex = 0; iIndex < Size; iIndex++)
	{
		for(int j = 0; j < sizeof(Range)/sizeof(int); j++)
	    {
			if (Range[j]%iNumbers[iIndex] == 0)
			                Range[j] = 0;
		}
	}
	return Range;
}

int main() 
{
	int iIndex, iFrom, iTo; 
	int iSize;       
	int* Range;
	int Summa;
	int c = 0;
	
	printf("Please enter Range: ");
	scanf("%d - %d", &iFrom, &iTo);

	Range = (int*)malloc((iTo-iFrom+1)*sizeof(int));

	iSize = FillArray( iFrom, iTo, Range );

	printf("The Range: ");
	for(iIndex = 0; iIndex < iSize; iIndex++)
	{
	   printf("%d ", Range[iIndex]);
	}
	printf( "\n" );

	printf("Count of numbers: ");
	scanf("%d", &c);
	int* iNumbers = new int[c];
	printf("Input values:\n");
	for(int i = 0; i < c; i++)
	{
		scanf("%d", &iNumbers[i]);
	}

	for(iIndex; iIndex < iSize; iIndex++)
	{
		Range = Function(Range, iNumbers, c);
	}

	for(iIndex = 0; iIndex < iSize; iIndex++)
	{
	   printf("%d ", Range[iIndex]);
	}

	free(Range);
	_getch();
	return 0;
}

Вроде ошибок нет, но занулять всё равно не хочет :(

Offline

#7  23.03.10 12:39

$up
Профиль

Re: [C++] Нужна помощь с функциями

for(iIndex; iIndex < iSize; iIndex++)
    {
        Range = Function(Range, iNumbers, c);
    }

Зачем вызывать функцию много раз? Зачем она вообще должна возвращать значение?
Уже не буду говорить, что лишние данные не за чем передавать.
Попробуй так:
int *Function(int *Range, int* iNumbers, int Size)

Offline

#8  23.03.10 13:08

Re: [C++] Нужна помощь с функциями

Убрал цикл оставил только
Range = Function(Range, iNumbers, c);

изменил функцию как ты сказал, теперь опять таки зануляет только первый элемент :((

Offline

#9  23.03.10 13:22

$up
Профиль

Re: [C++] Нужна помощь с функциями

тогда sizeof(Range)/sizeof(int) неправильно размер массива Range определяет, попробуй его передать в функцию

Offline

#10  23.03.10 14:07

$up
Профиль

Re: [C++] Нужна помощь с функциями

DaZzle, ты в чём программы компилируешь? Тебе нужно научится дебагом пользоваться, пошагово выполнять свои программы и смотреть что содержится в переменных

Offline

#11  24.03.10 20:13

Re: [C++] Нужна помощь с функциями

Код: = cpp:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
 
int FillArray( int iFrom, int iTo, int* range ) 
{
 
   int   iSize = 0, i;
 
   for ( i = iFrom; i <= iTo; i++ )
      range[iSize++] = i;
 
   return iSize;
 
}
 
int Summa( int* range, int nRange )
{
	int summa = 0;
 
	for( int i = 0; i < nRange; i++ )
	{
		 summa += range[i];
	}
	return summa;
}
 
void Function( int* range, int nRange, int numbers[], int nNumbers ) 
{
 
   int i, j;
 
   for( i = 0; i < nNumbers; i++ ) 
   {
      for( j = 0; j < nRange; j++ ) 
	  {
         if ( range[j] != 0 ) 
		 {
            if ( range[j] % numbers[i] == 0)
                range[j] = 0;
         }
      }
   }
}
 
 
void PrintMatrix( char* czTitle, int* x, int n, int m ) 
{
 
   int i;
 
   if ( czTitle != NULL )
      printf( "%s\n", czTitle );
 
   for ( i = 0; i < n*m; i++ ) 
   {
      printf( "%d ", x[i] );
      if ( (i+1) % m == 0 )
         printf( "\n" );
   }
 
}
 
 
int main() {
 
   int   i, iFrom, iTo,
	 nNumbers, nRange,
	summa;       
   int   *numbers,
         *range;
 
    printf( "Please enter Range: ");
    scanf( "%d - %d", &iFrom, &iTo );
 
    range = (int*)malloc((iTo-iFrom+1)*sizeof(int));
    nRange = FillArray( iFrom, iTo, range );
    PrintMatrix( "The Range:", range, 1, nRange );
 
    printf("Count of numbers: ");
    scanf( "%d", &nNumbers );
    numbers = (int*)malloc(nNumbers*sizeof(int));
    printf("Input values: ");
    for ( i = 0; i < nNumbers; i++)
        scanf("%d", &numbers[i]);
 
    Function( range, nRange, numbers, nNumbers );
    PrintMatrix( "The Sifted Range:", range, 1, nRange );
 
	summa = Summa( range, nRange );
 
	printf( "%d", summa ); 
 
    free( range );
    free( numbers );
 
	_getch();
    return 0;
 
}


Вот переписал, код программы.
Но по заданию нужно одну функцию рекурсивную, одну нерекурсивную, одну inline
А я не знаю как переделать...

Исправлено DaZzle (24.03.10 20:13)

Offline

#12  25.03.10 11:06

$up
Профиль

Re: [C++] Нужна помощь с функциями

чтобы понять рекурсию нужно понять рекурсию

inline просто пишешь перед функцией.

твоя задача не требует рекурсивных функций, можно, конечно, сделать если сильно нужно.

Становится понятно, зачем с самого начала функция обрабатывала всего один элемент, в ней нужно было написать условие окончания рекурсии и вызвать саму себя с следующим элементом Range.

Исправлено $up (25.03.10 11:23)

Offline

#13  25.03.10 11:19

Re: [C++] Нужна помощь с функциями

inline я сделал уже :) вычисление суммы

а рекурсию я просто даже не представляю какую функцию у меня можно сделать рекурсивной

Offline

#14  25.03.10 11:32

$up
Профиль

Re: [C++] Нужна помощь с функциями

Код::

void Function( int* range, int nRange, int numbers[], int nNumbers ) 
{
 
   int i, j;
 if (nRange != 0)
{
   for( i = 0; i < nNumbers; i++ ) 
   {
            if ( *range % numbers[i] == 0)
                *range = 0;  
      }
    Function( range+1, nRange-1, numbers, nNumbers ) ;
}

}

как-то так

сильно напомнило циклы в xslt 8)

Исправлено $up (25.03.10 11:35)

Offline

#15  25.03.10 11:39

Re: [C++] Нужна помощь с функциями

Оу спасибо большое :)
Всё работает

Offline

#16  04.04.10 22:19

Re: [C++] Нужна помощь с функциями

Код: cpp:

/*48.	Для всех четных чисел заданного диапазона проверить гипотезу Гольдбаха:
каждое четное число представимо в виде суммы двух простых чисел.*/
 
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
 
 
bool getSimplesArray(int iInputEnd,int* pSimplesArray,int iSize)
{
	int flag;
	int* pSA = pSimplesArray;
	*pSA++=2;
	iSize-=1;
	for(int i=3; i<iInputEnd; i+=2)
	{
		flag=0;
		for(int* pTmpSA=pSimplesArray; pTmpSA<pSA; pTmpSA+=1)
		{
			if((i % *pTmpSA) == 0)
			{
				flag++;
				break;
			}
		}
		if (flag == 0)
		{
			*pSA++=i;
			iSize-=1;
			if(iSize<=0)
				return false;
		}
	}
	*pSA=0;
	return true;
 
}   
 
inline int Summa( int S1, int S2 )
{
	return S1 + S2; 
}
 
int main()
{
	int iInputBegin,iInputEnd,iSize,iChetnoeCheslo;
	int iN1,iN2;
	printf("Nachal'noe znachenie dipozona\n");
	scanf("%d",&iInputBegin);
	printf("konechnoe znachenie dipozona\n");
	scanf("%d",&iInputEnd);
	if (iInputEnd<100)
		iSize=iInputEnd/3;
	else
		iSize=iInputEnd/4;
	int* iSimplesArray = (int*)malloc(iSize * sizeof(int));
	//построить массив простых чисел, меньших или равных концу диапазона
	bool flag=getSimplesArray(iInputEnd,iSimplesArray,iSize);
	if (iInputBegin % 2 == 0)
		iChetnoeCheslo = iInputBegin;
	else
		iChetnoeCheslo = ++iInputBegin;
	int p = 0,p1 = 0;
	for (;iChetnoeCheslo<=iInputEnd;iChetnoeCheslo+=2)
	{
		p++;
		int flag = 0;
		for (int i=0;iSimplesArray[i]>0;i++)
		{
			for (int j=0;iSimplesArray[j]>0;j++)
			{
				iN1 = iSimplesArray[i];
				iN2 = iSimplesArray[j];
				if (iChetnoeCheslo == Summa(iN1,iN2))
				{
					flag++;
					p1++;
					//printf("%d ",iChetnoeCheslo);
				}
			}
		}
		if (flag == 0)
		{
			printf("gipoteza ne verna");
			break;
		}
 
	}
	if (p1 >= p)
		printf("gipotesa verna");
 
	_getch();
	return 0;
}


Ещё один вопрос, где в этой программе можно вставить рекурсию?

Offline

Программирование и БД » [C++] Нужна помощь с функциями 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.436 сек.
Выполнено 14 запросов.