Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2010, 19:52   #1
AquaticSoul
Нубик в С++
Пользователь
 
Аватар для AquaticSoul
 
Регистрация: 15.12.2009
Сообщений: 42
По умолчанию [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;
}
Должен занулять элементы диапазона которые делятся на цело на введёные числа, но дальше первого элемента почему-то не идёт
AquaticSoul вне форума Ответить с цитированием
Старый 23.03.2010, 21:05   #2
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

// типа объявил функцию
int FillArray(int iFrom, int iTo, int* Range) // зачем тут передаеш параметр
// по ссылка 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)// здесь мне не понять чавы это вы хатели. Перед использованием переменной она должна быть определена %iNumbers[iIndex]
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;
}
[/code]

Должен занулять элементы диапазона которые делятся на цело на введёные числа, но дальше первого элемента почему-то не идёт[/QUOTE]
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Старый 23.03.2010, 22:29   #3
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от AquaticSoul Посмотреть сообщение
Код:
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)    // (3)
{
	int iIndex;
	for(iIndex = 0; iIndex < Size; iIndex++)
	{
		for(int j = 0; j < sizeof(Range)/sizeof(int); j++)  // (2)
	    {
			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++)    // (1)
	{
		Range = Function(Range, iNumbers, c);
	}

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

	free(Range);
	_getch();
	return 0;
}
1. iIndex и в предыдущем цикле был переменной цикла. И, после выхода из него, остался равным iSize. А тут его не проинициализировали. Кстати, зачем здесь цикл вообще, если в п/п есть аналогичный?

2. Этот sizeof(Range) даёт не то, чего Вам хочется. Совсем не то... Это - размер указателя. В подавляющем большинстве случаев - четырёхбайтового адреса. И равен он, соответственно, на большинстве машин четырём, независимо от фактической длины массива. Нельзя в C/C++ определить длину массива "on the fly". Увы...

3. Это не Питон, это - C Не принято тут массивы через return возвращать. В принципе, можно, конечно, но - не принято. У вас адрес Range в параметрах есть - вот через него и работайте с этим массивом.
Vago вне форума Ответить с цитированием
Старый 24.03.2010, 09:47   #4
AquaticSoul
Нубик в С++
Пользователь
 
Аватар для AquaticSoul
 
Регистрация: 15.12.2009
Сообщений: 42
По умолчанию

Хм.. и что делать тогда с размеров массив iNumbers, и как массив в функции возвратить? о.О
AquaticSoul вне форума Ответить с цитированием
Старый 24.03.2010, 10:08   #5
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от AquaticSoul Посмотреть сообщение
и что делать тогда с размеров массив iNumbers
Размер массива iNumber[] ф-ии известен. Вы его туда передаёте; формальный параметр называется Size, а фактический - c. Аналогично, можно передать в ф-ю Function() в качестве параметра переменную iSize - фактический размер массива Range[].

Цитата:
Сообщение от AquaticSoul Посмотреть сообщение
и как массив в функции возвратить? о.О
Вы в Function() уже передали адрес массива Range[].

Это сейчас мода такая? Браться писать на C, не прочитав K&R?..
Vago вне форума Ответить с цитированием
Старый 24.03.2010, 14:10   #6
AquaticSoul
Нубик в С++
Пользователь
 
Аватар для AquaticSoul
 
Регистрация: 15.12.2009
Сообщений: 42
По умолчанию

когда передаю размер массива Range[], при попытке обратиться в функцию ругается..

ну не знаю какая мода, ну вот нам так сразу дали программируйте как хотите)
AquaticSoul вне форума Ответить с цитированием
Старый 24.03.2010, 15:37   #7
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Ну, немеркнущую классику в списке литературы вам не могли не дать...
Vago вне форума Ответить с цитированием
Старый 24.03.2010, 16:01   #8
AquaticSoul
Нубик в С++
Пользователь
 
Аватар для AquaticSoul
 
Регистрация: 15.12.2009
Сообщений: 42
По умолчанию

о.О спасибо, прочту.

Но у меня до сих пор остаётся нерешённая проблема с кодом, что поделать?
AquaticSoul вне форума Ответить с цитированием
Старый 24.03.2010, 16:23   #9
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>

int FillArray( int iFrom, int iTo, int* range ) {
   
   int   iSize = 0, i;

   for ( i = iFrom; i <= iTo; i++ )
      range[iSize++] = i;

   return iSize;

}


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;       
   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 );

    free( range );
    free( numbers );

    return 0;

}
Vago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу разобраться Lokin Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 22.03.2010 22:45
НЕ МОГУ РАЗОБРАТЬСЯ... GSV84 HTML и CSS 0 03.02.2010 01:38
не могу разобраться Инспектор ГУЛ Свободное общение 7 20.09.2009 09:29