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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2015, 18:40   #1
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
По умолчанию Динамический массив C++

Добрый день!

Помогите пожалуйста с программой. Программа с динамическим массивом. Вводится цепочка чисел. Из этой цепочки нужно удалить числа кратные трем.

Пыталась написать программу, но она, к сожалению, не работает. Ошибки написал. Помогите пожалуйста

Текст программы:

Код:
#include <iostream>
#include <algorithm>
using namespace std;
int proc(const int N)
{
    int* mas = new int[N];
    int k;
 
    for (int i = 0; i < N; i++)
    {
        mas[i] = new int[N]; // <----- значение типа int* нельзя присвоить сущности типа int 
    }
 
    for (int i = 0; i < N; i++)
    {
        cin >> mas[i];
    }
 
    cout << endl;
    for (int i = 0; i < N; i++)
    {
        cout << mas[i] << " ";
        cout << endl;
    }
    cout << endl;
    k = N;
    for (int i = 0; i < N; i++)
    {
        if (mas[i] % 3 = 0)   // <----выделяет mas и пишет: выражение должно быть допустимым для изменения левосторонним значением
        {
            delete[]mas[i]; // <--- выражение должно иметь тип указателя
            k = k - 1;
        }
        cout << endl;
    }
 
    for (int i = 0; i < k; i++)
    {
        cout << mas[i] << " ";
        cout << endl;
    }
 
    for (int i = 0; i < k; i++)
    {
        delete[] mas[i];  <--- выражение должно иметь тип указателя
    }
    delete[] mas;
    return 0;
 
}
int main() {
    int N;
    cout << "Введите количество элементов в строке: ";
    cin >> N;
    cout << endl;
    proc(N);
    system("pause");
}
Maray вне форума Ответить с цитированием
Старый 17.06.2015, 19:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
значение типа int* нельзя присвоить сущности типа int
Нужно так:
Код:
int** mas = new int*[N];
Цитата:
выделяет mas и пишет: выражение должно быть допустимым для изменения левосторонним значением
Не = а ==.
Сравнение в Си пишется двумя знаками "равно"
Цитата:
<--- выражение должно иметь тип указателя
Первое выполнишь - эта ошибка уйдет.
Цитата:
Из этой цепочки нужно удалить числа кратные трем.
Могу предложить такой вариант:http://www.programmersforum.ru/showp...9&postcount=24
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.06.2015, 20:03   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Код:
    int* mas = new int[N];
    int k;
 
    for (int i = 0; i < N; i++)
    {
        mas[i] = new int[N]; // <----- значение типа int* нельзя присвоить сущности типа int 
    }
Я не понял, чего Вы этим хотели добиться? Если нужна матрица NxN, то как показал Stilet, нужно делать указатель на указатель, а потом формировать строки при помощи цикла. Но у Вас в задании,
Цитата:
Вводится цепочка чисел. Из этой цепочки нужно удалить числа кратные трем.
В этом случае, вышеприведённый цикл не имеет смысла. К тому-же всё остальные циклы работают просто с массивом N.

Код:
delete[]mas[i]; // <--- выражение должно иметь тип указателя
Так делать нельзя. Вернее можно, но для динамической матрицы.
Для массива делаем так: Находим удаляемый элемент и перемещаем на его место весь "хвост массива. При этом при помощи delete ничего не удаляется, просто декрементируется переменная, проверяющая массив на окончание. Если дальше предполагается использовать массив новой длины, можно создать новый динамический массив, а старый удалить. Или использовать новое значение N. К стати, при создании динамических массивов, N совсем не обязательно делать константой.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 17.06.2015 в 20:15.
Smitt&Wesson вне форума Ответить с цитированием
Старый 17.06.2015, 21:08   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вернее можно, но для динамической матрицы.
Да у ТС и так динамика
Но ты прав. Я даже в примере (см. ссылку) предпочел не перестраивать массив, а просто его дефрагментировать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.06.2015, 07:58   #5
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
По умолчанию

Вроде всё исправила, но некоторые ошибки остались

