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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2018, 22:58   #1
dastreba
Пользователь
 
Регистрация: 29.11.2017
Сообщений: 63
По умолчанию ошибка в коде

Задание-

Заданный массив с n чисел, в котором все элементы разные. Удалить из массива
минимальный элемент. Удалить элемент массива означает: изъять этот
элемент из массива смещением всех элементов, следующие за ним, на одну
позицию влево, и присвоить последнему элементу массива значение 0.

Сам код-
Код:
#include <conio.h>
#include <stdio.h>
int const n = 4;
int main (void)
{
int i,n;
int a[4] = {4, 2, 3, 5};
 
int min_i = 0;
for (int i = 0; i != n; ++i)
{
    if (a[min_i] < a[i])  min_i =0;
}
 
for (int i = min_i; i < n - 1; ++i)
    a[n] = a[i+1];
a[n - 1] = 0;
    return 0;
}

Последний раз редактировалось dastreba; 28.05.2018 в 23:17.
dastreba вне форума Ответить с цитированием
Старый 28.05.2018, 23:26   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Код:
 
for (int i = 1; i < n; i++)
    if (a[i] < a[min_i])  min_i = i;
digitalis вне форума Ответить с цитированием
Старый 28.05.2018, 23:56   #3
dastreba
Пользователь
 
Регистрация: 29.11.2017
Сообщений: 63
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Код:
 
for (int i = 1; i < n; i++)
    if (a[i] < a[min_i])  min_i = i;
Я подправил мелкие косяки-
Код:
#include <conio.h>
#include <stdio.h>
int const n = 4;
int main (void)
{
int i,n;
int a[4] = {4, 2, 3, 5};

int min_i = 0;
    printf("Write here: ");
    scanf("%d",&n);
for (int i = 0; i != n; ++i)
{
    if (a[min_i] < a[i])  min_i = 0;
}

for (int i = min_i; i < n - 1; ++i)
    a[n] = a[i+1];
a[n - 1] = 0;
    return 0;
}
Программа запускается,но когда вписываю число,то просто завершает работу (не крашит)
Код:
Write here: 6

Process returned 0 (0x0)
dastreba вне форума Ответить с цитированием
Старый 29.05.2018, 00:03   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от dastreba Посмотреть сообщение
Я подправил мелкие косяки-
а большой косяк зачем оставили?!
неужели не видно разницы между вашим

Цитата:
Сообщение от dastreba Посмотреть сообщение
Код:
for (int i = 0; i != n; ++i)
{
    if (a[min_i] < a[i])  min_i = 0;
}
и правильным
Цитата:
Сообщение от digitalis Посмотреть сообщение
Код:
for (int i = 1; i < n; i++)
    if (a[i] < a[min_i])  min_i = i;
сравнивайте посимвольно, пока не увидите, где у Вас косяки!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.05.2018, 00:08   #5
dastreba
Пользователь
 
Регистрация: 29.11.2017
Сообщений: 63
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а большой косяк зачем оставили?!
неужели не видно разницы между вашим


и правильным

сравнивайте посимвольно, пока не увидите, где у Вас косяки!
Если я не ошибаюсь,то это
Код:
min_i = i;
не очень правильно,т.к нужно присвоить элементу 0 , а если i>0,то автоматически не правильно.

Может я что-то не так понял
dastreba вне форума Ответить с цитированием
Старый 29.05.2018, 01:41   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от dastreba Посмотреть сообщение
Если я не ошибаюсь,то это
Код:

min_i = i;
так. точно. один свой косяк Вы нашли.

а второй проглядели.
Вот тут Вам разницы не видно ?
Цитата:
if (a[min_i] < a[i])
Цитата:
if (a[i] < a[min_i])
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.06.2018, 08:10   #7
c3nwen
 
Аватар для c3nwen
 
Регистрация: 01.06.2018
Сообщений: 9
По умолчанию

