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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2014, 14:53   #1
FrostBelarus
Пользователь
 
Регистрация: 10.11.2014
Сообщений: 23
По умолчанию Одномерный массив.Удалить элементы кратные х (С++)

Доброго времени суток. Прошу помощи с лабораторной. Вот задание:
Сформировать одномерный массив целых чисел, используя датчик случайных чисел (диапазон от 0 до 99). Размер массива ввести с клавиатуры. Удалить элементы, индексы которых кратны 7. Добавить после каждого нечетного элемента массива элемент со значением 4
Код:
#include<iostream>
#include<conio.h>
#include<time.h>
void main()
{
	setlocale(LC_CTYPE, "Russian");
	using namespace std;
	const int A = 100;
	int i, rm, W[A],k=7;
	cout << "Введите размер массива:" << endl;
	cin >> rm;
	cout << "Массив W: " << endl;
	srand((unsigned)time(NULL));
	for (i = 0; i < rm; i++)
	{
		cout << i <<"  "; //Чтобы было проще проверять индексы удаленных элементов
	}
	cout << endl;
	for (i = 0; i < rm; i++)
	{
		W[i] = rand() % 99;
		cout << W[i] << " ";
	}
	cout << endl;
	cout << "Удаляем элементы массива,индексы которых кратны 7:" << endl;
		for (i=1; i < rm ; i++)
		{
			if (i % 7 == 0)
			{
				k = k + 7;
				for (i; i <k; i++)
				{
					W[i] = W[i + 1];
					//rm--;
				}
				rm--;
			}
			//rm--;
		}
		for (i = 0; i < rm; i++)
		{
			cout << i << "  ";//Чтобы было проще проверять индексы удаленных элементов
		}
		cout << endl;
		for (i = 0; i < rm; i++)
		{
			cout << W[i] << " " ;
		}
		cout << endl;
		cout<<"Нажмите любую клавишу для выхода" << endl;
		_getch();

}
Программа корректно работает в том случае,если размер массива меньше 14,т.е. когда только один элемент кратен семи. Искал ошибки,вроде все,нашел решение,а потом понимаю что опять не то. Заранее спасибо

Последний раз редактировалось FrostBelarus; 11.11.2014 в 14:56.
FrostBelarus вне форума Ответить с цитированием
Старый 11.11.2014, 15:42   #2
Scorpius
Пользователь
 
Регистрация: 06.10.2014
Сообщений: 26
По умолчанию

Цитата:
Программа корректно работает в том случае,если размер массива меньше 14,т.е. когда только один элемент кратен семи. Искал ошибки,вроде все,нашел решение,а потом понимаю что опять не то.
Вот так должно заработать:
Код:
k = 0;
for (i=1; i < rm ; i++)
{
    if (i % 7 == 0)
    {
        ++k;
        --rm;
    }
    W[i] = W[i + k];
}
Не всегда говори то, что знаешь, но всегда знай, что говоришь.

Последний раз редактировалось Scorpius; 11.11.2014 в 16:10.
Scorpius вне форума Ответить с цитированием
Старый 11.11.2014, 16:48   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Мне кажется, горазно приятнее читать и удобнее работать, если заполнение массива и его показ, оформить в отдельные функции. Тогда можно функцию showArray() вызвать, где захочется:

Код:
#include<iostream>
#include<ctime>

void getArray( int *arr, size_t n );
void showArrya( const int *arr, size_t n );

int main()
{
    const int A = 100;
    int W[A];

    std::cout << "Enter a size of an array:\n> ";
    int rm;
    std::cin >> rm;

    // Get an array
    getArray( W, rm );

    // Show an array
    showArrya( W, rm );

    return 0;
}

void getArray( int *arr, size_t n )
{
    std::srand( ( unsigned ) std::time( NULL ) );
    for ( size_t i = 0; i < n; ++i ) {
        arr[i] = rand() % 99;
    }
}

void showArrya( const int *arr, size_t n )
{
    std::cout << "\nArray W:";
    for ( size_t i = 0; i < n; ++i ) {
        std::cout << " " << arr[i] ;
    }
    std::cout << "\n\n";
}
8Observer8 вне форума Ответить с цитированием
Старый 13.11.2014, 10:08   #4
FrostBelarus
Пользователь
 
Регистрация: 10.11.2014
Сообщений: 23
По умолчанию

Scorpius, Спасибо,но почему-то так некорректно работало.
8Observer8, К сожалению,пока я знаю только про void main,изредка проскакивало int main=)
Разобрался с удалением,было интересно Может пригодится кому-нибудь итог работы(здесь только удаление,добавление элемента еще не сделал):
Код:
#include<iostream>
#include<conio.h>
#include<time.h>
void main()
{
	setlocale(LC_CTYPE, "Russian");
	using namespace std;
	const int A = 100;
	int i, rm, W[A], k = 7, t,r=0,n;
	cout << "Введите размер массива:" << endl;
	cin >> rm;
	cout << "Массив W: " << endl;
	srand((unsigned)time(NULL));
	for (i = 0; i<=rm; i++)
	{
		cout << i <<"  ";//Индекс массива
	}
	cout << endl;
	for (i = 0; i <= rm; i++)
	{
		W[i] = rand() % 99;
		cout << W[i] << " ";
	}
	cout << endl;
	cout << "Удаляем элементы массива,индексы которых кратны 7:" << endl;
		for (i=1; i <= rm ; i++)
		{
				if(i % 7 == 0)
				{
					for (t=i-r; t <=rm; t++)
					{
						W[t] = W[t + 1];
					}
					r = r + 1;	//r - количество повторов if
				}
		}
		rm = rm - r;
		for (i = 0; i <=rm; i++)
		{
			cout << i << "  ";
		}
		cout << endl;
		for (i = 0; i <=rm; i++)
		{
			cout << W[i] << " " ;//вывод массива с удаленными элементами
		}	
		cout << endl;
		cout<<"Нажмите любую клавишу для выхода" << endl;
		_getch();

}
FrostBelarus вне форума Ответить с цитированием
Старый 13.11.2014, 11:26   #5
Scorpius
Пользователь
 
Регистрация: 06.10.2014
Сообщений: 26
По умолчанию

Цитата:
Scorpius, Спасибо,но почему-то так некорректно работало.
Извиняюсь, тогда не проверил код

Исправил, теперь работает правильно.

Код:
        k = 0;
        for (i=1; i < rm ; i++)
        {
            if ((i+k) % 7 == 0)
            {
                ++k;
                --rm;
            }
            W[i] = W[i + k];
        }
Не всегда говори то, что знаешь, но всегда знай, что говоришь.

Последний раз редактировалось Scorpius; 13.11.2014 в 11:31.
Scorpius вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
в Delphi решить задачу: Дан одномерный массив Zn. Удалить все элементы массива с четными индексами. Алексей 21 Помощь студентам 2 10.11.2014 21:50
Дан одномерный массив из 30 элементов. Сформировать второй массив, в котором сначала идут все элементы первого массива, кратные 5, Olzhakesh C# (си шарп) 1 29.04.2014 23:49
Из массива удалить элементы кратные трем,стоящие между максимальными и минимальными элементами natatimina Помощь студентам 1 19.04.2014 20:41
Найти одномерный массив элементы которого равны минимальным значениям в строках исходной матрицы и одномерный массив элементы... Richik123 Microsoft Office Excel 1 16.10.2013 15:45
Дан одномерный массив. Удалить все элементы последовательности значения,которые кратны k Кристюша5 Паскаль, Turbo Pascal, PascalABC.NET 4 27.05.2012 21:46