#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
#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
Re: [C++] Нужна помощь с функциями
for(iIndex; iIndex < iSize; iIndex++)
{
Range = Function(Range, iNumbers, c);
}
Зачем вызывать функцию много раз? Зачем она вообще должна возвращать значение?
Уже не буду говорить, что лишние данные не за чем передавать.
Попробуй так:
int *Function(int *Range, int* iNumbers, int Size)
Offline
#10 23.03.10 14:07
#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
Re: [C++] Нужна помощь с функциями
чтобы понять рекурсию нужно понять рекурсию
inline просто пишешь перед функцией.
твоя задача не требует рекурсивных функций, можно, конечно, сделать если сильно нужно.
Становится понятно, зачем с самого начала функция обрабатывала всего один элемент, в ней нужно было написать условие окончания рекурсии и вызвать саму себя с следующим элементом Range.
Исправлено $up (25.03.10 11:23)
Offline
#13 25.03.10 11:19
#14 25.03.10 11:32
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
#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