Код:
#include <iostream>
#include <algorithm>
using namespace std;
int proc(const int N)
{
	int** mas = new int*[N];
	int k;

	for (int i = 0; i < N; i++)
	{
		mas[i] = new int[N];
	}

	for (int i = 0; i < N; i++)
	{
		cin >> mas[i];                  
<-------отсутствует оператор ">>", соответствующий этим операндам типы операндов: std::istream>>int*
	}

	cout << endl;
	for (int i = 0; i < N; i++)
	{
			cout << mas[i] << " ";
		cout << endl;
	}
	cout << endl;
	k=N;
	for (int i = 0; i < N; i++)
	{
		if (mas[i]%3==0)       
<------(здесь ошибку исправила, но вместо неё появилась другая) выражение должно относиться
 к целочисленному типу или типу перечисления без области видимости
		{delete[]mas[i];
		k=k-1;
		}
		cout << endl;
	}

	for (int i = 0; i < k; i++)
	{
			cout << mas[i] << " ";
		cout << endl;
	}

	for (int i = 0; i < k; i++)
	{
		delete[] mas[i];
	}
	delete[] mas;
	return 0;

}
int main() {
	int N;
	cout << "Введите количество элементов в строке: ";
	cin >> N;
    cout << endl;
	proc(N);
	system("pause");
}
Цитата:
Сообщение от Stilet Посмотреть сообщение
Могу предложить такой вариант:http://www.programmersforum.ru/showp...9&postcount=24
А возможно ли доработать эту программу? Я с ней хоть более менее разобралась

Последний раз редактировалось Stilet; 18.06.2015 в 09:17.
Maray вне форума Ответить с цитированием
Старый 18.06.2015, 09:19   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
отсутствует оператор ">>", соответствующий этим операндам типы операндов: std::istream>>int*
У тебя mas - матрица, а не одномерный массив.
Тогда уж так:
Код:
int proc(const int N)
{
	int* mas = new int[N];
	int k;

	for (int i = 0; i < N; i++)
	{
		cin >> mas[i];
	}
И вот это:
Цитата:
for (int i = 0; i < k; i++)
{
delete[] mas[i];
}
Убирай.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.06.2015, 10:11   #7
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
По умолчанию

Так у меня уже получается не динамический массив. Но и он не работает. А мне нужно с динамическим.
Код:
#include <iostream>
#include <algorithm>
using namespace std;
int proc(const int N)
{
	int* mas = new int[N];
	int k;

	for (int i = 0; i < N; i++)
	{
		cin >> mas[i];
	}

	cout << endl;
	for (int i = 0; i < N; i++)
	{
			cout << mas[i] << " ";
		cout << endl;
	}
	cout << endl;
	k=N;
	for (int i = 0; i < N; i++)
	{
		if (mas[i]%3==0)
		{delete[]&mas[i];
		k=k-1;
		}
		cout << endl;
	}

	for (int i = 0; i < k; i++)
	{
			cout << mas[i] << " ";
		cout << endl;
	}

	return 0;

}
int main() {
	int N;
	cout << "Введите количество элементов в строке: ";
	cin >> N;
    cout << endl;
	proc(N);
	system("pause");
}
Maray вне форума Ответить с цитированием
Старый 18.06.2015, 10:42   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Изначально неверный подход, помимо того что ты не понимаешь что такое динамический массив...
Настаиваю на своем примере, что я выложил по ссылке, и более ничем помочь не могу. Удачи.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.06.2015, 10:43   #9
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
По умолчанию

спасибо за помощь
Maray вне форума Ответить с цитированием
Старый 18.06.2015, 10:50   #10
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
По умолчанию

В этом коде пишет, что не определены идентификаторы getchar, printf, _TCHAR
Maray вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив Си GoRdoN 17 Помощь студентам 9 25.01.2013 15:23
динамический массив ordinary_smile Общие вопросы C/C++ 12 13.06.2011 16:27
Динамический массив, массив указателей alexalisa Паскаль, Turbo Pascal, PascalABC.NET 4 22.04.2011 21:33
динамический массив? gramp Microsoft Office Excel 2 26.02.2011 14:41
Динамический массив - или всё таки не динамический? vedro-compota Общие вопросы C/C++ 30 10.12.2010 23:22