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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2017, 17:30   #1
furgingerbread
Пользователь
 
Регистрация: 14.11.2016
Сообщений: 12
По умолчанию [C++] Функция для вывода массива

Здравствуйте!

Подскажите, пожалуйста, как написать отдельную функцию вывода для массива? (функция написана, но она не работает) Говорили, что для этого применяются указатели, но я не совсем понял, как их применить к моей задаче. Буду признателен, если поможете разобраться.

Моя программа: удаление элементов из массива по определенному признаку, а именно: четных перед вторым максимумом.

Код:
// Ввод массива с клавиатуры

void SetArr(int arr[], int N){



		if (N<20) {

		for (int i = 0; i < N; i++) {
			cout << "[" << i + 1 << "]" << ": ";
			cin >> arr[i];
		}
  }

}

// Вывод заполненного массива

void ShowArr(int arr[], int N){

		cout << "\nYour Array: ";

		for (int i = 0; i < N; ++i) {
			cout << arr[i] << " ";
		}

		cout << endl;


}

// Нахождение индекса второго максимального элемента, удаление четных элементов, вывод

void NewArr(int arr[], int max, int P, int M, int N, int x){

		max=arr[1];

		// находим индекс максимального

		for (int i = 0; i <= N; i++) {

		  if (arr[i] > max)
		  {
			max = arr[i];
			P = i;
		  }
		  if (arr[i]==max)
		  {
			if (i!=P)
				M=i;
		  }
		}

		// удаляем элементы

		for (int i = 0; i < M-x; i++)
		{
		  if (arr[i]%2 == 0)
		  {
			  x++;

				 for (int j = i+1;j<M;j++)
					  arr[j-1]=arr[j];
			  i--;


		  }
		}





}

void MassOut(int arr[], int M, int N, int x)
{
			// Вывод нового массива

	for (int i = 0; i < M-x; i++)

	{    if(arr[i]%2 != 0)

		 {
			 cout << arr[i] << " ; ";
		  }
	}

}





 int _tmain(int argc, _TCHAR* argv[])
{
	int arr[20];
		int N, P, M;
		int max;
		int x=0;

		cout << "Array Size:";
		cin >> N;

		SetArr(arr, N);
		ShowArr(arr, N);
		NewArr(arr, max, P, M, N, x);
                MassOut(arr, M, x);


	getch();
	return 0;
}

Последний раз редактировалось furgingerbread; 26.04.2017 в 18:07.
furgingerbread вне форума Ответить с цитированием
Старый 26.04.2017, 19:50   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Прежде чем переходить к "функции вывода" выведи результаты расчёта
"max, P, M, N, x" после работы "NewArr", т.е. здесь:


1.jpg


Чему они равны?
ura_111 вне форума Ответить с цитированием
Старый 26.04.2017, 19:58   #3
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Ну вот примеры разных видов переменных:

2_0.jpg


2_1.jpg


3.jpg


Разберись чем отличается (в крайней случае - перебери все возможности - скорей всего часто будут ошибки выбивать, но что-то сработает и нормально выведит "max, P, M, N, x"). А дальше переходи к выводу массива на экран.
Покажи скриншоты, что у тебя получилось.

Последний раз редактировалось ura_111; 26.04.2017 в 20:00.
ura_111 вне форума Ответить с цитированием
Старый 26.04.2017, 21:46   #4
furgingerbread
Пользователь
 
Регистрация: 14.11.2016
Сообщений: 12
По умолчанию

Все считается неправильно... почему так происходит? В чем ошибка?

Все еще не понимаю, как работать с указателями.. Если кто-нибудь сможет, объясните на моем примере, пожалуйста.

Например, почему у меня вместо максимального индекса - адрес (это ведь он?)? Чтобы это исправить, нужно изменить что-то в параметрах функции? И менять ли что-нибудь при выводе?
Изображения
Тип файла: jpg Снимок экрана (30).jpg (82.3 Кб, 167 просмотров)

Последний раз редактировалось furgingerbread; 27.04.2017 в 08:55.
furgingerbread вне форума Ответить с цитированием
Старый 29.04.2017, 09:54   #5
furgingerbread
Пользователь
 
Регистрация: 14.11.2016
Сообщений: 12
По умолчанию

Попытался исправить ситуацию. По идее должен выводиться сначала массив, который ввели, а потом преобразованный массив, но два раза выводится введенный. В чем беда?

Код:
#pragma hdrstop
#pragma argsused

#ifdef _WIN32
#include <tchar.h>
#else
  typedef char _TCHAR;
  #define _tmain main
#endif

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


using namespace std;

// Ввод массива с клавиатуры

void SetArr(int *arr, int N){



		if (N<20) {

		for (int i = 0; i < N; i++)
		{
			printf("a[%d]=", i);
			scanf("%d", &arr[i]);
		}
  }

}

// Вывод заполненного массива

void ShowArr(int *arr, int N){

		printf("\nYour Array: ");

		for (int i = 0; i < N; ++i) {

			cout << arr[i] << " ";
		}

		cout << endl;


}

// Нахождение индекса второго максимального элемента

int FindI(int *arr, int N)
{
		 int i, P = 0; int max = arr[0], M;

		for (int i = 0; i <= N; i++) {

		  if (arr[i] > max)
		  {
			max = arr[i];
			P = i;
		  }
		  if (arr[i]==max)
		  {
			if (i!=P)
				M=i;
		  }
		}
		return M;
}

// Удаление четных элементов перед вторым максимальным