Здравствуйте, сам только несколько дней назад начал изучать программирование. Решил попробовать реализовать данную задачку, глобалил часа 4=). Все действия вынес в функции, вот что получилось:
Код:
#include <iostream>
#include <ctime>
using namespace std;
void assig_arr(int *arr, int size)
{
	for (int i = 0; i < size; i++)
		arr[i] = rand() % 400 + 100;
}
void findm_arr(int *arr, int size, int &min_ipos)
{
	int min_i = arr[0];
	for (int i = 1; i < size; i++)
		if (arr[i] < min_i)
		{
			min_i = arr[i];
			min_ipos = i;
		}
}
int  replg_arr(int *arr, int size, int &min_ipos)
{
	if (min_ipos == size - 1) // Если минимальное значение в массиве крайнее, то просто подставляем ноль и выходим из функции
		return arr[size - 1] = 0;
	for (min_ipos; min_ipos < size; min_ipos++) // Начинаем цикл элементом с минимальным значением
	{
		if (min_ipos != size - 1) // Если текущий элемент не равен крайнему элементу массива, копируем данные с соседнего элемента
			arr[min_ipos] = arr[min_ipos + 1];
		else break; // Во всех остальных случаях выходим из цикла (чтобы не скопировать данные, которые находятся за пределами массива)
	}
	return arr[size - 1] = 0; // После результата работы цикла, задаем крайнему элементу массива значение - ноль
}
void print_arr(int *arr, int size)
{
	cout << "\t";
	for (int i = 0; i < size; i++)
		cout << arr[i] << " ";
	cout << "\n\n";
}
void main()
{
	setlocale(LC_ALL, "Russian");
	srand(time(NULL));
	int size = 0, min_ipos = 0;
	cout << "Введите количество элементов массива: "; cin >> size;
	int *arr = new int[size]; // Генерация динамического массива, чтобы задать длинну в ходе выполнения программы
	assig_arr(arr, size); // Задаем случайные значения элементам массива (от 100 - 500)
	print_arr(arr, size); // Выводим на экран изначальный массив
	findm_arr(arr, size, min_ipos); // Поиск минимального значения
	replg_arr(arr, size, min_ipos); // Удаление мин. значения, сдвиг и присваиваем ноль в крайний элемент
	print_arr(arr, size); // Выводим на экран измененный массив
	delete[] arr; // Освобождение памяти
	system("pause");
}
Все отлично работает. Но если есть недостатки или замечания, буду благодарен за разъяснения=). Спасибо. Кстати еще можно реализовать эту задачу через создание копии массива, изменить его и вставить в память первого массива. Но решил, что работать с одним массивом будет практичнее.

Попробовал сделать тоже самое, но без использования функций. Все вроде работает, но при попытке освободить память - вылазит ошибка: CRT detected that the application wrote to memory after end of heap buffer (CRT обнаружил, что приложение записывает в память после окончания буфера кучи). Где-то прочитал, что эта ошибка может возникать при выходе за границы этой памяти, в момент работы с ней. Прогнал через отладчик, выдает ошибку именно в момент очистки памяти, не могу понять в чем проблема, помогите пожалуйста. Вот код:
Код:
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
	setlocale(LC_ALL, "Russian");
	srand(time(NULL));
	int size = 0, min_ipos = 0;
	int *arr = new int[size];
	cout << "Введите количество элементов массива: "; cin >> size;
	cout << "\t";
	for (int i = 0, min_i = 0; i < size; i++)
	{
		arr[i] = rand() % 400 + 100;
		if (i == 0) min_i = arr[0];
		if (arr[i] < min_i)
		{
			min_i = arr[i];
			min_ipos = i;
		}
		cout << arr[i] << " ";
	}
	cout << "\n";
	if (min_ipos == size-1)
	{
		arr[size - 1] = 0;
		for (int i = 0; i < size; i++) cout << arr[i] << " ";
		delete[] arr;
		return 0;
	}
	for (min_ipos; min_ipos < size; min_ipos++)
	{
		if (min_ipos != (size-1)) arr[min_ipos] = arr[min_ipos + 1];
		else break;
	}
	arr[size - 1] = 0;
	cout << "\t";
	for (int i = 0; i < size; i++)
	{
		cout << arr[i] << " ";
	}
	cout << "\n\n";
	delete[] arr;
	return 0;
	system("pause");
}
Есть подозрения, что проблема где-то тут:
Код:
	for (min_ipos; min_ipos < size; min_ipos++)
	{
		if (min_ipos != (size-1)) arr[min_ipos] = arr[min_ipos + 1];
		else break;
	}

Последний раз редактировалось c3nwen; 01.06.2018 в 11:51.
c3nwen вне форума Ответить с цитированием
Старый 02.06.2018, 01:02   #8
c3nwen
 
Аватар для c3nwen
 
Регистрация: 01.06.2018
Сообщений: 9
По умолчанию

Появились еще вопросы по поводу освобождения памяти, вынес в отдельную тему. http://www.programmersforum.ru/showthread.php?t=320528
c3nwen вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Java. Ошибка. Компилируется, но не запускается. Ошибка duplicate class. Проблема не в коде. nevender Общие вопросы по Java, Java SE, Kotlin 2 13.02.2016 13:24
Ошибка в коде paradises965 Помощь студентам 2 18.11.2014 08:59
Ошибка в коде!!!! курбанниязов Помощь студентам 11 14.05.2014 16:56
Где ошибка в этом исходном коде на языке Си? Или ошибка в Excel? ArchiCurtis Помощь студентам 2 07.04.2012 14:16
Ошибка в коде, ошибка в css или это проблема с совместимостью с браузерами? ankris HTML и CSS 5 23.11.2010 16:58