void Del(int *arr, int *N, int M)
{
		 int j, x;

		for (int i = 0; i < M-x; i++)
		{
		  if (arr[i]%2 == 0)
		  {
			  x++;

				 for (int j = i+1;j<M;j++)
					  arr[j-1]=arr[j];
			  i--;

		  }
		}


}






 int _tmain(int argc, _TCHAR* argv[])
{
	int arr[20];
		int N;

		printf("Array Size:\n");
		scanf("%d", &N);

		if ((N <= 0)||(N > 20))
		{
			 printf("Array size must be less then 20\n");
		}

		else

		{

		SetArr(arr, N);
		ShowArr(arr, N);
		Del(arr, &N, FindI(arr, N));
		ShowArr(arr, N);

		}
	getch();
	return 0;
}

Последний раз редактировалось furgingerbread; 29.04.2017 в 10:40.
furgingerbread вне форума Ответить с цитированием
Старый 29.04.2017, 15:25   #6
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Я понял в чём ошибка...
Ну вот смотри (проанализируй этот простенький, наглядный код и его результат):
Код:
#pragma hdrstop
#pragma argsused

#ifdef _WIN32
#include <tchar.h>
#else
typedef char _TCHAR;
#define _tmain main
#endif

#include <stdio.h>
#include <stdio.h>
#include <iostream>
#include<stdlib.h>
#include <conio.h>
using namespace std;

void ShowArr(int *arr, int N)
{
	printf("\nYour Array: ");
	for (int i = 0; i < N; ++i)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}

// Изменение массива
void FindI(int *arr, int &N)
{
	arr[0] = 15;
	arr[1] = 25;
	N = N - 3;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int arr[20] = { 3, 4, 5, 6, 7, 8, 9, 10 };
	int N = 8;

	ShowArr(arr, N);
	FindI(arr, N);
	ShowArr(arr, N);
	
	//	getch();
	cin >> N;// У меня "getch" не работает, поэтому использую задержку как обычный ввод 
	return 0;
}
1.jpg
ura_111 вне форума Ответить с цитированием
Старый 01.05.2017, 00:08   #7
furgingerbread
Пользователь
 
Регистрация: 14.11.2016
Сообщений: 12
По умолчанию

Большое спасибо за пример! И правда становится понятнее. Без него вряд ли бы дошло.

Еще раз исправил. Теперь на выходе массив, как на фото.

А должен быть такой результат: 1312.

Пометил место, где предположительно ошибка.

Код:
#pragma hdrstop
#pragma argsused

#ifdef _WIN32
#include <tchar.h>
#else
  typedef char _TCHAR;
  #define _tmain main
#endif

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


using namespace std;

// Ввод массива с клавиатуры

void SetArr(int *arr, int N){



		if (N<20) {

		for (int i = 0; i < N; i++)
		{
			printf("a[%d]=", i);
			scanf("%d", &arr[i]);
		}
  }

}

// Вывод заполненного массива

void ShowArr(int *arr, int N){

		printf("\nYour Array: ");

		for (int i = 0; i < N; ++i) {

			cout << arr[i] << " ";
		}

		cout << endl;


}

// Нахождение индекса второго максимального элемента

int FindI(int *arr, int N)
{
		 int i, P = 0; int max = arr[0], M;

		for (int i = 0; i <= N; i++) {

		  if (arr[i] > max)
		  {
			max = arr[i];
			P = i;
		  }
		  if (arr[i]==max)
		  {
			if (i!=P)
				M=i;
		  }
		}
		return M;
}

// Удаление четных элементов перед вторым максимальным

void Del(int *arr, int M, int P, int &K)
{
		 int j, x = 0;

		for (int i = 0; i < M-x; i++)
		{
		  if ((arr[i]%2 == 0)&(i!=M))
		  {
			  x++;

				 for (int j = i+1;j<M;j++)
					  arr[j-1]=arr[j];
			  i--;

		  }
		}

		K = M-x;

}

void MassOut(int *arr, int N, int K){

		printf("\nNew Array: ");

		for (int i = 0; i < K; ++i) {

			cout << arr[i] << " ";
		}
                 
                 // проблема, видимо, здесь

		for (int i = K; i < N; ++i) { 

			cout << arr[i] << " ";
		}
}




 int _tmain(int argc, _TCHAR* argv[])
{
	int arr[20];
		int N;
		int M;
		int x;
		int P;
		int K;

		printf("Array Size:\n");
		scanf("%d", &N);

		if ((N <= 0)||(N > 20))
		{
			 printf("Array size must be less then 20\n");
		}

		else

		{

		SetArr(arr, N);
		ShowArr(arr, N);
		Del(arr, FindI(arr, N), P, K);
		MassOut(arr, N, K);

		}

	getch();
	return 0;
}
Подскажите, как это можно исправить?
Изображения
Тип файла: png Снимок экрана (33).png (23.7 Кб, 138 просмотров)
furgingerbread вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработать шаблоны ввода и вывода массива, а также шаблон для решения основной задачи. C++ vladrrom Помощь студентам 0 21.12.2016 22:02
Разработать шаблоны ввода и вывода массива, а также шаблон для решения основной задачи. В C++ vladrrom Помощь студентам 0 14.12.2016 02:40
функция draw для вывода дерева из букв T (C++ Builder) SofiNNN Помощь студентам 0 10.12.2014 21:32
Нужна функция(Макрос) для вывода номеров и категорий в таблице alexp21 Microsoft Office Excel 4 26.09.2011 23:32
Функция для вывода на дисплей целых чисел. alex_8 Помощь студентам 3 24.05.2010 15:59